感知机及其实践

news2024/11/28 11:46:06

说明

     感知机是SVM(support vector machine,支持向量机)的基础,更是机器学习的基础。本文的目的在于把感知机的相关概念捋清楚,并基于感知机做最基本的线性可分的二分类实践。

    有关机器学习的一些基础概念,读者可以参考本专栏的第一篇博文[4]:机器学习系列篇章0 --- 人工智能&机器学习相关概念梳理-CSDN博客 (同样地,第一篇博文的相关概念其实也可以结合本文的内容进行理解)

Blog

2024.10.6  博文第一次撰写

目录

说明

目录

一、概述

二、感知机模型

三、感知机损失函数

四、感知机学习算法

4.1 原始形式及其实践

4.1.1 原始形式说明

4.1.2 原始形式下的算法描述

4.1.3 原始形式下的实践

4.2 对偶形式及其实践

4.2.1 对偶形式说明

4.2.2 对偶形式下的算法描述

4.2.3 对偶形式下的实践

五、总结

六、拓展:非线性可分&多类判别的思考

七、参考资料

八、数据和代码参考


一、概述

    感知机(perceptron)是一种可用于二分类线性分类模型,属于监督学习算法。我在之前的博文[3]中讨论过聚类问题,聚类和分类有诸多相同的地方,也有显著差异:这两种方法的目的都是将多类目标分开,但聚类是一种无监督学习算法,它事先不知道数据类别,而是根据样本的相似性来进行分组,聚类算法更多的是探索性的;分类算法则是需要根据已知类别的数据来训练模型,是预测性的,更侧重于根据已知标签来预测新样本的标签。

    感知机是最简单的二分类模型,它旨在求出一个将输入空间中的实例划分为两类的分离超平面。如果训练数据集是线性可分的,则感知机一定能求得分离超平面(这个超平面不一定是泛化能力/鲁棒性最好的,SVM得到的才是最优的,关于这两者的差异,我会在后续关于SVM的系列文章中做更详细说明),如果是非线性可分的数据,则无法获得超平面。 感知机具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习到的感知机模型对新的实例进行预测。感知机是神经网络和支持向量机的基础

二、感知机模型

    假设训练数据集为:

                                       (2-1)  

    其中,xi ∈X ⊆Rn, xi不是指单个数据,而是一个n维(n≥1)的向量,比如当n=3时,则对应数据在三维空间上,此时我们可以用一个平面去分开空间中的两组数据。yi ∈Y ⊆{+1, -1},对应两种可能的类别。典型的感知机模型为:

                                      (2-2)

    其中,w和b称为感知机模型参数,w为权值,其维度等于x的维度b为偏置。sign函数是符号函数:

                                         (2-3)

    感知机模型的其中一个超平面(在上述模型下,一个显而易见的超平面)是:

w·x + b = 0                                                         (2-4)

    其中,w是超平面的法向量(类比平面方程中各变量的系数可以构成该平面的法向量),b是超平面的截距。这个超平面将样本点分为正负两类。即对所有yi = +1 的样本,都有w*xi + b ≥ 0; 对所有yi = -1 的样本,都有w*xi + b < 0。

三、感知机损失函数

    为求得超平面,感知机引入了基于误分类的损失函数,利用梯度下降法对损失函数进行优化求解,并进而得到超平面。(相关的概念我在[4]中有过介绍)

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

    损失函数的选择,容易想到的是误分点的总数,但是这样的函数不是连续可导的,不易优化。因此感知机采用的损失函数是误分类点到超平面的总距离

    对于三维空间中的点(x0,y0,z0)到平面(Ax+By+Cz+D=0)的距离,我们有公式:

                                              (3-1)

    相似地,如果假设超平面是h = w·x + b ,则样本点x’到超平面的距离为:

                                                     (3-2)

    式中的||w||是w的L2范数(L2范数是指向量中各值的平方和后开根号)。对于数据点(xi,yi),如果分类正确,按照第二章中对感知机模型的描述,w∙xi+b>0 对应yi = +1,那么 必然是大于0的,如果分类不正确则乘积小于0:

                                  (3-3)

    该误分类点到超平面的距离为:

                                                (3-4)

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

                                          (3-5)

    不考虑,我们就可以得到感知机学习的损失函数

                                 (3-6)

    这个损失函数就是感知机学习的经验风险函数,我们需要想办法使其越小越好,直到所有误分类点到超平面S的总距离为0:也即没有误分类的点 。

四、感知机学习算法

4.1 原始形式及其实践

    我们得到感知机损失函数后,感知机学习问题就转化为了求解损失函数的最优化问题。 由于感知机学习算法是误分类驱动的,可以基于随机梯度下降法进行优化求解:任意选取一个超平面(w0,b0),然后用梯度下降法不断地极小化损失函数,极小化过程中不是一次使M中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降,直到不存在误分类点。

4.1.1 原始形式说明

    损失函数L(w,b)的梯度(分别对w和b求导)为:

                                   (4-1)

                                      (4-2)

    于是,如果我们随机选取一个误分类点(xi, yi),则对w和b进行更新的公式为(逆梯度方向)

                                             (4-3)

                                                (4-4)

    (上式中,w的维度和xi的维度一样,xi不是一个值,而是一个向量)

4.1.2 原始形式下的算法描述

    假设输入训练数据集: ,其中,, ,​​​​​​​

,学习率η 为(0<η<1)。 算法流程图如下

图4.1  感知机原始形式下的学习算法流程图

    其中初始值可以随机化设置,上面的流程中,每次迭代是随机选取训练集中的某个数据,当被正确分类的点增多时,可能每次随机选取的都是被正确分类的点,此时循环其实在“空转”,如何快速找到没有被正确分类的数据?这里面是有一些小的细节需要把握的,具体可参考后续的代码。

    上面给出的流程是比较典型的处理方法,在某些情况下如果我们想限制学习的时长(即便此时训练数据集还没有被完全正确分类),此时也可以设置特定的迭代次数、或者设置特定的正确分类率,当到达迭代次数或者特定的正确分类率时,即刻停止学习,退出循环。文章[2]给的代码就是这样通过限制迭代次数来终止循环的,这两种迭代终止条件下的算法流程如下述两图所示:

图4.2  预设训练次数下的感知机学习算法流程图

    这种方法下其实是有风险的:因为在迭代的过程中,如果出现了未被正确分类的数据,我们会更新权值和偏置,更新这两个值后,是有可能存在:之前被正确分类的点在权值和偏置更新后反而被错误分类了!对应到上图的算法流程,也就可能存在:在第N次训练时,其中某个没有被正确分类的数据点导致的权值和偏置的更新,使我们得到的感知机模型分类效果更差了! 训练次数阈值N的选择可能需要多次试验,直到找到某个合适的值。   此外,上面的算法流程中,我们在每次训练时对每个数据都做了一次遍历,这和图4.1算法流程中通过随机选取有些出入。

    预设训练集正确分类率的算法流程图如下:

图4.3  预设训练集分类正确率阈值下的感知机学习算法流程图

    通过预设训练集正确分类率来停止训练的方法是我临时想到的,这种方法和图4.2的不同在于:可以保证训练集的正确分类率。本方法可以说是图4.1经典方法的一种”简化”版本,通过调整正确分类率阈值,从某种程度上,我们可以兼顾正确率和训练时间

    注:在后文的实践部分,我只给出图4.1算法流程图指导下的仿真实践,相关的代码读者可以参考本文第八章的链接,图4.2和图4.3算法流程对应的代码实现只需在4.1的基础上做一点改动即可,读者可以自行完成。

4.1.3 原始形式下的实践

    首先生成可用于二分类的数据集,我直接沿用了之前聚类博文[3]中的代码,在二维平面上生成数据,结果如下:

图4.4  随机生成的可线性二分类的数据集

    随后基于图4.1中的流程以及前述理论公式,从生成的数据集中选取了一部分作为模型训练的训练集,剩余的作为模型测试的测试集,权值、偏置、学习率都是在(0 1)区间内随机生成。得到的训练以及测试结果如下:

图4.5 原始形式下的感知机学习和分类结果

    图中直线对应训练得到的分类超平面,实心圆圈对应训练集,空心圆圈对应测试集,从图中可以看到,训练以及分类的结果符合预期:没有误分类的点。算法迭代了860次,每次迭代下的分类超平面如下图所示:

图4.6  各次迭代下的分类超平面

4.2 对偶形式及其实践

    对偶形式是对算法执行速度的优化

4.2.1 对偶形式说明

    从前述原始形式我们看到:每次梯度的迭代都是选择一个样本来更新w和b,最终经过若干次迭代后得到最终的结果。在迭代过程中,对于从来没有被误分过的样本,它被选择参与w和b迭代修改的次数为0,对于被多次误分类的样本,我们假设其参与对w和b迭代的次数为ni。那么对于该参与ni次迭代的样本(xi,yi),它单独参与的对w和b贡献的量为:

    (对w的贡献)                                (4-5)

     (对b的贡献)                                      (4-6)

    如果我们假设w和b的初始值都为0,将前述公式推广至全部对迭代有贡献的数据点,则迭代完成后w和b的公式为:

                                        (4-7)

                                            (4-8)

    有了上式后,我们可以得到对偶形式下的感知机模型

            (4-9)

    在判断误分类时,对于任意点(xi, yi),我们可以用下式来判断其是否为误分类点(注意这里以及后续的i和j之间所表示意思的区别):

             (4-10)

    这个判断误分类的形式里面是计算两个样本xi和xj的内积,而且这个内积计算的结果在下面的迭代次数中可以重用。如果我们事先用矩阵运算计算出所有的样本之间的内积,那么在算法运行时,仅仅一次的矩阵内积运算比多次的循环计算省时。计算量最大的判断误分类这儿就省下了很多的时间,这也是对偶形式的感知机模型比原始形式优的原因。

    对偶形式中训练实例仅以内积的形式出现,为了减少计算量,我们可以预先将训练集样本间的内积计算出来,也就是Gram矩阵:

                                           (4-11)

4.2.2 对偶形式下的算法描述

    令,(它是一个大小为1*m的数组,m为数据量的大小,在得到最终的结果之前,我们需要为训练集中的每个数据分配一个α),假设输入训练数据集: ,其中,xi ϵ X ⊆ Rn, yi ϵ Y={+1,-1},学习率η 为(0<η<1)。 算法流程如下:

1. 初始化α = zeros(1,m),η可以随机设置;

2. 在训练集中任意选取数据(xi,yi);

3. 如果 ,则认为该点是误分点,进行参数更新:(在求解时,我们就可以用到Gram矩阵)

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

5. 输出α向量,并得到训练好的感知机模型:

4.2.3 对偶形式下的实践

    对偶形式下所用的数据集与4.1.3节一样,权值以及学习率也是随机生成的。得到的学习和分类结果如下:

图4.7 对偶形式下的感知机学习和分类结果

也没有误分类的点,结果符合预期。对偶形势下一共迭代了600次,各次下的超平面如下图所示:

图4.8  各次迭代下的分类超平面

备注:关于两种形式的选择

  • 如果特征数过高,计算内积非常耗时,应选择对偶形式算法加速。
  • 如果样本数过多,每次计算累计和就没有必要,应选择原始算法。

    此外,需要注意的是:从前述对感知机的理论分析来看,只要训练集中没有了误分类的点,迭代便会停止,感知机这套理论主要关注得到超平面,不考虑超平面是不是最优的,超平面只是严格地对训练集负责,其泛化性不高。所以在分类测试时,像前述两个实践下分类准确率为100%的情况其实并不会多见。关于如何得到更优的、泛化性更好的超平面,是SVM要解决的问题,读者可以关注我后续的博文。

五、总结

    本文围绕机器学习中基础的感知机模型展开,首先对其基本概念进行了介绍,随后给出了感知机的数学模型以及模型的求解方法(引入了损失函数,通过优化该函数来求得感知机的二分类模型),最后分别对其原始形式和对偶形式做了说明,并分别进行了仿真实践,实践的结果验证了理论以及所编代码的正确性。本文的工作很基础,不过为后续更复杂的多分类、SVM模型以及众多机器学习算法的认识和理解打了点基础。

六、拓展:非线性可分&多类判别的思考

    前文讨论的都是针对最基本的、线性可分的二分类情况(事实上,这种情况在实际应用中是很少见的),如果待分类的目标是线性不可分的?或者类型不止两种呢?如下面两图所示:

图6.1  线性不可分的情况示例

图6.2  多类别的情况示例

    有关这两种情况下的分类方法,我在后续的SVM系列博文中会进行探讨。

七、参考资料

[1] 【机器学习】感知机原理详解_感知机算法原理-CSDN博客

[2] 感知机介绍及MATLAB实现_感知机对100个数据分类matlab-CSDN博客

[3] (毫米波雷达数据处理中的)聚类算法(1) --- 概述-CSDN博客

[4] 机器学习系列篇章0 --- 人工智能&机器学习相关概念梳理-CSDN博客

八、数据和代码参考

感知机及其实践博文相对应的代码资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192345.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle创建用户报错-ORA-65096: invalid common user or role name

问题描述 ORA-65096: invalid common user or role name 原因分析 这可能是创建角色的容器为cdb导致&#xff0c;当然如果想继续执行&#xff0c;可以在角色名前加C##或者c##&#xff0c;但是这样会导致用户名多了c##&#xff0c;我们不要这样的用户名 解决步骤 用sysdba 登录&…

SCUC博客摘录「 储能参与电能市场联合出清:SCUC和SCED模型应用于辅助服务调频市场(IEEE39节点系统)」2024年10月6日

2.1 SCUC模型在本方法中&#xff0c;首先利用SCUC模型确定机组出力计划和储能充放电计划。SCUC模型是电力系统经济调度的重要工具&#xff0c;通过优化发电机组出力计划和调度&#xff0c;实现电力系统的经济性和可靠性。在考虑储能的情况下&#xff0c;SCUC模型需要考虑储能的…

vue3常用组件通信方法

title: vue3常用组件通信方法 date: 2024-10-06 15:00:54 tags: vue3 组件通信 一、父传子—defineProps 1.父亲 通过属性传值 2.儿子 通过defineProps接收相关的数据 二、子传父 1&#xff09;使用defineExposeref 1.子组件 在子组件中使用defineExpose先暴露出来 2.父…

基础算法之滑动窗口--Java实现(上)--LeetCode题解:长度最小的子数组-无重复字符的子串-最大连续1的个数III-将x减到0的最小操作数

这里是Thembefue 今天讲解算法中较为经典的一个算法 > 滑动窗口 本讲解主要通过题目来讲解以理解算法 讲解分为三部分&#xff1a;题目解析 > 算法讲解 > 编写代码 滑动窗口 在正式进入题目的讲解之前&#xff0c;得先了解一下什么是滑动窗口&#xff0c;以及应该在什…

一篇文章教会你DHT11读取温湿度,附STM32代码示例

目录 一、DHT11说明&#xff1a; 1.典型电路&#xff1a; 2.串行通信说明&#xff08;单线双向&#xff09;&#xff1a; 单总线说明&#xff1a; 单总线传送数据位定义&#xff1a; 校验位数据定义&#xff1a; 二、DHT11读取时为啥要切换模式&#xff1a; 1. 通信时序…

基于深度学习的手势控制模型

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…

理解递归和回溯

文章目录 什么是递归回溯 什么是递归 回溯 //使用递归回溯来给小球找路//说明//1. map 表示地图//2. i,j 表示从地图的哪个位置开始出发 (1,1)//3. 如果小球能到 map[6][5] 位置&#xff0c;则说明通路找到.//4. 约定&#xff1a; 当map[i][j] 为 0 表示该点没有走过 当为 1 表…

【Python】wxPython 高 DPI 缩放问题(笔记本上字体模糊问题)

问题 使用 wxPython 编写的程序在某些高 DPI 的电脑&#xff08;通常是笔记本&#xff09;上显示出来的字体会非常模糊&#xff1a; 事实上 wxPython 是支持高 DPI 的&#xff0c;但是由于我们的程序没有显式指明支持高 DPI&#xff0c;因此系统默认不支持高 DPI&#xff0c;…

Bolt.new:终极自动化编程工具

兄弟们&#xff0c;终极写代码工具来了—— Bolt.new&#xff01;全方位的编程支持&#xff1a; StackBlitz 推出了 Bolt․new&#xff0c;这是一款结合了 AI 与 WebContainers 技术的强大开发平台&#xff0c;允许用户快速搭建并开发各种类型的全栈应用。 它的主要特点是无需…

【小沐学GIS】QGIS导入导出OpenStreetMap数据(QuickMapServices、OSM)

文章目录 1、简介1.1 OpenStreetMap地图1.2 QGIS 2、安装插件2.1 QuickMapServices2.2 OSMDownloader2.3 Qgis2threejs 3、使用插件结语 1、简介 1.1 OpenStreetMap地图 https://www.openstreetmap.org/ https://extract.bbbike.org/ Openstreetmap是一种开源地图&#xff0c…

微服务swagger解析部署使用全流程

1、介绍 swagger是一个在线接口说明文档&#xff0c;在代码中通过注解的方式将说明问题集成到项目&#xff0c;代码发生修改&#xff0c;说明文档同步修改&#xff0c;前后台联调可以快速同步数据。 2、应用 1、引入依赖 <dependency><groupId>io.springfox<…

如何使用ssm实现基于Web的穿戴搭配系统的设计与实现+vue

TOC ssm784基于Web的穿戴搭配系统的设计与实现vue 第1章 绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展&#xff0c;用了短短的几十年时间就风靡全球&#xff0c;使得全球各个行业都进行了互联网的改造升级&#xff0c;标志着互联网浪潮的来临。在这个新的时代&…

新机配置Win11

Win11跳联网 在连接网络的界面输入ShiftF10打开命令行&#xff0c;然后输入oobe\bypassnro然后会重启&#xff0c;在联网的界面就可以进行跳过了。 编码 在中国大陆Windows使用的编码是GBK编码 查看电脑系统版本 WinR输入winver即可 桌面图标 设置->个性化->主题…

Art. 1 | 信号、信息与消息的区别及其在通信中的应用

信号、信息与消息的区别及其在通信中的应用 通信技术是现代社会的基石&#xff0c;其广泛应用于日常生活的各个方面。从手机、互联网到企业信息管理&#xff0c;通信系统无处不在。在这一技术领域中&#xff0c;信号、信息和消息是三大基础概念&#xff0c;支撑着整个通信系统…

03 去重排序

题目&#xff1a; 桶排序变体&#xff1a; #include<iostream> #include<algorithm> using namespace std; #define M 100005 int a[M];int main() {int N;cin>>N;int count0;for(int i1;i<N;i){int temp;cin>>temp;if(a[temp]1){continue;}else{a…

[C语言]第十一节 函数递归一基础知识到高级技巧的全景探索

目录 11.1. 递归是什么&#xff1f; 11.1.1 递归的思想&#xff1a; 11.2 递归的限制条件 举例1&#xff1a;求n的阶乘 画图推演 举例2&#xff1a;顺序打印⼀个整数的每⼀位 画图推演 11.3. 递归与迭代 举例3&#xff1a;求第n个斐波那契数 11.1. 递归是什么&#xff…

oh-topic-editor: OpenHarmony HarmonyOS平台上基于RichEditor实现的支持添加话题、@用户的文本编辑组件

需求 在App开发中&#xff0c;我们常常会遇到发布文章、评论的时候需要添加话题或者用户的需求&#xff0c;就像微博那样。这在Android、iOS或者其他平台上都有现成的组件可供使用&#xff0c;但是HarmonyOS NEXT作为一个新兴平台&#xff0c;三方库实在匮乏&#xff0c;连微博…

SpringBoot中,接口签名,通用方案,以确保接口的安全性

1. 为什么需要接口签名&#xff1f; 接口签名目的&#xff1a;防止第三方伪造请求。请求伪造&#xff1a;未经授权的第三方构造合法用户的请求来执行不希望的操作。转账接口示例&#xff1a;展示了如果接口没有安全措施&#xff0c;第三方可以轻易伪造请求&#xff0c;例如将资…

用户在网页上输入一个网址,它整个页面响应的流程是什么?

目录 一、流程的大致过程 二、流程的详细分析 1. 浏览器先分析超链接中的URL 2. DNS解析 3. 建立TCP连接 建立连接&#xff08;三次握手&#xff09; HTTP中的请求报文 4. 浏览器发送HTTP请求 5. 服务器处理请求并发送响应 HTTP的响应报文 6. 浏览器接收响应 7. 渲…

After-kaoyan

知乎 - 安全中心 有态度&#xff0c;有回应&#xff0c;有温度&#xff0c;是跟双鱼相处的基础 我今天跟大家泄漏一个秘密&#xff0c;这个秘密也很简单&#xff0c;就是我每次遇到困难险阻时候我从不退缩&#xff0c;我也不会想着&#xff1a;“算了吧&#xff0c;我做不到&a…