感知机是统计学习方法中的监督学习方法,是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机学习旨在求出将训练数据进行线性划分的分离超平面。

本文首先介绍感知机模型,然后叙述感知机的学习策略,特别是损失函数,接着介绍感知机学习算法,最后用一个实例说明并用Python编程实现。

1.感知机模型

假设输入空间(特征空间)是

python 感知器神经 python感知机算法_python 感知器神经

,输出空间是

python 感知器神经 python感知机算法_误分类_02

。输入

python 感知器神经 python感知机算法_损失函数_03

表示实例的特征向量,对应于输入空间(特征空间)的点;输出

python 感知器神经 python感知机算法_损失函数_04

表示实例的类别。由输入空间到输出空间的如下函数                                                       

python 感知器神经 python感知机算法_python 感知器神经_05

称为感知机。其中w和b为感知机模型参数,

python 感知器神经 python感知机算法_误分类_06

叫做权值或权值向量,

python 感知器神经 python感知机算法_感知机_07

叫做偏置,sign是符号函数,即当x>0,sign(x)=1;当x=0,sign(x)=0;当x<0, sign(x)=-1。

2.感知机学习策略

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确分开的分离超平面。为了找到这样的超平面,即确定感知机模型参数w和b,需要一个学习策略,即定义(经验)损失函数并将损失函数极小化。

损失函数的一个自然选择是误分类点的个数。但这样的损失函数不是参数w和b的连续可导函数,不易优化。损失函数的另一个选择是误分类点到超平面S的总距离,这是感知机所采用的。

输入空间中任一点x0到超平面S的距离:

python 感知器神经 python感知机算法_误分类_08


python 感知器神经 python感知机算法_感知机_09

是w的L2范数。对于误分类点(xi,yi)来说,因为当

python 感知器神经 python感知机算法_感知机_10

时,yi<0;当

python 感知器神经 python感知机算法_感知机_11

时,yi》0,因此,误分类点xi到超平面S的距离是

python 感知器神经 python感知机算法_损失函数_12

。这样,假设超平面S的误分类点集合为M,那么所有误分类点到超平面S的总距离为

python 感知器神经 python感知机算法_python 感知器神经_13

。不考虑w的L2范数,定义感知机

python 感知器神经 python感知机算法_python 感知器神经_05

学习的损失函数定义为

python 感知器神经 python感知机算法_感知机_15


3.感知机学习算法

已知了损失函数,目标就是让损失函数最小化。算法如下:

输入:训练数据集

python 感知器神经 python感知机算法_误分类_16

,其中

python 感知器神经 python感知机算法_误分类_17


python 感知器神经 python感知机算法_误分类_18

,i=1,2,...,N;学习率η(0<η≤1);输出:w和b;感知机模型

python 感知器神经 python感知机算法_python 感知器神经_05


(1)选取初值w0和b0

(2)在训练集上选取数据(xi,yi)

(3)如果有误分类点,即

python 感知器神经 python感知机算法_感知机_11

,则按以下方式迭代

python 感知器神经 python感知机算法_误分类_21

(4)转至(2),直至训练集上没有误分类点。

4.实例

有如下数据集,第一列表示x向量第一个元素,第二列表示x向量中第二个元素,第四列表示y的值,+1或-1,试用感知机学习算法求感知机模型

python 感知器神经 python感知机算法_python 感知器神经_05

,这里w=(w1,w2)T,x=(x1,x2)T。

python 感知器神经 python感知机算法_感知机_23

基于以上实例,我把数据集放在一个Excel文件中,使用Python编写算法,IDE用的是Spyder,初值w0=(0,0)T,b=0,学习率alpha=1,代码如下:

# -*- coding: utf-8 -*-
"""
Created on Mon Aug 20 23:04:52 2018

@author: Huyaoqing
"""

import xlrd  #python官方Excel库

#要训练感知机模型,要修改的参数有:
#excel表格
#数据量大小N
#看情况修改学习率

#training set
data = xlrd.open_workbook('C:\\Users\\12592\\Documents\\MATLAB\\感知机数据集.xlsx')
table = data.sheets()[0]        #打开第一张表
x = [table.col_values(0)[:20], table.col_values(1)[:20]]    #第一列和第二列的数存储到x矩阵中
y = table.col_values(3)[:20]

#parameter
w = [0, 0]      #权重
b=0             #偏置
N=20            #数据量大小
alpha=1         #学习率
iteration=0     #迭代次数
max_iter=200    #最大迭代次数
count=0         #被正确分类的个数
temp=0

#process of iteration
while 1:
    iteration += 1
    
    if iteration > max_iter:
        break
    
    #迭代更新参数
    for i in range(0, N):
        for j in range(0, 2):
            temp += w[j] * x[j][i]
        if y[i] * (temp + b) <= 0:
            temp = 0
            for j in range(0, 2):
                w[j] = w[j] + alpha * (y[i] * x[j][i])
            b = b + alpha * y[i]
            break
        else:
            temp = 0
    
    #计算被正确分类的个数
    for i in range(0, N):
        for j in range(0, 2):
            temp += w[j] * x[j][i]
        if y[i] * (temp + b) > 0:
            count += 1
        temp = 0
    
    #如果等于N。则说明全部分类正确,跳出循环
    if count == N:
        break
    else:
        count = 0

 运行代码,在Spyder这个编辑器里面可以看到变量的值,得到的输出结果为:

python 感知器神经 python感知机算法_python 感知器神经_24

可以看到,迭代次数iteration为84,最终输出的w=(7,3)T,b=-14。因此感知机模型为

python 感知器神经 python感知机算法_误分类_25

,使用MATLAB画图,数据集和感知机的超平面的如图:

python 感知器神经 python感知机算法_感知机_26