最简单的神经网络–感知机,只有一个神经元,代表只能画一条线。一分为二。不能处理异或问题—这得需要两条线分开,需要俩神经元。
一、定义
感知机(PLA)是最简单的神经网络(见神经网络矩阵结构单神经元多样本),只有一个神经元来判断与否非问题,是最简单的二分类算法。
对于
W
W
W,
X
X
X 和
Y
Y
Y
W
W
W为系数矩阵,就是我们要求的未知数,
m
∗
1
m*1
m∗1大小。
X
X
X为输入矩阵,
m
∗
n
m*n
m∗n大小。
Y
Y
Y为输出矩阵,
n
∗
1
n*1
n∗1大小,值为1或者-1(非此种形式的转换成此种表达),1表示一种分类,-1表示另一种分类。对于一个样本:
y
i
=
s
g
n
(
W
T
x
i
)
y_i=sgn(W^Tx_i)
yi=sgn(WTxi)
s
g
n
(
x
)
sgn(x)
sgn(x)是符号函数。
二、损失函数
感知机损失函数为0-1损失函数(gold standard 标准式), 0-1损失是指,预测值和目标值不相等为1,否则为0。但是此损失函数只是相当于指导思想,无法直接操作,所以我们换一种思路:误分类点到超平面的总距离,这种错误分类的点的距离总和最小化。
从最简单的二维说起,由初中数据知识,一条直线可以表示为
a
x
+
b
y
+
c
=
0
ax + by + c = 0
ax+by+c=0或者
w
1
x
1
+
w
2
x
2
+
w
0
=
0
w_1x_1+w_2x_2+w_0 = 0
w1x1+w2x2+w0=0,点
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)或
(
x
1
,
x
2
)
(x_1,x_2)
(x1,x2)到直线的距离公式为:
∣
a
x
0
+
b
y
0
+
c
∣
a
2
+
b
2
或
∣
w
1
x
1
+
w
2
x
2
+
c
∣
w
1
2
+
w
2
2
\frac{|ax_0+by_0+c|}{\sqrt{a^2+b^2}}或\frac{|w_1x_1+w_2x_2+c|}{\sqrt{w_1^2+w_2^2}}
a2+b2∣ax0+by0+c∣或w12+w22∣w1x1+w2x2+c∣
推广到高维,超平面公式为:
g
(
x
)
=
∑
i
=
1
n
w
i
x
i
+
w
0
g(x)= \sum _{i=1}^{n}w_{i}x_{i}+w_{0}
g(x)=i=1∑nwixi+w0
点
(
x
1
,
x
2
,
.
.
.
,
x
n
)
(x_1,x_2,...,x_n)
(x1,x2,...,xn)到该平面的距离为:
1
∣
∣
w
∣
∣
∣
w
⋅
x
+
w
0
∣
\frac{1}{||w||}|w\cdot x+w_0|
∣∣w∣∣1∣w⋅x+w0∣
三、感知机原理
感知机可理解为:对于线性可分数据集,存在一个(超)平面S(即
w
⋅
x
+
b
w\cdot x+b
w⋅x+b),可将所有数据完全正确分到两侧。考虑二维平面情况,则当
w
1
x
1
+
w
2
x
2
+
w
0
>
0
w_1x_1+w_2x_2+w_0>0
w1x1+w2x2+w0>0和
w
1
x
1
+
w
2
x
2
+
w
0
<
0
w_1x_1+w_2x_2+w_0<0
w1x1+w2x2+w0<0分别位于直线的两侧。
如前文所述,感知机判断标准:
y
i
=
s
g
n
(
W
T
x
i
)
y_i=sgn(W^Tx_i)
yi=sgn(WTxi),如果判断正确,此时分为两种情况:
W
T
x
i
W^Tx_i
WTxi为正,此时
y
i
=
1
y_i=1
yi=1;
W
T
x
i
W^Tx_i
WTxi为负,此时
y
i
=
−
1
y_i=-1
yi=−1。总之,判断正确时,
y
i
∗
W
T
x
i
>
0
y_i*W^Tx_i>0
yi∗WTxi>0,判断错误时,
y
i
∗
W
T
x
i
<
0
y_i*W^Tx_i<0
yi∗WTxi<0.
如果超平面S没将所有数据分块,假设误分类点集合为M,那么所有误分类点到S的距离为:
−
1
∣
∣
w
∣
∣
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
w
0
)
-\frac{1}{||w||}\sum_{x_i\in M}y_i(w\cdot x_i+w_0)
−∣∣w∣∣1xi∈M∑yi(w⋅xi+w0)
通俗起见,
w
0
w_0
w0一般写成
b
b
b,即
−
1
∣
∣
w
∣
∣
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
-\frac{1}{||w||}\sum_{x_i\in M}y_i(w\cdot x_i+b)
−∣∣w∣∣1xi∈M∑yi(w⋅xi+b)
此处,
y
i
y_i
yi和
(
w
x
i
+
b
)
(wx_i+b)
(wxi+b)符号相反,因为是错误分点。所以去掉绝对值后,前面加一个负号。
所以损失函数可写为:
L
(
w
,
b
)
=
−
1
∣
∣
w
∣
∣
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
L(w,b)=-\frac{1}{||w||}\sum_{x_i\in M}y_i(w\cdot x_i+b)
L(w,b)=−∣∣w∣∣1xi∈M∑yi(w⋅xi+b)
进一步令
∣
∣
w
∣
∣
=
1
||w||=1
∣∣w∣∣=1,此时并不影响后续实际计算,上式简化为:
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
(
w
⋅
x
i
+
b
)
L(w,b)=-\sum_{x_i\in M}y_i(w\cdot x_i+b)
L(w,b)=−xi∈M∑yi(w⋅xi+b)
进一步计算
w
和
b
w和b
w和b 的导数,求得梯度:
∂
L
(
w
,
b
)
∂
w
=
−
∑
x
i
∈
M
y
i
x
i
\frac{\partial L(w,b)}{\partial w} =-\sum_{x_i\in M}y_ix_i
∂w∂L(w,b)=−xi∈M∑yixi
∂
L
(
w
,
b
)
∂
b
=
−
∑
x
i
∈
M
y
i
\frac{\partial L(w,b)}{\partial b} =-\sum_{x_i\in M}y_i
∂b∂L(w,b)=−xi∈M∑yi
对于系数
w
w
w 来说,迭代方式为:
w
i
+
1
=
w
i
−
∂
L
∂
w
=
w
i
+
y
i
x
i
w_{i+1}=w_i-\frac{\partial L}{\partial w}=w_i+y_ix_i
wi+1=wi−∂w∂L=wi+yixi
四、代码实现
使用python来实现
import numpy as np
def pla(X, y):
"""
感知器学习算法实现
注意:只能处理线性可分的数据集,输入线性不可分的数据集函数将无法停止
args:
X - 训练数据集
y - 目标标签值
return:
w - 权重系数
"""
done = False
# 初始化权重系数
w = np.zeros(X.shape[1])
# 循环
while(done == False):
done = True
# 遍历训练数据集
for index in range(len(X)):
x = X[index]
# 判定是否与目标值不符
if x.dot(w) * y[index] <= 0:
done = False
# 修正权重系数
w = w + y[index] * x
return w
使用sklearn
from sklearn.linear_model import Perceptron
# 初始化感知器
clf = Perceptron()
# 用随机梯度下降拟合线性模型
clf.fit(X, y)
# 权重系数
w = clf.coef_
五、示例演示
简单训练数据集分类:
复杂训练数据集分类:
六、参考
简单程序见:
机器学习算法系列(一)- 感知器学习算法(PLA)
复杂程序见:
NLP重剑篇之感知机与支持向量机
实例联系见:
Python实现感知机(PLA)算法
其他参考见:
模式识别系列(一)感知器算法(PLA)
机器学习 第35集:感知机用什么做损失函数? ( 含有笔记、代码、注释 )
线性模型篇之感知机 (PLA) 数学公式推导