介绍
感知机是一个线性二分类模型,该模型是SVM和神经网络的基础。假设输入空间为X特征向量,输出空间为y={+1,-1},从输入空间到输出空间函数可以表示为:
f
(
x
)
=
s
i
g
n
(
W
T
+
b
)
f(x)=sign(W^T+b)
f(x)=sign(WT+b)
对于分类错误的点
(
X
e
,
y
e
)
(X_e,y_e)
(Xe,ye)有:
−
y
e
(
W
T
X
e
+
b
)
>
0
-y_e(W^TX_e+b)>0
−ye(WTXe+b)>0
该点到分割平面的距离可以表示为:
1
∣
∣
∣
W
∣
∣
y
e
(
W
T
X
e
+
b
)
\frac{1}{|||W||}y_e(W^TX_e+b)
∣∣∣W∣∣1ye(WTXe+b)
将所有判断错误的点到分割面距离和作为损失函数:
1
∣
∣
∣
W
∣
∣
∑
i
=
0
k
y
i
(
W
T
X
i
+
b
)
\frac{1}{|||W||}\sum_{i=0}^ky_i(W^TX_i+b)
∣∣∣W∣∣1i=0∑kyi(WTXi+b)
上述损失函数可以采用梯度下降法进行求解。
代码
import numpy as np
import matplotlib.pyplot as plt
def GradientMethod(ErrorList,w_t,b_t,Traing):
b_t=b_t+Traing*(ErrorList[1])
for k in range(X_range):
w_t[k]=w_t[k]+Traing*((ErrorList[0][k]*ErrorList[1]))
return w_t,b_t
def main(TrainNum,Test,X_range,w,b,TrainingRat):
for z in range(TrainNum):
for i in Test:
y_test=0
sum_test=0
for j in range(X_range):
sum_test+=i[0][j]*w[j,0]
y_test=sum_test+b
if y_test*i[1]<=0:
w,b=GradientMethod(i,w,b,TrainingRat)
return w,b
if __name__=="__main__":
#测试数据
Test=[[(3,3),1],[(4,3,),1],[(1,1,),-1]]
X_range=len(Test[0][0])
# 初始化
w=np.zeros((X_range,1))
b=0
TrainingRat=1
TrainNum=int(input("输入迭代次数"))
w,b=main(TrainNum,Test,X_range,w,b,TrainingRat)
#结果可视化
for i in Test:
if i[1]>0:
plt.plot(i[0][0],i[0][1] ,'bo')
elif i[1]<0:
plt.plot(i[0][0],i[0][1], 'rx')
x_2_max=-((w[0]*5+b)/w[1])
x_2_min=-((w[0]*0+b)/w[1])
plt.plot([0,5],[x_2_min,x_2_max])
plt.axis([0, 5, -6, 6])
plt.grid(True)
plt.xlabel('x_1')
plt.ylabel('x_2')
plt.show()
内容参考了《统计学习方法》