Rosenblatt感知器_《神經網路與機器學習》_Simon_計算機試驗程式碼
阿新 • • 發佈:2019-01-29
#產生訓練樣本集--雙月區域
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()