Python实战之神经网络(1)



本文转自:http://blog.csdn.net/cui134/article/details/25632981

python有专门的神经网络库,但为了加深印象,我自己在numpy库的基础上,自己编写了一个简单的神经网络程序,是基于Rosenblatt感知器的,这个感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入求和后进行调节。为了便于观察,这里的数据采用二维数据。

目标函数是训练结果的误差的平方和,由于目标函数是一个二次函数,只存在一个全局极小值,所以采用梯度下降法的策略寻找目标函数的最小值。

代码如下:

  1. import numpy as np  
  2. import pylab as pl  
  3. b=1              #偏置  
  4. a=0.3            #学习率  
  5. 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]])   #训练数据  
  6. d=np.array([1,1,-1,-1,1,-1,1,-1])                                      #训练数据类别  
  7. w=np.array([b,0,0])                                               #初始w  
  8. def sgn(v):                                   
  9.     if v>=0:  
  10.         return 1  
  11.     else:  
  12.         return -1  
  13. def comy(myw,myx):  
  14.     return sgn(np.dot(myw.T,myx))  
  15. def neww(oldw,myd,myx,a):  
  16.     return oldw+a*(myd-comy(oldw,myx))*myx  
  17.   
  18. for ii in range(5):                                #迭代次数  
  19.     i=0  
  20.     for xn in x:  
  21.         w=neww(w,d[i],xn,a)  
  22.         i+=1  
  23.     print w  
  24.   
  25. myx=x[:,1]                                    #绘制训练数据  
  26. myy=x[:,2]  
  27. pl.subplot(111)  
  28. x_max=np.max(myx)+15  
  29. x_min=np.min(myx)-5  
  30. y_max=np.max(myy)+50  
  31. y_min=np.min(myy)-5  
  32. pl.xlabel(u"x")  
  33. pl.xlim(x_min,x_max)  
  34. pl.ylabel(u"y")  
  35. pl.ylim(y_min,y_max)  
  36. for i in range(0,len(d)):  
  37.     if d[i]==1:  
  38.         pl.plot(myx[i],myy[i],'r*')  
  39.     else:  
  40.         pl.plot(myx[i],myy[i],'ro')  
  41. #绘制测试点  
  42. test=np.array([b,9,19])  
  43. if comy(w,test)>0:  
  44.     pl.plot(test[1],test[2],'b*')  
  45. else:  
  46.     pl.plot(test[1],test[2],'bo')  
  47. test=np.array([b,9,64])  
  48. if comy(w,test)>0:  
  49.     pl.plot(test[1],test[2],'b*')  
  50. else:  
  51.     pl.plot(test[1],test[2],'bo')  
  52. test=np.array([b,9,16])  
  53. if comy(w,test)>0:  
  54.     pl.plot(test[1],test[2],'b*')  
  55. else:  
  56.     pl.plot(test[1],test[2],'bo')  
  57. test=np.array([b,9,60])  
  58. if comy(w,test)>0:  
  59.     pl.plot(test[1],test[2],'b*')  
  60. else:  
  61.     pl.plot(test[1],test[2],'bo')  
  62. #绘制分类线  
  63. testx=np.array(range(0,20))  
  64. testy=testx*2+1.68  
  65. pl.plot(testx,testy,'g--')  
  66. pl.show()     
  67. for xn in x:  
  68.     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感知器的分类效果还是不错的

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值