一、感知机原理
简单来说就是给定一组数据集(以二维为例),在二维平面上求出一根直线将标记好的数据集分为两类,直线一边为一类,另一边为另一类。
例如给定一个数据集:
其中:
此时假设分类直线的函数为:
其中w是这个平面的法向量,b是这个平面的截距。这里用的是平面方程的一般式,即假设平面的法向量为n=(A,B,C)则这个平面的一般式为Ax+By+Cz+D=0。
如果分类正确,那么对于所有y=1的实例i,有:
对于所有y=-1的实例i,有:
那么误分类就是:
这个数据集中某个实例到分类超平面的距离为:
这里用到了点到平面的距离公式:
||w||表示w的L2范数,它的形式就是距离公式的分母那种形式,即:
误分类点到分类超平面的总距离为:
故感知机的损失函数为:
求参数w,b,使其为以下损失函数极小化问题的解:
采用梯度下降法来求解:
随机选择误分类点对w和b进行更新(梯度的反方向就是下降最快的方向):
(二)例题计算
例题:
(三)编程计算
import numpy as np
import matplotlib.pyplot as plt
#将数据保存成字典的形式
train_data_set = {-1:np.array([[1,1]]),
1:np.array([[3,3],
[4,3]])}
data_color={-1:'r',1:'b'}
def train(data):
rate=1 #学习速率
w=np.array([0,0]) #斜率
b=0 #截距
optimize1=True
while optimize1:
a=0
exit_flag1=True
for i in data: #i=1或-1
for j in data[i]:
if i*(np.dot(j,w)+b) <=0:
w=w+rate*j*i
b=b+rate*i
exit_flag1=False
break #跳出内层for循环
else:
a=a+1
if not exit_flag1:
break #跳出外层for循环,进入内层的while循环
if a==3: #样本的容量,代表所需循环的次数,意思是只有当不再出现分类错误的现象才能退出while
break
return w,b
w_t,b_t=train(train_data_set)
print("w0=",w_t[0])
print("w1=",w_t[1])
print("b=",b_t)
运行结果:
w0= 1
w1= 1
b= -3