李航统计方法——感知机

李航统计学习方法——感知机

1.数据集的线性可分性

给定一个数据集
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\} T={(x1,y1),(x2,y2),,(xN,yN)}
其中
x i ∈ χ = R n , y i ∈ Y = { + 1 , − 1 } , i = 1 , 2 , … , N , 如 果 存 在 某 个 超 平 面 S : w ∗ x + b = 0 x_i\in\chi=R^n,y_i\in\mathcal{Y}=\{+1,-1\},i=1,2,\dots,N,如果存在某个超平面S:w*x+b=0 xiχ=Rn,yiY={+1,1},i=1,2,,N,Swx+b=0
能够将数据集的正实例点和负实例点完全正确地划分到超平面的两侧,及对所有的

y_i=+1的实例i,有w*x_i+b>0

y_i=-1的实例i,有w*x_i+b<0

则称数据集T为线性可分数据集

2.感知机学习策略

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。即需要我们去确定感知机模型参数w,b,我们需要确定一个学习策略,即定义(经验)损失函数并将损失函数极小化。

损失函数的一个自然选择是误分类点的总数,但这样的损失函数不会死参数w,b的连续可导函数,不易优化。

感知机采用误分类点到超平面S的总距离。为此,首先有输入空间R^n中任一点x_0,到超平面S的距离
1 ∣ ∣ w ∣ ∣ ∣ w ∗ x 0 + b ∣ , ∣ ∣ w ∣ ∣ 是 w 的 L 2 范 数 \frac{1}{||w||}|w*x_0+b|,||w||是w的L_2范数 w1wx0+b,wwL2
对于误分类的数据(x_i,y_i)有
− y i ( w ∗ x i + b ) > 0 -y_i(w*x_i+b)>0 yi(wxi+b)>0
因为当
w ∗ x i + b > 0 时 , y i = − 1 ( 把 + 1 认 成 了 − 1 ) w ∗ x i + b < 0 时 , y i = + 1 ( 把 − 1 认 成 了 + 1 ) w*x_i+b>0时,y_i=-1(把+1认成了-1) \\ w*x_i+b<0时,y_i=+1(把-1认成了+1) wxi+b>0yi=1+11wxi+b<0yi=+11+1
此时我们能得到误分类点的x_i到超平面S的距离:
− 1 ∣ ∣ w ∣ ∣ y i ( w ∗ x i + b ) -\frac{1}{||w||}y_i(w*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*x_i+b) w1xiMyi(wxi+b)
不考虑1/||w||,我们就得到感知机学习的损失函数
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)=xiMyi(wxi+b)

  • 损失函数L(w,b)是非负的
  • 没有误分类点,损失函数值是0
  • 误分类点越少,误分类点离超平面越近,损失函数值越小
  • 损失函数L(w,b)是参数w,b的线性(连续可导)函数

3.感知机学习算法

3.1感知机学习算法原始形式

min ⁡ w , b L ( w , b ) = − ∑ x i ∈ M y i ( w ∗ x i + b ) , M 为 误 分 类 点 的 集 合 \min_{w,b}L(w,b)=-\sum_{x_i\in M}y_i(w*x_i+b),M为误分类点的集合 w,bminL(w,b)=xiMyi(wxi+b),M

感知机学习算法是误分类驱动的,具体采用随机梯度下降法。

首先,任意选取一个超平面w_0,b_0,然后利用梯度下降法不断的极小化目标函数。

极小化过程不是一次使M中所有误分类点的梯度下降,而是每次随机选取一个误分类点使其梯度下降
▽ w L ( w , b ) = − ∑ x i ∈ M y i x i ▽ b L ( w , b ) = − ∑ x i ∈ M y i \bigtriangledown_wL(w,b)=-\sum_{x_i\in M}y_ix_i \\ \bigtriangledown_bL(w,b)=-\sum_{x_i\in M}y_i wL(w,b)=xiMyixibL(w,b)=xiMyi
随机选取一个误分类点(x_i,y_i),对w,b进行更新:
w ← w + η y i x i b ← b + η y i w\leftarrow w+\eta y_ix_i \\ b\leftarrow b + \eta y_i ww+ηyixibb+ηyi
其中η(0<η≤1)是步长,在统计学习中又称为学习率。此时通过迭代可使损失函数L(w,b)不断减小,直到为0.综上所述,有如下算法:

在这里插入图片描述

import numpy as np

def Perceptron(x,y,w,b,eta):
    m,n = x.shape
    bool = True
    while bool:
        bool = False
        for i in range(m):
            if y[i]*(w.dot(x[i])+b) <= 0:
                w = w + eta*y[i]*x[i]
                b = b + eta*y[i]
                # print(w,b)
                bool = True
                break
    return w,b

# 设置初始值        
x = np.array([[3,3],[4,3],[1,1]])
y = np.array([1,1,-1])
m,n = x.shape
w = np.zeros(n)
b = 0  
eta = 1 # 学习率

w,b = Perceptron(x, y, w, b, eta)

在这里插入图片描述

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

preview

def Perceptron_dual(x,y,nn,eta):
    m,n = x.shape
    Gram = np.zeros((m,m))
    for i in range(m):
        for j in range(m):
            Gram[i][j] = x[i].dot(x[j])            
    bool = True
    while bool:
        bool = False
        for i in range(m):
            data = 0
            for j in range(m):
                data = data + nn[j]*eta*y[j]*Gram[i][j]+nn[j]*eta*y[j]
            if y[i]*(data) <= 0:
                nn[i] = nn[i]+1
                bool = True
                break
    return nn

# 设置初始值        
x = np.array([[3,3],[4,3],[1,1]])
y = np.array([1,1,-1])
m,n = x.shape
nn = np.zeros(m)  
eta = 1 # 学习率

nn = Perceptron_dual(x, y, nn, eta)
print(nn)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值