k-平均演算法(英文:k-means clustering,以下簡稱為 k-means )是一種非監督式的學習方法,其主要的目標是對未標記的資料進行分群。什麼意思呢?
k-means 的判斷邏輯其實跟 KNN 一樣,都是物以類聚。我們在介紹 KNN 的時候曾經舉例:假設你的鄰居都是有錢人,那麼你有十之八九也是有錢人。
那麼 k-means 在做的事情就是:我們不知道誰是有錢人,但是有錢人肯定會聚在一起,窮人也是。
但是資料並不會自己長腳然後湊成一堆,這個時候我們該怎麼將他們分群呢?
答案是找出群集中心。這就像是一群人剛剛湊在一起大家都不熟,但過了一陣子之後便會有一些小團體出現,而在每個團體中總會有人成為領頭羊,而這幾隻領頭羊就是我們要找的群集中心了。
(當然,隨著時間推進,各個團體內的領頭羊也可能會換人,直到最適合的領導者出現為止。)
步驟如下:
我們將資料分為 k 群,自然就會有 k 個群集中心。而我們會希望每一群的資料都能跟群集中心距離愈短愈好,因此:
已知觀測集,其中每個觀測都是一個 d 維的實向量,而我們在做的就是要想辦法求出各個群組內部最小的均方誤差總和。
代表群集中心,‖‖就是算歐式距離,而S為分割的群組集合。
計算每個群集內的資料,其中每個都只被分配到一個確定的聚類中
更新群集中心。
我們隨機生成 200 個點,然後用 k-means 將他們分成 5 群:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
x = np.random.rand(200,2) # 將200個值隨機分佈在2維上
clf = KMeans(n_clusters=5) # 分成5類
clf.fit(x)
# 將點逐一染色
for i in range(0,100):
if clf.labels_[i] == 0:
plt.scatter(x[i][0], x[i][1], color='red')
elif clf.labels_[i] == 1:
plt.scatter(x[i][0], x[i][1], color='blue')
elif clf.labels_[i] == 2:
plt.scatter(x[i][0], x[i][1], color='green')
elif clf.labels_[i] == 3:
plt.scatter(x[i][0], x[i][1], color='pink')
elif clf.labels_[i] == 4:
plt.scatter(x[i][0], x[i][1], color='orange')
plt.autoscale()
plt.grid() # grid()用來顯示網格
plt.show()
https://chih-sheng-huang821.medium.com/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E9%9B%86%E7%BE%A4%E5%88%86%E6%9E%90-k-means-clustering-e608a7fe1b43
https://zh.wikipedia.org/wiki/K-%E5%B9%B3%E5%9D%87%E7%AE%97%E6%B3%95
其實機器學習還有很多可以講的內容,但是礙於篇幅的關係,機器學習的部份將先告一段落。明天將開始進入深度學習的環節!