感知器学习算法(PLA)及python实现
1、感知器原理
感知器是最简单的人工神经网络结构之一,由 Frank Rosenblatt 发明于 1957。它是基于一种稍微不同的人工神经元,称为线性阈值单元(LTU):输入和输出现在是数字(而不是二进制开/关值),并且每个输入连接都与权重相连。LTU计算其输入的加权和( z = W1×1 + W2×2 + … + + WN×n = Wt·x ),然后将阶跃函数应用于该和,并输出结果: HW(x) = STEP(Z) = STEP(W^T·x) 。
单一的 LTU 可被用作简单线性二元分类。它计算输入的线性组合,如果结果超过阈值,它输出正类或者输出负类。例如,你可以使用单一的 LTU基于花瓣长度和宽度去分类鸢尾花。训练一个 LTU 意味着去寻找合适的 W0 和 W1 值,。感知器简单地由一层 LTU 组成,每个神经元连接到所有输入。这些连接通常用特殊的被称为输入神经元的传递神经元来表示:它们只输出它们所输入的任何输入。此外,通常添加额外偏置特征( X0=1 )。这种偏置特性通常用一种称为偏置神经元的特殊类型的神经元来表示,它总是输出 1。
引入这样一个例子具体说明一下:某银行要根据用户的年龄、性别、年收入等情况来判断是否给该用户发信用卡。我们把用户的个人信息作为特征向量x,令总共有d个特征,每个特征赋予不同的权重w,表示该特征对输出(是否发信用卡的影响有多大。那所有特征的加权和的值与一个设定的阈值threshold进行比较:大于这个阈值,输出为+1,即发信用卡;小于这个阈值,输出为-1,即不发信用卡。感知器模型,就是当特征加权和与阈值的差大于或等于0,则输出h(x)=1;当特征加权和与阈值的差小于0,则输出h(x)=-1,而我们的目的就是计算出所有权值w和阈值threshold。
2、训练过程
首先随机选择一条直线进行分类。然后找到第一个分类错误的点,如果这个点表示正类,被误分为负类,则
,那表示w和x夹角大于90度,其中w是直线的法向量。所以,x被误分在直线的下侧(相对于法向量,法向量的方向即为正类所在的一侧),修正的方法就是使w和x夹角小于90度。通常做法是,一次或多次更新后的w与x夹角小于90度,能保证x位于直线的上侧,则对误分为负类的错误点完成了直线修正。
同理,如果是误分为正类的点,即
,那表示w和x夹角小于90度,其中w是直线的法向量。所以,x被误分在直线的上侧,修正的方法就是使w和x夹角大于90度。通常做法是,一次或多次更新后的w与x夹角大于90度,能保证x位于直线的下侧,则对误分为正类的错误点也完成了直线修正。
按照这种思想,遇到个错误点就进行修正,不断迭代。要注意一点:每次修正直线,可能使之前分类正确的点变成错误点,这是可能发生的。但是没关系,不断迭代,不断修正,最终会将所有点完全正确分类(PLA前提是线性可分的)。这种做法的思想是“知错能改”。
实际操作中,可以一个点一个点地遍历,发现分类错误的点就进行修正,直到所有点全部分类正确。
3、两个感知器学习算法实例
3.1、这个代码没用包
这个例子是之前我在网上找的,现在忘了在哪个网上找的了,如果侵权请告知删除谢谢!不过(划重点了),在贴出代码之前先说明一下,这个代码的原始程序是错误的(在做预测的时候),就是classify()这个函数(下面贴的是我修改过的正确的)。
下面是代码:

本文介绍了感知器学习算法(PLA)的基本原理,包括线性阈值单元的工作方式和感知器的训练过程。通过示例解释了如何使用感知器进行线性二元分类,并提供了两个Python实现,一个是未使用任何包的代码,另一个利用了sklearn库。此外,还讨论了感知器在处理线性不可分数据时的问题和解决方案。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



