1. 程式人生 > >Rosenblatt感知器_《神經網路與機器學習》_Simon_計算機試驗程式碼

Rosenblatt感知器_《神經網路與機器學習》_Simon_計算機試驗程式碼

#產生訓練樣本集--雙月區域 import random from math import sqrt import numpy as np import matplotlib.pyplot as plt def train_sample(radius=10,wid=3,x0=0,y0=0,num=1000,mir=0): ## radius 半月形中心圓半徑 wid=width/2 半月形寬度的一半 x0 y0 圓心橫座標和縱座標 num 資料點個數 #返回值 X1 為 num行2列的矩陣 其中 第一列為橫座標 第二列為縱座標 x1=[] x2=[] for i in range
(num): x1.append(random.uniform(0-radius-wid,radius+wid)) #隨機產生資料點的橫座標值(以圓心為座標原點) for x in x1: if abs(x)>radius-wid: #若橫座標絕對值大於小圓半徑,縱座標下界限為橫軸 low=0 else: low=sqrt(pow((radius-wid),2)-pow(x,2)) #橫座標絕對值大於小圓半徑,y座標下界限為小圓上對應y座標值 up=sqrt(pow((radius+wid),2)-pow
(x,2)) #上界限為大圓對應座標值 x2.append(random.uniform(low,up)) if mir==0: x=np.array([i+x0 for i in x1]) y=np.array([i+y0 for i in x2]) else: x = np.array([-i + x0 for i in x1]) y = np.array([-i + y0 for i in x2]) X1=np.column_stack((x,y)) return X1 def sgn
(a): if a>=0: return 1 else: return -1 def roseblatt(X,d,w,eff): val=sgn(np.dot(w,X)) w=w+eff*(d-val)*X return w if __name__=='__main__': num = 1000 X11 = train_sample(num=num) X21 = train_sample(x0=10, y0=-1, mir=1, num=num) x6 = np.ones(num) X1=np.column_stack((x6,X11)) X2=np.column_stack((x6,X21)) w=[0,0,0] for i in range(1000): eff=0.1-i*(0.1-0.00001)/1000 X=X1[i] d=1 w = roseblatt(X, d, w, eff) X=X2[i] d=-1 w = roseblatt(X, d, w, eff) #plt.scatter(X1[:,0],X1[:,1]) #plt.scatter(X2[:,0],X2[:,1]) print("b=",w[0]) print(w[1],w[2]) lx=np.linspace(-25,25,500) X3=train_sample(num=5000) X4=train_sample(x0=10,y0=-1,mir=1,num=5000) plt.scatter(X3[:,0],X3[:,1]) plt.scatter(X4[:,0],X4[:,1]) ly=-1*(w[1]/w[2]*lx)-w[0]/w[2] plt.plot(lx,ly) plt.show()