Python實戰之神經網路(1)
阿新 • • 發佈:2019-01-25
python有專門的神經網路庫,但為了加深印象,我自己在numpy庫的基礎上,自己編寫了一個簡單的神經網路程式,是基於Rosenblatt感知器的,這個感知器建立在一個線性神經元之上,神經元模型的求和節點計算作用於突觸輸入的線性組合,同時結合外部作用的偏置,對若干個突觸的輸入求和後進行調節。為了便於觀察,這裡的資料採用二維資料。
目標函式是訓練結果的誤差的平方和,由於目標函式是一個二次函式,只存在一個全域性極小值,所以採用梯度下降法的策略尋找目標函式的最小值。
程式碼如下:
[python] view plaincopyprint?- import numpy as np
- import
- 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:
- return1
- 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感知器的分類效果還是不錯的