python 生成環形人工數據集


生成如圖所示的環形數據集,這里外矩形的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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM