您的位置:首页 > 理论基础 > 计算机网络

python机器学习之神经网络(一)

2016-02-24 04:46 656 查看
来自http://blog.csdn.net/cui134/article/details/25632981

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

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

代码如下:

[python] view
plaincopy





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感知器的分类效果还是不错的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: