参考:
林轩田机器学习基石
统计学习方法
感知机Perceptron
一. 模型
- 感知机是二类分类的线性分类模型。把输入空间的实例划分为正负两类的分离超平面,它是线性分类模型,属于判别模型。
- 函数:f(x)=sign(w*x+b),w表示超平面S法向量,x表示特征向量
- 解决应用问题:分类问题。得到模型后可以对新输入的实例进行分类。
二.策略
如果给定的数据集是线性可分,也就说存在某个超平面S为w*x+b=0,它刚好可以把正负实例点划分开。那么感知机学习目的就是找到这么一个超平面。
如何确定呢?那就是我们的学习策略:定义损失函数并将其损失函数最小化。
- 损失函数是由所有误分类点的距离相加组成,它非负。
三.算法
PLA算法
Perceptron Learning Algorithm(PLA)的核心思想是知错能改,逐步修正。
- 实例点的错误划分为两种情况:
(1) 实例x对应的y本应该是正,但是sign(w_t^T * x_n(t))为负。两个向量内积为负,几何定义上来看,两个向量夹角超过90°。
(2)实例x对应的y本应该是负,但是sign(w_t^T * x_n(t))为正。两个向量内积为正,几何定义上来看,两个向量夹角小于90°。
此时w_t+1 = w_t+y_n(t)*x_n(t),w_t+1就是我们新的超平面S的法向量。直到所有的点正确的划分为结束。
步骤
- 一开始我们的W_0=0,我们先找一个点做连线,它就是修正后的平面的法向量。w1=w_0+y_n(0)*x_n(0)
- 我是正,但是放在了负的区域,夹角大于90°,修正
- 我是负,放在了正的区域,夹角小于90°,修正
PLA的遗留问
-
PLA停不下来,找不到一条直线分割正负点,下图第一个可以,第二三个不行。
当处于第二种情况的时候,我们可以找犯错误最少的线。首先经过w_0,手上握住一根线,开始纠正错误。每一次出现线时,比较自己手上的线看看犯错时是不是少,是就替换,不是就接着纠正错误找线。直到手上握住的线中的错误点个数,就算纠正了也没我手上的好之后,结束。 -
停下来的PLA得到的直线g是不是与f接近呢?
首先理想函数f会完美的划分正负区域,而且每一个点距离f的距离都会大于0,法向量w_f*x会与y同号,也就是两者相乘也会大于0。
那么f与g接近怎么判别呢?
(1). 法向量w_f与修正更新后的w_t+1做内积,向量内积越大说明向量越接近,说明f和g会越来越接近。(注意:内积变大还有可能是向量的模引起的)
(2). 解决长度引起的内积变大
首先PLA是有错才更正,其次我们的更新后的w_t+1的长度用求模来计算,我们把错误点x_n(t)换成最远的点,发现最多会多出的距离由x_n的决定。
证明最后一个公式:
参考: https://redstonewill.com/70/
最后一个公式的左边其实得到的是一个余弦,可以看到除了T再变动以外,其他都是固定给出的,所以当T越来越大时,w_f^T会和W_T接近。这也说明线性可分的停下来的PLA函数f和函数g会接近。
四.算法:原始形态
五.算法:对偶形态
为什么需要对偶形式?
因为它可以减少一位参数!原始形态的w,b可以被a_i所代替。
六. 代码
参考:https://blog.csdn.net/u010626937/article/details/72896144
# 原始形态
import numpy as np
import matplotlib.pyplot as plt
p_x = np.array([[3, 3], [4, 3], [1, 1]])
p_y = np.array([1, 1,