Python中使用K-means演算法

船頭尺發表於2021-09-11

Python中使用K-means演算法

k-means是機器學習中最常用的聚類演算法,關於k-means演算法的數學原理、演算法、偽碼等已有相當豐富的文獻,在此不再贅述。

1、呼叫以下庫

import numpy as np   #用於抽樣和生成隨機數
from sklearn.cluster import KMeans   #sklearn自帶的Kmeans演算法, 用於嚴重本文演算法結果是否正確
import matplotlib.pyplot as plt     #結果視覺化
import sys   #需要用到sys.exit()函式

若不需要驗證聚類結果是否可以不使用Sklearn庫。

2、生成用於訓練的隨機資料

np.set_printoptions(suppress=True)    #令numpy的結果不以科學計數法的方式輸出
Data = np.array([[1.0, 2.0], [1.5, 1.8], [3, 4], [6, 8], [8, 8], [1, 0.6],
                 [9, 11], [7, 10]])  #你也可以透過抽樣的方式來更快的獲得測試資料

3、定義用於選擇隨機初始點和簇數(k)的函式

def K_means(data, k):
    global Mean
    mean = []
    a = np.max(data[:, 0])
    b = np.min(data[:, 0])
    c = np.max(data[:, 1])
    d = np.min(data[:, 1])
    for i in range(k):
        x = np.random.uniform(a, b, 1)  
        #此處返回array
        y = np.random.uniform(c, d, 1)  #此處返回array
        mean.append([float(x), float(y)])
    Mean = np.array(mean)
    return Mean

在上面的程式碼中,為了限定初始點(x,y)的位置不會超出樣本點的範圍,因此均勻抽樣的上下限是指訓練資料(a,b)和(c,d)的最小橫距。

4、定義視覺化函式, 繪製測試資料散點圖

def vision(data, cell):
    plt.figure(figsize=(12,6))
    ax1 = plt.subplot(121)
    ax1.scatter(Data[:, 0], Data[:, 1])   #原始資料散點圖
    ax1.scatter(point[:, 0], point[:, 0])    #同時將隨機選取的初始點表示出來
    plt.xlabel("x")
    plt.ylabel("y")
    plt.title("scatter of " + "rural" + " data")
    ax2 = plt.subplot(122)
    ax2.scatter(Data[:, 0], Data[:, 1])    #原始資料散點圖
    ax2.scatter(data[:, 0], data[:, 1])     #經過迭代後最終確定的聚類點
    plt.xlabel("x")
    plt.ylabel("y")
    plt.title("scatter of " + cell + " data")
    plt.show()

聚類結果的視覺化對於判斷聚類結果的準確性至關重要。

5、定義迭代過程, 透過不斷計算各個樣本對聚類點的歐式聚類, 來不斷更新聚類點

def iteration(Data, point):
    A = []
    B = []
    for i in range(len(Data)):
        d1 = np.sqrt(sum(pow(Data[i] - point[0], 2)))
        d2 = np.sqrt(sum(pow(Data[i] - point[1], 2)))
        if d1 > d2:
            A.append(list(Data[i]))
        else:
            B.append(list(Data[i]))
    if len(A) == len(Data) or len(B) == len(Data):
        print("初始化錯誤")
        sys.exit(0)
    new_x1 = np.mean(np.array(A)[:, 0])
    new_y1 = np.mean(np.array(A)[:, 1])
 
    new_x2 = np.mean(np.array(B)[:, 0])
    new_y2 = np.mean(np.array(B)[:, 1])
    new_point = np.array([[new_x1, new_y1], [new_x2, new_y2]])
    return new_point

注意, 上段程式碼中加入了一個if語句

    if len(A) == len(Data) or len(B) == len(Data):
        print("初始化錯誤")
        sys.exit(0)

由於初始點是隨機產生的,所以這個條件語句是非常必要的,因此有可能所有的樣本點都只接近一個聚類中心而遠離另一個聚類中心,這樣就不能形成兩個聚類中心,程式將會報錯,因此我們需要排除出現這種情況的可能性。一旦所有樣本點都接近一個聚類中心時令程式停止。

以上就是Python中使用K-means演算法,希望能對大家有所幫助!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3016/viewspace-2830703/,如需轉載,請註明出處,否則將追究法律責任。

相關文章