文章目錄
- 1. K均值(K-means)聚類是什么算法?
- 2. 核心思想
- 2. 數學目標
- 3. 算法步驟
- 3.1. 選擇K個初始質心:
- 3.2.迭代優化
- 3.3. 重復步驟2和步驟3:
- 4. 關鍵參數
- 5. 優缺點
- 6. 改進變種
- 7. K值選擇方法
- 8. Python示例
- 9. 應用場景
- 10. 注意事項
- 11. 數學推導(質心更新)
- 12. 總結
1. K均值(K-means)聚類是什么算法?
K均值(K-means)聚類算法是一種廣泛使用的無監督學習算法,用于將數據集分成多個簇(clusters)。每個簇代表數據集中的一種內在結構,其中簇內的數據點相似度較高,而簇與簇之間的相似度較低。K均值算法的目標是最小化簇內數據點的平方誤差(即簇內的方差)
2. 核心思想
K均值是一種無監督學習算法,用于將數據劃分為K個簇(Cluster),目標是最小化簇內樣本的平方誤差和(Sum of Squared Errors, SSE)。其核心思想是:
簇內相似度高:同一簇的樣本盡可能接近。
簇間相似度低:不同簇的樣本盡可能遠離。
2. 數學目標
最小化損失函數(SSE):
J = ∑ i = 1 K ∑ x ∈ C i ∥ x ? μ i ∥ 2 J = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2 J=i=1∑K?x∈Ci?∑?∥x?μi?∥2
- C i C_i Ci?:第 i i i個簇。
- μ i μ_i μi?:第 i i i 個簇的中心點(質心)。
- ∥ x ? μ i ∥ 2 \|x - \mu_i\|^2 ∥x?μi?∥2:樣本 x x x到質心的歐氏距離平方。
3. 算法步驟
3.1. 選擇K個初始質心:
- 隨機選擇K個數據點作為初始質心 μ 1 , μ 2 , … , μ K μ_1,μ_2,…,μ_K μ1?,μ2?,…,μK?。
3.2.迭代優化
- 分配步驟(Assignment): 分配每個數據點到最近的質心
- 對于數據集中的每一個點,計算它與K個質心的距離,并將該點分配到距離其最近的質心所對應的簇。
- C i = { x : ∥ x ? μ i ∥ 2 ≤ ∥ x ? μ j ∥ 2 , ? j } C_i = \{x : \|x - \mu_i\|^2 \leq \|x - \mu_j\|^2, \forall j\} Ci?={x:∥x?μi?∥2≤∥x?μj?∥2,?j}
- 更新步驟(Update):重新計算質心
- 計算每個簇中所有點的均值,將該均值作為新的質心。
- μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \mu_i = \frac{1}{|C_i|} \sum_{x \in C_i} x μi?=∣Ci?∣1?x∈Ci?∑?x
3.3. 重復步驟2和步驟3:
- 迭代分配數據點并更新質心,直到質心不再變化或者變化非常小(通常有設定的最大迭代次數或者誤差容忍度)
4. 關鍵參數
-
K值(簇數量):需預先指定,可通過肘部法則(Elbow Method)或輪廓系數(Silhouette Score)選擇。
-
初始化方法:
-
隨機初始化(可能陷入局部最優)。
-
K-Means++(優化初始質心選擇,默認方法)。
-
-
距離度量:通常用歐氏距離,也可用曼哈頓距離等。
5. 優缺點
-
? 優點:
-
簡單高效:時間復雜度 O ( n ? K ? d ? t ) O(n?K?d?t) O(n?K?d?t),其中 n n n 是樣本數, d d d 是特征維度, t t t是迭代次數。
-
可擴展性強:適合大規模數據。
-
解釋性強:簇中心可直接表示簇特征。
-
-
? 缺點:
-
需預先指定K值。
-
對初始質心敏感(可能收斂到局部最優)。
-
僅適用于凸形簇(對非球形簇效果差)。
-
對噪聲和異常值敏感。
-
6. 改進變種
-
K-Means++:優化初始質心選擇,減少局部最優風險。
-
Mini-Batch K-Means:用數據子集加速計算,適合大數據。
-
K-Medoids(PAM):用實際樣本點(而非均值)作為中心,對噪聲更魯棒。
-
Fuzzy C-Means:允許樣本屬于多個簇(軟聚類)。
7. K值選擇方法
-
肘部法則(Elbow Method):
- 繪制不同K值對應的SSE曲線,選擇拐點(SSE下降變緩處)
from sklearn.cluster import KMeans
import matplotlib.pyplot as pltsse = []
for k in range(1, 10):kmeans = KMeans(n_clusters=k).fit(X)sse.append(kmeans.inertia_)
plt.plot(range(1, 10), sse, marker='o')
plt.xlabel('K')
plt.ylabel('SSE')
plt.show()
-
輪廓系數(Silhouette Score):
- 衡量樣本與同簇和其他簇的相似度,值越接近1表示聚類越好。
from sklearn.metrics import silhouette_score
scores = []
for k in range(2, 10):kmeans = KMeans(n_clusters=k).fit(X)scores.append(silhouette_score(X, kmeans.labels_))
plt.plot(range(2, 10), scores, marker='o')
8. Python示例
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 生成模擬數據
X, _ = make_blobs(n_samples=300, centers=4, random_state=42)# 訓練K-Means(K=4)
kmeans = KMeans(n_clusters=4, init='k-means++', random_state=42)
kmeans.fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_# 可視化
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='X', s=200)
plt.title("K-Means Clustering")
plt.show()
9. 應用場景
-
客戶分群(如電商用戶細分)。
-
圖像壓縮(用簇中心代表顏色)。
-
異常檢測(遠離簇中心的樣本可能是異常值)。
-
文本聚類(如新聞主題分類)。
10. 注意事項
-
數據標準化:K均值對特征尺度敏感,需標準化(如StandardScaler)。
-
處理異常值:可用K-Medoids或DBSCAN替代。
-
非凸簇問題:嘗試譜聚類或高斯混合模型(GMM)。
11. 數學推導(質心更新)
質心 μ i μ_i μi?的更新是損失函數
J J J 的最小化過程:
? J ? μ i = ? 2 ∑ x ∈ C i ( x ? μ i ) = 0 ? μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \frac{\partial J}{\partial \mu_i} = -2 \sum_{x \in C_i} (x - \mu_i) = 0 \implies \mu_i = \frac{1}{|C_i|} \sum_{x \in C_i} x ?μi??J?=?2x∈Ci?∑?(x?μi?)=0?μi?=∣Ci?∣1?x∈Ci?∑?x
12. 總結
K均值是聚類任務的基礎算法,核心在于迭代優化質心位置。盡管有局限性(如需預設K值),但其高效性和易實現性使其在實踐中廣泛應用。改進方法(如K-Means++)和評估技巧(肘部法則)可進一步提升效果。