基于Python的单层感知器分类算法的实现
2018-06-02佘朝兵
佘朝兵
摘要:分类是一种非常重要的数据挖掘方法,目的是根据训练数据集的属性数据构建分类模型,为预测提供依据。通过python实现单层感知器模型,并利用iris数据验证了构建的单层感知器的训练效果。实验表明,单层感知器可有效进行数据分类。
关键词:单层感知器;神经网络;分类
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)10-0190-02
1 引言
机器学习算法可以分为有监督学习和无监督学习两类。而分类是监督学习的一个核心问题[1]。分类算法可以应用在不同的领域,如文本分类、图像识别、客户细分、入侵检测等。具体来说,在银行的贷款业务中,区分客户的贷款能力显得尤其重要。通过分类算法,利用客户的属性特征可以构建一个分类模型,通过该分类模型可以对客户按贷款风险进行分类,从而为银行贷款业务提供决策依据。总之,分类算法应用范围非常广,具有较高的应用价值。而许多统计方法也用于分类,主要有k邻近法、感知机、朴素贝叶斯、决策树等等。深度学习因为阿尔法狗等事件被人所熟知,深度学习成为机器学习的热点。而单层感知器是深度学习的基础,实现单层感知器分类算法有助于理解深度学习,为相关技术研究提供借鉴。
2 单层感知器算法
2.1 算法原理
单层感知器将外部输入数据进行加权处理,利用事先设置好的阀值与加权处理的结果进行比较,如果结果大于或者等于阀值,则激活函数的结果为+1,表示该对象属于一类;反之,如果加权结果小于阀值,则激活函数的结果为-1,表示该对象属于另外一个类别。其中外部输入数据表示为[x=x1x2?xn];对应的权重为[w=w1w2?wn];对应的加权处理函数为[z=w1*x1+…+wn*xn];激活函數为[?z=1 if z≥θ-1 otherwise]。为了计算的方便,一般将阀值[的相反数-θ]看成是权重[w0],而在输入数据部分增加对应的[x0=1]。因此,上述加权处理函数可变为[z=w0*x0+…+wn*xn=i=0nwi*xi=WTX];而激活函数则为[?z=1 if z≥0-1 otherwise]。
2.2 算法步骤
根据上节所述,单层感知器的算法步骤如下:
步骤1:获取训练样本数据X;
步骤2:初始化权重向量W为0或者将权重向量初始化为属于区间[0,1]之间的数;
步骤3:将权重向量与训练数据输入单层感知器,通过激活函数,得到分类结果;
步骤4:根据分类结果,更新权重和阀值;
步骤5:利用更新的权重和阀值;
步骤6:重复步骤3、4、5直到达到指定重复次数。
步骤7:将预测数据输入单层感知器,利用最终的权重和阀值得到分类结果。
在上述步骤中,关键的步骤是更新权重和阀值。权重更新的公式如下:
[wj=wj+?wj]
[?wj=δ*y-y'*xj]
其中[wj]表示第j个权重值,[?wj]表示第j个权重的更新值,[δ]表示学习率,而y表示正确的分类结果,[y']表示感知器的分类结果,[xj]表示训练样本中第j个输入值。
3 代码实现
Python是一种面向对象的解释性编程语言,由于它具有易读性、简洁性、可扩展性,现今已成为国内外知名高校的教学语言。Python具有丰富和强大的库,主要用于科学计算。在人工智能时代,Python在机器学习领域发挥越来越大的作用。Winpython以及anaconda都是python的开源项目,其中anaconda包含了大量的用户科学计算的库,具有丰富的数据处理功能。因此本文在anaconda上构建单层感知器的模型。具体代码如下:
import numpy as np
class Perceptron(object):
def _int_(self,eta,n_iter):
self.eta=eta;
self.n_iter=n_iter
pass
def fit(self,X,y):
self.w_= np.zeros(1+X.shape[1])
self.errors_=[]
for _ in range(self.n_iter):
errors=0
for xi,target in zip(X,y):
update = self.eta*(target-self.predict(xi))
self.w_[1:]+=update*xi
self.w_[0]+=update
errors += int(update != 0.0)
self.errors_.append(errors)
pass
pass
pass
def net_input(self,X):
return np.dot(X,self.w_[1:])+self.w_[0]
pass
def predict(self,X):
return np.where(self.net_input(X)>=0.0,1,-1)
pass
pass
4 应用实例
4.1 数据来源
本节结合上节构建的单层感知器模型,以iris数据集为训练数据,测试构建的单层感知器的实现效果。Iris数据集是常用的分类实验数据集,包含了150个数据集、共三种类型,每类50个数据集,每个数据保存花的属性数据,主要属性分别是花萼长度、花萼宽度、花瓣长度、花瓣宽度以及花的类型。Iris数据集结构以及部分实例数据如表1所示。
4.2 数据预处理
由于数据集中前两种类型的数据是线性可分的,后两种类型是非线性可分。单层感知器适用于线性可分的数据集的分类。因此本文首先对数据集进行预处理,只提取前两类花型的数据,即iris数据集的前100条记录。与此同时,为了测试的方便,本文主要选取花萼长度(Sepal Length)和花瓣长度(Petal Length)这两个属性作为训练数据集。除此外,在数据集中,由于花的类型是字符串类型,而其他属性是浮点型,为了计算的方便,需将花的类型数据进行转化,本文将“Iris-setosa”用数字-1替换,而将“Iris-versicolor”用数字1替换。
4.3 测试结果
本文利用之前构建的单层感知器模型,通过对iris前100条数据进行预处理后,输入到模型进行训练,模型的参数设置如下:设学习率为0.02,迭代次数为10次。最终训练后的显示结果如1所示。
图1中横坐标表示花萼长度,纵坐标表示花瓣长度,红色方框表示Iris-setosa,蓝色×表示Iris-versicolor。由图中,经过单层感知器的训练,可通过图中的斜线准确区分两种类型的花。最终结果显示错误率为0.在每次迭代过程的判断花的类型出现错误的数据的统计图如图2所示。
图2中横坐标表示迭代过程训练数据记录,纵坐标表示错误次数。由于每次迭代共预测100条记录数据,总共10次迭代,因此横坐标数据共达1000。由图2可知,最终错误次数为0.
参考文献:
[1] 王红军,陈庆新,陈新,等.基于效用分析的客户聚类方法研究[J].计算机集成制造系统,2003,9(3):237-241.
[2] 宋世杰,胡华平,胡笑蕾,等.数据挖掘技术在网络型异常入侵检测系统中的应用[J].计算机应用,2003,23(12):20-23.
[3] 王必强,毕硕本,董学士.基于单层感知器的数据挖掘分类的设计与实现[J].计算机技术与发展,2010,20(9):111-114..
[4] 易中凯,吴沧浦.一种快速的单层感知器网络学习算法[J].计算机工程,2001,27(12):43-45.