《统计学习方法》个人记录(1)-感知机

本文是作者对《统计学习方法》中感知机部分的学习笔记,介绍了感知机作为线性分类模型的基本概念,包括其定义、线性可分性、学习策略以及学习算法。内容涵盖权重、偏置、线性可分数据集的定义,以及感知机的损失函数和随机梯度下降的学习更新方式。最后提到了感知机的原始形式和对偶形式的代码实现及运行结果。
摘要由CSDN通过智能技术生成

感知机

该文章内容参考 李航 的《统计学习方法》,是本人对这本书的学习记录。
感知机是一种线性分类模型,分类结果为+1与-1二值。

定义

输入 X ⊆ R n X \subseteq R^n XRn, 输出 Y = { + 1 , − 1 } Y=\{+1,-1\} Y={+1,1}. 输入 x ∈ X x \in X xX表示一个实例的特征向量,即一个点。

将输入映射到输出的函数为: f ( x ) = s i g n ( w ⋅ x + b ) f(x)=sign(w\cdot x+b) f(x)=sign(wx+b),其中 w ⋅ x + b = 0 w\cdot x+b=0 wx+b=0为特征空间中分类所用的超平面。

w ∈ R n w\in\R^n wRn为权重, b b b为偏置, w ⋅ x w\cdot x wx为内积。 s i g n sign sign为符号函数,当 x ≥ 0 x\geq0 x0 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 wx+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 wx+b>0;所有 y = − 1 y=-1 y=1的负实例都满足 w ⋅ x + b < 0 w\cdot x+b<0 wx+b<0.

策略

假设T线性可分,感知机需要确定w与b来找到一个分离超平面。为此,我们需要定义一个损失函数并将其最小化来优化。

是否可以选择误分类点数呢?这样符合直觉,但是误分类点数本身不是连续可导的。针对空间中的点和面,一个与w和b相关的函数就是点到平面距离公式,所以我们这里选择误分类点到超平面的距离和作为损失函数。

任意点(x,y)到超平面的距离即 1 ∣ ∣ w ∣ ∣ ∣ w ⋅ x + b ∣ \frac{1}{||w||}|w\cdot x + b| w1wx+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 wxi+b y i y_i yi的符号是相反的,
所以必有 y i ∗ ( w ⋅ x i + b ) < 0 y_i * (w\cdot x_i + b) < 0 yi(wxi+b)<0,所以误分类点到超平面的距离可以表示为 − 1 ∣ ∣ w ∣ ∣ ∗ y i ∗ ( w ⋅ x i + b ) -\frac{1}{||w||}*y_i*(w \cdot x_i + b) w1yi(wxi+b).

这样我们就可以着手下一步了,就是计算所有误分类点到超平面S的距离的和。损失函数为去掉 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} w1后的距离和。

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)=xiMyi(wxi+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。

    1. 选取初始参数 w 0 , b 0 w_0,b_0 w0,b0
    2. 选取点 ( x i , y i ) ∈ T (x_i,y_i) \in T (xi,yi)T
    3. y i ( w ⋅ x i + b ) ≤ 0 y_i(w\cdot x_i + b) \leq 0 yi(wxi+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
    4. 跳转至步骤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
运行结束!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值