感知机原理以及python实现
感知机原理以及python的实现
- 感知机
- 感知机的定义
- 数据的线性可分
- 损失函数
- 感知机的原始算法
- 原始算法的例题
- 感知机原始算法的对偶形式
- 对偶形式的算法过程
- 对偶形式的优点
- 感知机算法的python实现
- 线性可分与凸壳
- 参考资料
感知机
感知机是一个二分类的线性分类模型,输入数据为实例的特征向量,输出为实例的分类,输出取+1和-1两个值。感知机是一个分类模型,旨在找出一个超平面,这个超平面能够正确的将输入数据分类。感知机是支持向量机和神经网络的基础。
感知机的定义
假设 xxx 表示为实例的特征向量,对应于输入空间的一个点,输出空间 f(x)f(x)f(x) 表示 xxx 的类别,那么从 xxx 到 f(x)f(x)f(x) 的映射可以写为:
f(x)=sign(w⋅x+b)f(x) = sign (w·x + b ) f(x)=sign(w⋅x+b)
从输入空间到输出空间的映射称之为感知机,其中 xxx 表示为输入空间的一个实例,www 和 bbb 为感知机的参数,www 相当于实例 xxx 的系数,也叫做权值。b∈Rb∈Rb∈R 叫做偏移量。signsignsign 函数即为常见的+1 和 -1的判断函数。
数据的线性可分
给定一个数据集 T
T=[(x1,y1),(x2,y2),....,(xn,yn)]T = [(x_1,y_1),(x_2,y_2),....,(x_n,y_n)] T=[(x1,y1),(x2,y2),....,(xn,yn)]
如果存在一个超平面,可以将数据集 T 中所有的向量完全正确的划分在超平面的两侧。那么就称这个数据集线性可分,否则,线性不可分。
损失函数
假设一个数据集 T 是线性可分的,根据我们的数据,要寻找出一个能够将数据完全正确划分开的超平面。感知机的映射函数为
f(x)=sign(w⋅x+b)f(x) = sign (w·x + b ) f(x)=sign(w⋅x+b)
也就是我们需要确定f(x)f(x)f(x) 中www 和 bbb 的值。因此我们需要采取一个方法,即定义一个损失函数,并将损失函数极小化。
损失函数的一个选择方法是选择误分类的点数。但是不能根据这样的方式推导出www 和 bbb 的值。另一个方法是选择误分类点到超平面SSS的距离。一个点x0x_0x0到超平面SSS的距离为:
1∣∣w∣∣∣w⋅x0+b∣\frac{1}{||w||}|w·x_0 + b| ∣∣w∣∣1∣w⋅x0+b∣
因为错误分类的点到超平面的距离与将改错误点正确分类到超平面的距离总是相反的,所以误分类的点到超平面的距离则是:
−1∣∣w∣∣y0(w⋅x0+b)-\frac{1}{||w||}y_0(w·x_0 + b)−∣∣w∣∣1y0(w⋅x0+b)
假设分类错误的点的个数为N,因此所有错误的点到超平面的距离可以表示为:
−1∣∣w∣∣∑i=1Nyi(w⋅xi+b)-\frac{1}{||w||} \sum_{i=1}^Ny_i(w·x_i + b) −∣∣w∣∣1i=1∑Nyi(w⋅xi+b)
这里对1∣∣w∣∣\frac{1}{||w||} ∣∣w∣∣1进行删除的话,就得到了感知机的损失函数:
L(w,b)=−∑i=1Nyi(w⋅xi+b)L(w,b) =-\sum_{i=1}^Ny_i(w·x_i + b) L(w,b)=−i=1∑Nyi(w⋅xi+b)
删除的原因一方面是我们追求的是损失函数为0的情况下的www 和 bbb
根据这个式子我们可以看出来,如果错误分类的数量为0,那么损失函数也为0,所以和系数没有多大的关系。并不影响最终结果。并且损失函数始终为正。并且损失函数为连续可导函数。
感知机的原始算法
给定一个数据集
T=[(x1,y1),(x2,y2),....,(xn,yn)]T = [(x_1,y_1),(x_2,y_2),....,(x_n,y_n)] T=[(x1,y1),(x2,y2),....,(xn,yn)]
给定一个学习率η\etaη(0 < η\etaη < 1)
- 对www 和 bbb 赋初始值 w0w_0w0 和 b0b_0b0
- 选取一个数据点(xi,yi)(x_i,y_i)(xi,yi),并判断是否分类正确。根据公式yI(w∗xi+b)y_I(w*x_i+b)yI(w∗xi+b) 和0的大小来进行判断,大于0则分类正确。 如果分类错误
- 就对www 和 bbb进行更新,公式为:
w=w+ηxiyiw = w + \eta x_iy_iw=w+ηxiyi
b=b+ηyib = b + \eta y_ib=b+ηyi - 重复步骤2和步骤3,直到没有错误分类点。
- 最后我们就得到了感知机的参数www 和 bbb
原始算法的例题
有x1=(3,3),y1=1,x2=(4,3),y2=1,x3=(1,1),y1=−1x_1 = (3,3),y_1 = 1,x_2 = (4,3),y_2=1,x_3=(1,1),y_1=-1x1=(3,3),y1=1,x2=(4,3),y2=1,x3=(1,1),y1=−1组成的数据集T={(x1y1),(x2,y2),(x3,y3)}T=\lbrace(x_1y_1),(x_2,y_2),(x_3,y_3)\rbraceT={(x1y1),(x2,y2),(x3,y3)}
试构建感知机原始算法模型
- 对 www 和 bbb 赋初值为w0=0,b0=0w_0=0,b_0=0w0=0,b0=0。对 η\etaη 赋初值为 1.
- 选取数据点(x1,y1)(x_1,y_1)(x1,y1),判断是否分类正确。
y1(w0∗x1+b0)=0y_1(w_0*x_1+b_0) = 0y1(w0∗x1+b0)=0 分类错误 - 对www 和 bbb进行更新:
w1=w0+ηx1y1=(3,3)w_1 = w_0 + \eta x_1y_1 = (3,3)w1=w0+ηx1y1=(3,3)
b1=b0+ηy1=1b_1 = b_0 + \eta y_1 = 1b1=b0+ηy1=1 - 对x1,x2x_1,x_2x1,x2进行判断,因为y2(w1∗x2+b1)>0,y1(w1∗x1+b1)>0y_2(w_1*x_2+b_1)>0,y_1(w_1*x_1+b_1)>0y2(w1∗x2+b1)>0,y1(w1∗x1+b1)>0所以这两个分类正确。
- 对x3x_3x3进行判断,因为
y3(w1∗x3+b1)<0y_3(w_1*x_3+b_1)<0y3(w1∗x3+b1)<0 所以第三个数分类错误。 - 对www 和 bbb进行更新:
w2=w1+ηx3y3=(2,2)w_2 = w_1 + \eta x_3y_3 = (2,2)w2=w1+ηx3y3=(2,2)
b2=b1+ηy3=0b_2 = b_1 + \eta y_3 = 0b2=b1+ηy3=0 - 然后重复检查x3x_3x3,直到x3x_3x3套入公式后>0,然后重复步骤2-6。直到所有数据全部分类正确。
- 最终结果为 w7=(1,1),b=−3w_7 = (1,1),b = -3w7=(1,1),b=−3 。
感知机原始算法的对偶形式
在上面感知机的算法原理求解例题过程中,可以发现会检查很多次是否正确分类。假设修改了n次,则w,bw,bw,b 每次修改的增量为αiyixi\alpha_iy_ix_iαiyixi 和 αiyi\alpha_iy_iαiyi , 因为η\etaη 为常数,所以整合为 α\alphaα ,即αi=nηi\alpha_i = n\eta_iαi=nηi。那么最终的w,bw,bw,b 可以分别表示为:
w=∑i=1Nαiyixiw = \sum_{i=1}^N\alpha_iy_ix_iw=i=1∑Nαiyixi
b=∑i=1Nαiyib = \sum_{i=1}^N\alpha_iy_ib=i=1∑Nαiyi
那么最终,感知机的对偶形式可以变化为:
f(x)=sign(∑j=1Nαjyjxj⋅x+b)f(x) = sign (\sum_{j=1}^N\alpha_jy_jx_j · x + b ) f(x)=sign(j=1∑Nαjyjxj⋅x+b)
这里用jjj不用iii是因为要区分数据集中的iii
对偶形式的算法过程
- 对α\alphaα 和 bbb 赋值为 0
- 选取数据集的(xi,yi)(x_i,y_i)(xi,yi)
- 如果 yi(∑j=1Nαjxjyj⋅xi+b)≤0y_i(\sum_{j=1}^N\alpha_jx_jy_j·x_i+b)\leq0yi(∑j=1Nαjxjyj⋅xi+b)≤0
αi=αi+η\alpha_i = \alpha_i + \etaαi=αi+η
b=b+ηyib= b + \eta y_ib=b+ηyi - 重复步骤2-3 直到没有误分类数据。
对偶形式的优点
假设按照感知机原始形式所有的参数更新一共需要n次,对偶形式就是把这n次分摊到i个样本中去,这样最终的参数可以展开使用每个样本点进行表示,这样在判断误分类的时候的计算就都可以展开成样本之间的点乘形式,这样就可以通过提前算好的Gram矩阵来大大降低计算量,因为仅仅计算了一次,后续全部通过查表就可以了。而反观原始形式,每次参数改变,所有的矩阵计算全部需要计算,导致计算量比对偶形式要大很多。
感知机算法的python实现
import numpy as np
import matplotlib.pyplot as plt
import timedef check(x,y,w,b): # 检查是否正确分类wx = w * xwx = sum(wx)result = y * (wx + b)if result > 0:return Trueelse:return Falsedef regirt(x,y,n,w,b):# 将w, b 进行更新w = w + n*x*yb = b + n*yreturn w, bdef find_all(x_data, y_data, w, b): # 感知机流程data_len = len(x_data)i = 0while(i<data_len):print('正在测试',x_data[i], y_data[i])if check(x_data[i], y_data[i], w, b) == True:print(x_data[i], y_data[i], '分类正确')i += 1else:print( sum((w * x_data[i] + b) * y_data[i]), '< 0 ')w, b = regirt(x_data[i], y_data[i], n, w, b)print( 'w b 更新为:',w,b);i = 0print("\n")print('最终的w b 为:', w, b)return w, b if __name__ == "__main__":x_data = np.array([[3,3],[4,3],[1,1]])y_data = np.array([1,1,-1])w = 0b = 0n = 1find_all(x_data,y_data, w, b)
线性可分与凸壳
这里可以参考其他的博客,内容过多,以后再做详解。
https://blog.csdn.net/y954877035/article/details/52210734
参考资料
参考资料
[1]:https://www.zhihu.com/question/26526858
[2]:https://blog.csdn.net/weixin_43314519/article/details/106996639
[3]:https://blog.csdn.net/qq_29591261/article/details/77945561
[4]: 《统计学习方法》(第二版) 李航
感知机原理以及python实现相关推荐
- python gdbt+fm_GBDT回归的原理及Python实现
提到GBDT回归相信大家应该都不会觉得陌生(不陌生你点进来干嘛[捂脸]),本文就GBDT回归的基本原理进行讲解,并手把手.肩并肩地带您实现这一算法. 完整实现代码请参考本人的p...哦不是...git ...
- 手把手教你EMD算法原理与Python实现(更新)
Rose今天主要介绍一下EMD算法原理与Python实现.关于EMD算法之前介绍过<EMD算法之Hilbert-Huang Transform原理详解和案例分析>, SSVEP信号中含有自 ...
- 信号处理之频谱原理与python实现
目录 频谱分析 FFT频谱分析原理 下面就用python案例进行说明 案例1 案例2 短时傅里叶变换STFT 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区.QQ交流群:941473018 ...
- 倒频谱原理与python实现
目录 倒频谱定义 倒频谱python案例 本教程为脑机学习者Rose发表于公众号:脑机接口社区 .QQ交流群:903290195 倒频谱定义 倒频谱可以分析复杂频谱图上的周期结构,分离和提取在密集调频 ...
- 冲量(momentum)的原理与Python实现
冲量(momentum)的原理与Python实现 前言 参考:https://www.jianshu.com/p/58b3fe300ecb 梯度下降法(Gradient Descent)是机器学习中最 ...
- python实现逻辑回归的流程_逻辑回归原理及其python实现
September 28, 2018 7 min to read 逻辑回归原理及其python实现 原理 逻辑回归模型: $h_{\theta}(x)=\frac{1}{1+e^{-{\theta}^ ...
- 统计学习方法|感知机原理剖析及实现
欢迎直接到我的博客查看最近文章:www.pkudodo.com.更新会比较快,评论回复我也能比较快看见,排版也会更好一点. 原始blog链接: http://www.pkudodo.com/2018/ ...
- 典型相关分析(cca)原理_CCA典型关联分析原理与Python案例
文章来源于"脑机接口社区" CCA典型关联分析原理与Python案例mp.weixin.qq.com Rose今天分享一下CCA的相关原理以及Python应用,CCA在EEG等脑 ...
- python kmeans聚类 对二维坐标点聚类_Kmeans均值聚类算法原理以及Python如何实现
第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质 ...
- python实现守护进程_守护进程原理及Python实现
守护进程原理及Python实现 守护进程,不依赖于终端,在后台运行的程序,通常称为daemon(ˈdiːmən或ˈdeɪmən). 一些常见的Linux软件通常都是已守护进程的方式运行,比如: ngi ...
最新文章
- sftp shell 批量上传文件_Shell自动上传下载文件到SFTP服务器
- oracle imp 错误604,oracle imp导入出错
- 使用Spring框架开发会遇到的所有异常及解决方案(持续更)
- SPV、SPV节点和SPV钱包
- qt设置路径为应用程序启动路径
- SRM 542 DIV2
- Mtlab之图形标注
- 推荐一款好用的jquery弹出层插件——wbox
- The following paths are ignored by one of your .gitignore
- 程序员如何删库?(一看就会)Linux
- 想和大家讲述一个普通人的生活:现在差劲不可怕,只要最后是好的就行
- MySQL输入密码闪退
- Docker系列之MySQL安装教程
- 全球与中国网络性能监控工具市场现状及未来发展趋势
- 安卓上微信闪退的一种解决方法
- 小程序的缓存数据什么情况会被清除
- open-falcon监控实施
- FFMPEG学习【libavcodec】:编解码器:硬件加速器桥:VDPAU解码器和渲染器
- python如何读取文件中第一行的元素_python txt读取第一行数据库
- 论文翻译:Recent Iris and Ocular Recognition Methods in High- and Low-Resolution Images A Survey
热门文章
- 基于java拼图游戏(带文档)
- Java培训后如何找工作?
- android 圆角 水波纹_Android实现水波纹点击效果
- canvas卡通兔子萝卜飞行动画
- 怎么学好html5和css3,如何提高你的CSS水平
- c语言求数组中绝对值最小值,c语言中求绝对值的数学函数
- 【論文筆記】MIDAS:Microcluster-Based Detector of Anomalies in Edge Streams
- 个人搭建ASP网站,从头开始完全教程(一)
- jeffery0207博客导航
- matlab中怎么输入特殊符号