摘要:
1、使用标量实现感知器;
2、使用鸢尾花作为训练与测试样本;
鸢尾花:
一、感知器算法与公式
1、感知器训练算法
【计算输出:向前】
(1)随机初始化一组权重(权重个数与输入特征数据个数一样);
(2)对输入的特征数据使用随机初始化的权重,进行加权求和;
(3)使用激活函数,对加权求和的结果做函数运算,最后得到计算输出结果,
【更新权重:反向】
(1)根据向前的计算输出,与样本的数据的期望输出,计算权重的更新梯度;
(2)使用学习率与更新梯度,计算权重的更新值;
(3)使用权重更新值,更新权重;
2、感知器训练计算公式
【向前输出计算公式】
【向后权重更新公式】
如果上面激活函数是恒等函数,公式还可以更加简化。
注意:
(1)我们这里是求最小值,所以权重更新使用减法运算。如果求最大值,则权重更新使用加法运算。
(2)这个缘于选择导数作为梯度的结果,因为极小值点左边导数为负,如果需要逼近极小值点,则需要减去导数,实际上是加上导数的相反数。
二、感知器设计与实现
1、感知器类设计
感知器核心功能就两个:向前计算输出(forward),向后更新权重(backward)。
感知器核心数据就一个:权重(相关数据:输入特征数据,激活函数,学习率)。
2、感知器应用类设计
感知器应用类核心功能也只有两个:训练(train),预测分类(predict)。
感知器应用类核心数据就是训练的参数:训练次数,被训练的感知器,训练样本与期望标签。
3、感知器实现
【导入模块】
【数据初始化】
还有一些后置条件数据,需要在计算过程中初始化,并赋值,比如:计算结果输出y。
【forward函数实现】
注意:其中偏置项需要加上。
【backward函数实现】
4、感知器应用类实现
【数据初始化】
其中需要初始化一个感知器,感知器的构造器参数都是通过应用类构造器传递。
【train函数实现】
其中训练算法应该是达到极小值点就结束,实际上这不太可能,所以采用在指定训练次数,训练次数会根据经验得到一个相对最佳值。
【predict函数实现】
预测分类函数的返回值,实际是训练多测后权重下计算的结果,理论上是接近我们期望的结果。
三、鸢尾花测试效果
现在是测试上面两个类的时候,这里使用鸢尾花数据样本。
1、样本数据介绍
注:下面鸢尾花数据集介绍内容来自【百度百科】
Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理。Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集。数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性。可通过花萼长度,花萼宽度,花瓣长度,花瓣宽度4个属性预测鸢尾花卉属于(Setosa,Versicolour,Virginica)三个种类中的哪一类。其它比较流行的数据集还有Adult,Wine,Car Evaluation等。
iris以鸢尾花的特征作为数据来源,常用在分类操作中。该数据集由3种不同类型的鸢尾花的50个样本数据构成。其中的一个种类与另外两个种类是线性可分离的,后两个种类是非线性可分离的。
该数据集包含了5个属性:
& Sepal.Length(花萼长度),单位是cm;
& Sepal.Width(花萼宽度),单位是cm;
& Petal.Length(花瓣长度),单位是cm;
& Petal.Width(花瓣宽度),单位是cm;
& 种类:Iris Setosa(山鸢尾)、Iris Versicolour(杂色鸢尾),以及Iris Virginica(维吉尼亚鸢尾)。
该数据集使用有两种形式:文本文件,sklearn.datasets模块的封装。这里使用sklearn.datasets封装。
下面是鸢尾花文本数据集截图:
2、样本数据加载
我们使用前100个样本作为测试,记得import模块。
from sklearn import datasets #获取鸢尾花数据样本
下面是数据集加载的代码:
3、感知器构造与感知器应用构造
提示:感知器应用构造后,会自动构造一个感知器。
注意:
(1)激活函数使用的恒等函数,其函数导数恒为1。
(2)学习率最好小点,一般取值为四位小数。
(3)学习率小则训练次数需要多。这个平衡度是一种经验。
(4)鸢尾花的数据集是4维特征数据。
如果学习率,取得较大,很可能训练不会收敛,最后的结果可能是无穷。这里设置的学习率是0.0000001,训练轮数是100000,下面可以看到测试效果。
4、样本训练
样本训练的实现就非常简单了。
训练函数已经封装好,只需要传入训练集与期望标签集,就可以完成训练工作。
5、样本分类测试
训练完毕,就可以使用特征数据测试,这里采用训练样本来测试(当然也可以采用没有参加训练的样本来测试),前面50个期望值是0,后面50个期望值是1,当然输出结果,不可能精确到为0或者1。我们采用近似计算,0.5以下就是0,0.5以上就是1(也可以0.1以下为0,0.9以上为1),所以实现代码如下:
最后训练的测试效果为100%:
鸢尾花文本数据集下载:数据集/01鸢尾花
代码下载:https://github.com/QiangAI/AICode/tree/master/ml01_perceptron