生成如圖所示的環形數據集,這里外矩形的X跟Y的范圍為(0.5,2.5),內矩形X跟Y的范圍為(0.7,2.3)。
原理:依次迭代生成先生成均勻分布的在大矩形內的數據點,在判斷生成的每個數據點是否落在介於大矩形跟小矩形中即環中,若落在環中,則保留這個點。 若生成的點的數量到預期值,則停止迭代。
若直接生成介於環中的數據,則環中的數據點會不均勻,因為四角會重復生成。
加入噪聲與生成數據類似,只是判斷若生成的噪聲不在環形中,則此數據為噪聲數據。
def get_data(num_point,num_noise,seed):
"""
生成環形數據與噪聲
@param num_point: 正常數據點的個數
@param num_noise: 噪聲的個數
@param seed: 隨機數種子。若seed值設置的一樣,則每次隨機生成的數據點都一樣
@return: 環形數據,噪聲
"""
np.random.seed(seed)
# 設置生成環形的坐標數據,即大矩形跟小矩形坐標
X_small = (0.7, 2.3)
Y_small = (0.7, 2.3)
X_large = (0.5, 2.5)
Y_large = (0.5, 2.5)
point = []
# 若生成的點的數量沒有到達預期目標將不停迭代
while len(point)!=num_point:
#生成介於大矩形的均勻分布的數據點
X_point = X_large[0] + (X_large[1]-X_large[0]) * np.random.rand()
Y_point = Y_large[0] + (Y_large[1]-Y_large[0]) * np.random.rand()
#判斷此點是否符合要求
if (X_large[0]<X_point<X_small[0] or X_small[1]<X_point<X_large[1]
or Y_large[0]<Y_point<Y_small[0] or Y_small[1]<Y_point<Y_large[1]):
point.append((X_point, Y_point))
point = np.array(point)
#生成噪聲
noise_Xcor = (0,3)
noise_Ycor = (0,3)
noise = []
while len(noise) != num_noise:
X_noise = noise_Xcor[0]+(noise_Xcor[1]-noise_Xcor[0]) * np.random.rand()
Y_noise = noise_Ycor[0]+(noise_Ycor[1]-noise_Ycor[0]) * np.random.rand()
if not (X_large[0]<X_noise<X_small[0] or X_small[1]<X_noise<X_large[1]
or Y_large[0]<Y_noise<Y_small[0] or Y_small[1]<Y_noise<Y_large[1]):
noise.append((X_noise, Y_noise))
return np.array(point),np.array(noise)
繪制最終圖形
def draw(data_point, data_noise):
'''
繪制圖像
@param data_point: 環形數據
@param data_noise: 噪聲
@return:
'''
fig = plt.figure()
ax = fig.add_subplot(111)
plt.scatter(data_point[:, 0], data_point[:, 1], c='r', marker='.')
plt.scatter(data_noise[:, 0], data_noise[:, 1], c='b', marker='.')
plt.show()