python开机号_感知机(python实现)

感知机(perceptron)是二分类的线性分类模型,输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机对应于输入空间中将实例划分为两类的分离超平面。感知机旨在求出该超平面,为求得超平面导入了基于误分类的损失函数,利用梯度下降法 对损失函数进行最优化(最优化)。感知机的学习算法具有简单而易于实现的优点,分为原始形式和对偶形式。感知机预测是用学习得到的感知机模型对新的实例进行预测的,因此属于判别模型。感知机由Rosenblatt于1957年提出的,是神经网络和支持向量机的基础。

行文脉络

感知机模型

感知机学习策略

感知机学习算法

原始形式

对偶形式

4. Github地址

1. 感知机模型

定义

假设输入空间(特征向量)为X⊆Rn,输出空间为Y={-1, +1}。输入x∈X表示实例的特征向量,对应于输入空间的点;输出y∈Y表示示例的类别。由输入空间到输出空间的函数为

f(x)=sign(w·x + b)(1)

称为感知机。其中,参数w叫做权值向量,b称为偏置。w·x表示w和x的内积。sign为符号函数,即

                                    (2)

几何解释

感知机模型是线性分类模型,感知机模型的假设空间是定义在特征空间中的所有线性分类模型,即函数集合{f|f(x)=w·x+b}。线性方程 w·x+b=0对应于特征空间Rn中的一个超平面S,其中w是超平面的法向量,b是超平面的截踞。这个超平面把特征空间划分为两部分。位于两侧的点分别为正负两类。超平面S称为分离超平面,如下图:

学习与预测

感知机学习即由训练数据集T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N)求得感知机模型(1),即求得参数w,b;感知机预测即根据得到的感知机模型(1),对新的输入实例给出对应的类型。

2. 感知机学习策略

假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据的正负实例点完全分开的分离超平面,即最终求得参数w、b。这需要一个学习策略,即定义(经验)损失函数并将损失函数最小化。

损失函数的一个自然的选择是误分类的点的总数。但是这样得到的损失函数不是参数w、b的连续可导函数,不宜优化。损失函数的另一个选择是误分类点到分里面的距离之和。

首先,对于任意一点xo到超平面的距离为

                                     (3)

其次,对于误分类点(xi,yi)来说 -yi(w·xi+b)>0

这样,假设超平面S的总的误分类点集合为M,那么所有误分类点到S的距离之和为

                           (4)

不考虑1/||w||,就得到了感知机学习的损失函数。

经验风险函数

给定数据集T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N),感知机sign(w·x+b)学习的损失函数定义为

                     (5)

其中M为误分类点的集合,这个损失函数就是感知机学习的经验风险函数。

显然,损失函数L(w,b)是非负的。如果没有误分类点,那么L(w,b)为0,误分类点数越少,L(w,b)值越小。一个特定的损失函数:在误分类时是参数w,b的线性函数,在正确分类时,是0.因此,给定训练数据集T,损失函数L(w,b)是w,b的连续可导函数。

3. 感知机学习算法

最优化问题:给定数据集T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N),求参数w,b,使其成为损失函数的解(M为误分类的集合):

                 (6)

3.1 感知机学习的原始形式

感知机学习是误分类驱动的,具体采用随机梯度下降法。首先,任意选定w0、b0,然后用梯度下降法不断极小化目标函数(6),极小化的过程不知一次性的把M中的所有误分类点梯度下降,而是一次随机选取一个误分类点使其梯度下降。

假设误分类集合M是固定的,那么损失函数L(w,b)的梯度由(7)(8)给出

                                  (7)

                                      (8)

随机选取一个误分类点(xi,yi),对w,b进行更新:

                                            (9)

                                              (10)

式中η(0≤η≤1)是步长,在统计学是中成为学习速率。步长越大,梯度下降的速度越快,更能接近极小点。如果步长过大,有可能导致跨过极小点,导致函数发散;如果步长过小,有可能会耗很长时间才能达到极小点。

算法(感知机学习算法的原始形式)

输入:T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N,学习速率为η)

输出:w, b;感知机模型f(x)=sign(w·x+b)

(1) 初始化w0,b0

(2) 在训练数据集中选取(xi, yi)

(3) 如果yi(w xi+b)≤0w= w +ηyixi

b= b +ηyi

(4) 转至(2)

直观解释:当一个实例点被误分类时,调整w,b,使分离超平面向该误分类点的一侧移动,以减少该误分类点与超平面的距离,直至超越该点被正确分类。

例1

对于训练数据集,其中正例点是x1=(3,3)T,x2=(4,3)T,负例点为x3=(1,1)T,用感知机学习算法的原始形式求感知机模型f(x)=w·x+b。这里w=(w(1),w(2))T,x=(x(1),x(2))T

解:构建最优化问题:

按照算法求解w, b。η=1

(1)取初值w0=0, b0=0

(2)对于(3,3):-(0+0)+0=0未被正确分类。更新w,b

w1=w0+1*y1·x1 = (0,0)T+1(3,3)T=(3,3)T

b1=b0+y1=1

得到线性模型w1x+b1 = 3x(1)+3x(2)+1

(3)返回(2)继续寻找yi(w·xi+b)≤0的点,更新w,b。直到对于所有的点yi(w·xi+b)>0,没有误分类点,损失函数达到最小。

分离超平面为x(1)+x(2)-3=0

感知机模型为 f(x)=sign(x(1)+x(2)-3)

在迭代过程中,出现w·xi+b=-2,此时,取任意一个点,都会是其小于0,不同的取值顺序会导致最终的结果不同,因此解并不是唯一的。为了得到唯一的超平面,需要对分离超平面增加约束条件,这就是支持向量机的想法。

实现代码

importosimportsys#An example in that book, the training set and parameters' sizes are fixed

training_set =[]

w=[]

b=0

lens=0

n=0#update parameters using stochastic gradient descent

defupdate(item):globalw, b, lens, nfor i inrange(lens):

w[i]= w[i] + n * item[1] *item[0][i]

b= b + n * item[1]print w, b #you can uncomment this line to check the process of stochastic gradient descent

#calculate the functional distance between 'item' an the dicision surface

defcal(item):globalw, b

res=0for i inrange(len(item[0])):

res+= item[0][i] *w[i]

res+=b

res*= item[1]returnres#check if the hyperplane can classify the examples correctly

defcheck():

flag=Falsefor item intraining_set:if cal(item) <=0:

flag=True

update(item)if not flag: #False

print "RESULT: w:" + str(w) + "b:"+str(b)

tmp= ''

for keys inw:

tmp+= str(keys) + ' 'tmp=tmp.strip()

modelFile.write(tmp+ '\n')

modelFile.write(str(b)+ '\n')

modelFile.write(str(lens)+ '\n')

modelFile.write(str(n)+ '\n')

modelFile.close()

os._exit(0)

flag=Falseif __name__=="__main__":if len(sys.argv) != 4:print "Usage: python perceptron.py n trainFile modelFile"exit(0)

n= float(sys.argv[1])

trainFile= file(sys.argv[2])

modelFile= file(sys.argv[3], 'w')

lens=0for line intrainFile:

chunk= line.strip().split(' ')

lens= len(chunk) - 1tmp_all=[]

tmp=[]for i in range(1, lens+1):

tmp.append(int(chunk[i]))

tmp_all.append(tmp)

tmp_all.append(int(chunk[0]))

training_set.append(tmp_all)

trainFile.close()for i inrange(lens):

w.append(0)for i in range(1000):

check()print "The training_set is not linear separable."

View Code

3.2 感知机学习的对偶形式

对偶形式的基本想法是,将w,b表示成为实例xi和标记yi的线性组合的形式,通过求解其系数而得到w和b。不失一般性,将初始值w0,b0设为0.对误分类点(xi,yi)通过

w = w + ηyixi

b = b + ηyi

的转换逐步修该w,b,设修改了n次,则w,b关于(xi,yi)的增量分别为aiyixi和aiyi,这里ai=niη最终学习到的w,b可以表示为

实例点更新次数越多,意味着它距离分离超平面越近,也就越难正确分类。换句话说,这样的实例对学习结果影响很大。

算法(感知机学习算法的对偶形式)

输入:T={(x1,y1),(x2,y2)...(xN,yN)}(其中xi∈X=Rn,yi∈Y={-1, +1},i=1,2...N,学习速率为η)

输出:a,b;感知机模型f(x)=sign(w·x+b)

(1) 初始化w0,b0

(2) 在训练数据集中选取(xi, yi)

(3) 如果

ai = ai + η

b = b + ηyi(4) 转至(2)

对偶形式中训练数据仅以内积的形式出现,为了方便可以预先把训练数据间内积计算出来并以矩阵的形式存储起来,这个矩阵就是所谓的Gram矩阵。

实现代码

importosimportsys#An example in that book, the training set and parameters' sizes are fixed

training_set =[]

w=[]

a=[]

b=0

lens=0

n=0

Gram=[]defcalInnerProduct(i, j):globallens

res=0for p inrange(lens):

res+= training_set[i][0][p] *training_set[j][0][p]returnresdefAddVector(vec1, vec2):for i inrange(len(vec1)):

vec1[i]= vec1[i] +vec2[i]returnvec1defNumProduct(num, vec):for i inrange(len(vec)):

vec[i]*=numreturnvecdefcreateGram():globallensfor i inrange(len(training_set)):

tmp=[]for j inrange(0, len(training_set)):

tmp.append(calInnerProduct(i, j))

Gram.append(tmp)#update parameters using stochastic gradient descent

defupdate(k):globala, b, n

a[k]+=n

b= b + n * training_set[k][1]print a, b #you can uncomment this line to check the process of stochastic gradient descent

#calculate the functional distance between 'item' an the dicision surface

defcal(k):globala, b

res=0for i inrange(len(training_set)):

res+= a[i] * int(training_set[i][1]) *Gram[i][k]

res+=b

res*= training_set[k][1]returnres#check if the hyperplane can classify the examples correctly

defcheck():globalw, a

flag=Falsefor i inrange(len(training_set)):if cal(i) <=0:

flag=True

update(i)if not flag: #False

for i inrange(len(training_set)):

w= AddVector(w, NumProduct(a[i] * int(training_set[i][1]), training_set[i][0]))print "RESULT: w:", w, "b:", b

tmp= ''

for keys inw:

tmp+= str(keys) + ' 'tmp=tmp.strip()

modelFile.write(tmp+ '\n')

modelFile.write(str(b)+ '\n')

modelFile.write(str(lens)+ '\n')

modelFile.write(str(n)+ '\n')

modelFile.close()

os._exit(0)

flag=Falseif __name__=="__main__":if len(sys.argv) != 4:print "Usage: python perceptron_duality.py n trainFile modelFile"exit(0)

n= float(sys.argv[1])

trainFile= file(sys.argv[2])

modelFile= file(sys.argv[3], 'w')

lens=0for line intrainFile:

chunk= line.strip().split(' ')

lens= len(chunk) - 1tmp_all=[]

tmp=[]for i in range(1, lens+1):

tmp.append(int(chunk[i]))

tmp_all.append(tmp)

tmp_all.append(int(chunk[0]))

training_set.append(tmp_all)

trainFile.close()

createGram()for i inrange(len(training_set)):

a.append(0)for i inrange(lens):

w.append(0)for i in range(1000):

check()print "The training_set is not linear separable."

View Code

4. GitHub地址

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

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

相关文章

linux 路由表设置 之 route 指令详解

使用下面的 route 命令可以查看 Linux 内核路由表。 [cpp] view plaincopy# route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 169.254.0.0 * …

10进制转化为16进制以内的转化

进制转化问题十进制转化为其它进制应该是比较简单的问题&#xff0c;就是一个%和/的问题&#xff0c;模之后再除就ok了 1 int a[1000];2 char c[]{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F};3 int main()4 {5 int m,n,i,t,k;6 printf("十进制数&#xff1a;");7 …

黄老师离开呆了十年的上海

关注我的老朋友都知道&#xff0c;我和一线码农&#xff08;黄新成&#xff09;以前是同事&#xff0c;我以前也写过文章说过他的事迹。我们曾经一起共事过一家电商服务公司&#xff0c;每天和千万量级的数据打交道。.NET 圈的朋友想必很多人都看过一线码农写的技术文章&#x…

Shell配置_配置IP

1、setup 打开图形化页面a) 选择网络配置b) 选择设置配置c) 选择第一个网卡2、启动网卡&#xff08;第一个网卡&#xff09;vim /etc/sysconfig/network-scripts/ifcfg-eth0将ONBOOT"no"改为ONBOOT"yes"3、重启网络服务service network restart来自为知笔记…

Spring入门5.事务管理机制

Spring入门5.事务管理机制 20131126 代码下载 &#xff1a; 链接: http://pan.baidu.com/s/1kYc6c 密码: 233t 回顾之前的知识,Spring 最为核心的两个部分IoC和AOP&#xff0c;我们已经学习过了&#xff0c;其中IoC是Spring的基础核心&#xff0c;AOP是建立在IoC之上的&#xf…

linux之路由知识之ip route 命令中的疑惑

1.基础知识 1.1 路由 &#xff08;Routing&#xff09; 1.1.1 路由策略 &#xff08;使用 ip rule 命令操作路由策略数据库&#xff09; 基于策略的路由比传统路由在功能上更强大&#xff0c;使用更灵活&#xff0c;它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应…

python怎么执行程序_小鹅通视频怎么下载?用python实现小鹅通视频下载(二)

小鹅通视频怎么下载&#xff1f;用python实现小鹅通视频下载(二)背景上次分享《小鹅通视频怎么下载&#xff1f;用python实现小鹅通视频下载(一)[1]》后&#xff0c;引来了很多人咨询小鹅通视频怎么下载的问题。其实咨询的人大多是不懂python[2]语言的人&#xff0c;也有一部分…

在 Azure Functions 上使用不同的路由前缀

点击上方蓝字关注“汪宇杰博客”原文&#xff1a;Azure Tips and Tricks翻译&#xff1a;汪宇杰导语有时需要使用与 Azure Functions 自动生成的路由前缀不同的路由前缀。例如&#xff1a;https://mynewapimc.azurewebsites.net/api/HttpTriggerCSharp1 在函数名之前使用 api。…

RabbitMq、ActiveMq、ZeroMq、kafka之间的比较,资料汇总

2019独角兽企业重金招聘Python工程师标准>>> MQ框架非常之多&#xff0c;比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka。这几种MQ到底应该选择哪个&#xff1f;要根据自己项目的业务场景和需求。下面我列出这些MQ之间的对比数据和资料。 第一部分&#xff1a;Rab…

linux之gdb基本调试命令和使用总结

1、gdb调试命令 描述backtrace(或bt)查看各级函数调用及参数finish连续运行到当前函数返回为止,然后停下来等待命令frame(或f) 帧编号选择栈帧info(或i) locals查看当前栈帧局部变量的值list(或l)列出源代码,接着上次的位置往下列,每次列10行list 行号列出从第几行开…

TMG学习(十一),保护企业内网上网安全

我们知道一个企业如果允许用户上网而且可以任意下载软件&#xff0c;这对于企业来说是非常危险的&#xff0c;用户无法辨别哪些是安全网站哪些网站存在风险&#xff0c;因此一旦用户在恶意网站上下载了软件&#xff0c;导致客户端中毒从而会影响整个企业内部网络&#xff0c;最…

sql跨表查询_跨表更新,看到自己写的SQL像个憨憨

有点 SQL 基础的朋友肯定听过 「跨表查询」&#xff0c;那啥是跨表更新啊&#xff1f;背景项目新导入了一批人员数据&#xff0c;这些人的有的部门名称发生了变化&#xff0c;有的联系方式发生了变化&#xff0c;暂且称该表为t_dept_members, 系统中有另外一张表 t_user_info 记…

iText创建一个含有中文的pdf文档

有朋友问我pdfbox支不支持向pdf文档中写入中文。然后试了好多遍都是有乱码&#xff0c;也找了好多资料没有找到解决办法。 但是在查找资料的过程中发现了另一个处理pdf的开源库iText.官方介绍 http://itextpdf.com/ 在这参考了两篇博客 博客1.pdfbox&iText生成PDF文件格式及…

万字长文 - 解读功能开关 | IDCF

原文&#xff1a;https://martinfowler.com/articles/feature-toggles.html作者&#xff1a;Pete Hodgson译者&#xff1a;冬哥功能开关Feature Toggle&#xff08;通常也称为功能标志Feature Flag&#xff09;是一种强大的技术&#xff0c;允许团队在不更改代码的情况下修改系…

linux c之gdb常用断点调试总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1 、安装GDB sudo apt-get install gdb 2 、怎么打断点 1 、源文件的某一行设置断点 break 行号 2、一个特定的函数设置断点 break 函数名 3、设置条件断点 break 行号 i…

2000多一件的大牌T恤,真实成本有多少?

▲ 点击查看喜大普奔&#xff0c;2021年度T恤大战总算是要在全国范围揭幕了。夏天的T恤永远不嫌多&#xff0c;基础款、印花款&#xff0c;从入春以来我们商城也陆陆续续上架了不少。但始终还有一些空白尚未填补&#xff0c;例如我们一直想给大家再找一些看起来上档次、穿起来显…

监控cacti中的RRDtool用法详解

RRDtool作为一个合格的运维工程师&#xff0c;监控技能必须是要掌握的&#xff0c;当然监控的软件很多很多(cacti,nagios,zabbix...)。而生产环境中一般只运用1、2种而已。所以全部掌握这些有点不靠谱。所以选择其中一种掌握之即可&#xff0c;当工作环境变化后还可以以之为跳板…