文章目录

  • 1. 感知机基础
  • 1.1 模型
  • 1.2 函数间隔与训练策略
  • 1.3 学习算法
  • 2. 算法收敛性证明
  • 3. 附录



1. 感知机基础

1.1 模型

感知机是最基础的机器学习模型之一,它的类别为:

  • 分类(√)、回归、标注
  • 概率软分类(√)、非概率硬分类
  • 监督(√)、无监督、强化
  • 线性(√)、非线性
  • 判别(√)、生成

模型定义:
输入空间算法收敛曲线怎么画python_人工智能,输出空间算法收敛曲线怎么画python_机器学习_02,定义由输入空间到输出空间的函数映射为:
算法收敛曲线怎么画python_机器学习_03
该模型称为感知机。其中算法收敛曲线怎么画python_感知机_04为感知机参数,算法收敛曲线怎么画python_算法收敛曲线怎么画python_05称为权值,算法收敛曲线怎么画python_算法收敛曲线怎么画python_06称为偏置,算法收敛曲线怎么画python_机器学习_07为符号函数,即:
算法收敛曲线怎么画python_样本集_08

该模型本质上是在输入空间定义了一个分离超平面:算法收敛曲线怎么画python_机器学习_09算法收敛曲线怎么画python_样本集_10为该超平面的法向量,算法收敛曲线怎么画python_样本集_11为该超平面的截距。该超平面将输入空间划分为两部分,位于两侧的点(输入数据)分别属于正负两类。
给定一个线性可分的训练样本集,通过寻找合适的算法收敛曲线怎么画python_样本集_10算法收敛曲线怎么画python_样本集_11使得训练样本集的数据被正确划分到超平面的两侧,该过程即感知机模型的训练过程。
这里有一个前提“训练样本集线性可分”,即对于训练样本集:算法收敛曲线怎么画python_样本集_14,其中,算法收敛曲线怎么画python_机器学习_15,若存在某超平面算法收敛曲线怎么画python_算法收敛曲线怎么画python_16,使得算法收敛曲线怎么画python_人工智能_17,则称算法收敛曲线怎么画python_机器学习_18为线性可分数据集。

1.2 函数间隔与训练策略

为了寻找能正确划分训练样本集的超平面,需要定义损失函数,并将损失函数极小化。如何度量损失呢?如下图所示,有A、B、C三点,表示三个样本,都在分离超平面的正侧,距离分离超平面的距离依次减小。距离越远,预测为正类的确信度越大,反之则不那么确信。

算法收敛曲线怎么画python_算法收敛曲线怎么画python_19

在超平面算法收敛曲线怎么画python_机器学习_09确定的情况下,算法收敛曲线怎么画python_机器学习_21能够相对地表示点算法收敛曲线怎么画python_样本集_22距离超平面的远近,而算法收敛曲线怎么画python_感知机_23的符号与类标记算法收敛曲线怎么画python_算法收敛曲线怎么画python_24的符号是否一致能够表示分类是否正确。所以可以用算法收敛曲线怎么画python_人工智能_25来表示分类的正确性与确信度,这就是函数间隔(functional margin)的概念。
算法收敛曲线怎么画python_人工智能_26算法收敛曲线怎么画python_机器学习_18上被超平面算法收敛曲线怎么画python_样本集_28误分类的所有点的集合,则算法收敛曲线怎么画python_算法收敛曲线怎么画python_29
按照机器学习约定俗成的惯例,损失函数为正,对损失函数求极小值。因此,我们将感知机的损失函数定义为算法收敛曲线怎么画python_机器学习_18上所有被误分类的点到超平面算法收敛曲线怎么画python_样本集_28的函数间隔的绝对值,即:算法收敛曲线怎么画python_样本集_32
感知机的学习策略是在假设空间中选取使上式最小的分离超平面系数算法收敛曲线怎么画python_样本集_10算法收敛曲线怎么画python_样本集_11

1.3 学习算法

感知机的学习问题可转化为求解使损失函数最小的最优化问题,即求参数算法收敛曲线怎么画python_算法收敛曲线怎么画python_35,使其为以下极小化问题的解。算法收敛曲线怎么画python_感知机_36
其中,M为误分类点的集合。求解该问题可使用梯度下降算法。
损失函数算法收敛曲线怎么画python_机器学习_37的梯度为:
算法收敛曲线怎么画python_样本集_38
如果样本集非常大,梯度下降算法每轮迭代都要计算全局梯度,这需要耗费非常大的计算资源,实际应用中通常使用随机梯度下降算法代替,即每次随机选取一个误分类点算法收敛曲线怎么画python_样本集_39,对算法收敛曲线怎么画python_算法收敛曲线怎么画python_35沿梯度负方向更新。
算法收敛曲线怎么画python_样本集_41
其中算法收敛曲线怎么画python_人工智能_42为步长,又叫做学习率。随机梯度的期望为全局梯度,因此其收敛性与梯度下降算法一致。通过不断迭代以上步骤,可以期待损失函数算法收敛曲线怎么画python_机器学习_37不断减小,直到为0.
该算法的直观理解为:当一个实例点被误分类,调整算法收敛曲线怎么画python_算法收敛曲线怎么画python_35的值,使分离超平面向该误分类点移动,减小该误分类点与超平面的距离,直至超平面越过该点,使其被正确分类。
该算法在训练开始时需要选取一个初始分类超平面算法收敛曲线怎么画python_人工智能_45,经过算法收敛曲线怎么画python_感知机_46轮迭代后:
算法收敛曲线怎么画python_人工智能_47
其中,算法收敛曲线怎么画python_样本集_39为第算法收敛曲线怎么画python_机器学习_49轮迭代时随机选取的误分类点。当算法收敛曲线怎么画python_机器学习_50时,第算法收敛曲线怎么画python_感知机_46轮迭代时的超平面方程为:
算法收敛曲线怎么画python_机器学习_52
可以看出,学习速率算法收敛曲线怎么画python_感知机_53可以被约去,说明当算法收敛曲线怎么画python_机器学习_50时,算法收敛速度与算法收敛曲线怎么画python_感知机_53无关。下面证明感知机训练算法收敛性,证明过程可进一步验证该结论。

2. 算法收敛性证明

证明感知机训练算法是收敛的,即证明训练过程可在有限轮迭代内完成,即迭代次数算法收敛曲线怎么画python_感知机_46存在一个上界。
为了便于叙述,将偏置算法收敛曲线怎么画python_样本集_11并入权重向量算法收敛曲线怎么画python_样本集_10,记作算法收敛曲线怎么画python_样本集_59,同时对输入向量算法收敛曲线怎么画python_样本集_22进行扩充,记作算法收敛曲线怎么画python_感知机_61,显然算法收敛曲线怎么画python_样本集_62

Novikoff定理:
设训练数据集算法收敛曲线怎么画python_机器学习_63是线性可分的,其中,算法收敛曲线怎么画python_样本集_64,令算法收敛曲线怎么画python_机器学习_65,则感知机学习算法在训练数据集上的误分类次数算法收敛曲线怎么画python_人工智能_66满足不等式:
算法收敛曲线怎么画python_机器学习_67
其中算法收敛曲线怎么画python_样本集_68为该训练数据集的任一分离超平面的扩展系数向量。

证明:
训练数据集线性可分,则存在能将数据集完全正确分开的分离超平面,对任一满足要求的分离超平面算法收敛曲线怎么画python_机器学习_69,存在算法收敛曲线怎么画python_机器学习_70,对所有算法收敛曲线怎么画python_样本集_71
算法收敛曲线怎么画python_机器学习_72
初始时,算法收敛曲线怎么画python_人工智能_73,随机选取某样本,若被误分类,则更新权重。令算法收敛曲线怎么画python_人工智能_74是第算法收敛曲线怎么画python_感知机_46次迭代时的扩充权重向量,此次迭代随机选择的第算法收敛曲线怎么画python_感知机_46个误分类样本满足条件:
算法收敛曲线怎么画python_算法收敛曲线怎么画python_77
迭代时进行如下更新:
算法收敛曲线怎么画python_人工智能_78
联合(2)(4)式,有:
算法收敛曲线怎么画python_算法收敛曲线怎么画python_79
联合(3)(4)式,有:
算法收敛曲线怎么画python_样本集_80
联合(5)(6)式,有:
算法收敛曲线怎么画python_机器学习_81
定理得证。
从(7)式可知,迭代次数算法收敛曲线怎么画python_感知机_46存在上界,这说明当训练数据集线性可分时,感知机学习算法是收敛的。
进一步地,通过调整算法收敛曲线怎么画python_感知机_53可以改变算法收敛曲线怎么画python_人工智能_84的取值。算法经过算法收敛曲线怎么画python_感知机_46次迭代结束后得到分离超平面算法收敛曲线怎么画python_样本集_86,由(1)式可知,算法收敛曲线怎么画python_样本集_87,令算法收敛曲线怎么画python_人工智能_88,则可使得算法收敛曲线怎么画python_感知机_89,从而得到感知机迭代次数收敛上界的精简形式:
算法收敛曲线怎么画python_样本集_90

3. 附录

from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
import numpy as np
import random

X,Y=make_blobs(n_samples=100,
               n_features=2,
               centers=2,
               cluster_std=2.5,
               random_state=1)
Y[Y==0]=-1

fig=plt.figure(figsize=(7,5))
ax=fig.add_subplot(111)
plt.show()
ax.scatter(X[:,0],X[:,1],c=Y, s=5, cmap='rainbow')

w=np.zeros(2)
b=0
eta=0.1
watcher=True
i=0
while(watcher):
    watcher=False
    for k in range(100):
        xk=X[k]
        yk=Y[k]
        if yk*(np.dot(w,xk)+b)>0:
            continue
        w=w+eta*yk*xk
        b=b+eta*yk
        i+=1
        print('第%d个误分类样本,w=%s,b=%s'%(i,w,b))
        watcher=True
        x1=np.arange(-7.5,1,0.01)
        x2=-(w[0]*x1+b)/w[1]
        ax.plot(x1,x2)
        plt.pause(0.01)

算法收敛曲线怎么画python_样本集_91