统计学习方法之感知机的Python代码实现

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

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

1.感知机模型

假设输入空间(特征空间)是,输出空间是。输入表示实例的特征向量,对应于输入空间(特征空间)的点;输出表示实例的类别。由输入空间到输出空间的如下函数

                                                       

称为感知机。其中w和b为感知机模型参数,叫做权值或权值向量,叫做偏置,sign是符号函数,即当x>0,sign(x)=1;当x=0,sign(x)=0;当x<0, sign(x)=-1。

2.感知机学习策略

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

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

输入空间中任一点x0到超平面S的距离:是w的L2范数。

对于误分类点(xi,yi)来说,因为当时,yi<0;当时,yi》0,因此,误分类点xi到超平面S的距离是

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

不考虑w的L2范数,定义感知机学习的损失函数定义为

3.感知机学习算法

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

输入:训练数据集,其中,i=1,2,...,N;学习率η(0<η≤1);

输出:w和b;感知机模型

(1)选取初值w0和b0

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

(3)如果有误分类点,即,则按以下方式迭代

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

4.实例

有如下数据集,第一列表示x向量第一个元素,第二列表示x向量中第二个元素,第四列表示y的值,+1或-1,试用感知机学习算法求感知机模型,这里w=(w1,w2)T,x=(x1,x2)T。

基于以上实例,我把数据集放在一个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这个编辑器里面可以看到变量的值,得到的输出结果为:

可以看到,迭代次数iteration为84,最终输出的w=(7,3)T,b=-14。因此感知机模型为,使用MATLAB画图,数据集和感知机的超平面的如图:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值