感知器
在讲神经网络前先说说感知器,感知器是一种二分类的线性分类模型,输出值取-1或1。感知器是最基础的神经网络,理解好感知器对后面的各种神经网络模型是很有帮助的。如下图,
它可以有多个输入(x1,x2,...xn),每个输入对应有一个权重(w1,w2...wn),除此之外还有一个偏置项w0。
则输出为
o(x)=⎧⎩⎨⎪⎪1,−1,if∑i=0nxiwi>0;otherwise;
其中将x0看成是1。而
∑i=0nxiwi=x0w0+x1w1+...+xnwn
则可以看成是x与w的点积。
感知器的作用
它的输入就是一个线性函数,所以可用于线性分类。同时感知器是单层神经网络,是神经网络的基础。
损失函数
损失函数可以用错误分类的点到超平面的总距离来表示,不直接使用统计错误分类的点总数作为损失函数是因为这样的损失函数不是w的连续可导函数。其中距离可用欧氏距离来表示,可用w的L2范数∥w∥来表示,于是根据距离公式有,
1∥w∥|w∗x0+b|
对于错误分类的点有,−yi(w∗xi+b)>0,其中y为1或-1,所以错误分类点到超平面的距离为
−1∥w∥yi(w∗x0+b)
得到总距离为
−1∥w∥∑xiϵMyi|w∗x0+b|
忽略范数部分,于是得到损失函数
L(w,b)=−∑xiϵMyi(w∗x0+b)
所以要做的是最小化损失函数L(w,b),使用梯度下降法,梯度分别由w和b的偏导决定,过程中随机用某个错误分类点来更新w和b,更新公式为w+ηyixi和b+ηyi。
实现代码
import numpy as np
eta = 0.1
ite = 20
def train(x, y):
w_ = np.zeros(1 + x.shape[1])
for _ in range(ite):
for xi, yi in zip(x, y):
update = eta * (yi - predict(xi, w_))
w_[1:] += update * xi
w_[0] += update
return w_
def predict(x, w):
return np.where(np.dot(x, w[1:]) + w[0] >= 0, 1, -1)
x_train = np.array([[1, 2], [2, 1], [2, 3], [3, 5], [1, 3], [4, 2], [7, 3], [4, 5], [11, 3], [8, 7]])
y_train = np.array([1, 1, -1, -1, 1, -1, -1, 1, -1, 1])
w = train(x_train, y_train)
print("w = " , w)
x1 = [4, 3]
print(predict(x1, w))
========广告时间========
鄙人的新书《Tomcat内核设计剖析》已经在京东销售了,有需要的朋友可以到 https://item.jd.com/12185360.html 进行预定。感谢各位朋友。
=========================
欢迎关注: