感知器及其在python中的实现_(二)感知器算法及其python实现

出发点

一旦判别函数的形式确定下来,不管它是线性的还是非线性的,剩下的问题就是如何确定它的系数。在模式识别中,系数确定的一个主要方法就是通过对已知样本的训练和学习来得到。感知器算法就是通过训练样本模式的迭代和学习,产生线性(或广义线性)可分的模式判别函数。

基本思想

采用感知器算法能通过对训练模式样本集的“学习”得到判别函数的系数。这里采用的算法不需要对各类别中模式的统计性质做任何假设,因此称为确定性的方法。

具体算法

已知两个训练模式集分别属于

类和

类,权向量的初始值为

,可任意取值。若

,若

,则在用全部训练模式集进行迭代训练时,第k次的训练步骤为:

,则分类器对第k个模式

做了错误分类,此时应校正权向量,使得

,其中C为一个校正增量;

,同样分类器分类错误,则权向量应该校正为

若以上情况不符合,则表明该模式样本在第k次中分类正确,因此权向量不变,即

若对

的模式样本乘以(-1),有

时,w(k+1)=w(k)+Cx_{k}。此时感知器算法可统一写成:

示例

用感知器算法求下列模式分类的解向量w:

因为手算比较麻烦,就直接上代码了。

import numpy as np

w_1 = np.array([[0,0,0],

[1,0,0],

[1,0,1],

[1,1,0]]).T

w_2 = np.array([[0,0,1],

[0,1,1],

[0,1,0],

[1,1,1]]).T

# 增广化

w_1_Aug = np.ones((w_1.shape[0]+1,w_1.shape[1]))

w_1_Aug[0:w_1.shape[0],0:w_1.shape[1]] = w_1

w_2_Aug = np.ones((w_2.shape[0]+1,w_2.shape[1]))

w_2_Aug[0:w_2.shape[0],0:w_2.shape[1]] = w_2

# 符号规范化

w_2_Aug = 0 - w_2_Aug

# 初始化解向量

Weight = np.array([0,0,0,0]).reshape((4,1))

# 设定校正增量

C = 1

# 初始化标记

flag = True

while(True):

for i in range(w_1_Aug.shape[1]):

if(np.dot(Weight.T,np.reshape(w_1_Aug[:,i:i+1],(4,1)))[0][0] > 0):

Weight = Weight

else:

Weight = Weight + C*np.reshape(w_1_Aug[:,i:i+1],(4,1))

print(Weight)

flag = False

for i in range(w_2_Aug.shape[1]):

if(np.dot(Weight.T,np.reshape(w_2_Aug[:,i:i+1],(4,1)))[0][0] > 0):

Weight = Weight

else:

Weight = Weight + C*np.reshape(w_2_Aug[:,i:i+1],(4,1))

print(Weight)

flag = False

if(flag == True):

break

else:

flag = True

最后得出:

多类感知器多类情况3:

对M类模式存在M个判别函数

,若

,则

设有M种模式类别

,若在训练过程中的第

次迭代时,一个属于

类的模式样本x送入分类器,则应先计算出M个判别函数:

的条件成立,则权向量不变,即

若其中第

个权向量使得

,则相应的权向量应做调整,即

多类示例

用多类感知器算法求下列模式的判别函数:

因为手算比较麻烦,就直接上代码了。

import numpy as np

w_1 = np.array([[-1,-1]]).T

w_2 = np.array([[0,0]]).T

w_3 = np.array([[1,1]]).T

# 增广化

w_1_Aug = np.ones((w_1.shape[0]+1,w_1.shape[1]))

w_1_Aug[0:w_1.shape[0],0:w_1.shape[1]] = w_1

w_2_Aug = np.ones((w_2.shape[0]+1,w_2.shape[1]))

w_2_Aug[0:w_2.shape[0],0:w_2.shape[1]] = w_2

w_3_Aug = np.ones((w_3.shape[0]+1,w_3.shape[1]))

w_3_Aug[0:w_3.shape[0],0:w_3.shape[1]] = w_3

# 初始化解向量

Weight1 = np.array([[0,0,0]]).T

Weight2 = Weight1.copy()

Weight3 = Weight1.copy()

# 设定校正增量

C = 1

# 初始化标记

flag = True

while(True):

if(np.dot(Weight1.T,w_1_Aug) <= np.dot(Weight2.T,w_1_Aug) and

np.dot(Weight1.T,w_1_Aug) <= np.dot(Weight3.T,w_1_Aug)):

Weight1 = Weight1 + C*w_1_Aug

Weight2 = Weight2 - C*w_1_Aug

Weight3 = Weight3 - C*w_1_Aug

flag = False

elif(np.dot(Weight1.T,w_1_Aug) <= np.dot(Weight2.T,w_1_Aug) and

np.dot(Weight1.T,w_1_Aug) > np.dot(Weight3.T,w_1_Aug)):

Weight1 = Weight1 + C*w_1_Aug

Weight2 = Weight2 - C*w_1_Aug

flag = False

elif(np.dot(Weight1.T,w_1_Aug) > np.dot(Weight2.T,w_1_Aug) and

np.dot(Weight1.T,w_1_Aug) <= np.dot(Weight3.T,w_1_Aug)):

Weight1 = Weight1 + C*w_1_Aug

Weight3 = Weight3 - C*w_1_Aug

flag = False

if(np.dot(Weight2.T,w_2_Aug) <= np.dot(Weight1.T,w_2_Aug) and

np.dot(Weight2.T,w_2_Aug) <= np.dot(Weight3.T,w_2_Aug)):

Weight1 = Weight1 - C*w_2_Aug

Weight2 = Weight2 + C*w_2_Aug

Weight3 = Weight3 - C*w_2_Aug

flag = False

elif(np.dot(Weight2.T,w_2_Aug) <= np.dot(Weight1.T,w_2_Aug) and

np.dot(Weight2.T,w_2_Aug) > np.dot(Weight3.T,w_2_Aug)):

Weight1 = Weight1 - C*w_2_Aug

Weight2 = Weight2 + C*w_2_Aug

flag = False

elif(np.dot(Weight2.T,w_2_Aug) > np.dot(Weight1.T,w_2_Aug) and

np.dot(Weight2.T,w_2_Aug) <= np.dot(Weight3.T,w_2_Aug)):

Weight2 = Weight2 + C*w_2_Aug

Weight3 = Weight3 - C*w_2_Aug

flag = False

if(np.dot(Weight3.T,w_3_Aug) <= np.dot(Weight1.T,w_3_Aug) and

np.dot(Weight3.T,w_3_Aug) <= np.dot(Weight2.T,w_3_Aug)):

Weight1 = Weight1 - C*w_3_Aug

Weight2 = Weight2 - C*w_3_Aug

Weight3 = Weight3 + C*w_3_Aug

flag = False

if(np.dot(Weight3.T,w_3_Aug) <= np.dot(Weight1.T,w_3_Aug) and

np.dot(Weight3.T,w_3_Aug) > np.dot(Weight2.T,w_3_Aug)):

Weight1 = Weight1 - C*w_3_Aug

Weight3 = Weight3 + C*w_3_Aug

flag = False

if(np.dot(Weight3.T,w_3_Aug) > np.dot(Weight1.T,w_3_Aug) and

np.dot(Weight3.T,w_3_Aug) <= np.dot(Weight2.T,w_3_Aug)):

Weight2 = Weight2 - C*w_3_Aug

Weight3 = Weight3 + C*w_3_Aug

flag = False

if(flag == True):

break

else:

flag = True

print(Weight1)

print(Weight2)

print(Weight3)

最后得出:

则判别函数为:

后记

如有问题,欢迎交流批评指正。

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

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

相关文章

原来C语言和其他高级语言的最大的区别是这个...

我们知道C语言和其他高级语言,最大的区别就是C语言是要操作内存。 如有小伙伴想自学&#xff0c;可以进群731871503进行交流 学习&#xff0c;提升编程&#xff0c;共同进步 我们需要知道——变量&#xff0c;其实是内存地址的一个抽像名字罢了。在静态编译的程序中&#xff…

python爬虫登录网站_python爬虫19 | 遇到需要的登录的网站怎么办?用这3招轻松搞定!...

你好 由于你是游客 无法查看本文 请你登录再进 谢谢合作当你在爬某些网站的时候 需要你登录才可以获取数据 咋整&#xff1f; 莫慌 小帅b把这几招传授给你 让你以后从容应对那么 接下来就是登录的常见方法无非是这两种 1、让你输入帐号和密码登录2、让你输入帐号密码验证码登录…

ei会议论文录用但不参加会议_美国研究生和博士申请论文发表真的很重要吗?...

在美国研究生和博士申请的过程中&#xff0c;论文可以直观体现申请者研究经历&#xff0c;一篇高质量的论文能够让美国招生官能够快速了解到申请者对所申请专业的理解&#xff0c;同时能够通过文章论述直观感受到申请者的学术思维力、判断力、逻辑分析能力等&#xff0c;这是简…

干货 | 大牛谈嵌入式C语言的高级用法

C语言程序设计是我们的专业基础课&#xff0c;但是C语言本身却是一个非常强大的工具&#xff0c;它是到目前为止最为广泛使用的工具&#xff0c;并且在可以预见的将来&#xff0c;它仍然是皈依为程序员的人们心中的神器。这个工具作什么的呢&#xff1f;它在人和机器之间建立了…

python提示对话框自动关闭_Python - tkinter:打开和关闭对话框窗口

我是Python新手&#xff0c;必须编写一个简单的GUI程序&#xff0c;为了简单起见&#xff0c;我选择在tkinter中这样做。 我想要的GUI应该非常类似于在Windows上安装程序时经常遇到的对话框&#xff08;您想要安装的位置&#xff0c;您想要的模块等&#xff09;。基本上当它在p…

第六篇:如何学习C语言?

现在很多人初学者直接选择C语言的人已经变得越来越少了&#xff0c;主要原因还是在招聘岗位数量上无法和java&#xff0c;php等高级语言想媲美&#xff0c;但并不代表C语言已经穷途末路没有前景了&#xff0c;C语言的角色从前台变成了后台服务&#xff0c;在一些关键领域还承担…

long mode 分页_x86 系列 CPU 内存寻址模式总结

说明:S16 表示 16 位段寄存器P16 表示 16 位的普通寄存器, 立即数, 结果为 16 位的表达式等等.P32 同上, 只是扩展到 32 位.一. CPU 概况1. 8086: 8 位数据线, 16 位地址线. 8 位数据线和前8位地址线合用.2. 8088: 16位数据线, 16位地址线. 数据线和地址线完全分时合用.3. 8018…

典型相关分析_2020-2025年中国海水淡化行业发展前景与投资预测分析报告

《2020-2025年中国海水淡化行业发展前景与投资预测分析报告》利用中经未来长期对海水淡化市场跟踪搜集的一手数据&#xff0c;从行业的高度全面而准确的构建分析体系。报告主要分析了海水淡化行业的发展概况、海水淡化行业的发展环境、国外海水淡化行业发展经验借鉴、中国海水淡…

语言还是你不得不服的大哥级别编程语言!

直到今天&#xff0c;有人在喊C语言过时的语言&#xff0c;还有什么值得学习的&#xff0c;现在看Python&#xff0c;PHP等语言现在都很容易用&#xff0c;谁还在学习老C语言&#xff0c;其实这是真的吗&#xff1f;作者下载了两种语言的源代码作为下载器。由于空间的限制&…

字节跳动测试开发4轮面试_字节跳动测试开发工程师一面总结

公司简介:字节跳动是全球发展速度最快的科技公司之一&#xff0c;公司旗下拥有今日头条、抖音、西瓜视频、懂车帝、Faceu激萌、轻颜相机、飞书、皮皮虾、TikTok等多款海内外产品&#xff0c;全系产品月活用户超过15亿。目前还在积极探索游戏、教育、金融领域。字节跳动办公室遍…

python爬虫好学不_python爬虫好学吗

python爬虫难学吗 简单来说互联网是由一个个站点和网络设备组成的大网&#xff0c;我们通过浏览器访问站点&#xff0c;站点把HTML、JS、CSS代码返回给浏览器&#xff0c;这些代码经过浏览器解析、渲染&#xff0c;将丰富多彩的网页呈现我们眼前。爬虫是什么&#xff1f; 如果我…

力压Java、C语言!Python 获2018年度编程语言

TIOBE 近日宣布&#xff1a;Python 成为 2018 年度编程语言&#xff0c;Python之所以获得这个称号&#xff0c;是因为它在2018年的排名中比其他所有语言都高。Python语言赢得了3.62%的选票&#xff0c;紧随其后的是Visual Basic . net&#xff08;3.2%&#xff09;和Java&#…

.idea文件夹是做什么的_33 个 IDEA 最牛配置,写代码太爽了!

作者&#xff1a;琦彦blog.csdn.net/fly910905/article/details/778683001.设置maven1.在File->settings->搜索maven2.Mavan home directory--设置maven安装包的bin文件夹所在的位置3.User settings file--设置setting文件所在的位置4.Local repository--设置本地仓库2.I…

耳挂式蓝牙耳机原理_一种耳挂式蓝牙耳机的制作方法

本实用新型涉及蓝牙耳机技术领域&#xff0c;特别涉及一种耳挂式蓝牙耳机。背景技术&#xff1a;随着蓝牙耳机技术的使用普及&#xff0c;蓝牙耳机在智能设备以及智能通信中得到了广泛地应用。自蓝牙耳机出现以来&#xff0c;蓝牙耳机适用于各种场合&#xff0c;蓝牙耳机在佩戴…

学习C语言什么都做不了,为什么你还学?是这样吗?

对于大部分初学者&#xff0c;学习C语言的目的是希望做一名合格的程序员&#xff0c;开发出靠谱的软件来。但是学了C语言的基本语法后&#xff0c;发现只能开发“黑底白字”的DOS程序&#xff0c;完全没有漂亮的界面和生动的交互。于是学数据结构&#xff0c;学算法&#xff0c…

手动卸载_一种手动液压一体式卸载扳手

摘要一种手动液压一体式卸载扳手&#xff0c;属于煤矿井下施工设备领域&#xff0c;可解决井下回收单体柱时存在的安全隐患的问题&#xff0c;包括扳手腔体、柱塞、堵头和加长把手&#xff0c;扳手腔体包括半圆柱体Ⅰ以及与半圆柱体Ⅰ连接的半圆柱体Ⅱ&#xff0c;所述半圆柱体…

docker运行jenkins挂掉_【图文】Jenkins教程集成SonarQube

什么是SonarQube?看看维基百科的说明&#xff1a;SonarQube与CI/CD架构图SonarQube与CI/CD架构图Docker运行SonarQube简单了解之后&#xff0c;开始安装SonarQube.这里用Docker安装注&#xff1a;这里用mysql来存储SonarQube的数据&#xff0c;SonarQube7.9起已经不在支持mysq…

干货丨总结5类面试官特点和应对方法

秋招已经结束&#xff0c;年后春招即将拉开帷幕&#xff0c;想必大家都已经参加了不少面试&#xff0c;也见了不少面试官&#xff0c;俗话说知己知彼&#xff0c;百战不殆&#xff0c;推荐下面这篇文章&#xff0c;一起看看面试官可以分成哪几类以及应对的方法~ 一。虚张声势型…

去除面部黑色素小妙招_面部黑色素沉着怎么去除 推荐几个去黑色素的方法

1面部黑色素沉着怎么去除 推荐几个去黑色素的方法面部黑色素沉着怎么去除 推荐几个去黑色素的方法1、使用无刺激的美白护肤品定期做保养。2、对于色素较深且面积较小的色斑&#xff0c;可先用黑疗法(即药物点疗或激光点疗然后再配合一些能控制黑色素形成且可加速细胞新陈代谢的…

python写选择排序_如何快速掌握python选择排序算法?

对于算法&#xff0c;我们不少讲述&#xff0c;但是大部分小伙伴都希望&#xff0c;将单个算法拆分讲解&#xff0c;这样可以更加深对算法的印象&#xff0c;好了&#xff0c;本期&#xff0c;就针对选择排序算法&#xff0c;给大家讲解说明哦~感兴趣的小伙伴一起来看下吧~ 在列…