实现简单感知机_感知机的原始算法与对偶算法

2023-11-11

一、感知机模型

感知机是一个二分类的线性分类模型,输入为实例的特征向量,输出实例的类别,取1,-1两个值,输入判别模型。它适用于线性可分的数据集的分类,所谓线性可分,就是两类数据可以用空间中的一个超平面分离,即存在参数

,当
属于其中一类时,
,当
属于另一类时,
。对于平面情况示意图如下所示:

线性可分示意图

定理:样本集线性可分的充要条件是两类数据集张成的凸包的交集为空集

证明:

必要性:显然(只需注意到开半平面是凸集,每类点各包含在一个开半平面中,所以每类点的凸包各包含在一个开半平面中,由于两个开半平面不交,所以两类点的凸包不交)

充分性:显然(只需注意到有限个点生成的凸包是闭的且是有界的,则是紧的,由于它们不交,所以必有正距离。由超平面严格分离定理,存在超平面,将这两个凸包严格分离,即将两类点严格分离)

注:两个闭集互不相交不能推出两个闭集间有正距离,除非至少有一个是紧致的。

我们的目的是计算出该超平面的参数,即确定

,得到函数
,对于一个新样本
,即可根据
的符号进行分类。即最终需要构造的函数为:

,当
时取1,否则取-1。这样对于新样本,即可根据
的输出1,-1进行分类。为了简单起见,我们将每个实例点
增加一维,变成
,同时将
合成一个向量:

,这样,要训练模型就变成了:

,其中
是需要计算的参数。对于训练数据集来说,第一类标签
,第二类标签
,如果超平面可以将训练数据集完全分类正确,那么

定号,我们训练使得对所有
的超平面。即

的点是误分类点。将所有误分类点构成的集合记为
,如果没有误分类点,则:

如果存在误分类点,则

所以我们将

定义为损失函数,并将它极小化。

二、感知机原始形式算法

,我们采用梯度下降法对
进行更新。极小化过程不是一次对
中所有点进行梯度下降,而是一次随机选取一个误分类点进行。即随机选取一个误分类点,
,则参数更新:
称为学习率。这就是感知机的原始算法:

(1)、将每一类的

增加一维1,仍然记为

(2)、第一类所有

不变,第二类所有
反号,构成的集合仍称为训练集

(3)、在训练集任取一个

,如果
,则

(4)、转至(2),直到没有误分类点

在实际训练中,我们往往设置训练的次数来决定训练是否结束。

三、原始算法的实现

我们使用感知机算法对

数据集进行两类分类,关于该数据集的格式以及读取代码,在前面
以及朴素
分类器的推文中都有介绍,这里不再赘述。下面给出分类源代码
%调用自定义函数读取训练集中的数据
Train=loadMNISTImages('train-images.idx3-ubyte');
%增加一位特征,仍记为Train
A(1,1:60000)=1;
Train=[A;Train];
%调用自定义函数读取训练集中数据标签
Trainlabels=loadMNISTLabels('train-labels.idx1-ubyte');
%根据标签对训练集中的数据分类,分别记为M{1,1},M{1,2}...M{1,10}
count=ones(1,10);
for i=1:60000
    M{1,Trainlabels(i,1)+1}(:,count(1,Trainlabels(i,1)+1))=Train(:,i);
    count(1,Trainlabels(i,1)+1)=count(1,Trainlabels(i,1)+1)+1;
end

%调用自定义函数读取测试集中的数据
Test=loadMNISTImages('T10K-images.idx3-ubyte');
%增加一位特征,仍记为Test
B(1,1:10000)=1;
Test=[B;Test];
%调用自定义函数读取测试集中数据标签
Testlabels=loadMNISTLabels('t10k-labels.idx1-ubyte');
%根据标签对训练集中的数据分类,分别记为N{1,1},N{1,2}...N{1,10}
count=ones(1,10);
for i=1:10000
    N{1,Testlabels(i,1)+1}(:,count(1,Testlabels(i,1)+1))=Test(:,i);
    count(1,Testlabels(i,1)+1)=count(1,Testlabels(i,1)+1)+1;
end
%设置学习率
eta=1;
%迭代算法,训练模型,得到感知机参数w
%两两分类,循环45次
for s=1:9
    for t=(s+1):10
M{1,t}=-M{1,t};
P=[M{1,s},M{1,t}];
[m,n]=size(P);
w=randn(1,785);
for j=1:200
  for i=1:n
    if (w)*P(:,i)<0
        w=w+eta*(P(:,i))';
    end
  end
end
%计算训练准确率
k=0;
for i=1:n
    if (w)*P(:,i)>=0;
        k=k+1;
    end
end
Trainaccuracy(s,t)=k/n;
%将得到的模型用于测试
N{1,t}=-N{1,t};
Q=[N{1,s},N{1,t}];
[m,n]=size(Q);
k=0;
for i=1:n
    if (w)*Q(:,i)>=0;
        k=k+1;
    end
end
%计算测试准确率
Testaccuracy(s,t)=k/n;
    end
end
%Trainaccuracy,Testaccuracy分别是训练得到的模型在训练集与测试集上,
%对数字i-1与数字j-1分类的准确率(j>i)

由于该算法中有随机参数,每次运行得到的结果是不一样的。

在训练集与测试集上两两分类的准确率如下所示

训练200论:

训练500论

训练2000论

四、感知机的对偶算法

在原始形式的算法中,不妨假设

的初始值为0,对误分类点
,修改
的系数为:

,在学习率给定的情况下,
的增量只与误分类点
有关,通过这种方式逐步修改
的值。假设共修改了
次,假设其中有
次是由错分样本
而引起的修改,则
关于样本
的增量为
,其中
。最后学习得到的参数

,其中
为训练集中的总样本个数。如果
分类错误一次,对应的
的增量为
,对应的
的增量为
,这样就得到了感知机的对偶形式。对于一个特征向量
,如果
,则分类正确,反正则分类错误。

通过训练数据集计算的参数是

。对偶算法如下:

(1)、随机初始化参数

(2)、在训练集中选取数据

(3)、如果

,则:
。这样算法复杂度过高。我们进行批更新,即对所有
都遍历一遍后,更新一次

(4)、转至(2),直到没有误分类数据。

这样就得到了

,从而得到
,进而可对测试数据集分类。

在实际训练中,我们往往设置训练的次数来决定训练是否结束。在对偶形式中,训练实例只与内积形式出现,为了方便,可以预先将实例间的内积计算出来并以矩阵形式存储,这就是

矩阵,

五、对偶算法的实现

源代码如下:

%调用自定义函数读取训练集中的数据
Train=loadMNISTImages('train-images.idx3-ubyte');
%增加一位特征,仍记为Train
A(1,1:60000)=1;
Train=[A;Train];
%调用自定义函数读取训练集中数据标签
Trainlabels=loadMNISTLabels('train-labels.idx1-ubyte');
%根据标签对训练集中的数据分类,分别记为M{1,1},M{1,2}...M{1,10}
count=ones(1,10);
for i=1:60000
    M{1,Trainlabels(i,1)+1}(:,count(1,Trainlabels(i,1)+1))=Train(:,i);
    count(1,Trainlabels(i,1)+1)=count(1,Trainlabels(i,1)+1)+1;
end

%调用自定义函数读取测试集中的数据
Test=loadMNISTImages('T10K-images.idx3-ubyte');
%增加一位特征,仍记为Test
B(1,1:10000)=1;
Test=[B;Test];
%调用自定义函数读取测试集中数据标签
Testlabels=loadMNISTLabels('t10k-labels.idx1-ubyte');
%根据标签对训练集中的数据分类,分别记为N{1,1},N{1,2}...N{1,10}
count=ones(1,10);
for i=1:10000
    N{1,Testlabels(i,1)+1}(:,count(1,Testlabels(i,1)+1))=Test(:,i);
    count(1,Testlabels(i,1)+1)=count(1,Testlabels(i,1)+1)+1;
end
%设置学习率
eta=1;
%迭代算法,训练模型,得到感知机参数a
%两两分类,循环45次
for s=1:9
    for t=(s+1):10
M{1,t}=-M{1,t};
P=[M{1,s},M{1,t}];
[m,n]=size(P);
%计算训练数据集的Gram矩阵
Gram_Train=P'*P;
% a初始化
a=randn(1,n);
for j=1:200
    T=Gram_Train*a';
  for i=1:n
    if T(i,1)<0
        a(1,i)=a(1,i)+eta;
    end
  end
end
%计算训练准确率
k=0;
T=Gram_Train*a';
for i=1:n
    if T(i,1)>0
        k=k+1;
    end
end
%Trainaccuracy,Testaccuracy分别是训练得到的模型在训练集与测试集上,
%对数字i-1与数字j-1分类的准确率(j>i)
Trainaccuracy(s,t)=k/n;
%将得到的模型用于测试
w=P*a';
N{1,t}=-N{1,t};
Q=[N{1,s},N{1,t}];
[m,n]=size(Q);
k=0;
for i=1:n
    if (w')*Q(:,i)>=0;
        k=k+1;
    end
end
%计算测试准确率
Testaccuracy(s,t)=k/n;
    end
end

学习率设为1,两两循环200论,得到在训练集上的准确率与测试上的准确率如下(矩阵的ij元表示数字i-1与数字j-1的分类准确率)

训练集上的准确率

测试集上的准确率
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现简单感知机_感知机的原始算法与对偶算法 的相关文章

  • ttl计算机,如何利用生存时间值(TTL)来判断操作系统

    一 什么是TTL TTL Time To Live 生存时间 是IP协议包中的一个值 当我们使用Ping命令进行网络连通测试或者是测试网速的时候 本地计算机会向目的主机发送数据包 但是有 的数据包会因为一些特殊的原因不能正常传送到目的主机
  • nginx服务器搭建好但是浏览器却无法访问原因排查

    问题 1 查看ip地址 2 xshell中访问nginx服务器 curl 服务器地址 curl 172 17 199 190 出现如下界面说明服务器搭建完成 3 在浏览器输入该网址 但是却无法打开 问题一 nginx监听的端口是否被占用 查
  • Kbuild系统源码分析(四)—./scripts/Makefile.build

    版权声明 本文为CSDN博主 ashimida 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net lidan113lidan article details
  • Machine Learning Park--EM(最大期望算法)

    9 EM算法 最大期望算法 在前面聚类的博客当中 我们简单的讲解过使用EM算法求解GMM模型的过程 这里我们对EM算法深入进行探讨 本文Github仓库已经同步文章与代码https github com Gary code Machine
  • android缓存面试,Android面试——Glide 的缓存原理

    Glide 内部是使用 LruCache 弱引用和硬盘缓存实现的 Glide 主要将缓存分为两块内存缓存和硬盘缓存 两种缓存的结合 构成了 Glide 缓存机制的核心 内存缓存skipMemoryCache true 默认是开始缓存的 如果
  • 【数据结构】二叉树、堆多图详解(TopK、堆排序)

    和光同尘 我的个人主页 应该在肩膀上长着自己的脑袋 弗拉基米尔 伊里奇 列宁 二叉树 堆的概念及应用 前言 1 数的概念及结构 1 1 树的概念 1 2 树的相关概念 1 3 数的表示 2 二叉树概念及结构 2 1 概念 2 2 特殊二叉树
  • keil_lic.exe注册机使用

    第一步 以管理员身份运行keil5 第二步 打开File中的License Management 第三步 复制CID 第四步 选择对应的Target为ARM 粘贴CID 复制生成的注册码 第五步 将注册码粘贴到这 就ok了
  • Android实现折叠式Toolbar:CollapsingToolbarLayout 使用教程与解析

    简介 在各种不同的应用中 大家可能会经常见到这样一个效果 Toolbar是透明的 有着一个背景图片以及大标题 随着页面向上滑动 其标题逐渐缩放到Toolbar上 而背景图片则在滑动到一定程度后变成了Toolbar的颜色 这种效果也即是折叠式
  • 类与类之间的关系图(Class Diagram,UML图)

    一 简介 二 类的构成 三 类之间的关系 Relationship 1 单向关联 2 双向关联 3 自身关联 4 多维关联 N ary Association 5 泛化 Generalization 6 依赖 Dependency 7 聚合
  • FlatBuffers

    概述 FlatBuffers是google最新针对游戏开发退出的高性能的跨平台序列化工具 目前已经支持C C Go Java JavaScript PHP and Python C和Ruby正在支持中 相对于json和Protocol Bu
  • 很有用的一些的Python小工具送给你

    导读 python作为越来越流行的一种编程语言 不仅仅是因为它语言简单 有许多现成的包可以直接调用 Python作为越来越流行的一种编程语言 不仅仅是因为它语言简单 有许多现成的包可以直接调用 python中还有大量的小工具 让你的pyth
  • Sql Server 日期函数

    1 一个月第一天的复制 保存Select DATEADD mm DATEDIFF mm 0 getdate 0 2 本周的星期一复制 保存Select DATEADD wk DATEDIFF wk 0 getdate 0 3 一年的第一天复
  • ceph存储 pg归置组处于stuck以及degraded状态解决方案

    由于对ceph的兴趣 我们经常自己搭建ceph集群 可能是单节点 也可能是多节点 但是经常遇到pg归置组异常状态 下面是遇到的一些情况 1 单节点的时候pg归置组unclean或者degraded 这个时候应该检查 自己是几个osd 副本数
  • BSC主网链搭建,如何在不到24小时之内同步完成?

    还是老样子 在本篇文档开始之前 大概说明一下本次BSC同步的情况 服务器环境 服务器 阿里云服务器 CPU 16核 内存 64 GB 数据盘 3T SSD 数据盘 带宽 独享 200M 区域 美国弗吉尼亚 软件环境 centos 7 9 B
  • jqGrid 常用方法和事件

    jqGrid 常用方法整理 常用方法 获取行数据 删除行数据 重新加载表格 动态设置列显示隐藏 常用事件 常用方法 获取行数据 div div 1 获取所有行数据 jqGrid getRowData 或者 var IDS jqGrid ge
  • 小型软件公司的绩效考核

    近几个月 我常和一些朋友讨论如何在小型软件公司中对软件开发人员进行绩效考核的问题 发现很多朋友都为此问题而烦恼 由于我正好在一家小型软件公司里负 责绩效考核工作 有一些成功的实践经验 所以特此在这里与大家交流一下我的心得 这些心得可能仅限于
  • 通过python构建一个区块链来学习区块链

    了解区块链Blockchains如何工作的最快方法就是构建一个区块链 你来到这里是因为 和我一样 你对加密钱币的崛起感到很兴奋 而且你想知道区块链是如何工作的 想了解它们背后的基本技术 但理解区块链并不容易 或者至少不适合我 我在密集的视频
  • Fisco-bsco 开发联盟链 账户之间的转账

    Fisco bsco 开发联盟链 账户之间的转账 参考 开发第一个区块链应用 FISCO BCOS v2 9 0 文档 fisco bcos documentation readthedocs io 前提 Fisco bcos节点开启 控制
  • 容器性能比无容器服务器,【译】容器 vs 无服务器(Serverless)

    一些历史 不久之前 开发 部署和运维还相当复杂 在一开始 运维不仅需要修补程序代码 还要支持物理机器 保持服务器 硬件与软件处于最新状态也是一项艰巨的任务 在2000年代 一个新的模型 架构即服务 IaaS 很快流行起来 IaaS提供了从第

随机推荐

  • OSG的控制台报错处理

    OSG报错或者出现警告怎么办 最快解决方法是查资料问人 但是都不凑效的情况下 只能分析源码了 报错信息如下 报错调用方定位 触发位置 State cpp bool State checkGLErrors StateAttribute GLM
  • JSP连接数据库

    2019 10 15 JSP连接数据库 一 连接数据库需要用到的包为mysql connector java 5 1 20 bin jar 导入包的方法有两种 1 在Java Build Path中倒导入 2 把我们需要的包拷入WEB IN
  • Java之XML解析-使用dom(org.w3c.dom)解析XML

    转自 Java之XML解析 使用dom org w3c dom 解析XML 下文笔者将讲述使用W3C org w3c dom 提供的接口 解析XML文档的方法分享 W3C解析xml文档的方法 将整个xml文档读入内存 然后构建一个DOM树
  • 如何查看和修改gcc、g++默认include路径

    如何查找gcc g 默认include路径 注意 是Tab上面的那个符号 gcc gcc print prog name cc1plus v g g print prog name cc1plus v 我们都知道在编译的预处理阶段 编译器会
  • Python爬虫的requests(学习于b站尚硅谷)

    目录 一 requests 1 requests的基本使用 1 文档 2 安装 3 响应response的属性以及类型 4 代码演示 2 requests之get请求 3 requests之post请求 1 演示示例 爬取百度翻译 2 ge
  • simulink半桥逆变电路仿真

    逆变是将直流变为脉冲方波信号 电压是100V的 第一幅为原始直流信号 第二幅是逆变电流 第三幅是逆变电压 参数设置 图3 RC1 图4 RC 图5 晶闸管 图6 脉冲信号的参数
  • Java常用类(比较器、System类、Math类、BigInteger和BigDecimal类)

    Java常用类 比较器 System类 Math类 BigInteger和BigDecimal类 一 比较器 一 自然排序 使用Comparable接口 二 定制排序 使用Comparator接口 二 System类 三 Math类 四 B
  • ServletContext

    ServletContext上下文提供对应用程序中所有Servlet所共有的各种资源和功能的访问 Servlet上下文 API用于设置应用程序中所有Servlet共有的信息 Servlet可能需要共享他们之间的共有信息 运行于同 一服务器的
  • 如何使用groovy语言访问url时绕过https ssl认证校验?

    记录一下使用groovy解决https ssl校验问题 import javax net ssl HostnameVerifier import javax net ssl HttpsURLConnection import javax n
  • 生产数据库数据误删、错刷恢复备份实战

    文章目录 故障起因 前提 全备 全备脚本 增备 数据库配置要求 增备脚本 定时备份 故障处理 思路 全备恢复 解析增备 新建binlog解析导出目录 查看整点binlog列表 将每个整点的增量备份文件导出到sql文件 选定结束导入的SQL文
  • react函数式组件(hooks)之useEffect

    文章目录 前言 一 useEffect的作用 二 useEffect的使用 1 class组件 2 函数式组件 总结 前言 React函数式编程没有生命周期 因此需要借助useEffect来实现 一 useEffect的作用 发ajax请求
  • Swift4.0--Photos框架的使用附从相簿中获取图片

    首先发布Demo链接 Photos从相簿中获取图片 效果展示 一 Photos简介 在iOS 8之前 开发者只能用 AssetsLibrary 框架访问的用户的照片库 几年以来 相机应用和照片应用发生了显著的变化 增加了许多新特性 包括按时
  • invalid Key or Package

    使用EasyAR打包apk后出现invalid Key or Packag解决方案 1 Bundle ID IOS 和 PackageName Android 填写的对不对 2 回头看Unity里面Player Setting 里面的名字可
  • Qt 文件读写操作

    转载 http blog csdn net ei nino article details 7301132 文列出Qt读写文件常用方式 还有对文件的一些简单操作 读文件 cpp view plain copy print QString f
  • day28 回溯

    39 组合总和 数字可以被无限制选取 但是无需考虑顺序 组合 因此递归还是需要考虑startIdx 但是每次都从最开始进行回溯 而不是startIdx 1 40 组合总和II 通过标识去除重复值 树层去重 131 分割回文串 每次找到切割点
  • 孩子们的游戏(圆圈中最后剩下的数)

    每年六一儿童节 牛客都会准备一些小礼物去看望孤儿院的小朋友 今年亦是如此 HF作为牛客的资深元老 自然也准备了一些小游戏其中 有个游戏是这样的 首先 让小朋友们围成一个大圈 然后 他随机指定一个数米 让编号为0的小朋友开始报数 每次喊到M
  • firrtl

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 动手 sbt 2 之后 再回头看 chisel第一个实验 根据 https github com freechipsproject firrtl 发现firrtl没有执行s
  • android ARouter源码分析

    背景 随着项目越做越大 代码量越来越多 项目也随之改造成组件化的开发模式 组件化开发非常适合庞大的项目 将每个业务模块 功能模块解耦 抽离成组件的形式 各个组件遵循严格的依赖关系 因为这层严格的依赖关系 使得组件化比模块化结构更加简洁和清晰
  • python中objects_python之django的objects.get和objects.filter方法

    为了说明它们两者的区别定义2个models class Student models Model name models CharField 姓名 max length 20 default age models CharField 年龄
  • 实现简单感知机_感知机的原始算法与对偶算法

    一 感知机模型 感知机是一个二分类的线性分类模型 输入为实例的特征向量 输出实例的类别 取1 1两个值 输入判别模型 它适用于线性可分的数据集的分类 所谓线性可分 就是两类数据可以用空间中的一个超平面分离 即存在参数 当 属于其中一类时 当