#产生训练样本集--双月区域 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()
Rosenblatt感知器_《神经网络与机器学习》_Simon_计算机试验代码

相关文章:

  • 2021-06-24
  • 2022-01-18
  • 2022-02-09
  • 2021-12-06
  • 2021-11-28
  • 2021-05-15
  • 2021-11-26
猜你喜欢
  • 2021-05-16
  • 2022-02-09
  • 2021-12-16
  • 2021-04-14
  • 2022-02-08
  • 2022-01-28
相关资源
相似解决方案