[统计学习方法笔记]第2章-感知机

感知机是二类分类的线性分类模型,输入为实例的特征向量,输出为实例的类别。感知机学习旨在求出将训练数据进行线性划分的分离超平面。

感知机模型

输入x表示实例的特征向量,输出空间是y = {+1, -1},由输入空间到输出空间的函数: f ( x ) = s i g n ( w ⋅ x + b ) f(x) = sign(w \cdot x + b) f(x)=sign(wx+b),称为感知机。w和b为模型参数,sign为符号函数。
感知机的几何解释对应线性方程: w ⋅ x + b = 0 w \cdot x + b = 0 wx+b=0,对应一个超平面,这个超平面把特征空间划分为两个部分,位于两部分的点分别被分为正负两类。

学习策略

当数据是线性可分时,感知机学习的目标是求得一个能够将训练集正负实例点完全正确分开的分离超平面。找到这样的超平面就需要确定参数w和b。需要定义损失函数,并将损失函数最小化。
这里选择的损失函数是误分类点到超平面S的总距离,其中输入空间中任一点 x 0 x_{0} x0到超平面S的距离: 1 ∥ w ∥ ∣ w ⋅ x 0 + b ∣ \frac{1}{\left \| w \right \|}|w\cdot x_{0}+b| w1wx0+b
y = {-1, +1},所以对于误分类的数据(xi, yi)来说: − y i ( w ⋅ x i + b ) > 0 -y_{i}(w\cdot x_{i} + b) > 0 yi(wxi+b)>0
误分类点x_{i}到超平面S的距离是: − 1 ∣ ∣ w ∣ ∣ y i ( w ⋅ x i + b ) -\frac{1}{||w||}y_{i}(w\cdot x_{i}+b) w1yi(wxi+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\cdot x_{i}+b) w1xiMyi(wxi+b)
不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} w1,就得到感知机学习的损失函数。

给定训练数据集: 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 ∈ R n x_i\in R^{n} xiRn y i ∈ { + 1 , − 1 } y_{i}\in \{+1,-1\} yi{+1,1},感知机 s i g n ( w ⋅ x + b ) sign(w\cdot x+b) sign(wx+b)学习的损失函数定义为:
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)=xiMyi(wxi+b)

学习算法

感知机学习算法是针对上面的损失函数的最优化问题,可以采用随机梯度下降法,损失函数L(w,b)中w和b的梯度:
▽ w L ( w , b ) = − ∑ x i ∈ M y i x i \triangledown_{w}L(w,b) = -\sum_{x_{i}\in M}y_{i}x_{i} wL(w,b)=xiMyixi ▽ b L ( w , b ) = − ∑ x i ∈ M y i \triangledown_{b}L(w,b) = -\sum_{x_{i}\in M}y_{i} bL(w,b)=xiMyi
学习算法的完整步骤:

输入:训练数据集 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 ∈ R n x_i\in R^{n} xiRn y i ∈ { + 1 , − 1 } y_{i}\in \{+1,-1\} yi{+1,1},学习率 0 < η ⩽ 1 0<\eta\leqslant 1 0<η1
输出:w, b;感知机模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x) = sign(w\cdot x+b) f(x)=sign(wx+b)
(1) 选取初始值 w 0 w_0 w0, b 0 b_0 b0
(2)在训练集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
(3)如果 y i ( w ⋅ x i + b ) ≤ 0 y_{i}(w\cdot x_{i}+b) \leq 0 yi(wxi+b)0
w ← w + η y i x i w\leftarrow w + \eta y_{i}x_{i} ww+ηyixi b ← b + η y i b\leftarrow b + \eta y_{i} bb+ηyi(4)转至(2),直至训练集中没有误分类点

例2.1 练习题,正实例点 x 1 = ( 3 , 3 ) T x_{1}=(3,3)^{T} x1=(3,3)T x 1 = ( 4 , 3 ) T x_{1}=(4,3)^{T} x1=(4,3)T,负实例点 x 1 = ( 1 , 1 ) T x_{1}=(1,1)^{T} x1=(1,1)T,用感知机学习算法求感知机模型 f ( x ) = s i g n ( w ⋅ x + b ) f(x) = sign(w\cdot x+b) f(x)=sign(wx+b),这里 w = ( w ( 1 ) , w ( 2 ) ) T w = (w^{(1)},w^{(2)})^{T} w=(w(1),w(2))T x = ( x ( 1 ) , x ( 2 ) ) T x = (x^{(1)},x^{(2)})^{T} x=(x(1),x(2))T .
具体计算可参见书中过程,这里也给出python代码计算过程。

# 感知机学习算法
import numpy as np

X = np.array([[3,3], [4,3], [1,1]])
y = [1, 1, -1]

w = np.array([0, 0])
b = 0
lr = 1.
epoch = 100

for e in range(epoch):
    num = 0
    for xi, yi in zip(X, y):
        if yi * (np.dot(w, xi) + b) <= 0: # 错误分类点
            w = w + lr * yi * xi
            b = b + lr * yi
        else: # 正确分类点
            num += 1
    print(w, b)
    if num == len(y): # 全部分类正确迭代终止
        break
        
print("w={0}, b={1}".format(w, b))

上面得到的超平面是: 2 x ( 1 ) + x ( 2 ) − 5 = 0 2x^{(1)}+x^{(2)}-5=0 2x(1)+x(2)5=0 .
感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。

对偶形式

感知机学习算法的对偶形式

输入: 线性可分的数据集 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 ∈ R n x_i\in R^{n} xiRn y i ∈ { + 1 , − 1 } y_{i}\in \{+1,-1\} yi{+1,1},学习率 0 < η ⩽ 1 0<\eta\leqslant 1 0<η1
输出: α \alpha α,b;感知机模型 f ( x ) = s i g n ( ∑ j = 1 N α j y j x j ⋅ x + b ) f(x)=sign(\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\cdot x+b) f(x)=sign(j=1Nαjyjxjx+b)
其中 α = ( α 1 , α 2 , . . . , α N ) T \alpha =(\alpha_{1},\alpha_{2},...,\alpha_{N})^{T} α=(α1,α2,...,αN)T .
(1) α ← 0 \alpha \leftarrow 0 α0 b ← 0 b \leftarrow 0 b0
(2)在训练集中选取数据 ( x i , y i ) (x_{i},y_{i}) (xi,yi)
(3)如果 y i ( ∑ j = 1 N α j y j x j ⋅ x + b ) ⩽ 0 y_{i}(\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\cdot x+b)\leqslant 0 yi(j=1Nαjyjxjx+b)0
α i ← α i + η \alpha_{i} \leftarrow \alpha_{i} + \eta αiαi+η b ← b + η y i b \leftarrow b + \eta y_{i} bb+ηyi(4)转至(2)直到没有误分类数据.

例2.2 数据同例2.1,正样本点是 x 1 = ( 3 , 3 ) T x_{1}=(3,3)^{T} x1=(3,3)T x 1 = ( 4 , 3 ) T x_{1}=(4,3)^{T} x1=(4,3)T,负实例点 x 1 = ( 1 , 1 ) T x_{1}=(1,1)^{T} x1=(1,1)T,用感知机学习算法的对偶形式求解模型。

按照上面算法的步骤:
(1)取 α i = 0 \alpha_{i}=0 αi=0,i=1,2,3,b=0, η = 1 \eta=1 η=1
(2)计算所有内积的Gram矩阵, G = [ x i ⋅ x j ] N × N G=[x_{i} \cdot x_{j}]_{N \times N} G=[xixj]N×N
G = [ 18 21 6 21 25 7 6 7 2 ] G = \begin{bmatrix} 18 & 21 & 6 \\ 21 & 25 & 7 \\ 6 & 7 & 2 \end{bmatrix} G=1821621257672
(3)误分类条件: y i ( ∑ j = 1 N α j y j x j ⋅ x + b ) ⩽ 0 y_{i}(\sum_{j=1}^{N}\alpha_{j}y_{j}x_{j}\cdot x+b)\leqslant 0 yi(j=1Nαjyjxjx+b)0
更新参数: α i ← α i + η \alpha_{i} \leftarrow \alpha_{i} + \eta αiαi+η b ← b + η y i b \leftarrow b + \eta y_{i} bb+ηyi
(4)迭代更新。

下面是计算过程的简单代码形式:

# 感知机学习算法对偶形式
import numpy as np

X = np.array([[3,3], [4,3], [1,1]])
y = [1, 1, -1]

alpha = [0, 0, 0]
b = 0
lr = 1
epoch = 100

gram_matrix = np.matmul(X, X.transpose())
n = len(y)

for e in range(epoch):
    num = 0
    for i in range(n):
        sum_xy = 0
        for j in range(n):
            sum_xy += alpha[j] * y[j] * gram_matrix[j][i]
        if y[i] * (sum_xy + b) <= 0: # 错误分类
            alpha[i] = alpha[i] + lr
            b = b + y[i]
        else: # 正确分类
            num += 1
    print("alpha={0}, b={1}".format(alpha, b))
    if num == n: # 全部分类正确迭代终止
        break

# w = sum(alpha_i * y_i * x_i)
w = np.array([0,0])
for i in range(n):
    w += alpha[i] * y[i] * X[i]

print("w={0}, b={1}".format(w, b))

你可能感兴趣的:(统计学习方法,机器学习)