• 《统计学习方法》学习笔记(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

    >>> 

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

     

  • 相关阅读:
    Dora.Interception,为.NET Core度身打造的AOP框架 [3]:多样化拦截器应用方式
    Dora.Interception,为.NET Core度身打造的AOP框架 [2]:以约定的方式定义拦截器
    Dora.Interception,为.NET Core度身打造的AOP框架 [1]:更加简练的编程体验
    TechEmpower最新一轮的性能测试出炉,ASP.NET Core依旧表现不俗
    [文章汇总]ASP.NET Core框架揭秘[最近更新:2018/10/31]
    依赖注入[8]: .NET Core DI框架[服务消费]
    依赖注入[7]: .NET Core DI框架[服务注册]
    依赖注入[6]: .NET Core DI框架[编程体验]
    依赖注入[5]: 创建一个简易版的DI框架[下篇]
    依赖注入[4]: 创建一个简易版的DI框架[上篇]
  • 原文地址:https://www.cnblogs.com/thelongroad/p/3132474.html
Copyright © 2020-2023  润新知