假设输入空间(特征空间),输出空间是
,输入
表示实例的特征向量,对应输入空间(特征空间)点;git
输出表示实例的类别,输入空间到输出空间的映射函数
称为感知机。github
其中w b为模型参数,w*x表示内积,sign表示指示函数:算法
感知机几何解释网络
线性方程,对应于特征空间 Rn 超平面S,S的法向量为w,S的截距为b。超平面S将特征空间分为两部分,位于两部分(特征空间)函数
的点分为正负两类,所以也称为分离超平面。二维空间分离平面示意图:性能
感知机的学习策略学习
给定训练集,须要找到模型参数w 、b,肯定将正负样例正确分开的超平面。这时咱们须要定义损失函数并极小化。损失函数一个天然的想法是误分类点网站
的总数,但它不是w 、b的连续可导数;另外一个想法是计算全部误分类点到超平面S的距离,其中任一点
到S的距离可表示为:this
,其中
是w的L2 范数。spa
对于误分类的数据(xi ,yi)有:
误分类点集合有:
误分类点到超平面S的距离为:
所以全部误分类点到超平面的距离为:,M为误分类点的集合。
不考虑就获得感知机的损失函数
,感知机的学习策略就是在假设空间选取使
最小的模型参数w 、b。
感知机损失函数极小化方法
感知机误分类集合M,全部点离超平面S越近,越小,而
对
是连续可导的,对w求偏导得:
对b求偏导得:
训练时随机选取误分类点对
更新:
其中为学习率或步长。
比较直观的代码实现:
# 数据线性可分,二分类数据 # 此处为一元一次线性方程 class Model: def __init__(self): self.w = np.ones(len(data[0])-1, dtype=np.float32) self.b = 0 self.l_rate = 0.1 # self.data = data def sign(self, x, w, b): y = np.dot(x, w) + b return y # 随机梯度降低法 def fit(self, X_train, y_train): is_wrong = False while not is_wrong: wrong_count = 0 for d in range(len(X_train)): X = X_train[d] y = y_train[d] if y * self.sign(X, self.w, self.b) <= 0: self.w = self.w + self.l_rate*np.dot(y, X) self.b = self.b + self.l_rate*y wrong_count += 1 if wrong_count == 0: is_wrong = True return 'Perceptron Model!' def score(self): pass
感知机的收敛性
Novikoff定理说明:1)线性可分的样本必定存在超平面将正负样本分开;
2)误分类次数有上限,通过有限次搜索能够找到样本彻底正确分开的超平面,也就是说原始形式经过不断迭代是收敛的。
3)当样本线性不可分时,感知机算法不收敛,原始形式迭代过程会发生震荡。
4)感知机的算法存在许多解,依赖于初值选择,也依赖于误分类点在迭代过程当中的顺序。
5)在增长约束条件下,能够获得惟一分离超平面。
感知机学习对偶形式
感知机学习算法对偶形式:
输入:线性可分的数据集其中
,
,i=1,2...N,学习率
输出:a,b: 感知机模型 ,其中a=
1)
2)在训练集中选取数据
3)若是
4)转至(2)直到没有误分类数据。
对偶形式中样本实例之内积形式预先计算出来,保存在Gram矩阵中。
对偶形式与原始形式本质同样,它出现的意义在于:样本点特征向量之内积事先计算好,放在Gram矩阵中,在更新参数a、b时,直接
经过查询矩阵,能够加快计算。
不妨假设特征空间是,n很大,而样本行数N远小于n,若是采用原始形式时间复杂度为
;采用对偶形式的话,直接在Gram矩阵
里查表就能拿到内积 ,因此这个误判检测的时间复杂度是
,大大下降了时间复杂度。
换句话说感知机的对偶形式,经过提早计算好样本点内积并存储于Grama Matrix,把每轮数据迭代的时间复杂度,从特征空间维度n转移
到样本集大小的维度,达到了性能的提高。