《统计学习》——感知机

《统计学习》——感知机

本文不是像网上大多数的博文那样,洋洋洒洒的写一大篇文章,只是记录下学习机器学习的一些总结与心得,志在总结与和同道中人一起讨论,分享各自的想法。

1.何为感知机?

我们在学习机器学习的时候,基本都是从感知机开始的,为什么?因为它的思想较为易懂和容易实现,而且对于一般的问题(如二分类问题),效果也很好。感知机是神经网络和支持向量机SVM的基础,也被称为“单层神经网络”。

感知机是二分类分类的线性分类模型,输入为实例的特征向量,输出为实例的类别,定义为+1和-1两个值。说白了,就是通过一个 超平面 把输入的实例切分为正实例和负实例,归为判别模型。【注意(1)超平面,很多人被一些博文误导,以为感知机模型就是一条切分线,其实是不对的。注意了,感知机的输入是特征向量,所以可以是n多维度的,如果输入实例是2维度的,超平面才会退化为一条“线”,如果是3维度,那么就是特征空间中的一个“面”。】

2.感知机模型

 

为了效率,直接把李航先生的《统计学习方法》的内容直接搬过来了,想看完整内容的请移步《统计学习方法》的第二章。

由感知机的模型,引出了一些术语:特征空间、特征向量、权值向量、偏置。为了方便大家,下面直接对它们做出解释。

  • 特征空间:特征是对原始数据的抽象,是从原始数据中提取特征并把原始数据映射到一个更高维的空间,方便研究。例如文本,就是把词向量化。
  • 特征向量:线性变换的特征向量(本征向量)是一个非简并的向量,其方向在该变换下不变。详细只能去查资料了,不然一篇博文都写不下原理。
  • 权值向量:权向量ωm中的权系数ωi的大小代表相应目标fi在多目标最优化问题中的重要程度,ωi越大表示fi在问题中越重要,反之,越小的ωi表示fi越不重要。其实表示目标的重要程度。
  • 偏置:就是超平面的的移动偏离,也是截距。

由感知机模型知道,x是实例输入,已知的,正是通过其来确定 w 和 b。最常用的方法是梯度下降法,通过逐渐逼近的方法来求出完全分类时的w和b参数。

3.感知机的学习策略

  • 注意2说明:||w||其实就是加权向量的平方加和的开方。如果不知道这公式可以看下面的点到直线的距离的公式:

  • 可以引出函数距离(functional margins)和几何距离(geometrical margins)。假设x∈Rn,那么显然wTx+b=0是一个超平面。通过推导,空间中的任意一点x(i)到这个超平面的距离为  L=w*x+b / ||w||

  • 注意3说明:感知机模型判断有误时,对于数据(xi, yi)来说,-yi(w*xi + b)>0 。为什么?因为感知机模型判断正确时,应是以下结果: wxi+b>0,yi=1,wxi+b<0,y=-1 。举个例子如下图 

  • 注意4 5说明:没什么好说的,就是根据是上面的空间中点到直线的距离公式得来,并且把所有维度考虑进来。
  • 注意6说明:这里要注意了。很多人疑惑,为什么在推出感知机的损失函数时||w||可以忽略。在这里给出我自己的观点。

    • 1.感知机主要是靠在迭代的过程中判断sign的符号,也即+1/-1来逐渐优化感知机模型的达到分类的目的的,既然是通过正负变化来判断,那么||w||是恒大于0的,不影响迭代判断的符号变换,因此可以忽略。
    • 2.w是输入实例的加权向量,在训练模型的时候,w的维度是根据训练集x的维度已经确定的了,对于损失函数的优化,很明显是优化可变项,所以||w||是不变的,所以可以忽略。
    • 感知机学习算法最终的终止条件是所有的输入都被正确分类,即不存在误分类的点。则此时损失函数为0,对应于-y(wx+b)/||w||,即分子为0(分母不为0,分母为0也就是待测试点与已知点重合,必定分类正确,不然追溯以前的已分类点就得知全都分类错误了),则可以看出1/||w||对最终结果也无影响。
  • 注意7说明:这是最终的感知机的损失函数定义了,也就是把二分类优化问题,转换为求损失函数的最优,也就是通过某些方法(朴素贝叶斯or梯度下降法)求出使损失函数值最小的w和b两个模型参数。

4.感知机学习算法

给定数据集T,学习率η

  • 1.选取初值w0,b0
  • 2.根据函数距离选取误分类点
  • 3.更新w,b
  • 4.转至 2,直至没有误分类点

详细的推导过程请看《统计学习方法》一书。

5.Python实现感知机小例子

# -*- coding:utf-8 -*-
import copy

training_set = [[(3, 3), 1], [(4, 5), 1], [(1, 1), -1], [(1, 2), -1]]
w = [0, 0]
b = 0
history = []

def update(item):
    global w, b, history
    w[0] += 1 * item[1] * item[0][0]
    w[1] += 1 * item[1] * item[0][1]
    b += 1 * item[1]
    print w, b
    history.append([copy.copy(w), b])

def cal(item):
    res = 0
    for i in range(len(item[0])):
    res += item[0][i] * w[i]
    res += b
    res *= item[1]
    return res

def check():
    flag = False
    for item in training_set:
    if cal(item) <= 0:
    flag = True
    update(item)
    if not flag:
    print "RESULT: w: " + str(w) + " b: " + str(b)
    return flag

if __name__ == "__main__":
    for i in range(1000):
        if not check(): break

6.小结

  感知机虽然简单,但是简单就是美,它是神经网络和支持向量机的基础。比如感知机和支持向量机最大的区别是,感知机只是为了分正确,但是支持向量机还考虑了最优选择,扩展了优化函数的参数是L2范数,可以通过核函数把低维不可分数据向高维映射,从而达到线性化处理的目的。这些后面深入学到再来分析。

posted @ 2018-02-07 22:46  那一抹风  阅读(448)  评论(0编辑  收藏  举报