感知机
该文章内容参考 李航 的《统计学习方法》,是本人对这本书的学习记录。
感知机是一种线性分类模型,分类结果为+1与-1二值。
定义
输入 X ⊆ R n X \subseteq R^n X⊆Rn, 输出 Y = { + 1 , − 1 } Y=\{+1,-1\} Y={+1,−1}. 输入 x ∈ X x \in X x∈X表示一个实例的特征向量,即一个点。
将输入映射到输出的函数为: f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w\cdot x+b) f(x)=sign(w⋅x+b),其中 w ⋅ x + b = 0 w\cdot x+b=0 w⋅x+b=0为特征空间中分类所用的超平面。
w ∈ R n w\in\R^n w∈Rn为权重, b b b为偏置, w ⋅ x w\cdot x w⋅x为内积。 s i g n sign sign为符号函数,当 x ≥ 0 x\geq0 x≥0, s i g n ( x ) = 1 sign(x)=1 sign(x)=1, 否则为 − 1 -1 −1。
回到 f ( x ) f(x) f(x),可以发现,感知器即判断对于输入 x x x, w ⋅ x + b w\cdot x+b w⋅x+b的正负。
线性可分
一个数据集是否能用感知机划分呢?
简单的例子,二维平面中有很多正负实例点,如果能用一条直线将他们分成正负两类,就可以。这就是简单的线性可分性,对其定义如下:
给定数据集 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为输入实例的n维特征向量,每个x对应一个分类标签y。
如果所有的正实例与负实例能用用一个超平面S完全正确地划分在两侧,就说T线性可分。
即所有 y = 1 y=1 y=1的正实例都满足 w ⋅ x + b > 0 w\cdot x+b>0 w⋅x+b>0;所有 y = − 1 y=-1 y=−1的负实例都满足 w ⋅ x + b < 0 w\cdot x+b<0 w⋅x+b<0.
策略
假设T线性可分,感知机需要确定w与b来找到一个分离超平面。为此,我们需要定义一个损失函数并将其最小化来优化。
是否可以选择误分类点数呢?这样符合直觉,但是误分类点数本身不是连续可导的。针对空间中的点和面,一个与w和b相关的函数就是点到平面距离公式,所以我们这里选择误分类点到超平面的距离和作为损失函数。
任意点(x,y)到超平面的距离即 1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x + b ∣ \frac{1}{||w||}|w\cdot x + b| ∣∣w∣∣1∣w⋅x+b∣,其中 ∣ ∣ w ∣ ∣ ||w|| ∣∣w∣∣为w的L2范数。
对于一个误分类点
(
x
i
,
y
i
)
(x_i, y_i)
(xi,yi),可以知道
w
⋅
x
i
+
b
w\cdot x_i + b
w⋅xi+b与
y
i
y_i
yi的符号是相反的,
所以必有
y
i
∗
(
w
⋅
x
i
+
b
)
<
0
y_i * (w\cdot x_i + b) < 0
yi∗(w⋅xi+b)<0,所以误分类点到超平面的距离可以表示为
−
1
∣
∣
w
∣
∣
∗
y
i
∗
(
w
⋅
x
i
+
b
)
-\frac{1}{||w||}*y_i*(w \cdot x_i + b)
−∣∣w∣∣1∗yi∗(w⋅xi+b).
这样我们就可以着手下一步了,就是计算所有误分类点到超平面S的距离的和。损失函数为去掉 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1后的距离和。
即 L ( w , b ) = ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b) = \sum\limits_{x_i \in M}y_i(w\cdot x_i+b) L(w,b)=xi∈M∑yi(w⋅xi+b).
学习算法
首先,随机选取一个超平面 w 0 , b 0 w_0,b_0 w0,b0,然后每次选取一个误分类点 ( x i , y i ) (x_i,y_i) (xi,yi)更新w,b。更新策略如下:
w
=
w
+
η
y
i
x
i
w = w+\eta y_ix_i
w=w+ηyixi;
b
=
b
+
η
y
i
b=b+\eta y_i
b=b+ηyi,其中
η
∈
(
0
,
1
]
\eta \in(0,1]
η∈(0,1],为步长。如此往复直至L(w,b)=0.
这个更新策略也就是随机梯度下降法,其中w和b的更新所用的就是对w和b的两个偏导数。
-
算法
输入数据集T,学习率 η \eta η; 输出超平面参数w,b。
- 选取初始参数 w 0 , b 0 w_0,b_0 w0,b0;
- 选取点 ( x i , y i ) ∈ T (x_i,y_i) \in T (xi,yi)∈T;
- 若 y i ( w ⋅ x i + b ) ≤ 0 y_i(w\cdot x_i + b) \leq 0 yi(w⋅xi+b)≤0,则更新w,b为 w = w + η y i x i w=w+\eta y_i x_i w=w+ηyixi, b = b + η y i b=b+\eta y_i b=b+ηyi;
- 跳转至步骤2,直至不存在任何误分类点。
该算法被称为感知机的原始形式,对应感知机的对偶形式。
原始形式代码如下(使用书中实例)
'''
这里使用《统计学习方法》中例2.1的数据集作样例;
正实例点(3,3),(4,3)
负实例点(1,1)
'''
T = [(3, 3), (4, 3), (1, 1)]
Y = [1, 1, -1]
w = [0,0] # 初始化w为0
b = 0 # 初始化b为0
eta = 1 # 步长为1
fin=False # 标识是否结束分类
while not fin:
fin = True
for i in range(0, len(T)):
if Y[i] * (T[i][0] * w[0] + T[i][1] * w[1] + b) <= 0: # 误分类
w[0] = w[0] + eta * Y[i] * T[i][0]
w[1] = w[1] + eta * Y[i] * T[i][1]
b = b + eta * Y[i]
print("w更新为%d,%d; b更新为%d" % (w[0],w[1],b))
fin=False
print("运行结束!")
运行结果如下
w更新为3,3; b更新为1
w更新为2,2; b更新为0
w更新为1,1; b更新为-1
w更新为0,0; b更新为-2
w更新为3,3; b更新为-1
w更新为2,2; b更新为-2
w更新为1,1; b更新为-3
运行结束!