图文详解感知机算法原理及Python实现
作者:Mr.Winter` 发布时间:2022-03-07 23:56:34
写在前面
机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。
本期目标:实现这样一个效果
1.什么是线性模型
线性模型的假设形式是属性权重、偏置与属性的线性组合,即
称为广义线性模型(generalized linear model),其中g(⋅)称为联系函数(link function)。
广义线性模型本质上仍是线性的,但通过g(⋅)进行非线性映射,使之具有更强的拟合能力,类似神经元的激活函数。例如对数线性回归(log-linear regression)是g(⋅)=ln(⋅)时的情形,此时模型拥有了指数逼近的性质。
线性模型的优点是形式简单、易于建模、可解释性强,是更复杂非线性模型的基础。
2.感知机概述
感知机(Perceptron)是最简单的二分类线性模型,也是神经网络的起源算法,如图所示。
y=w^Tx^是 Rd空间的一条直线,因此感知机实质上是通过训练参数w^改变直线位置,直至将训练集分类完全,如图所示,或者参考文章开头的动图。
3.手推感知机原理
机器学习强基计划的初衷就是搞清楚每个算法、每个模型的数学原理,让我们开始吧!
感知机的损失函数定义为全体误分类点到感知机切割超平面的距离之和:
对于二分类问题y∈{−1,1},则误分类点的判断方法为
这在二分类问题中是个很常用的技巧,后面还会遇到这种等效形式。
从而损失函数也可简化为下面的形式以便于求导:
方程两边同时乘以系数都成立,所以直线系数 w^可以随意缩放,这里可令|w^|=1
若采用梯度下降法进行优化(梯度法可参考图文详解梯度下降算法的原理及Python实现),则算法流程为:
4.Python实现
4.1 创建感知机类
class Perceptron:
def __init__(self):
self.w = np.mat([0,0]) # 初始化权重
self.b = 0 # 初始化偏置
self.delta = 1 # 设置学习率为1
self.train_set = [[np.mat([3, 3]), 1], [np.mat([4, 3]), 1], [np.mat([1, 1]), -1]] # 设置训练集
self.history = [] # 训练历史
4.2 更新权重与偏置
def update(self,error_point):
self.w += self.delta*error_point[1]*error_point[0]
self.b += self.delta*error_point[1]
self.history.append([self.w.tolist()[0],self.b])
4.3 判断误分类点
def judge(self,point):
return point[1]*(self.w*point[0].T+self.b)
4.4 训练感知机
def train(self):
flag = True
while(flag):
count = 0
for point in self.train_set:
if(self.judge(point)<=0):
self.update(point)
else:
count += 1
if(count == len(self.train_set)):
flag = False
4.5 动图可视化
def show():
print("参数w,b更新过程:",perceptron.history)
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=len(perceptron.history),
interval=1000, repeat=False,blit=True)
plt.show()
5.总结
感知机最大的缺陷在于其线性,单个感知机只能表达一条直线,即使是如图(a)所示简单的异或门样本,都无法进行分类。对此有两种解决方式:
通过多条直线,即多层感知机(Multi-Layer Perceptron, MLP)进行分类,如图(b)所示;在线性加权的基础上引入非线性变换,如图(c)所示。
来源:https://blog.csdn.net/FRIGIDWINTER/article/details/126131955


猜你喜欢
- 一、异常处理在程序开发中如果遇到一些 不可预知的错误 或 你懒得做一些判断 时,可以选择用异常处理来做。import requestswhi
- Django rest_framework serializer.HiddenField(default=serializer.Curren
- 1、查看鼠标右键快捷键,可以看到pycharm打开项目快捷键2、打开注册器win+r键打开,输入regedit,运行注册器找到下面的路径:计
- go get 和 go install 的区别先看结论:go get: 对 go mod 项目,添加,更新,删除&nbs
- 一、爬虫的简单理解1. 什么是爬虫?网络爬虫也叫网络蜘蛛,如果把互联网比喻成一个蜘蛛网,那么蜘蛛就是在网上爬来爬去的蜘蛛,爬虫程序通过请求u
- 1、创建Django项目打开pycharm,新建Django项目,可以选择一个虚拟环境建完之后目录如下:2、创建应用,我这里命名为demo在
- 前阵子刚完成一个B/S架构的学校办公系统,体会就是表太多,文件太多,而每个文件中类似的操作(代码)也太多了,例如学生信息和教师信息操作,st
- 哪个Python版本?当我提及Python,所指的就是CPython 2(准确的是2.7).我会显式提醒那些相同的代码在CPython 3
- 最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容。如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来
- 1、日期大小的比较,传到xml中的日期格式要符合'yyyy-MM-dd',这样才能走索引,如:'yyyy'改
- 1、下载安装 python https://www.python.org/downloads/windows/web-based insta
- 本文主要给大家介绍的是关于Golang解析json数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:使用 Gol
- 加载模型并查看网络加载模型,以vgg19为例。打开终端> pythonPython 3.7.2 (tags/v3.7.2:9a3ffc
- 这篇文章主要介绍了微信小程序封装多张图片上传api代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 如果进入了shell交互窗口,python的退出方式只能够用函数不能够用命令,这有时候让人感觉到很不习惯。因为函数会比命令多一个括号的输入,
- 背景为了更好的发展自身的测试技能,应对测试行业以及互联网行业的迭代变化。自学python以及自动化测试。虽然在2017年已经开始接触了sel
- 场景说明假设有一个mysql表被水平切分,分散到多个host中,每个host拥有n个切分表。 如果需要并发去访问这些表,快速得到查询结果,
- 最近接到一个领导需求,将xmind脑图直接转成可以导入的excel用例,并且转换成gui可执行的exe文件,方便他人使用。因为对Python
- 1.Jinja21.简介Jinja2是Python下一个被广泛应用的模版引擎,他的设计思想来源于Django的模板引擎,并扩展了其语法和一系
- 使用Python实现了一下我们同事的C++高斯投影正反算,实际跑通,可用。#!/ usr/bin/python# -*- coding:ut