zoukankan      html  css  js  c++  java
  • 《统计学习方法》学习笔记(1) 感知机

    感知机(perceptron)是Frank Rosenblatt在1957年就职于Cornell航空实验室(Cornell Aeronautical Laboratory)时发明的一种人工神经网络,是一种二元线性分类器。

          定义:输入空间(特征空间),输出空间是。由输入空间到输出空间的函数称为感知机。sign是符号函数,即

           数据集,其中xi为n维实数向量),,i=1,2, … , N。如果存在某个超平面(hyperplane)S:,对于所有的实例i有;对于所有的实例i有,则称数据集T为线性可分;否则称数据集T线性不可分。

          学习策略:输入空间任一点x0到超平面S的距离为,对于误分类的数据来说,当;当,所以,。因此,误分类点到超平面S的距离为,假设所有误分类点的集合为M,那么所有误分类点到超平面的总距离为。不考虑,感知机的损失函数定义为

          求解:感知机学习算法是误分类驱动的,任意选取一个超平面w0, b0,,然后用随机梯度下降法(stochastic gradient descent)不断的极小化目标函数。梯度由损失函数分别对w和b求偏微分获得:

                       

           迭代:                (0<η<=1,步长,又称学习率)

          代码:

     1 # perceptron.py
     2 # -*- coding: gbk -*-
     3 #《统计学习方法》,例2.1,代码
     4 
     5 from numpy import *
     6 
     7 def getDataSet():
     8     dataMat=mat([[3,3],
     9                 [4,3],
    10                 [1,1]])
    11     labelSet = [1,1,-1]
    12     return dataMat, labelSet
    13 
    14 def run(dataMat, labelSet):
    15     m,n = shape(dataMat)
    16     wi = mat([0,0]); bi = 0
    17     wrongclass = True
    18     i=0
    19     print(i, "error point:", "*", " w:", wi, " b:", bi)
    20     while True:
    21         i += 1
    22         wj = wi; bj = bi
    23         wrongclass = False
    24         for j in range(m):
    25             if (labelSet[j]*(((wj*dataMat[j].T)[0,0]) + bj) <= 0):  #wrong classification
    26                 wi = wj + labelSet[j]*dataMat[j]
    27                 bi = bj + labelSet[j]
    28                 wrongclass = True
    29                 print(i, "error point:", j, " w:", wi, " b:", bi)
    30                 break;
    31         if(wrongclass == False):
    32             break;

          代码输出:

    >>> import perceptron

    >>> dataMat, labelMat = perceptron.getDataSet()

    >>> perceptron.run(dataMat, labelMat)

    0 error point: *  w: [[0 0]]  b: 0

    1 error point: 0  w: [[3 3]]  b: 1

    2 error point: 2  w: [[2 2]]  b: 0

    3 error point: 2  w: [[1 1]]  b: -1

    4 error point: 2  w: [[0 0]]  b: -2

    5 error point: 0  w: [[3 3]]  b: -1

    6 error point: 2  w: [[2 2]]  b: -2

    7 error point: 2  w: [[1 1]]  b: -3

    >>> 

          上面的结果和书里的结果是一样的,选择的误分类点都是第一次遇到的误分类点。而实际上在选择误分类点时应该采用随机的方法来选取,每次梯度下降的时候只对随机选择的一个误分类点进行梯度下降。由于采用不同初值或选取不同的误分类点,结果可以不同。

     

  • 相关阅读:
    [Java面试一]Spring总结以及在面试中的一些问题.(转发:http://www.cnblogs.com/wang-meng/p/5701982.html)
    微信开发学习2--消息管理
    微信开发学习1--接入指南(入门,微信开发环境搭建)
    Bootstrap学习5--bootstrap中的模态框(modal,弹出层)
    iOS开发常用的宏
    iOS开发之---多线程技术
    iOS开发 之---返回可重用单元格
    iOS开发之---发送邮件
    ios开发之---UITextField退出键盘
    StoryBoard概览
  • 原文地址:https://www.cnblogs.com/thelongroad/p/3132474.html
Copyright © 2011-2022 走看看