感知机
超平面w⋅x+b=0
当 wx+b>0时 为+1类
当 wx+b<0时 为-1类距离计算:
1||w||2|w⋅xi+b|注:||w||2为L2范式
计算错分类的距离:
错分时: w⋅xi 与 yi异号此时可以去掉abs 得:忽略掉1||w||2可得损失函数:−1||w||2yi(w⋅xi+b)>0L(w,b)=−∑i=1Nyi(w⋅xi+b)
优化:梯度▽下降法
wb的梯度:的梯度:∂∂wL(w,b)=∂∂bL(w,b)=−∑i=1N yi xi−∑i=1N yii=1,2,3...N
loop:计算▽w,▽bw ←b ←w−(−α∗▽w)=w+α∗▽wb−(−α∗▽b)=b+α∗▽b结束条件:1. 设定loop次数or2. 设定前后两次梯度差值<阈值ϵ时停止
代码简单实现
import numpy as np
#梯度下降法
def gradDesc(x,y,lr=0.001,loop=400,r=0): #lr=learning rate
w=np.zeros(len(x[0])+1)
x=np.column_stack([np.ones([len(x),1]),x])
for i in range(loop):
y_hat=x.dot(w)
misclass=((y*y_hat)<=0)
grad=np.dot(y[misclass],x[misclass])
w+=lr*grad #--α▽ => +α·▽
return w,misclass
if __name__=='__main__':
x=np.array([[1,1],[1,0],[0,1],[2,3],[2,2],[3,3]])
y=np.array([-1,-1,-1,1,1,1])
w=gradDesc(x,y,lr=0.01)#learning rate 需要根据实际情况调整.
print(w)
#画图
import matplotlib.pyplot as plt
plt.scatter(x[:,0],x[:,1],c=y)
y_plot=(-x[:,0]*w[0][1]-w[0][0])/w[0][2]
plt.plot(x[:,0],y_plot,c='b')
plt.show()