感知机(Perceptron)的原理及实现

news2024/9/28 3:24:17

1.感知机(Perceptron)的原理及实现

声明:笔记来源于《白话机器学习的数学》

感知机是接受多个输入后将每个值与各自权重相乘,最后输出总和的模型。
单层感知机因过于简单,无法应用于实际问题,但它是神经网络和深度学习的基础模型。
单层感知机指的是感知机、多层感知机指的是神经网络(之前本人相关笔记:机器学习和AI底层逻辑、深度神经网络底层原理、卷积神经网络底层原理)

w ⋅ x = ∑ i = 1 n w i x i \boldsymbol{w}\cdot\boldsymbol{x}=\sum_{i=1}^{n}w_ix_i wx=i=1nwixi


感知机的缺点是只能解决线性可分的问题

1.1 使用向量内积来表达直线(分类边界)

权重向量中的各个值就是我们说的未知参数

如何使用向量内积来表达直线?
向量内积衡量的是两个向量的相似程度
利用内积为0,则两个向量垂直,其中一个向量为权重向量,另一个向量所在的直线则可表示分类边界

假设权重向量 w = ( 1 , 1 ) w=(1,1) w=(1,1)

移项后为 x 2 = − x 1 x_2=-x_1 x2=x1 x 2 x_2 x2为纵轴、 x 1 x_1 x1为横轴


我们观察一下分类边界的两侧对应内积的情况

图1 内积为负
图2 内积为正

为什么是这种结果的呢?
w ⋅ x = ∣ w ∣ ⋅ ∣ x ∣ cos ⁡ θ \boldsymbol{w}\cdot\boldsymbol{x}=|\boldsymbol{w}|\cdot|\boldsymbol{x}|\cos\theta wx=wxcosθ
其中 ∣ w ∣ 、 ∣ x ∣ |\boldsymbol{w}|、|\boldsymbol{x}| wx均为正数,
w ⋅ x < 0 \boldsymbol{w}\cdot\boldsymbol{x}\lt 0 wx<0,则 cos ⁡ θ < 0 \cos\theta\lt 0 cosθ<0,即 θ \theta θ范围为 [ 90 ° , 180 ° ] [90°,180°] [90°180°],与权重向量夹角在此范围的内积为负
w ⋅ x > 0 \boldsymbol{w}\cdot\boldsymbol{x}\gt 0 wx>0,则 cos ⁡ θ > 0 \cos\theta\gt 0 cosθ>0,即 θ \theta θ范围为 [ 0 ° , 90 ° ] ∪ [ 270 ° , 360 ° ] [0°,90°]\cup[270°,360°] [90°][270°360°],与权重向量夹角在此范围的内积为正

上图中的两个范围作为两个类别,那一条直线就是分类边界,这个分类边界由权重向量表示
在权重向量已知的情况下(权重向量需要我们通过训练来得到),我们将数据代入,判断内积的正负即可完成分类的任务
我们为内积为负的区域类别设置标签为-1,为内积为正的区域类别设置标签为1

1.2 权重向量的更新表达式

f w ( x ( i ) ) f_{\boldsymbol{w}}(\boldsymbol{x}^{(i)}) fw(x(i))为判别函数、 y ( i ) y^{(i)} y(i)为对应的标签,标签代表该数据在哪个分类(可能是人工标注)

如果 f w ( x ( i ) ) ≠ y ( i ) f_{\boldsymbol{w}}(\boldsymbol{x}^{(i)})\neq y^{(i)} fw(x(i))=y(i)表示分类失败,例如某些应该在内积为负区域的值落在了正区域,则需要更新权重向量(图像上表现为权重向量的旋转)
如果 f w ( x ( i ) ) = y ( i ) f_{\boldsymbol{w}}(\boldsymbol{x}^{(i)})= y^{(i)} fw(x(i))=y(i)表示分类成功,则无需更新权重向量(位置保持不变)

随意画一个权重向量
代入一个训练数据
数据的判别函数与数据标签不等,分类失败
旋转权重向量


旋转权重向量后,该数据判别结果与标签相等,分类成功,代入所有数据使得权重向量最终在这些数据的正确位置,其法线向量所在直线为分类边界

1.2 感知机(Perceptron)的实现

输入图像水平方向和竖直方向的像素,判断该图像是纵向的还是横向的?

纵向
横向

x 1 x1 x1为水平方向像素、 x 2 x2 x2为竖直方向像素、 y y y为标签, y = − 1 y=-1 y=1代表该图像为纵向的, y = 1 y=1 y=1代表该图像为横向的

import numpy as np
import matplotlib.pyplot as plt

# 读入训练数据
train = np.loadtxt('~/Downloads/sourcecode-cn/images1.csv', delimiter=',', skiprows=1)
train_x = train[:,0:2]
train_y = train[:,2]

绘制训练数据

plt.plot(train_x[train_y == 1, 0], train_x[train_y == 1, 1], 'o')
plt.plot(train_x[train_y == -1, 0], train_x[train_y == -1, 1], 'x')
plt.axis('scaled')
plt.show()

x 1 x_1 x1 x x x 轴, x 2 x_2 x2 y y y

# 权重初始化
w = np.random.rand(2)

w = [ w 1 w 2 ] \boldsymbol{w}=\left [ \begin{matrix} w_1 \\ w_2 \\ \end{matrix} \right ] w=[w1w2]

# 判别函数
def f(x):
    if np.dot(w, x) >= 0:
        return 1
    else:
        return -1

# 重复次数
epoch = 10

# 更新次数
count = 0

感知机停止学习的标准最好根据精度来决定是否停止,我们这里暂时通过规定迭代次数作为循环的结束条件

# 学习权重
for _ in range(epoch):
    for x, y in zip(train_x, train_y):
        if f(x) != y:
            w = w + y * x

            # 输出日志
            count += 1
            print('第 {} 次 : w = {}'.format(count, w))

# 绘图确认
x1 = np.arange(0, 500)
plt.plot(train_x[train_y ==  1, 0], train_x[train_y ==  1, 1], 'o')
plt.plot(train_x[train_y == -1, 0], train_x[train_y == -1, 1], 'x')
plt.plot(x1, -w[0] / w[1] * x1, linestyle='dashed')
plt.show()

使权重向量成为法线向量的直线方程是内积为 0 的 x 的集合


验证

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

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

相关文章

一文让你搞定接口测试

一、什么是接口测试&#xff1f; 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试&#xff0c;则是通过接口的不同情况下的输入&#xff0c;去对比输出&#xff0c;看看是否满足接口规范所规定的功能、…

二叉树知识小结

思维导图&#xff1a; 一&#xff0c;树 树&#xff0c;这是一种对计算机里的某种数据结构的形象比喻。比如这种: 这种&#xff1a; 这种&#xff1a; 这几种都是树形结构。在百度百科中对树形结构的定义如下&#xff1a; 树形结构指的是数据元素之间存在着“一对多”的树形关系…

津津乐道设计模式 - 建造者模式详解(教你如何构造一个专属女友)

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

接口测试断言详解(Jmeter)

接口测试是目前最主流的自动化测试手段&#xff0c;它向服务器发送请求&#xff0c;接收和解析响应结果&#xff0c;通过验证响应报文是否满足需求规约来验证系统逻辑正确性。接口的响应类型通过Content-Type指定&#xff0c;常见的响应类型有&#xff1a; • text/html &…

Android Jetpack Compose之轻松添加分隔线:Divider组件

引言&#xff1a; 在构建用户界面时&#xff0c;有效地组织和分隔内容是至关重要的。这就是Android Jetpack Compose的Divider组件派上用场的地方。在这篇博客中&#xff0c;我们将详细了解Divider组件的功能和用法&#xff0c;并通过示例展示如何将其融入您的Compose UI。 Je…

自动化测试和性能测试面试题精选

自动化测试相关 包含 Selenium、Appium 和接口测试。 1. 自动化代码中&#xff0c;用到了哪些设计模式&#xff1f; 单例模式工厂模式PO模式数据驱动模式 2. 什么是断言&#xff1f; 检查一个条件&#xff0c;如果它为真&#xff0c;就不做任何事&#xff0c;用例通过。如果…

8年资深测试总结,自动化测试成功实施,你不知道的都在这...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 什么项目&#xf…

python:并发编程(二十七)

前言 本文将和大家一起探讨python并发编程的实际项目&#xff1a;Locust性能测试&#xff08;篇一&#xff0c;共N篇&#xff09;&#xff0c;系列文章将会从零开始构建项目&#xff0c;并逐渐完善项目&#xff0c;最终将项目打造成适用于高并发场景的应用。 本文为python并发…

分支定价算法求解VRPTW问题(代码非原创)

参考文献&#xff1a;微信公众号“程序猿声”关于分支定价求解VRPTW的代码 A tutorial on column generation and branch-and-price for vehicle routing problems 框架 对于VRPTW问题&#xff0c;先做线性松弛&#xff0c;调用列生成算法&#xff08;一种解决大型线性规划问…

Docker网络之Network Namespace

Docker网络中相关的命令非常少&#xff0c;但需要掌握的底层原理却又非常多。 1.Network Namespace Docker网络底层原理是Linux的Network Namespace&#xff0c;所以说对于Linux Network Namespace的理解对Docker网络底层原理的理解就显得尤为重要了。 2.需求 通过手工的方式…

ICC2与INNOVUS命令对照表

ICC2与INNOVUS命令对照表 TargetICC2INNOVUS设置多CPU set_host_options -max_cores16 setMultiCpuUsage -localCpu 16 获得物体的属性 get_attribute

DSP,国产C2000横空出世,QX320F280049,替代TI 的 TMS320F280049,支持国产

一、特性参数 1、独立双核&#xff0c;32位CPU&#xff0c;单核主频400MHz 2、IEEE 754 单精度浮点单元 &#xff08;FPU&#xff09; 3、三角函数单元 &#xff08;TMU&#xff09; 4、1MB 的 FLASH &#xff08;ECC保护&#xff09; 5、1MB 的 SRAM &#xff08;ECC保护&…

全网最全,Selenium自动化测试POM模式总结(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 在UI自动化测试中…

Python+Selenium+Unittest 之selenium7--元素定位6-CSS定位1(定位所有、定位class、定位id、tag定位)

目录 一、CSS简介 二、 定位方式 三、实践操作 1、*&#xff08;定位所有元素&#xff09; 2、. &#xff08;定位class属性&#xff09; 3、#&#xff08;定位id属性&#xff09; 4、tag定位 一、CSS简介 CSS属于是一种计算机语言&#xff0c;主要是用来为结构化文档的外…

软件测试期末速成(背题家出列!)

文章目录 一、前言二、选择题&#xff08;15 X 2&#xff09;1、概述2、相关概念3、黑盒测试4、白盒测试5、单元测试6、集成测试7、系统测试8、自动化测试9、实用软件测试技术 三、判断题&#xff08;10 X 1’&#xff09;四、简答题&#xff08;4 X 5&#xff09;1、软件测试生…

一文学会Nginx做图片服务器

Nginx做图片服务器 前言&#xff1a; Nginx是一个高性能的HTTP和反向代理web服务器,以及负载均衡器。根据nginx是高性能的http服务器&#xff0c;因此可以用作图片服务器使用。 本案例是在docker安装nginx来操作的。 什么是Nginx? Nginx是一款高性能的Web服务器和反向代理服…

linux入门之浅谈shell及权限的概念

文章目录 目录 文章目录 一、shell命令以及运行原理 二、linux权限的概念 1.Linux权限管理 a.文件访问者的分类&#xff08;人&#xff09; b.文件类型和访问权限 1&#xff09;文件类型 2&#xff09;基本权限 3&#xff09;文件权限值的表示方法 4)文件访问权限的相…

docker快速部署oracle19c、oracle12c,测试环境问题复现demo快速搭建笔记

Oracle 19c测试环境快速搭建 安装 # 下载镜像 19.3.0.0.0 docker pull registry.cn-hangzhou.aliyuncs.com/laowu/oracle:19c # 创建文件 mkdir -p /mymount/oracle19c/oradata # 授权&#xff0c;不授权会导致后面安装失败 chmod 777 /mymount/oracle19c/oradatadocker run …

01背包思路解析+代码

01背包 题目链接&#xff1a;01背包 思路&#xff1a;题目要求是获取背包能装的最大重量。一个物品有体积和重量两个属性。而当我们判断一个物品是否要放进背包&#xff0c;第一取决于他的体积是否足以放进背包&#xff0c;第二取决于他的重量是否足以让我们取出已经放入的一部…

buuctf 你有没有好好看网课? 解析

打开文件得到两个压缩包&#xff0c;第一个压缩包flag2需要密码&#xff0c;第二个压缩包flag3打开后在备注可以获得提示 使用arc爆破&#xff0c;得到6位数字密码 解压压缩包得到一个视频和文档 文档内容包含6个数字&#xff0c;结合视频猜测是关键信息藏在这两个时间节点上 …