感知机 (Perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1。感知机对应于输入空间(特征空间)中将实例划为正负两类的分离超平面,属于判别模型。感知机预测是用学习得到的感知机模型对新的输入实例进行分类,是神经网络与支持向量机的基础。强烈推荐以下参考链接,讲的非常详细。
参考连接:
一、感知机模型
定义:输入x,对应于输入空间上的特征点,输出y={+1,-1}表示实例的类别,输入到输出的函数如下:
f
(
x
)
=
s
i
g
n
(
w
∗
x
+
b
)
f(x)=sign(w*x+b)
f(x)=sign(w∗x+b)
称为感知机。w、b为感知机的权重。
感知机为一种线性分类模型,属于判别模型。线性方程w*x+b=0对应于特征空间的一个超平面S,这个超平面将特征空间划分为两个部分,分别为正负两类。S也称作分离超平面,如下图所示:
二、感知机的学习策略
假设训练数据线性可分,感知机的学习目标是求得一个可以将正负样本完全分开的分离超平面,即确定w,b,需定义一个损失函数并将损失函数极小化。
感知机选择误分类点到分离超平面S的总距离作为损失函数。输入空间
R
n
R^{n}
Rn中任意一点
x
o
x_{o}
xo到超平面的距离:
1
∣
∣
w
∣
∣
∣
w
∗
x
0
+
b
∣
\frac{1}{||w||}|w*x_{0}+b|
∣∣w∣∣1∣w∗x0+b∣
其中
∣
∣
w
∣
∣
||w||
∣∣w∣∣为w的L2范数。
【补充】
1、点到直线的距离
设直线方程为 Ax+By+C=0 ,其上一点为 ( x 0 , y 0 ) (x_{0},y_{0}) (x0,y0),则距离为
d = A ∗ x 0 + B ∗ y 0 + C A 2 + B 2 d=\frac{A*x_{0}+B*y_{0}+C}{\sqrt{A^{2}+B^{2}}} d=A2+B2A∗x0+B∗y0+C
2、样本到超平面距离假设超平面是 h=w⋅x+b,其中 w=(w0,w1,w2…wn), x=(x0,x1,x2…xn),样本点 x′到超平面的距离:
d = w ∗ x ′ + b ∣ ∣ d ∣ ∣ d=\frac{w*x^{'}+b}{||d||} d=∣∣d∣∣w∗x′+b
另外,对于误分类分类数据
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi,yi)来说,当
w
∗
x
i
+
b
>
0
w*x_{i}+b>0
w∗xi+b>0时,
y
i
=
−
1
y_{i}=-1
yi=−1;而当
w
∗
x
i
+
b
<
0
w*x_{i}+b<0
w∗xi+b<0时,
y
i
=
+
1
y_{i}=+1
yi=+1。所以,误分类到S的距离为:
−
1
∣
∣
w
∣
∣
y
i
(
w
∗
x
i
+
b
)
-\frac{1}{||w||}y_{i}(w*x_{i}+b)
−∣∣w∣∣1yi(w∗xi+b)
不考虑
1
∣
∣
w
∣
∣
\frac{1}{||w||}
∣∣w∣∣1,感知机的损失函数定义为:
L
(
w
,
b
)
=
−
∑
y
i
(
w
∗
x
i
+
b
)
L(w,b)=-\sum y_{i}(w*x_{i}+b)
L(w,b)=−∑yi(w∗xi+b)
三、感知机学习算法
3.1、感知机算法的原始形式
对于给定数据集
T
=
(
x
1
,
y
1
)
,
.
.
.
,
(
x
N
,
y
N
)
T={(x_{1},y_{1}),...,(x_{N},y_{N})}
T=(x1,y1),...,(xN,yN)求参数w,b使得损失函数最小化:
m
i
n
L
(
w
,
b
)
=
−
∑
y
i
(
w
∗
x
i
+
b
)
minL(w,b)=-\sum y_{i}(w*x_{i}+b)
minL(w,b)=−∑yi(w∗xi+b)
因为我们需要不断学习 w,b,因此我们采取随机梯度下降法不断优化目标函数,在这里,随机梯度下降过程中,每一次仅用一个误分类点样本来使其梯度下降。
首先,我们求解梯度,分别对 w,bw,b 求偏导:
∇
w
L
(
w
,
b
)
=
∂
∂
w
L
(
w
,
b
)
=
−
∑
y
i
x
i
∇
b
L
(
w
,
b
)
=
∂
∂
b
L
(
w
,
b
)
=
−
∑
y
i
∇wL(w,b)=\frac{∂}{∂w}L(w,b)=−∑yixi\\ ∇bL(w,b)=\frac{∂}{∂b}L(w,b)=−∑yi
∇wL(w,b)=∂w∂L(w,b)=−∑yixi∇bL(w,b)=∂b∂L(w,b)=−∑yi
然后,随机选取一个误分类点对 w,bw,b 进行更新: (同步更新)
w
←
w
+
η
y
i
x
i
b
←
b
+
η
y
i
w←w+ηyixi\\ b←b+ηyi
w←w+ηyixib←b+ηyi
其中,η为学习率,通过这样迭代使损失函数 L(w,b)不断减小,直至最小化。
算法步骤:
输入: T = ( x 1 , y 1 ) , . . . , ( x N , y N ) T={(x_{1},y_{1}),...,(x_{N},y_{N})} T=(x1,y1),...,(xN,yN),学习率η(0<η<=1)
输出:w,b;感知机模型 f ( x ) = s i g n ( w ∗ x + b ) f(x)=sign(w*x+b) f(x)=sign(w∗x+b)
- 选取初始值 w 0 , b 0 w_{0},b_{0} w0,b0
- 选取数据 ( x i , y i ) (x_{i},y_{i}) (xi,yi)
- 如果 y i ( w ∗ x i + b ) < = 0 y_{i}(w*x_{i}+b)<=0 yi(w∗xi+b)<=0
w ← w + η y i x i b ← b + η y i w←w+ηyixi\\ b←b+ηyi w←w+ηyixib←b+ηyi
- 转至(2),直至训练集中没有误分类点
根据算法可以看出,感知机主要是利用误分类点来进行学习的,通过调整w,b的值,使分离超平面向误分类点移动,减少该分离点到平面的距离,直到超平面越过该点使其被正确分类。
3.2、感知机算法的对偶形式
我们知道一般形式的权重更新:
w
←
w
+
η
y
i
x
i
b
←
b
+
η
y
i
w←w+ηyixi\\ b←b+ηyi
w←w+ηyixib←b+ηyi
但是经历多次迭代,我们需要多次更新w、b权重,这样计算量比较大。有没有不用这么多次就就计算好权重的方法呢?有,那就是感知机算法的对偶形式。具体怎么引出的能?我们知道经过n次修改过后,参数变化如下公式:
w
=
∑
i
a
i
y
i
x
i
b
=
∑
i
a
i
y
i
w=\sum_{i} a_{i}y_{i}x_{i} \\ b=\sum_{i} a_{i}y_{i}
w=i∑aiyixib=i∑aiyi
其中
a
i
a_{i}
ai为误分类点
(
x
i
,
y
i
)
(x_{i},y_{i})
(xi,yi)需要更新的次数
这样我们就从学习w,b变成学习误分类次数
a
i
a_{i}
ai,并且在对偶形式中引入了Gram 矩阵来存储内积,可以提高运算速度, 而反观原始形式,每次参数改变,所有的矩阵计算全部需要计算,导致计算量比对偶形式要大很多, 这就是对偶形式的高效之处。这里Gram矩阵相当于
∑
i
y
i
x
i
\sum_{i}y_{i}x_{i}
∑iyixi。Gram 矩阵定义如下:
G
=
[
x
1
x
1
.
.
.
x
1
x
N
x
2
x
1
.
.
.
x
2
x
N
.
.
.
.
.
.
.
.
.
x
N
x
1
.
.
.
x
N
x
N
]
G=\left[ \begin{matrix} x_{1}x_{1} & ... & x_{1}x_{N}\\ x_{2}x_{1} & ... & x_{2}x_{N}\\ ... & ... & ...\\ x_{N}x_{1} & ... & x_{N}x_{N} \end{matrix} \right]
G=⎣⎢⎢⎡x1x1x2x1...xNx1............x1xNx2xN...xNxN⎦⎥⎥⎤
算法步骤:
输入: T = ( x 1 , y 1 ) , . . . , ( x N , y N ) T={(x_{1},y_{1}),...,(x_{N},y_{N})} T=(x1,y1),...,(xN,yN),学习率η(0<η<=1)
输出:a,b;感知机模型 f ( x ) = s i g n ( ∑ j a j y i x j ∗ x i + b ) f(x)=sign(\sum_{j}a_{j}y_{i}x_{j}*x_{i}+b) f(x)=sign(∑jajyixj∗xi+b)
- 赋初值a0,b0 。
- 选取数据点(xi,yi)。
- 判断该数据点是否为当前模型的误分类点,即判断若 y i ( ∑ j a j y j x j ∗ x i + b ) < = 0 y_{i}(\sum_{j}a_{j}y_{j}x_{j}*x_{i}+b)<=0 yi(∑jajyjxj∗xi+b)<=0则更新
a i = a i + η b = b + η y i a_{i}=a_{i}+η \\ b=b+ηy_{i} ai=ai+ηb=b+ηyi
- 转到(2),直到训练集中没有误分类点
为了减少计算量,我们可以预先计算式中的内积,得到Gram矩阵。
参考连接: