機器學習 - K-means
在此頁面上,W3schools.com 與 紐約資料科學學院 合作,為我們的學生提供數字培訓內容。
K-means
K-means 是一種用於對資料點進行聚類的無監督學習方法。該演算法透過最小化每個簇內的方差來迭代地將資料點劃分為 K 個簇。
在此,我們將向您展示如何使用肘部方法估算 K 的最佳值,然後使用 K-means 聚類將資料點分組到簇中。
它是如何工作的?
首先,每個資料點被隨機分配到 K 個簇中的一個。然後,我們計算每個簇的質心(實質上是中心),並將每個資料點重新分配到距離質心最近的簇。我們重複此過程,直到每個資料點的簇分配不再發生變化為止。
K-means 聚類要求我們選擇 K,即我們想要將資料分組成的簇的數量。肘部方法可以讓我們繪製慣性(一種基於距離的度量)圖,並可視化其開始線性下降的點。這個點被稱為“肘部”,是基於我們資料選擇 K 最佳值的良好估計。
示例
首先,視覺化一些資料點
import matplotlib.pyplot as plt
x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
plt.scatter(x, y)
plt.show()
結果
廣告
現在我們使用肘部方法來視覺化不同 K 值的慣性
示例
from sklearn.cluster import KMeans
data = list(zip(x, y))
inertias = []
for i in range(1,11)
kmeans = KMeans(n_clusters=i)
kmeans.fit(data)
inertias.append(kmeans.inertia_)
plt.plot(range(1,11), inertias, marker='o')
plt.title('肘部方法')
plt.xlabel('簇的數量')
plt.ylabel('慣性')
plt.show()
結果
肘部方法顯示 2 是 K 的一個好值,因此我們重新訓練並可視化結果
示例
kmeans = KMeans(n_clusters=2)
kmeans.fit(data)
plt.scatter(x, y, c=kmeans.labels_)
plt.show()
結果
示例解釋
匯入所需的模組。
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
你可以在我們的 “Matplotlib 教程”中瞭解 Matplotlib 模組。
scikit-learn 是一個流行的機器學習庫。
建立類似於資料集中兩個變數的陣列。請注意,雖然這裡我們只使用了兩個變數,但這種方法適用於任何數量的變數。
x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
將資料轉換為一組點
data = list(zip(x, y))
print(data)
結果
[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (6, 22), (10, 21), (12, 21)]
為了找到 K 的最佳值,我們需要在一定範圍內執行 K-means 對我們的資料進行處理。我們只有 10 個數據點,所以最多可以有 10 個簇。因此,對於 range(1,11) 中的每個 K 值,我們訓練一個 K-means 模型,並繪製該簇數量下的慣性。
inertias = []
for i in range(1,11)
kmeans = KMeans(n_clusters=i)
kmeans.fit(data)
inertias.append(kmeans.inertia_)
plt.plot(range(1,11), inertias, marker='o')
plt.title('肘部方法')
plt.xlabel('簇的數量')
plt.ylabel('慣性')
plt.show()
結果
我們可以看到,上面圖中的“肘部”(慣性變得更線性的地方)在 K=2。然後,我們可以再擬合一次 K-means 演算法,並繪製分配給資料的不同簇。
kmeans = KMeans(n_clusters=2)
kmeans.fit(data)
plt.scatter(x, y, c=kmeans.labels_)
plt.show()
結果