一,感知机模型
感知机模型是机器学习当中的一个二分类器模型,并且是一种线性分类器。
从输入空间到输出空间经过如下的函数:
其中w和b为感知机的模型参数,w叫作权值或者权值向量,b叫作偏置。sign是符号函数,既
感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型。
感知机对线性方程的几何解释;
对于特征空间中存在一个超平面S,其中w是超平面的法向量,b是超平面的截距。这个超平面将特征空间分成两部分,位于这个平面两侧的样本(特征向量)分别被称为正类,或负类,这个超平面也被称为分离超平面。
二,感知机学习策略
有了感知机的假设空间,我们需要考虑如何选择最优的模型。注意感知机的数据要求线性可分。
感知机损失函数是选择误分类点到超平面的距离。
误判的点到我们决策线(wx+b)的距离衡量我们[w,b]的好坏
教程上说这是点到我们决策线段的距离,但很含糊,我这里推一下;
如果样本点被误分类了,即如果样本的真实标记,则,即预测得到的样本标记为;反之,如果样本真实标记,则,即预测得到的样本标记为,因此可以总结如下规律,如果样本被误分类,则符合下式:
故而,我们可以得到误分类点到分类超平面的距离可表示为:
不考虑就得到我们的感知机的损失函数
可以看出损失函数是非负的,即如果误分类点越少,则损失函数越小,其值越趋近于0。我们的目标就是确定w和b,使得损失函数能够尽可能的小。
三,感知机算法
在这里我们采用随机梯度下降法来对损失函数进行优化,进而求得相对合适的w和b。
采用随机梯度下降法更新权值与偏置(即求损失函数关于权值与偏置的偏导数(梯度),并用偏导更新参数),损失函数偏导
感知机采用随机梯度下降法更新参数的方式和一般我们所理解的随机批梯度下降法有所不同,另外感知机中只有误分类样本参与随机梯度下降,并且采用的是单个误分类样本进行计算。所谓随机就是随机选取一个误分类样本,计算梯度权值和偏置的梯度,然后采用梯度更新参数w和b。
对于随及选取的误分类样本,更新权值w和b
四,代码
import numpy as np
import matplotlib.pyplot as plt
import time
#train data
x = np.array([[3, 3], [1, 1],[4, 3]])
y = np.array([1, -1, 1])#标签
#参数初始化
w = np.array([0,0])
b =np.array([0])
learning_rate = 1
#判断是否误分类 函数
def judge_class(x,y,w2,b):
misclassification = False
cnt = 0
mis_index = 0
for i in range(len(x)):
if y[i]*(np.dot(w2,x[i])+b) <= 0:
cnt += 1
mis_index = i
break #发现有误分类点 记录其下标就直接退出即可;很重要
if cnt > 0 :
misclassification = True
return misclassification, mis_index
# 参数w, b 的更新
def update(x, y, w1, b, i):
w1 = w1 + learning_rate*y[i]*x[i]
b = b + learning_rate*y[i]
return w1, b
t1 = time.time()
misclassification, mis_index = judge_class(x,y,w,b)
for j in range(7):
#print(x)
w, b = update(x, y, w, b, mis_index)
print("第{}次,w={},b={}".format(j,w,b))
misclassification, mis_index = judge_class(x,y,w,b)
if misclassifications:
break;
t2 = time.time()
print("w={}".format(w))
print("b={}".format(b))
#绘制图
#w1*x1+w2*x2+b=0
plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(xmax=12,xmin=0)
plt.ylim(ymax=12,ymin=0)
#散点图数据
x1=np.array([3,4])
y1=np.array([3,3])
x2 = np.arange(0,5,0.1)
y2 = -((w[0])*x2 +b)/(w[1]+0)
x3 = np.array([1])
y3 = np.array([1])
plt.scatter(x1, y1, marker = 'o', alpha=0.4,color="red", label='正类')
plt.scatter(x3, y3, marker = 'x', alpha=0.4,color="red", label='负类')
plt.plot(x2,y2,label="拟合直线",c='orange')
plt.legend() #label='正类' 图中显示
plt.title('感知机原始形')#图的标题
plt.show()
其中的阿尔法就是我们常说的学习率了大于0小于1,
这里的图来自我们吴恩达老师的机器学习课程。
我们想要找到局部最优就需要从山顶上找一个方向走下去,而这个方向就是我们loss函数对参数的偏导,而上述我们的就是控制我们下山的步长,当然我们让其太大了,太大可以就超过我们的最优解了 ,太小又走的太慢了。然后重复我们的随机梯度下降算法,直到没有误分点。
五、感知机算法的对偶形式
对偶形式是对算法执行速度的优化。具体是怎么优化的呢?
对于上面我们感知机模型算法的原始形式
我们可以看出,每次梯度的迭代都是都是选择一个样本来更新我们的w和b,经过若干次后得到最终结果,不是误差点参与迭代的次数为0,对于多次被认为是误分类而更新样本,它参与更新w的次数我们设为n ,我们让w向量初始值为0,则w可以表示为
这里的n是样本(xi,yi)在当前的这一步之前梯度下降之前因误分类而更新的次数,每个样本在没有误分类之前,它的n都为0,只有误分类之后我们的n都是自加1。
由于我们的是一个常量我们就令, 是第i个边表示第i个样本,哪我们的迭代式就变成
在每一步判断误分类的地方我们就可以用
来判断当前样本点是否误分类
而其中xi*xj是以内积的形式出现,为了方便我们预先将训练集中的内积计算出来并以矩阵的形式储存,这样避免的大量的重复运算,这就是为啥我们的对偶形式比原始算法优的原因。
以上内容参考了李航老师的统计学习方法,吴恩达的机器学习视频