感知机(perceptron)
前言
感知机(perceptron)是一个二类分类的线性分类模型(SVM也是二类分类模型)。感知机接受多个信号(实例的特征向量),输出一个信号(实例的类别),取+1和-1二值。感知机是由Rosenblatt提出,属于最早的一类机器学习模型算法。是神经网络和支持向量机的基础。
感知机的作用就是将输入特征空间中将实例分为正负两类的分离超平面,属于判别模型。感知机预测就是用学习得到的模型对新输入的实例进行分类。
感知机模型
1、感知机定义
定义:(感知机) 假设输入空间(特征空间)是
X
⊆
R
n
\mathcal X \subseteq \mathcal R^n
X⊆Rn,输出空间是
Y
=
{
+
1
,
−
1
}
\mathcal Y = \{+1,-1\}
Y={+1,−1}。输出
x
∈
X
\mathcal x \in \mathcal X
x∈X表示实例的特征向量,对应于输入空间(特征空间)的点;输出
y
∈
Y
\mathcal y \in \mathcal Y
y∈Y表示实例的类别。由输入空间到输出空间的如下函数:
f
(
x
)
=
s
i
g
n
(
w
.
x
+
b
)
\mathcal f(x) = sign(w.x +b)
f(x)=sign(w.x+b)称为感知机。其中,
w
,
b
\mathcal w,b
w,b为感知机模型参数,
w
∈
R
n
w \in R^n
w∈Rn叫做权值(weight)或者权值向量(weight vector),
b
b
b叫做偏置(bias),
w
.
x
w.x
w.x表示w和x的内积。sign是符号函数,即:
s
i
g
n
(
x
)
=
{
+
1
,
x
≥
0
−
1
,
x
<
0
sign(x)= \begin{cases} +1,x\ge 0 \\ -1, x<0 \end{cases}
sign(x)={+1,x≥0−1,x<0
感知机模型的假设空间是定义在特征空间中的所有线性分类模型(linear classification model)或线性分类器(linear classification),即函数几何{f∣f(x)=w.x+b){f|f(x) = w.x+b){f∣f(x)=w.x+b)。
2、感知机几何解释
几何解释: 一个线性分类器学习的目标就是在一个n维数据空间中寻找一个 ( n − 1 ) (n-1) (n−1)维的超平面S(hyper plane): w . x + b = 0 w.x+b=0 w.x+b=0其中 w w w是超平面的法向量, b b b是超平面的截距。这个 超平面把特征空间分为两部分。分别被分为正负两类。因此超平面也被称为分离超平面。如下图:
这个超平面将样本点分为正负两类,对于 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的样本点,总有 w . x i + b < 0 w.x_i+b<0 w.xi+b<0
感知机的学习原理
1、数据集的可分性
定义(数据集的可分性) 对于给定的特征空间,如果存在某个超平面能将特征空间实例的数据集的正实例点和负实例点完全正确的划分到超平面的两侧,则称数据集T为线性可分数据集。
2、感知机学习的原理
假设训练数据是线性可分的,感知机的目标就是找出一个能够将数据集分为正实例和负实例点完全区分开的超平面,即确定感知机模型参数
w
,
x
w,x
w,x,需要一个学习策略,即定义(经验)损失函数并将损失函数极小化。
损失函数可以定义为统计误分类点的个数,但是这样的损失函数不是参数
w
,
b
w,b
w,b的连续函数,无法对其求导优化;故另一个思路是将其定义为误分点到超平面S的总距离,这是感知机采用的。由此先确定输入空间
R
n
R^n
Rn中的一点
x
0
x_0
x0到超平面的几何间隔为:
1 ∣ ∣ w ∣ ∣ ∣ w . x 0 + b ∣ \frac{1}{||w||}|w.x_0+b| ∣∣w∣∣1∣w.x0+b∣
在 超 平 面 w ∗ x + b = 0 确 定 的 情 况 下 , ∣ w . x + b ∣ 能 够 表 示 点 x 到 距 离 超 平 面 的 远 近 。 在超平面w*x+b=0确定的情况下,|w.x+b|能够表示点x到距离超平面的远近。 在超平面w∗x+b=0确定的情况下,∣w.x+b∣能够表示点x到距离超平面的远近。
这 里 ∣ ∣ w ∣ ∣ 是 w 的 L 2 范 数 , 其 次 对 于 误 分 类 的 数 据 ( x i , y i ) 来 说 , − y i ( w . x i + b ) > 0 成 立 。 因 为 当 w . x i + b > 0 时 , y i = − 1 ; 而 当 w . x i + b < 0 时 , y i = + 1 。 因 此 , 误 分 类 点 x i 到 超 平 面 S 的 距 离 为 : 这里||w||是w的L_2范数,其次对于误分类的数据(x_i,y_i)来说,-y_i(w.x_i+b)>0成立。因为当w.x_i+b>0时,y_i=-1;而当w.x_i+b<0时,y_i=+1。因此,误分类点x_i到超平面S的距离为: 这里∣∣w∣∣是w的L2范数,其次对于误分类的数据(xi,yi)来说,−yi(w.xi+b)>0成立。因为当w.xi+b>0时,yi=−1;而当w.xi+b<0时,yi=+1。因此,误分类点xi到超平面S的距离为: − 1 ∣ ∣ w ∣ ∣ y i ∣ w . x i + b ∣ -\frac{1}{||w||}y_i|w.x_i+b| −∣∣w∣∣1yi∣w.xi+b∣
这样,假设超平面S的误分类点的集合为M,那么所有误分类点到超平面S的总距离为:
− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w . x i + b ) -\frac{1}{||w||}\sum_{x_i\in M} y_i(w.x_i+b) −∣∣w∣∣1xi∈M∑yi(w.xi+b)
不 考 虑 1 ∣ ∣ w ∣ ∣ 即 可 得 到 感 知 机 损 失 函 数 : 不考虑\frac{1}{||w||}即可得到感知机损失函数: 不考虑∣∣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.x_i+b) L(w,b)=−xi∈M∑yi(w.xi+b)
其中M为误分类点的集合,这个损失函数就是感知机学习的经验风险函数。显然损失函数是非负的。如果没有误分类点,损失函数的值是0。而且误分类点越少,误分类点离超平面越近,损失函数的值就越小。一个特定的样本点的损失函数:在误分类是参数w,b的线性函数,在正确分类时是0。因此给定训练数据集T,损失函数
L
(
w
,
b
)
L(w,b)
L(w,b)是
w
,
b
w,b
w,b的连续可导函数。
感知机学习的策略就是在假设空间中选取使损失函数
L
(
w
,
b
)
L(w,b)
L(w,b)最小的模型参数
w
,
b
w,b
w,b,即感知模型。
感知机学习算法
感知机学习问题转化为损失函数的最优化问题,优化方法是随机梯度下降法。
1、感知机学习算法的原始形式
感知机学习算法就是在给定的训练数据下,采用随机梯度下降的方法来求得参数 w , b w,b w,b,使得损失函数极小化的解:
m i n w , b L ( w , b ) = − ∑ x i ∈ M y i ( w . x i + b ) min_{w,b} L(w,b)=-\sum_{x_i \in M}y_i(w.x_i+b) minw,bL(w,b)=−xi∈M∑yi(w.xi+b)
感知机是误分类驱动的,采用随机梯度下降的方法来求得参数。首先先随意取一个超平面然后利用梯度下降法不断极小化目标函数。极小化过程不是一次性是M中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其下降。
假设感知机误分类点集合
M
M
M是固定的,那么损失函数
L
(
w
,
b
)
L(w,b)
L(w,b)的梯度由下式给出:
∂
∂
w
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
x
i
\frac{\partial}{\partial_w}L(w,b)=-\sum_{x_i\in M}y_ix_i
∂w∂L(w,b)=−xi∈M∑yixi
∂
∂
b
L
(
w
,
b
)
=
−
∑
x
i
∈
M
y
i
\frac{\partial}{\partial_b}L(w,b)=-\sum_{x_i\in M}y_i
∂b∂L(w,b)=−xi∈M∑yi
随机给出一个误分类点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)对
w
,
b
w,b
w,b进行更新:
w
=
w
−
α
∂
∂
w
L
(
w
,
b
)
w=w-\alpha\frac{\partial}{\partial_w}L(w,b)
w=w−α∂w∂L(w,b)
b
=
b
−
α
∂
∂
b
L
(
w
,
b
)
b=b-\alpha\frac{\partial}{\partial_b}L(w,b)
b=b−α∂b∂L(w,b)
式中
α
(
0
<
α
<
1
)
\alpha(0 < \alpha< 1)
α(0<α<1)是步长,又称为学习率,它决定梯度下降的快慢。这样通过迭代函数不断减小,直到为0。
综上所述,得到感知机学习算法的原始形式:
输入训练集
{
(
x
1
,
y
2
)
,
(
x
2
,
x
2
)
.
.
.
,
(
x
n
,
y
n
)
}
\{(x_1,y_2),(x_2,x_2)...,(x_n,y_n)\}
{(x1,y2),(x2,x2)...,(xn,yn)},其中
x
i
∈
X
=
R
n
,
y
i
∈
Y
=
{
−
1
,
+
1
}
,
i
=
1
、
2....
n
;
学
习
率
α
(
0
<
α
<
1
)
;
x_i \in \mathcal X =R_n,y_i\in Y=\{-1,+1\},i=1、2....n;学习率\alpha(0<\alpha<1);
xi∈X=Rn,yi∈Y={−1,+1},i=1、2....n;学习率α(0<α<1);
输出:
w
,
b
w,b
w,b:感知机模型
f
(
w
,
b
)
=
s
i
g
n
(
w
.
x
+
b
)
f(w,b)=sign(w.x+b)
f(w,b)=sign(w.x+b)
(1)选取初始值
w
0
,
b
0
;
w_0,b_0;
w0,b0;
(2)在训练集中选取数据
(
x
i
,
y
i
)
;
(x_i,y_i);
(xi,yi);
(3)如果
y
i
(
w
.
x
i
+
b
)
<
0
:
y_i(w.x_i+b)<0:
yi(w.xi+b)<0:
w
=
w
−
α
∂
∂
w
L
(
w
,
b
)
w=w-\alpha\frac{\partial}{\partial_w}L(w,b)
w=w−α∂w∂L(w,b)
b
=
b
−
α
∂
∂
b
L
(
w
,
b
)
b=b-\alpha\frac{\partial}{\partial_b}L(w,b)
b=b−α∂b∂L(w,b)
(4)转至(2),直至训练数据中没有误分类点。
代码示例:
import numpy as np
# print(np.dot([1,2],[2,2]))
train_x = np.array([[3,3],[4,3],[1,1]])
train_y = np.array([1,1,-1])
w = np.array([0,0])
b = 0
for j in range(7):
for i in range(3):
print(w,train_x[i])
print(np.dot(w,train_x[i]))
Y = train_y[i]*(np.dot(w,train_x[i])+b)
print(Y)
if Y <= 0:
Del = train_y[i]*train_x[i]
w = w+Del
b = b+train_y[i]
print(w,b)
运行得到结果为 w = [ 1 , 1 ] , b = − 3 w=[1,1],b=-3 w=[1,1],b=−3,因此得到:
分离超平面为: x ( 1 ) + x ( 2 ) − 3 = 0 x^{(1)} + x^{(2)}-3 = 0 x(1)+x(2)−3=0
感知机模型为: f ( x ) = s i g n ( x ( 1 ) + x ( 2 ) − 3 ) f(x) = sign(x^{(1)}+x^{(2)}-3) f(x)=sign(x(1)+x(2)−3)
感知机算法采用不同的初始值或者选取不同的误分类点,得到的模型可能不同
2、算法的收敛性
**定理:**设训练集
T
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
.
.
.
,
(
x
n
,
y
n
)
}
T=\{(x_1,y_1),(x_2,y_2),......,(x_n,y_n)\}
T={(x1,y1),(x2,y2),......,(xn,yn)}是线性可分的,其中
x
i
∈
X
=
R
n
,
y
i
∈
Y
=
{
−
1
,
+
1
}
,
i
=
1
,
2
,
.
.
.
.
.
.
.
,
N
x_i \in \mathcal X=R^n,y_i \in \mathcal Y=\{-1,+1\},i=1,2,.......,N
xi∈X=Rn,yi∈Y={−1,+1},i=1,2,.......,N,则:
(1)存在满足条件
∣
∣
w
^
o
p
t
.
x
^
i
∣
∣
=
y
i
(
w
o
p
t
.
x
i
+
b
o
p
t
)
⩾
ϵ
||\hat w_{opt}.\hat x_i||=y_i(w_{opt}.x_i+b_{opt})\geqslant\epsilon
∣∣w^opt.x^i∣∣=yi(wopt.xi+bopt)⩾ϵ
(2)令
R
=
m
a
x
1
⩽
i
⩽
n
∣
∣
x
^
i
∣
∣
R=max_{1\leqslant i\leqslant n}||\hat x_i||
R=max1⩽i⩽n∣∣x^i∣∣,则感知机算法在训练数据集上的误分类次数k满足不等式:
k
⩽
(
R
ϵ
)
2
k\leqslant(\frac{R}{\epsilon})^2
k⩽(ϵR)2
定理表明,误分类的次数
k
k
k是有上限的,经过有限次的搜索可以找到将训练数据完全正确分类的分离超平面。也就是说,当训练数据集是线性可分的,感知机学习算法原始形式迭代是收敛的。为了得到唯一的超平面,需要对分离 超平面增减约束条件。当训练数据集不可线性分时,感知机学习算法不收敛,迭代结果是震荡的。
3、感知机学习算法的对偶形式
对偶形式的基本思想是将
w
,
b
w,b
w,b表示为实例
x
i
和
标
记
y
i
x_i和标记y_i
xi和标记yi的线性组合的形式,通过求解其系数求得
w
和
b
w和b
w和b。不失一般性。在原始形式中,假设初始值
w
0
,
b
0
w_0,b_0
w0,b0均为0,对误分类点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)通过
w
=
w
+
α
y
i
x
i
w=w+\alpha y_ix_i
w=w+αyixi
b
=
b
+
α
y
i
b=b+\alpha y_i
b=b+αyi逐步修改
w
,
b
w,b
w,b,设修改n次,则
w
,
b
w,b
w,b关于
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)的增量分别是
φ
i
y
i
x
i
{\varphi}_iy_ix_i
φiyixi,这里
φ
i
=
n
i
α
\varphi_i=n_i\alpha
φi=niα。这样,最终我们得到的
w
,
b
w,b
w,b为:
w
=
∑
i
=
1
N
φ
i
y
i
x
i
w=\sum_{i=1}^N{\varphi}_iy_ix_i
w=i=1∑Nφiyixi
b
=
∑
i
=
1
N
φ
i
y
i
b=\sum_{i=1}^N{\varphi}_iy_i
b=i=1∑Nφiyi
这里
φ
i
⩾
0
,
i
=
1
,
2
,
.
.
.
.
.
.
,
N
,
当
α
=
1
{\varphi}_i \geqslant0,i=1,2,......,N,当\alpha=1
φi⩾0,i=1,2,......,N,当α=1时,表示第
i
i
i个实例由于误分而进行更新的 次数。实例更新的次数越多,表示离超平面越远。
综上所述,得到感知机学习算法的原始形式:
输入训练集
{
(
x
1
,
y
2
)
,
(
x
2
,
x
2
)
.
.
.
,
(
x
n
,
y
n
)
}
\{(x_1,y_2),(x_2,x_2)...,(x_n,y_n)\}
{(x1,y2),(x2,x2)...,(xn,yn)},其中
x
i
∈
X
=
R
n
,
y
i
∈
Y
=
{
−
1
,
+
1
}
,
i
=
1
、
2....
n
;
学
习
率
α
(
0
<
α
<
1
)
;
x_i \in \mathcal X =R_n,y_i\in Y=\{-1,+1\},i=1、2....n;学习率\alpha(0<\alpha<1);
xi∈X=Rn,yi∈Y={−1,+1},i=1、2....n;学习率α(0<α<1);
输出:
φ
,
b
\varphi,b
φ,b:感知机模型
f
(
w
,
b
)
=
s
i
g
n
(
∑
j
=
1
N
φ
i
y
i
x
j
.
x
i
+
b
)
f(w,b)=sign(\sum_{j=1}^N{\varphi}_iy_ix_j.x_i+b)
f(w,b)=sign(∑j=1Nφiyixj.xi+b),其中
φ
=
(
φ
1
,
φ
2
,
.
.
.
.
.
.
φ
N
)
N
\varphi=({\varphi}_1,{\varphi}_2,......{\varphi}_N)^N
φ=(φ1,φ2,......φN)N
(1)选取初始值
φ
0
=
0
,
b
0
=
0
;
{\varphi}_0=0,b_0=0;
φ0=0,b0=0;
(2)在训练集中选取数据
(
x
i
,
y
i
)
;
(x_i,y_i);
(xi,yi);
(3)如果
(
∑
j
=
1
N
φ
i
y
i
x
j
.
x
i
+
b
)
≤
0
:
(\sum_{j=1}^N{\varphi}_iy_ix_j.x_i+b)\le0:
(∑j=1Nφiyixj.xi+b)≤0:
φ
i
=
φ
i
+
1
{\varphi}_i={\varphi}_i+1
φi=φi+1
b
=
b
+
α
y
i
b=b+\alpha y_i
b=b+αyi
(4)转至(2),直至训练数据中没有误分类点。
对偶形式中训练实例仅以内积形式出现,为了计算方便,可以预先将训练集中实例的内积计算出来以矩阵的形式存在,这个矩阵就是所谓的Gram矩阵。
G
=
[
x
i
.
x
j
]
N
×
N
G={[x_i.x_j]}_{N\times N}
G=[xi.xj]N×N
感知机的局限性
感知机的局限性就在于它只能表示由一条直线分割的空间。而多层感知机可以表示非线性空间。