1.模型
感知机就是一个单个的神经元,如下图所示
几何解释:线性方程 是定义在特征空间 的一个超平面。其中 是超平面的一个法向量, 是超平面的截距。
2 训练数据集
,其中
3 损失函数:误分类点到超平面的总距离
输入空间中任意输入
到超平面的距离为
4.学习算法 —— 梯度下降法
极小化过程中不是一次将所有误分类点的梯度下降,而是一次随机算去一个误分类点使其梯度下降
4.1 原始形式
需要注意的是,参数为
和
。将损失函数分别对
和
求偏导
4.2 对偶形式
在原始形式中,实例点更新次数越多,表明它离超平面越近,分类也就越难。在完成所有的学习之后,得到 和 最终的表达式为
这样感知机模型就可以表示为
5 python实现
import numpy as np
import matplotlib.pyplot as plt
#训练数据集
TrainData_x = np.array([[3, 3], [4, 3], [1, 1]])
TrainData_y = np.array([1, 1, -1])
NumData = len(TrainData_x)
#训练数据可视化
plt.figure()
plt.scatter(TrainData_x[0:2,0], TrainData_x[0:2,1], color='r',label='positive')
plt.scatter(TrainData_x[2,0], TrainData_x[2,1], color='k',label='negative')
plt.title('perceptron')
plt.xlabel('x1')
plt.ylabel('x2')
plt.xlim([0,6])
plt.ylim([0,4])
plt.legend()
eta = 1 #步长or学习率
w = np.array([0, 0]) #法向量初始值
delta_w = np.array([[0,0],[0,0],[0,0]]) #法向量更新值
b = 0 #截距初始值
delta_b = np.zeros(NumData)
for index in range(NumData):
delta_w[index] = eta*TrainData_x[index]*TrainData_y[index]
delta_b[index] = eta*TrainData_y[index]
###学习过程###
CorrData = 0 #正确分类数据的数目
while 1 :
for index in range(NumData):
if -TrainData_y[index]*(np.dot(w,TrainData_x[index])+b) >= 0 : #误分类点需要更新法向量和截距
w = w + delta_w[index]
b = b + delta_b[index]
else: #正确分类点无需操作
CorrData = CorrData + 1
if NumData == CorrData : #如果分类全部正确,跳出while,学习结束
break
else: #如果分类有错误,将CorrData置零,重新循环判断数据分类
CorrData = 0
print("w = ", w)
print("b = ", b)
line_x = [0, 6]
line_y = [0, 0]
for index in range(len(line_x)):
line_y[index] = (-w[0] * line_x[index]- b)/w[1]
plt.plot(line_x, line_y)
plt.savefig("perceptron.png")
plt.show()
最终学习结果
w = [1 1]
b = -3.0