zoukankan      html  css  js  c++  java
  • 18-感知机模型在经典数据集鸢尾花上的应用

    今天去新宿舍打扫了一天,一切都是新的。立秋了,天气也凉爽起来,让人可以静下心来,不再那么浮躁。如果用心生活,时间是会慢下来的。你会享受多出N倍的人生。浮光掠影,追求效率,牺牲的是本该属于自己的趣味盎然的过程。自从脱离大公司的束缚,不再有周末和下班的概念。然而工作成了一种打怪升级的冒险历程,有点类似游戏。周一不再如上坟,工作和休息也不再泾渭分明。不到两年时间,比在大公司工作十年的经历更值得回忆。有时后悔在大公司呆太久了,单调的生活真的是杀时间的利器,会让你觉得逝去年华如流水,然而并没有什么值得追忆。

    上周我们学习了感知机模型,它的损失函数定义为误分类点到分离超平面的距离之和。之前的线性回归模型中,我们用的损失函数是实际值y和理论值的误差平方和。可能有的同学觉得奇怪,为啥损失函数用的不一样呢?因为我们要求w和b,使得损失函数最小,对于可导函数,我们的套路是用梯度下降法,不断更新w和b,向极值点方向靠拢。在线性回归模型中,实际值y和理论值的误差平方和是可导函数,所以是可行的。而在感知机模型中,实际值y和理论值的取值只可能是+1或-1,它们的误差平方和与w,b并没有明显的函数关系,也就不能通过梯度下降法来求使得损失函数极小化的w和b了。这个时候,我们发现误分类点到分离超平面的距离(注释1),和w,b都能扯上关系,而且很幸运也是连续可导的,所以就用这个作为损失函数,这样我们可以继续使用梯度下降法来更新w和b,使得损失函数向极值点方向靠拢。

    【注释1:误分类点到超平面的距离==

    用这个损失函数有个缺点,即它只计算了误分类点到分离超平面的距离,正确分类点的损失函数应该是0,那么针对每个点,我们首先要判断它是否是误分类点,如果是才需要计算梯度,更新w,b。

    损失函数L(w,b)的梯度通过偏导计算:

    随机选取一个误分类点,根据上面的规则,计算新的w, b然后进行更新:

    如果有一个通用的公式,对于所有点,无论是正确分类还是错误分类都适用,只是在正确分类点的情况下不更新w,b,能实现吗?数学家说SO EASY,于是有了下面改良版的权重更新规则:

    这意味着,仅当针对给定训练实例 (x,y) 产生的输出值 f(x)与预期的输出值 y不同时,权重向量才会发生改变。并且输出值 f(x)与预期的输出值 y不同时,意味着y-f(x)=y-(-y)=2*y【记住 f(x)和y的取值只可能是+1或-1】,即对于误分类点,w(j):=w(j)+2*α*y*x(j),这样和上周推导的权重更新公式是不是很像了?只是之前的学习率η=2*α。下面我们用算法实现这个改良版的权重更新规则:

    (代码及数据集地址:http://pan.baidu.com/s/1nu6P6sx)

    用感知机模型来训练大名鼎鼎的鸢尾花数据集:

    这里只考虑两种花 Setosa 和 Versicolor,以及两种特征 sepal length 和 petal length。但是 Perceptron Model 其实可以解决多类别分类问题, 参考 one-vs-all。

    • 读入数据

    • 画散点图

    • 训练感知机模型

    结果 error 的确最后为 0, 证明是 convergent 的, 且分类效果应该说是非常准确了。

    • 画决策边界(可以打印看下np.meshgrid和xx1.ravel的值)

    虽然 Perceptron Model 在上面 Iris 例子里表现得很好,但在其他问题上却不一定表现得好。Frank Rosenblatt 从数学上证明了,在线性可分的数据里,Perceptron 的学习规则会收敛,但在线性不可分的情况下,却无法收敛。这个时候只能通过定义最大迭代次数来控制了。

  • 相关阅读:
    (Android)如何将一个高复用性项目供其他项目使用(jar导出,导入,Is Library)(转)
    Android:SlidingMenu 使用详解 .
    单项链表和双向链表的区别
    LinkedList 与 ArrayList的区别
    完全二叉树与满二叉树
    C/C++之回调函数
    C++静态库与动态库
    C++项目中的extern "C" {}
    C++强大背后
    移动优先与响应式Web设计
  • 原文地址:https://www.cnblogs.com/turingbrain/p/7401257.html
Copyright © 2011-2022 走看看