#产生训练样本集--双月区域
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()
相关文章: