K-Means詳解

      在〈K-Means詳解〉中尚無留言

K-Means 中文為 k 均值算法,不過沒人在用中文稱呼就是了。

簡易圖示說明

先看下面的代碼及圖示

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 隨機產生500筆資料, 並分為 10 個群組
# 每筆資料有2個特徵features, 即 points為[[x1, y1],[x2, y2],[x3, y3]...]
points, labels = make_blobs(
    n_samples=500,
    n_features=2,
    centers=10,
    random_state=42)
# 以不同顏色畫出原始的 10 群資料
plt.figure(figsize=(14, 6))
ax=plt.subplot(121)
ax.set_title('Original data')
p=points.T
ax.scatter(p[0], p[1], c=labels, cmap=plt.cm.Set1)

# 用 KMeans 在資料中找出 7 個分組
model = KMeans(n_clusters=7)
model.fit(points)
# 預測新的目標值 label
new_labels = model.predict(points)

# 根據重新分成的 7 組來畫出資料
ax=plt.subplot(122)
ax.set_title('KMeans new groups')
ax.scatter(p[0], p[1], c=new_labels, cmap=plt.cm.Set1)
plt.savefig("kmeans_1.jpg")
plt.show()

在上面的例子中,左邊的圖是隨機產生的500個點,並分為10個群組。而這500個點,很明顯的只聚集在 7 個地方。所以有沒有辦法把它修正一下,變成只有 7 顏色呢? 也就是說,修正成右邊的樣子。

其實有點程式基礎的人,會開始感到焦慮,因為我們怎麼知道,那一個點是那一個群組的。這時 k-Means這個演算法就派得上用場了。

雖說上面程式中,我們還是要手動指定為 7 組啊,但已經能夠知道那一個點是屬於那一個群組的,就夠力害的了。如果要自動判別有7個群組的話,有更深的演算法。

make_blobs 為隨機產生 500筆資料,這500筆會被分為10個群組,每筆資料有 2 個特徵(features),也就是說 points 為 [[x1, y1], [x2, y2], [x3, y3], ….]的集合,label則是這10組的代號( 0~9)在代碼中

points, labels=make_blobs(n_samples=500, n_features=2, centers=10, random_state=42)

產生資料後,再用 KMeans()產生模型,並指定要分類的數量,再用  model.fit()進行訓練,最後使用 model.predict() 重新決定每一個點的群組代號。

model = KMeans(n_clusters=7) 
model.fit(points)
# 預測新的目標值 label
new_labels = model.predict(points)

最後需說明一下 points.T的用途。原本 points 是 500 列 * 2 行的陣列,如下
[[x0    ,       y0]
 [x1    ,       y1]
 …………………..
 [x499,  y499]
]

但在plt繪圖時,需傳入 plt.plot([x0, x1, x2, ….x499],[y0, y1, y2, …, y499]),所以需將 points置轉90度,變成 2 列 * 500 行的陣列

Features

上述的特徵點,只有二維的,所以可以繪製成平面圖,若是features=3,則可以在立体圖空間中分群。當然如果是四維,五維等高維度,也可以分類,只是畫不出來而以。

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 隨機產生500筆資料, 並分為 10 個群組
# 每筆資料有2個特徵features, 即 points為[[x1, y1],[x2, y2],[x3, y3]...]
points, labels = make_blobs(
    n_samples=500,
    n_features=3,
    centers=10,
    random_state=42)
# 以不同顏色畫出原始的 10 群資料

fig=plt.figure(figsize=(14, 6))
ax=fig.add_subplot(121, projection='3d')
ax.set_title('Original data')
p=points.T
ax.scatter(p[0], p[1], points.T[2], c=labels, cmap=plt.cm.Set1)

# 用 KMeans 在資料中找出 7 個分組
model = KMeans(n_clusters=7)
model.fit(points)
# 預測新的目標值 label
new_labels = model.predict(points)

# 根據重新分成的 7 組來畫出資料
ax=fig.add_subplot(122, projection='3d')
ax.set_title('KMeans new groups')
ax.scatter(p[0], p[1], points.T[2], c=new_labels, cmap=plt.cm.Set1)
plt.savefig("kmeans_2.jpg")
plt.show()

K-means 原理及演算法

為什麼K-means模型可以自動分群組呢,這是一種很簡單的演算法,底下使用二個群組來簡化說明,原理如下。

🔒 更多內容,請登入會員繼續閱讀。

立即登入

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *