您的位置:首页 > 编程语言

neural network for machine learning(第三周编程作业)----感知机算法

2017-04-21 19:47 585 查看
neural network for machine learning(第三周编程作业)----感知机算法

这篇博客主要结合hinton大神的neural network for machine learning第三周的编程作业来介绍下感知机算法,先来看下感知机,感知机可以说是最简单的神经网络了,因为它只有两层,输入层和输出层,不包含隐藏层,感知机模型如下所示:



前以前介绍神经网络的博客中也介绍过利用感知机可以轻易的实现逻辑与、或、非运算,具体参见这篇博客。感知机只有输出层的神经元进行激活函数处理,几种常见的激活函数在以前的博客也有,具体参见这篇博客。因为感知机没有隐藏层(hidden
layers),所以感知机的能力非常有限,它只能处理线性可分问题(线性可分的意思:存在一个线性超平面能把两类模式分开),比如下面的两张图就线性不可分(图片来自Hinton nn课):

                       

                     

     

要想解决非线性问题,就要使用带隐藏层的神经网络了,这个不在这篇博客的讨论范围之内。

关于感知机权重W的调整:

感知机权值可以这样调整:



其中,

 为权重,

 为学习率(learning rate),

 为样本的真是类别,

 为预测值,

 称为权重的改变量。从公式能够看出,若预测正确,则感知机的权重保持不变,否则根据错误的程度进行权重调整。
examples:
假如激活函数使用二元阈值函数(binary threshold neuron),二元阈值函数详情如下:



样本类别为:negative class 用0表示,positive class 用1表示,则权重调整方法为:

If the output unit is correct, leave its weights alone.
If the output unit incorrectly outputs a zero, add the input vector to the weight vector.
If the output unit incorrectly outputs a 1, subtract the input vector from the weight vector.
下面主要结合Hinton第三周的编程作业来体会下感知机的算法以及在数据集上的表现,编程语言依然是Matlab,也可以使用octave(可以看做免费版的Matlab),其实也可以Python写都一样。编程作业环境和ng的《machine learning》差不多,都是把大框架都搭好了,只要写一点核心算法的code,说白了就是实现上面描述的权重调整算法。作业给了4个数据集:



基本就是在四个数据集上跑跑感知机算法,他想让你用的激活函数是二元阈值函数(额。。这个比较坑的一点,害的我搞了一晚上,看它代码一直以为是线性的,没把预测值离散化,作业题还是不能放到网上的,对其他同学不好,不多说了,还有不明白的同学可以给我留言一起探讨下)。
dataset1上感知机算法运行过程图:



其中红色代表误分的样本,绿色代表正确分类的样本,右上是随着迭代次数的进行误分样本的个数,最下面的图是随着迭代次数的进行求得权重参数与最优权重向量之间的距离。从图中能够看出,迭代5次后感知机算法就收敛了。
下面直接给出剩下几个数据集的效果图:
dataset2:



从图中能够看出感知机算法无法收敛。

dataset3:



dataset4:



其实它给的框架核心代码写的略繁琐,可以不用判断的,直接一个公式

 就可以了。

下面把learning rate设为2,看看效果(dataset3,其他的就不展示了):



能够发现经过14次迭代,感知机算法最终收敛了,其实这验证了一个结论:只要两类模式是线性可分的,那么一定存在一个线性超平面能将他们分开,感知机的学习过程一定会收敛。

欢迎大家留言交流。
参考资料:

《机器学习》周志华著
neural network for machine learning by hinton
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐