图文详解感知机算法原理及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
猜你喜欢
- python中ord函数Python ord()函数 (Python ord() function)ord() function is a
- 本文实例讲述了Python创建系统目录的方法。分享给大家供大家参考。具体如下:Python2 mkdir在没有上级目录时创建会失败.该方法可
- 我们之前要想在调度里面实现延时执行,我们可以使用管道阻塞,直到有人往管道里面写东西才变通畅,还可以使用sleep来睡觉,但是睡觉的过程,协程
- 一、eval()函数是什么?Python的一个内置函数;返回传入字符串的表达式结果(官方)二、eval()函数语法解析三、eval()函数应
- 可以用函数 json.dumps()将 Python 对象编码转换为字符串形式。例如:import json python_obj = [[
- numpy.where() 有两种用法:1. np.where(condition, x, y)满足条件(condition),输出x,不满
- 做数据分析、科学计算等离不开工具、语言的使用,目前最流行的数据语言,无非是MATLAB,R语言,Python这三种语言,但今天小编简单总结了
- 本文介绍了Python格式化输出%s和%d的实例案例。分享给大家供大家参考,具体如下:python print格式化输出1. 打印字符串pr
- 利用Chrome或Firefox保存的Har文件http/https请求,可用于遍历字典提交From表单.少说废话直接上代码Github地址
- 本文实例讲述了Yii配置与使用memcached缓存的方法。分享给大家供大家参考,具体如下:1. 下载memcached软件包,解压,把me
- 我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中。之前我
- # 有时候我们提前知道了一个数组的大小,需要给每个元素赋值,此时append好像不管用。我们需要定义一个定# # 长的数组,python中代
- Abs (数值)绝对值。一个数字的绝对值是它的正值。空字符串 (null) 的绝对值,也是空字符串。未初始化的变数,其绝对为 0例子:ABS
- 近几天闲着没事开始学了些python,看了看之前写过的代码,把写过的基础的几个程序写进博客,今天是第一个。一个可以说简单的不能再简单的小程序
- 代码如下:--销售冠军 --问题:在公司中,老板走进来,要一张每个地区销量前3名的销售额与销售员的报表 --- create t
- 什么是特征金字塔很多文章里面写道特征金字塔这个结构,其实这个结构Very-Easy目标检测任务和语义分割任务里面常常需要检测小目标,但是小目
- 数据挖掘的过程中,数据进行处理是一重要的环节,我们往往会将其封装成一个方法,而有的时候这一个方法可能会被反复调用,每一次都对数据进行处理这将
- 今天,总结一下最近编程使用的python异常处理和日志处理的感受,其实异常处理是程序编写时非常重要的一块,但是我一开始学的语言是C++,这门
- 学习目的: 掌握文本框的用法 初次接触try…catch…语法 今天内容很轻松,用一个例子,输入年月日,判断输入是否正确 图片如下: 用个
- turtle库是一个很经典的绘图库,其最初来自于1967年创造的logo编程语言,之后被Python编写放到了Python的内置模块中。网络