Python实战之神经网络(1)
2015-06-14 21:31
711 查看
本文转自:/article/1893412.html
python有专门的神经网络库,但为了加深印象,我自己在numpy库的基础上,自己编写了一个简单的神经网络程序,是基于Rosenblatt感知器的,这个感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入求和后进行调节。为了便于观察,这里的数据采用二维数据。
目标函数是训练结果的误差的平方和,由于目标函数是一个二次函数,只存在一个全局极小值,所以采用梯度下降法的策略寻找目标函数的最小值。
代码如下:
[python]
view plaincopyprint?
import numpy as np
import pylab as pl
b=1 #偏置
a=0.3 #学习率
x=np.array([[b,1,3],[b,2,3],[b,1,8],[b,2,15],[b,3,7],[b,4,29],[b,4,8],[b,4,20]]) #训练数据
d=np.array([1,1,-1,-1,1,-1,1,-1]) #训练数据类别
w=np.array([b,0,0]) #初始w
def sgn(v):
if v>=0:
return 1
else:
return -1
def comy(myw,myx):
return sgn(np.dot(myw.T,myx))
def neww(oldw,myd,myx,a):
return oldw+a*(myd-comy(oldw,myx))*myx
for ii in range(5): #迭代次数
i=0
for xn in x:
w=neww(w,d[i],xn,a)
i+=1
print w
myx=x[:,1] #绘制训练数据
myy=x[:,2]
pl.subplot(111)
x_max=np.max(myx)+15
x_min=np.min(myx)-5
y_max=np.max(myy)+50
y_min=np.min(myy)-5
pl.xlabel(u"x")
pl.xlim(x_min,x_max)
pl.ylabel(u"y")
pl.ylim(y_min,y_max)
for i in range(0,len(d)):
if d[i]==1:
pl.plot(myx[i],myy[i],'r*')
else:
pl.plot(myx[i],myy[i],'ro')
#绘制测试点
test=np.array([b,9,19])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
test=np.array([b,9,64])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
test=np.array([b,9,16])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
test=np.array([b,9,60])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
#绘制分类线
testx=np.array(range(0,20))
testy=testx*2+1.68
pl.plot(testx,testy,'g--')
pl.show()
for xn in x:
print "%d %d => %d" %(xn[1],xn[2],comy(w,xn))
图中红色是训练数据,蓝色是测试数据,圆点代表类别-1.星点代表类别1。由图可知,对于线性可分的数据集,Rosenblatt感知器的分类效果还是不错的
本文转自:/article/1893412.html
python有专门的神经网络库,但为了加深印象,我自己在numpy库的基础上,自己编写了一个简单的神经网络程序,是基于Rosenblatt感知器的,这个感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入求和后进行调节。为了便于观察,这里的数据采用二维数据。
目标函数是训练结果的误差的平方和,由于目标函数是一个二次函数,只存在一个全局极小值,所以采用梯度下降法的策略寻找目标函数的最小值。
代码如下:
[python]
view plaincopyprint?
import numpy as np
import pylab as pl
b=1 #偏置
a=0.3 #学习率
x=np.array([[b,1,3],[b,2,3],[b,1,8],[b,2,15],[b,3,7],[b,4,29],[b,4,8],[b,4,20]]) #训练数据
d=np.array([1,1,-1,-1,1,-1,1,-1]) #训练数据类别
w=np.array([b,0,0]) #初始w
def sgn(v):
if v>=0:
return 1
else:
return -1
def comy(myw,myx):
return sgn(np.dot(myw.T,myx))
def neww(oldw,myd,myx,a):
return oldw+a*(myd-comy(oldw,myx))*myx
for ii in range(5): #迭代次数
i=0
for xn in x:
w=neww(w,d[i],xn,a)
i+=1
print w
myx=x[:,1] #绘制训练数据
myy=x[:,2]
pl.subplot(111)
x_max=np.max(myx)+15
x_min=np.min(myx)-5
y_max=np.max(myy)+50
y_min=np.min(myy)-5
pl.xlabel(u"x")
pl.xlim(x_min,x_max)
pl.ylabel(u"y")
pl.ylim(y_min,y_max)
for i in range(0,len(d)):
if d[i]==1:
pl.plot(myx[i],myy[i],'r*')
else:
pl.plot(myx[i],myy[i],'ro')
#绘制测试点
test=np.array([b,9,19])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
test=np.array([b,9,64])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
test=np.array([b,9,16])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
test=np.array([b,9,60])
if comy(w,test)>0:
pl.plot(test[1],test[2],'b*')
else:
pl.plot(test[1],test[2],'bo')
#绘制分类线
testx=np.array(range(0,20))
testy=testx*2+1.68
pl.plot(testx,testy,'g--')
pl.show()
for xn in x:
print "%d %d => %d" %(xn[1],xn[2],comy(w,xn))
import numpy as np import pylab as pl b=1 #偏置 a=0.3 #学习率 x=np.array([[b,1,3],[b,2,3],[b,1,8],[b,2,15],[b,3,7],[b,4,29],[b,4,8],[b,4,20]]) #训练数据 d=np.array([1,1,-1,-1,1,-1,1,-1]) #训练数据类别 w=np.array([b,0,0]) #初始w def sgn(v): if v>=0: return 1 else: return -1 def comy(myw,myx): return sgn(np.dot(myw.T,myx)) def neww(oldw,myd,myx,a): return oldw+a*(myd-comy(oldw,myx))*myx for ii in range(5): #迭代次数 i=0 for xn in x: w=neww(w,d[i],xn,a) i+=1 print w myx=x[:,1] #绘制训练数据 myy=x[:,2] pl.subplot(111) x_max=np.max(myx)+15 x_min=np.min(myx)-5 y_max=np.max(myy)+50 y_min=np.min(myy)-5 pl.xlabel(u"x") pl.xlim(x_min,x_max) pl.ylabel(u"y") pl.ylim(y_min,y_max) for i in range(0,len(d)): if d[i]==1: pl.plot(myx[i],myy[i],'r*') else: pl.plot(myx[i],myy[i],'ro') #绘制测试点 test=np.array([b,9,19]) if comy(w,test)>0: pl.plot(test[1],test[2],'b*') else: pl.plot(test[1],test[2],'bo') test=np.array([b,9,64]) if comy(w,test)>0: pl.plot(test[1],test[2],'b*') else: pl.plot(test[1],test[2],'bo') test=np.array([b,9,16]) if comy(w,test)>0: pl.plot(test[1],test[2],'b*') else: pl.plot(test[1],test[2],'bo') test=np.array([b,9,60]) if comy(w,test)>0: pl.plot(test[1],test[2],'b*') else: pl.plot(test[1],test[2],'bo') #绘制分类线 testx=np.array(range(0,20)) testy=testx*2+1.68 pl.plot(testx,testy,'g--') pl.show() for xn in x: print "%d %d => %d" %(xn[1],xn[2],comy(w,xn))
图中红色是训练数据,蓝色是测试数据,圆点代表类别-1.星点代表类别1。由图可知,对于线性可分的数据集,Rosenblatt感知器的分类效果还是不错的
相关文章推荐
- C#网络编程 tcpclient (阻塞异步)
- 【iOS开发-网络】AFN的使用
- APP测试框架(整合网络资源版)_Phoenix-晶
- Android开发之Http通信HttpClient接口
- HTTP协议学习
- 黑马程序员——网络编程2:网络通讯组件介绍及演示-上
- 黑马程序员——网络编程1:网络通讯原理简介
- JAVA实验五(网络编程)
- 计算机网络体系结构与协议
- 计算机网络技术中的数据通信
- 网络协议结构
- boa,thttp服务器安装,配置,测试
- ACM/ICPC World Finals 2013 C Surely You Congest
- 深度神经网络结构以及Pre-Training的理解
- Java学习【网络编程】
- 使用CNN(convolutional neural nets)检测脸部关键点教程(五):通过前训练(pre-train)训练专项网络
- HTTP协议学习笔记
- Android 之 网络访问服务器,解析JSON数据(返回无乱码)
- Android开发之Http通信HttpURLConnection接口
- 基于TCP的通信为什么需要RETRY