感知器算法c语言,一文搞懂感知机算法

2023-11-08

什么是感知机

感知机(preceptron)是线性分类的二分类模型,输入为实例的特征向量,输出为实例的类别,分别用 1 和 -1 表示。感知机将输入空间(特征空间)中的实例划分为正负两类分离的超平面,旨在求出将训练集进行线性划分的超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得最优解。感知机是神经网络和支持向量机的基础。

感知机模型

感知机的函数公式为:

math?formula=f(x)%20%3D%20sign(w%5Ccdot%20x%20%2B%20b)

其中, w和 b 为感知机模型参数,

math?formula=w%20%5Cin%20R%5En叫做权值或者权值向量,

math?formula=b%20%5Cin%20R 叫做偏差,

math?formula=w%20%5Ccdot%20x表示 w 和 x 的内积, sign 是符号函数,即:

math?formula=sign%5Cleft(%20x%5Cright)%20%3D%5Cbegin%7Bcases%7D1%2Cx%5Cgeq%200%5C%5C%20-1%2Cx%20%3C0%5Cend%7Bcases%7D

感知机的假设空间是定义在特征空间中所有线性分类模型的函数集合,即

math?formula=%5C%7Bf%7Cf(x)%20%3D%20w%20%5Ccdot%20x%20%2B%20b%5C%7D.

感知机的几何解释:线性方程

math?formula=w%20%5Ccdot%20x%20%2B%20b%20%3D%200对应特征空间

math?formula=R%5En中的一个超平面 S,其中 w 是超平面的法向量,b 是超平面的截距。该超平面将特征空间分为两个部分,将特征向量分为正负两类。因此,超平面 S 成为分离超平面。

c91087e6e1ea

image

感知机学习策略

假设训练数据集是线性可分的,感知机的学习目标就是找到能够将正负实例点完全分开的超平面,即确定感知机模型参数 w 和 b,因此就是确定(经验)损失函数并求损失函数的最优解,即最小化。

感知机

math?formula=sign(w%5Ccdot%20x%20%2B%20b)学习的损失函数 定义为:

math?formula=L(w%2C%20b)%20%3D%20-%20%5Csum_%7Bx%20%5Cin%20M%7Dy_i(w%20%5Ccdot%20x_i%20%2B%20b)%20%E5%85%AC%E5%BC%8F(1)

下面给出推导:

1.首先写入输入空间

math?formula=R%5En中任意点

math?formula=x_0到超平面 S 的距离:

math?formula=%5Cdfrac%20%7B1%7D%7B%5Cleft%5C%7C%20w%5Cright%5C%7C%20%7D%5Cleft%7C%20w%5Ccdot%20x_0%20%2Bb%5Cright%7C

其中,

math?formula=%5Cleft%5C%7C%20w%5Cright%5C%7C是 w 的 L2 范数。

2.当

math?formula=w%20%5Ccdot%20x_i%20%2B%20b%20%3E%200时,

math?formula=y_i%20%3D%20-1, 而当

math?formula=w%20%5Ccdot%20x_i%20%2B%20b%20%3C0时,

math?formula=y_i%20%3D%201。因此,对于误分类的数据

math?formula=(x_i%2C%20y_i)来说,

math?formula=-%20y_i(w%20%5Ccdot%20x_i%20%2B%20b)%20%3E%200成立。

3.另外,误差分类点到超平面 S 的距离是

math?formula=%5Cdfrac%20%7B1%7D%7B%5Cleft%5C%7C%20w%5Cright%5C%7C%20%7Dy_i%20(w%5Ccdot%20x_i%20%2Bb)

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

math?formula=%5Cdfrac%20%7B1%7D%7B%5Cleft%5C%7C%20w%5Cright%5C%7C%20%7D%5Csum_%7Bx%20%5Cin%20M%7Dy_i(w%20%5Ccdot%20x_i%20%2B%20b)

不考虑

math?formula=%5Cdfrac%20%7B1%7D%7B%5Cleft%5C%7C%20w%5Cright%5C%7C%20%7D,则得到感知机的损失函数 L(w, b),即公式(1)

显然,损失函数 L(w, b)是非负的。如果有所分类都正确,则损失函数值为 0。而且,分类越正确,则误分类的点离超平面越近,损失函数值越小。

因此,一个特定的样本的损失函数,在误分类时时参数 w, b 的线性函数,正确分类时时 0,可以得出给定训练数据集 T,损失函数 L(w, b)是 w,b 的连续可导函数。

感知机学习算法

下面我们来看感知机的学习算法。给定一个训练数据集

math?formula=T%3D%5C%7B(x_1%2Cy_1)%2C%20(x_2%2C%20y_2)%2C%20...%2C%20(x_N%2C%20y_N)%5C%7D

感知机的算法是误分类驱动的,具体采用 随机梯度下降法(stochastic gradient descent). 在极小化目标函数的过程中,并不是一次使 M 中所有误分类的点梯度下降,而是每次随机一个误分类的点使其梯度下降。

具体步骤为:

1.假设误分类点的集合为 M,那么损失函数L(w, b)的梯度为:

math?formula=%5Cnabla_wL(w%2C%20b)%20%3D%20-%20%5Csum_%7Bx%20%5Cin%20M%7Dy_ix_i

math?formula=%5Cnabla_bL(w%2C%20b)%20%3D%20-%20%5Csum_%7Bx%20%5Cin%20M%7Dy_i

2.随机选取一个误分类的点

math?formula=(x_i%2C%20y_i),对 w, b 更新:

math?formula=w%20%5Cleftarrow%20w%20%2B%20%5Ceta%20y_ix_i

math?formula=b%20%5Cleftarrow%20b%20%2B%20%5Ceta%20y_i

式中

math?formula=%5Ceta(0%3C%5Ceta%5Cleq1)是步长,又称为学习率(learning_rate),这样,通过迭代可以使损失函数不断减小,直到为 0.

当训练数据集线性可分的时候,感知机学习算法是收敛的,并且存在无穷多个解,解会由于不同的初值或不同的迭代顺序不同而有所不同。

实战

下面使用 sklearn 包中感知机来训练和分类 Iris(鸢尾花) 数据集。

from sklearn import datasets

import pandas as pd

from sklearn import Perceptron

from sklearn.cross_validation import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.metrics import accuracy_score

from sklearn.utils import shuffle

iris = datasets.load_iris()

先导入数据,然后使用shuffle打乱数据顺序,

X, y = shuffle(iris.data, iris.target,random_state=7)

接下来分割训练集和测试集:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=7)

然后进行样本特征的标准化缩放,为了让特征同步变化。标准化缩放就是将样本特征转化成均值为 0 ,方差为 1 的正态分布。

sc_X = StandardScaler()

X_train_std = sc_X.fit_transform(X_train)

X_test_std = sc_X.fit_transform(X_test)

创建感知机模型,进行训练,最终对测试集预测结果。

model = Perceptron()

model.fit(X_train_std, y_train)

y_pred = model.predict(X_test_std)

训练完成以后评价一下训练结果,

print ("Accuracy score on test data: {:.4f}".format(accuracy_score(y_test, y_pred)))

print ("F-score on test data: {:.4f}".format(fbeta_score(y_test, y_pred, beta = 0.5,average='weighted')))

结果如下:

c91087e6e1ea

image

效果不太好,我们尝试用网格搜索法来优化一下,设置好参数集,代码如下:

from sklearn.model_selection import GridSearchCV

from sklearn.metrics import make_scorer

from sklearn.metrics import fbeta_score, accuracy_score

clf = Perceptron(random_state=7)

parameters = {'eta0':[0.1,1,10], 'max_iter':[30,40,50]}

scorer = make_scorer(fbeta_score, beta=0.5, average='weighted')

#在分类器上使用网格搜索,使用'scorer'作为评价函数

grid_obj = GridSearchCV(clf, parameters, scoring=scorer)

grid_obj.fit(X_train_std, y_train)

# 得到estimator

best_clf = grid_obj.best_estimator_

# 使用没有调优的模型做预测

predictions = (clf.fit(X_train_std, y_train)).predict(X_test_std)

best_predictions = best_clf.predict(X_test_std)

最后我们将优化前和优化后的结果打印出来比较一下效果:

# 汇报调参前和调参后的分数

print ("\nUnoptimized model\n------")

print ("Accuracy score on test data: {:.4f}".format(accuracy_score(y_test, predictions)))

print ("F-score on test data: {:.4f}".format(fbeta_score(y_test, predictions, beta = 0.5,average='weighted')))

print ("\nOptimized Model\n------")

print ("Final accuracy score on the test data: {:.4f}".format(accuracy_score(y_test, best_predictions)))

print ("Final F-score on the test data: {:.4f}".format(fbeta_score(y_test, best_predictions, beta = 0.5,average='weighted')))

运行一下,得到下图:

c91087e6e1ea

image

最终可以看到,我们的模型预测效果已经有明显进步了。

如果你喜欢我的文章,欢迎扫码关注公众号:机器学习Club.聚焦机器学习,关注自我管理。

[图片上传失败...(image-d73933-1534854404075)]

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

感知器算法c语言,一文搞懂感知机算法 的相关文章

  • 初学(7)——Hadoop错误:can‘t create 事务 lock on /var/lib/rpm/.rpm.lock (权限不够)

    执行删除操作时出现错误 权限不够 1 使用sudo命令 2 如果出现上述情况 切换至root用户 将要执行该操作的用户添加到sudoers su vim etc sudoers xxx 要添加的用户 ALL ALL ALL 命令成功执行
  • Mac用iTerm2连接到Linux上,不能输入中文

    服务器是ubuntu 用Mac的iterm2 ssh连上去 终端显示中文乱码 也不能输入中文 然而本地终端可以显示和输入 解决方法 这种情况一般是终端和服务器的字符集不匹配 MacOSX下默认的是utf8字符集 输入locale可以查看字符
  • 步进电机实验

    通过 ULN2003 驱动模块控制 28BYJ48 步进电机运行方向和速度 按下 KEY1 键调节电机旋转方向 按下 KEY2 键 电机加速 当按下 KEY3 键 电机减速 实现对步进电机运动的简单控制 步进电机简介 步进电机是将电脉冲信号
  • java中io各种流的关闭顺序

    还是先看API void close Closes this stream and releases any system resources associated with it close void close throws IOExc
  • 【react从入门到精通】初识React

    文章目录 人工智能福利文章 前言 React技能树 什么是 React 安装和配置 React 创建 React 组件 渲染 React 组件 使用 JSX 传递属性 Props 处理组件状态 State 处理用户输入 事件处理 组合和嵌套
  • 生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼

    说到生成模型 VAE GAN可谓是 如雷贯耳 本站也有过多次分享 此外 还有一些比较小众的选择 如flow模型 VQ VAE等 也颇有人气 尤其是VQ VAE及其变体VQ GAN 近期已经逐渐发展到 图像的Tokenizer 的地位 用来直
  • Mac环境下安装、配置cocos2d-x环境

    转自 https www jianshu com p 2649a88b7f4d Mac环境下安装 配置cocos2d x环境 玉米包谷关注 2017 09 23 11 16 07字数 207阅读 2 359 1 将cocos2d x下载到桌
  • 学习笔记:进程间通信

    进程间通信的方式 示例 管道的概念及使用 管道pipe详解点击此处 示例 注 写端fd 1 读端fd 0 创建共享内存 mmap函数 思考 总结 示例 mmap父子进程通信 匿名映射 示例 进程1 进程二 shmget函数和mmap的区别
  • 逆矩阵的概念与性质

    逆矩阵的概念与性质 定理1 若矩阵A是可逆的 则A的逆矩阵是唯一的 并记作A的逆矩阵为A 1 性质 定理3 设A为n阶矩阵 则下列各命题等价 1 A是可逆的 2 AX 0只有零解 3 A与I行等价 4 A可表为有限个初等矩阵的乘积 注意 初
  • Docker的概念(1)

    前置条件 需要掌握Linux及常用命令 目录 1 Docker是什么 2 Docker用途 3 Docker与虚拟化 4 Docker和一个正常的虚拟机有何区别 5 Docker虚拟化的好处 5 1 应用部署方便 5 2 服务器同等配置 性
  • NDK开发——FFmpeg实现视频转YUV、视频转RGB显示、音频转PCM、音频播放、音视频同步

    项目演示 前提准备 编译FFmpeg CMake并能运行 详细可见我博客 下载libyuv库并编译成libyuv so库 用于实现转换RGB格式功能 FFmpeg库简介 avcodec 编解码 包含 avformate 封装格式处理 avf
  • Linux makefile 教程 非常详细,且易懂

    最近在学习Linux下的C编程 买了一本叫 Linux环境下的C编程指南 读到makefile就越看越迷糊 可能是我的理解能不行 于是google到了以下这篇文章 通俗易懂 然后把它贴出来 方便学习 后记 看完发现这篇文章和 Linux环境
  • 烟雾调节器

    先看效果 烟雾调节展示 再看代码
  • 【深度学习基础】损失函数

    深度学习基础 性能评估指标 超参数介绍 损失函数 前言 本文主要总结一下常见目标检测的损失函数以及一些基础的函数 主要损失函数为mask rcnn涉及到的损失函数包括 MSE均方误差损失函数 Cross Entropy交叉熵损失函数 目标检
  • Java项目:设计管理系统(java+SSM+JSP+MYSQL+layui+Maven)

    源码获取 博客首页 资源 里下载 一 项目简述 功能包括 课题管理 学生管理 内容管理 文件管理 提问管理 教师管理 进度管理等等 二 项目运行 环境配置 Jdk1 8 Tomcat8 5 mysql Eclispe IntelliJ ID
  • 新规明确所有APP必须备案!附备案指引

    2023年8月底前 新APP需要先备案才能上线 2024年4月前 存量APP完成备案 未履行备案手续的 不得从事APP互联网信息服务 网络接入服务提供者 分发平台 智能终端生产企业不得为未履行备案手续的APP提供网络接入 分发 预置等服务
  • SQL server 安装问题

    安装sqlserver2008中遇到的一些问题和解决办法 安装过程中遇到restart computer 导致不能成功安装 解决办法 1 打开注册表编辑器 2 找到以下路径 HKEY LOCAL MACHINE SYSTEM Current
  • 2020蓝桥杯省赛Java B组一等奖

    大家觉得写还可以 可以点赞 收藏 关注一下吧 也可以到我的个人博客参观一下 估计近几年都会一直更新 和我做个朋友吧 https motongxue cn 文章目录 A 门牌制作 问题描述 答案提交 代码 B 寻找 2020 问题描述 答案提
  • php用session防CC

随机推荐

  • 带头双向循环链表的增删查改

    带头双向循环链表的增删查改 简介 首先我们来看一下带头双向循环链表的结构示意图 在实际内存中并非是这样的结构 画图是为了我们能更好的理解链表 带头双向循环链表的结构最复杂 一般用在单独存储数据 实际中使用的链表数据结构 都是带头双向循环链表
  • 多机器人路径规划算法及其在CVD算法下的实现

    多机器人路径规划算法及其在CVD算法下的实现 在多机器人协同工作的场景中 路径规划问题是非常重要的 而对于存在障碍物的情况下 Voronoi图算法可以用于寻找机器人的最佳路径 本文将介绍一种基于CVD算法的多机器人路径规划算法 并提供相应的
  • 【MVCC多版本并发控制】MVCC 机制的原理及实现,什么是MVCC,多版本并发控制

    什么是 MVCC MVCC Multiversion Concurrency Control 中文全程叫多版本并发控制 是现代数据库 包括 MySQL Oracle PostgreSQL 等 引擎实现中常用的处理读写冲突的手段 目的在于提高
  • no matching key exchange method found

    问题描述 今天升级Ubuntu系统到16 04之后 之前通过git管理的一个项目add和commit之后无法push到服务器 每次提交都报以下错误 Unable to negotiate with xx xx x xxx port xxxx
  • 2021年数学建模国赛C题问题二详细思路和代码

    2021年数学建模国赛C题问题一详细思路和代码 说明 本思路仅为小编个人思路 其中关于本文中给出的AdaBoost回归预测模型于今年的 国赛参考评分标准有所出入 所以本题思路为个人创新思路 不一定符合评分标准 符号说明 1 问题分析 问题二
  • 深度学习学习日记_FCN_(1) shift_and_stitch

    当网络最后一层输出的 prediciton map size 和 label map size 大小不匹配时 除了bilinea interpolation 等暴力措施 且不采取 unpooling deconvolution 等decod
  • [Shell]文本处理工具(grep,cut,sort,uniq,tee,diff,paste,tr)以及bash的特性

    Shell 提示 Shell脚本基础 第一章 文本处理工具以及bash的特性 文章目录 Shell TOC 文章目录 前言 一 文本处理工具 1 grep工具 2 cut工具 3 sort工具 4 uniq工具 二 使用步骤 1 引入库 2
  • CORS解决跨域问题

    1 跨域问题 1 1 什么是跨域 跨域是指跨域名的访问 以下情况都属于跨域 跨域原因说明 示例 域名不同 www jd com 与 www taobao com 域名相同 端口不同 www jd com 8080 与 www jd com
  • java命令行运行小记

    JDK6中提供了java io Console类专用来访问基于字符的控制台设备 你的程序如果要与Windows下的cmd或者Linux下的Terminal交互 就可以用Console类代劳 类似System in和System out 但我
  • spawn cmd ENOENT错误处理方法

    点击此电脑 gt 高级系统设置 gt 环境变量 gt 用户变量 gt 点击Path gt 点击新建 gt 添加一行 C WINDOWS system32 gt 重启电脑即可
  • JAVA代码审计XSS及Filter动态代理过滤

    1 介绍 最近写了个小玩意儿 主要功能为用户信息管理 例如新增 删除 添加等 但在没写过滤之前 全是xss 所以拿出来给大家进行简单分析 后续通过动态代理进行过滤 2 代码分析 这里就只分析用户添加的页面了 可以看到在未做任何过滤的情况触发
  • 软件测试基础——功能测试,软件测试提升完整指南

    目录 导读 前言 一 测试基础的重要性 二 提升数据库处理能力 三 具备定位问题的能力 四 具备总结能力 五 适时做好能力提升 六 总结 前言 为什么需要功能测试 1 从用户的角度 确保系统的执行与需求一致 2 因为是功能测试 测试者根本不
  • 通过提高元件选择效率支持引入高速车载网络的PoC方式

    我们在上篇介绍到使用村田开发的BIST后 任何人都能轻松地选择合适的元件 下面的专访内容 将从车载摄像头设计人员的角度 介绍如何让为复杂的偏置T电路选择元件变得更简单 最后附上介绍偏置T电感设计辅助工具使用方法的视频供读者参考 在选择构成偏
  • 接口自动化框架(Pytest+request+Allure)

    前言 接口自动化是指模拟程序接口层面的自动化 由于接口不易变更 维护成本更小 所以深受各大公司的喜爱 接口自动化包含2个部分 功能性的接口自动化测试和并发接口自动化测试 本次文章着重介绍第一种 功能性的接口自动化框架 一 简单介绍 环境 M
  • git add .报错warning: adding embedded git repository: carreport hint: You‘ve added another git...

    git add 时报错 git add warning adding embedded git repository xxxxxxxxxx hint You ve added another git repository inside yo
  • window mysql dump_Windows|环境变量&mysqldump

    起因 工作中需要对DB进行备份时 mysqldump无法正常启动 打开win的cmd 输入 mysqldump exe 显示 mysqldump exe 内部 外部 操作可能 認識 此类消息 都可以通过配置环境变量来解决 这种消息的意思是
  • NetWork——关于TCP协议的三次握手和四次挥手

    0 准备知识 1 ACK TCP协议规定只有ACK 1时有效 也规定连接建立后所有发送的报文的ACK必须为1 2 SYN 在连接建立时用来同步序号 当SYN 1而ACK 0时 表明这是一个连接请求报文 对方若同意建立连接 则应在响应报文中使
  • opengl es3.0 仿真环境在win10上的搭建

    参考 https blog csdn net msdb198901 article details 77506165 https blog csdn net u010312436 article details 82984322 1 环境版
  • 基于matlab的图解粒度参数计算,基于MATLAB的图解粒度参数计算-热带地理.PDF

    基于MATLAB的图解粒度参数计算 热带地理 第 26卷 第 3期 热 带 地 理 Vol26 No3 2006年 8月 TROP ICAL GEO GRA PHY Aug 2006 基于 MA TLAB 的图解粒度参数计算 王 为 吴 正
  • 感知器算法c语言,一文搞懂感知机算法

    什么是感知机 感知机 preceptron 是线性分类的二分类模型 输入为实例的特征向量 输出为实例的类别 分别用 1 和 1 表示 感知机将输入空间 特征空间 中的实例划分为正负两类分离的超平面 旨在求出将训练集进行线性划分的超平面 为此