感知机(perceptron)是二类分类的线性分类模型,属于判别模型,是支持向量机(SVM)的基础,两者都是属于监督学习的一种分类器,而后者在生物信息学处理分类问题中应用非常广泛(尤其是在生物标记物biomarker研究以及癌症预后等研究中) 感知机的学习策略是使基于误分类点到分离超平面的距离(损失函数)极小化,使用的是基于梯度下降法(理解梯度下降法)对损失函数的最优化算法(有些使用标准梯度下降来实现);因为使用的是随机梯度下降法,所以极小化过程中随机选择一个误分类点使其梯度下降;当训练数据集是线性可分时,其学习算法是收敛的,但是由于迭代随机选取误分类点而导致存在无穷多个解
为了解决存在多解的情况,使得存在唯一解,需要对分离超平面增加约束条件,从而改进为支持向量机,后者不是使用梯度下降法,而是由约束条件构造的拉格朗日函数,求偏导为0求极值点
但感知机学习算法具有简单而易于实现的优点,但容易造成过拟合,分为原始形式和对偶形式两种,两者都能求解出相同的结果
感知机的损失函数中点到超平面的距离公式的推导(自己高数忘光了,推导不出,只好看别人的了~)可看点到超平面距离公式 推导
原始形式算法步骤: * 用0(或者一个较小的输)来初始化权值w0和偏置b0 * 从训练集中选取数据(xi, yi),计算其公式判断每个点是否被正确分类 * 通过感知器学习规则来更新权值w和偏置b,迭代至所有点都被正确分类,最终获得更新的权重w和偏置b
以<统计学习方法>例2.1数据为例,代码实现如下:
import numpy as np
X = np.array([[3,3],[4,3],[1,1]])
y = np.array([[1],[1],[-1]])
class Perceptron():
def __init__(self):
self.weight = np.zeros((2,1))
self.bias = 0
self.learning_rate = 1
def fit(self, X, y):
a = np.dot(X, self.weight) + self.bias
p = np.where(a <= 0)[0]
while len(p) > 0:
# 随机取误分类点
# index = np.random.choice(p)
# 取第一个误分类点(按照书中例子)
index = p[0]
print(index + 1)
self.weight += y[index] * X[index].reshape(2,1)
self.bias += y[index]
a = y * (np.dot(X, self.weight) + self.bias)
p = np.where(a <= 0)[0]
return self.weight, self.bias
p = Perceptron()
trained_w, trained_b = p.fit(X=X, y=y)
如果除了训练集外还有测试集,那么可以根据训练集获得的w和b来预测测试集从而进行分类
另外在查找R中感知机的函数时,见识到了一种搜索R函数的方法:
library(sos)
findFn("perceptron")
参考资料:
感知机和SVM的区别
理解梯度下降法
统计学习方法(感知机)
本文出自于http://www.bioinfo-scrounger.com转载请注明出处