目錄
K-Means 聚類:從原理到實踐的完整指南
什么是 K-Means 聚類?
應用場景舉例
K-Means 算法的核心原理
K-Means 算法的步驟詳解
可視化理解
K-Means 的優缺點分析
優點
缺點
如何選擇合適的 K 值?
1. 肘部法(Elbow Method)
2. 輪廓系數(Silhouette Score)
K-Means 的改進算法
總結
一.K-Means 聚類:從原理到實踐的完整指南
聚類分析是機器學習中一種重要的無監督學習方法,它能夠將相似的數據點自動分組,發現數據中潛在的結構和模式。在眾多聚類算法中,K-Means 因其簡單、高效和廣泛的適用性而成為最受歡迎的算法之一。本文將深入解析 K-Means 聚類算法的原理、實現步驟、優缺點及實際應用案例。
1.什么是 K-Means 聚類?
K-Means 是一種迭代式的聚類算法,其核心思想是將 n 個數據點劃分為 k 個不同的簇(Cluster),使得每個簇內的數據點具有較高的相似度,而不同簇之間的數據點差異較大。
"K" 代表我們想要創建的簇的數量,"Means" 則指每個簇的中心點(質心),算法通過計算數據點與質心的距離來決定數據點的歸屬。
應用場景舉例
K-Means 在實際生活中有著廣泛應用:
- 客戶分群:電商平臺根據用戶購買行為將客戶分為不同群體,進行精準營銷
- 文本聚類:將新聞文章按主題自動分類
- 圖像分割:識別圖像中不同的物體區域
- 異常檢測:發現數據中的異常值或離群點
- 市場細分:根據消費者特征劃分不同的市場群體
2.無監督學習與有監督學習的區別
- 有監督學習:需要X和Y數據,Y作為監督信號,模型通過Y優化預測結果(如分類、回歸)。
- 無監督學習:僅使用X數據,無Y標簽,通過數據內在結構進行聚類(如K-means)。
3.K-Means 算法的核心原理
K-Means 算法的工作流程基于以下關鍵概念:
- 簇(Cluster):具有相似特征的數據點集合
- 質心(Centroid):每個簇的中心點,是該簇內所有數據點的平均值
- 距離度量:通常使用歐氏距離衡量數據點與質心的相似度
- 目標函數:最小化所有數據點到其所屬簇質心的距離之和(平方誤差和)
4.K-Means 算法的步驟詳解
K-Means 算法通過迭代方式逐步優化聚類結果,具體步驟如下:
-
確定 K 值:根據業務需求或數據特點,指定要創建的簇數量 K
-
初始化質心:隨機選擇 K 個數據點作為初始質心
-
分配數據點:計算每個數據點到 K 個質心的距離,將數據點分配到距離最近的質心所在的簇
-
更新質心:計算每個簇內所有數據點的平均值,作為新的質心
-
重復迭代:重復步驟 3 和步驟 4,直到質心不再顯著變化或達到預設的最大迭代次數
-
輸出結果:得到最終的 K 個簇及對應的質心
可視化理解
想象在二維平面上有一些散點,K-Means 的過程就像是:
- 先在平面上隨機放 K 個 "種子" 點(初始質心)
- 每個點都選擇離自己最近的種子點 "站隊"
- 每個隊伍計算出自己的 "中心位置"(新質心)
- 所有點根據新的中心位置重新選擇隊伍
- 重復以上過程,直到每個隊伍的中心位置穩定下來
5.K-Means的評價指標(輪廓系數)
- 輪廓系數用于評估聚類效果,公式涉及兩個關鍵指標:
a_i
:樣本點與同簇其他點距離的平均值(簇內距離)。b_i
:樣本點到其他簇所有點距離的最小平均值(簇間距離)。
- 單個樣本的輪廓系數計算公式為:
s_i = (b_i - a_i)\max(a_i, b_i) - 整體輪廓系數為所有樣本輪廓系數的平均值,取值范圍為?
[-1, 1]
:- 接近?
1
:聚類效果優秀。 - 接近?
-1
:聚類效果差(樣本可能被誤分到其他簇)。 - 接近?
0
:樣本位于簇邊界。
- 接近?
6.K-Means 的優缺點分析
優點
- 算法簡單易懂,實現方便
- 計算效率高,對大數據集表現良好
- 聚類結果可解釋性強
- 適用于高維數據
缺點
- 需要預先指定 K 值,而最佳 K 值往往不明確
- 對初始質心的選擇敏感,可能導致不同的聚類結果
- 對噪聲和異常值敏感
- 不太適合發現非凸形狀的簇
- 當簇的大小差異較大時表現不佳
7.如何選擇合適的 K 值?
選擇合適的 K 值是 K-Means 聚類的關鍵挑戰之一。以下是兩種常用方法:
1. 肘部法(Elbow Method)
肘部法通過繪制 "K 值 - 誤差平方和" 曲線來確定最佳 K 值:
- 計算不同 K 值(如 1 到 10)對應的聚類結果
- 計算每個 K 值下的誤差平方和(SSE),即所有數據點到其簇質心的距離平方之和
- 繪制 K 值與 SSE 的關系曲線
- 曲線中 "肘部" 對應的 K 值即為最佳選擇,此時 SSE 開始趨于平穩
2. 輪廓系數(Silhouette Score)
輪廓系數用于衡量聚類結果的質量:
- 取值范圍為 [-1, 1]
- 接近 1 表示樣本聚類合理
- 接近 0 表示樣本可能位于兩個簇的邊界
- 接近 - 1 表示樣本可能被分到錯誤的簇
選擇輪廓系數最高的 K 值作為最佳聚類數量。
K-Means 的改進算法
由于基本 K-Means 存在一些局限性,研究者提出了多種改進算法:
- K-Means++:改進了初始質心的選擇方法,使質心盡可能遠離,提高聚類效果
- Mini-Batch K-Means:對大數據集更高效,使用部分樣本計算質心
- Bisecting K-Means:層次化聚類方法,通過不斷二分簇來構建聚類結果
- Kernel K-Means:利用核函數將數據映射到高維空間,能夠處理非凸形狀的簇
在 scikit-learn 中,KMeans
類默認使用n_init='auto'
參數,會根據數據情況自動選擇合適的初始質心數量,實際上已經包含了 K-Means++ 的改進。
總結
K-Means 聚類是一種簡單而強大的無監督學習算法,能夠有效地發現數據中的自然分組。盡管它存在需要預先指定 K 值、對初始質心敏感等局限性,但通過合理選擇參數和結合其他評估方法,K-Means 仍然是數據分析和挖掘中的重要工具。
在實際應用中,建議:
- 對數據進行標準化處理,消除量綱影響
- 結合多種方法確定最佳 K 值
- 多次運行算法,避免因初始質心選擇不當導致的局部最優
- 可視化聚類結果,直觀理解數據結構
二.案例實現(酒類數據聚類)
1.K-Means參數
源碼如下
n_clusters
:指定聚類中心數量(K值)。init
:初始化質心方法(默認?k-means++
,優于隨機初始化)。n_init
:初始化質心的次數(默認10次,避免因初始質心選擇不佳影響結果)。max_iter
:單次K-Means算法的最大迭代次數(默認300)。
2.讀取數據
數據特征:卡路里、氮濃度、酒精濃度、價格。data.txt部分內容如下:
第一列的name與訓練無關不要讀取
import pandas as pd
import numpy as np
beer = pd.read_table('data.txt',sep=' ')#注意sep劃分數據
X=beer.iloc[:,1:]
2.遍歷K值,計算輪廓系數選擇最優K(本例K=2最佳)。
from sklearn.cluster import KMeans
from sklearn import metrics
scores=[]
k=range(2,10)
for i in k:km=KMeans(n_clusters=i)km.fit(X)labels=km.labels_score=metrics.silhouette_score(X,labels)scores.append(score)
best_k=k[np.argmax(scores)]
print('best_k=',best_k)
3.訓練模型并輸出聚類標簽。
km=KMeans(n_clusters=best_k)
km.fit(X)
labels=km.labels_
beer['cluster']=labels
beer.sort_values('cluster',inplace=True)
print('輪廓系數: ',metrics.silhouette_score(beer.iloc[:,1:5],beer.cluster))
4.完整代碼
import pandas as pd
import numpy as np
beer = pd.read_table('data.txt',sep=' ')#注意sep劃分數據
X=beer.iloc[:,1:]from sklearn.cluster import KMeans
from sklearn import metrics
scores=[]
k=range(2,10)
for i in k:km=KMeans(n_clusters=i)km.fit(X)labels=km.labels_score=metrics.silhouette_score(X,labels)scores.append(score)
best_k=k[np.argmax(scores)]
print('best_k=',best_k)
km=KMeans(n_clusters=best_k)
km.fit(X)
labels=km.labels_
beer['cluster']=labels
beer.sort_values('cluster',inplace=True)
print('輪廓系數: ',metrics.silhouette_score(beer.iloc[:,1:5],beer.cluster))