【說在前面】本人博客新手一枚,象牙塔的老白,職業場的小白。以下內容僅為個人見解,歡迎批評指正,不喜勿噴![認真看圖][認真看圖]
【補充說明】聚類算法可以作為獨立方法將數據聚成不同簇,也可以作為數據挖掘任務(例如分類、關聯規則等)的預處理!
【補充說明】聚類算法與分類算法的主要區別在於訓練時的樣本有無標簽,聚類算法無監督學習,分類算法有監督學習!
【再說一句】本文主要介紹機器學習中聚類算法的演變路徑,和往常一樣,不會詳細介紹各算法的具體實現,望理解!
一、相似性衡量方法
1. 基於距離
- 閔可夫斯基距離(Minkowski Distance):計算距離的通用的公式
- 曼哈頓距離(即城市塊距離Manhattan distance):h=1(例如用於L1正則化等)
- 歐幾里德距離(用的比較多):h=2(例如用於L2正則化等)
- 其他距離:例如核函數距離K(x,y)、DTW距離、Mahalanobis距離等
2. 基於相似系數
例如余弦相似度等,主要優勢在於不受原線性變換的影響,可以輕松地轉換為距離,但其運算速度相對較慢。
二、基於划分的聚類
1. K-Means聚類
主要步驟如下:
(1)確定要聚類的數量K,並隨機初始化K個簇的中心點。
(2)將每個樣本分配到與其距離最近的中心點所在的簇(這里采用歐氏距離)。
(3)計算每一個簇內所有樣本點的平均值,作為該簇的新中心點。
迭代重復以上這些步驟,直到各簇中心點在迭代過程中變化不大(即小於設定的閾值)。
K-Means聚類的優點:
- 原理簡單,實現容易,收斂速度快
- 參數只有K,計算復雜度相對較低
- 模型可解釋性強
K-Means聚類的缺點:
- 需要事先確定聚類的簇數(即K值)
- 對簇中心初始值的選取比較敏感
- 對噪聲和離群點很敏感
- 采用迭代方法,容易陷入局部最優
- 適用場景有限,不能解決非凸數據
2. K值的選取
- 根據數據的可視化分布情況,結合對業務場景理解,人工選定K值
- Elbow method(即手肘法則):通過WSS隨聚類數量K的變化曲線,取手肘位置的K(例如Gap Statistic、Jump Statistic等)
- 通過計算類內內聚程度和類間分離度來確定K(例如使用平均輪廓系數、類內距離/類間距離等)
- 其他:例如使用ISODATA、Gap Statistic公式、計算不同K值下的BIC/AIC、X-means clustering(AIC/BIC)等
3. K-Means聚類變體:考慮到K-Means對簇中心初始值的選取比較敏感
例如k-means++、intelligent k-means、genetic k-means、CLARANS等。這里以常見的k-means++為例,進行介紹。
k-means++按照如下的思想選取K個聚類中心:
- 在選取第一個聚類中心(n=1)時,同樣是通過隨機的方法。
- 在選取第n+1個聚類中心時,距離當前n個聚類中心越遠的點會有更高的概率被選為第n+1個聚類中心。
4. K-Means聚類變體:考慮到k-means對噪聲和離群值很敏感
例如k-medoids、k-medians等。這里以常見的k-medians為例,進行介紹。
k-medians對於中心點的選取方式是中位值。原因在於,噪聲和離群點對中位值的變化影響不大。但是需要排序,速度較慢。
5. K-Means聚類變體:考慮到k-means不適用於類別型數據
例如k-modes等。這里以常見的k-modes為例,進行介紹。
k-modes算法采用差異度來代替k-means算法中的距離。k-modes算法中差異度越小,則表示距離越小。
6. K-Means聚類變體:考慮到k-means不能解決非凸數據
例如kernel k-means、譜聚類等。這里以常見的kernel k-means為例,進行介紹。
kernel k-means通過一個非線性映射,將輸入空間中的數據點映射到一個高維特征空間中,使得樣本在核空間線性可分,在特征空間聚類。
值得一提的是,譜聚類算法是建立在圖論中的譜圖理論基礎上,其本質是將聚類問題轉化為圖的最優划分問題,是一種點對聚類算法。
三、基於密度的聚類
1. Mean-Shift聚類
均值漂移聚類是基於滑動窗口的算法,尋找數據點的密集區域。類似爬山,每一次迭代都向密度更高的區域移動,直到收斂。
主要步驟如下:
(1)確定滑動窗口半徑r,以隨機選取的中心點C、半徑為r的圓形滑動窗口開始滑動。
(2)每一次滑動到新區域,計算窗口內的均值作為中心點,窗口內的點數量作為密度。在每一次移動中,窗口會想密度更高的區域移動。
(3)移動窗口,直到窗口內的密度不再增加為止。
其中,步驟1到3會產生很多個滑動窗口,當多個滑動窗口重疊時,保留包含最多點的窗口,然后根據數據點所在的滑動窗口進行聚類。
Mean-Shift聚類的優點:
- 不同於K-Means算法,均值漂移聚類算法不需要知道有多少簇,能夠自動發現
- 基於密度的算法,相比於K-Means受均值影響較小
Mean-Shift聚類的缺點:
- 窗口半徑r的選擇需要仔細考慮
2. DBSCAN聚類
DBSCAN的聚類定義很簡單,由密度可達關系導出的最大密度相連的樣本集合,即為最終聚類的一個簇。
主要步驟如下:
(1)首先任意選擇一個沒有類別的核心對象作為種子,然后找到所有這個核心對象能夠密度可達的樣本集合,即為一個聚類簇。
(2)接着繼續選擇另一個沒有類別的核心對象去尋找密度可達的樣本集合,這樣就得到另一個聚類簇。
一直運行到所有核心對象都有類別為止。

- 不需要知道有多少簇,能夠自動發現
- 可以在帶有噪聲的空間數據庫中發現任意形狀的簇
DBSCAN聚類的缺點:
- 需要確定Eps領域半徑、MinPts在領域中點的最少個數(即密度)這兩個全局參數,較為敏感
3. DBSCAN聚類的變體
OPTICS聚類通過優先對高密度進行搜索,然后根據高密度的特點設置參數,改善了DBSCAN的不足。
當然還有其他算法,例如DENCLUE聚類等。
四、基於概率模型的聚類
1. 用高斯混合模型(GMM)的最大期望(EM)聚類
GMM聚類采用概率模型來表達原型,即通過統計得到每個樣本點屬於各個類的概率,而不是判定它完全屬於一個類,也會被稱為軟聚類。
主要步驟如下:
(1)選擇簇的數量,並隨機初始化每個簇的高斯分布參數(即均值和方差)。
(2)給定每個簇的高斯分布,計算每個數據點屬於每個簇的概率。一個點越靠近高斯分布的中心就越可能屬於該簇。
(3)計算高斯分布參數,使概率最大化(EM最大期望),可用數據點概率的加權計算這些新的參數,權重就是數據點屬於該簇的概率。
重復迭代步驟2和3,直到迭代中的變化不大。
GMM聚類的優點:
- 使用均值和標准差,簇可以呈現出橢圓形,而不是僅僅限制於圓形。
- 使用概率,一個數據點可以屬於多個簇。例如數據點X可以有百分之20的概率屬於A簇,百分之80的概率屬於B簇。
GMM聚類的缺點:
- 執行效率不高,特別是分布數量很多並且數據量很少的時候
2. 其他方法
例如基於神經網絡模型的聚類SOM、基於統計學的聚類COBWeb等。
五、基於層次的聚類
對給定的數據集進行層次似的分解,直到某種條件滿足為止。具體又可分為“自底向上”和“自頂向下”兩種方案。
1. AGNES聚類
是一種自底向上聚合策略的層次聚類算法。
主要步驟如下:
(1)先將數據集中的每個樣本看做是一個初始聚類簇。
(2)然后在算法運行的每一步中,找出距離最近的兩個聚類簇進行合並。該過程不斷重復,直至達到預設的聚類簇個數。
其中,如何計算簇之間的距離,並進行合並:
- 單鏈接算法:兩個簇中距離最近的樣本的距離(最小距離)
- 全鏈接算法:兩個簇中距離最遠的樣本的距離(最大距離)
- 均鏈接算法:兩個簇中每兩個樣本之間的距離相加求平均的距離(平均距離)
AGNES聚類的優點:
- 距離和規則的相似度容易定義,限制少
- 不需要預先制定聚類數
- 可以發現類的層次關系
- 可以聚類成其它形狀
AGNES聚類的缺點:
- 計算復雜度太高
- 奇異值也能產生很大影響
- 算法很可能聚類成鏈狀
2. BIRCH聚類
BIRCH算法是個樹形結構,樹的每一個節點是由若干個聚類特征CF組成。BIRCH算法比較適合於數據量大,類別數K也比較多的情況。
對於CF Tree,一般有幾個重要參數:
- 第一個參數是每個內部節點的最大CF數B
- 第二個參數是每個葉子節點的最大CF數L
- 第三個參數是葉節點每個CF的最大樣本半徑閾值T
BIRCH聚類的優點:
- 不用輸入聚類數K值
- 節約內存,所有的樣本都在磁盤上,CF Tree僅僅存了CF節點和對應的指針
- 聚類速度快,只需要單遍掃描數據集就能建立CF Tree,CF Tree的增刪改都很快
- 可以識別噪音點,還可以對數據集進行初步分類的預處理
BIRCH聚類的缺點:
- BIRCH的調參較為復雜,幾個參數對CF Tree的最終形式影響很大
- 由於CF Tree對每個節點的CF個數有限制,導致聚類的結果可能和真實的類別分布不同
- 對高維特征的數據聚類效果不好(如果 n_features大於20,通常使用MiniBatchKMeans會更好)
- 如果數據集的分布簇不是類似於超球體,或者說不是凸的,則聚類效果不好
3. 其他方法
例如Diana、ROCK、CURE、CAMELEON等。
六、基於網格的聚類
核心原理就是:
(1)將數據空間划分為網格單元,將數據對象集映射到網格單元中,並計算每個單元的密度。
(2)根據預設的閾值判斷每個網格單元是否為高密度單元,由鄰近的稠密單元組形成”類“。
網格聚類的優點:
- 執行效率高,其速度只依賴於數據空間中每個維上單元的個數
網格聚類的缺點:
- 對參數敏感
- 無法處理不規則分布的數據
- 維數災難
STING、CLIQUE、WaveCluster等是該類方法中的代表性算法。以下是CLIQUE的例子:
七、其他角度的聚類
例如基於約束的聚類(COD)、基於圖網絡的聚類(圖團體檢測)等。
八、聚類算法的性能度量
大佬對常用的聚類算法從可伸縮性、適合的數據類型、高維性、異常數據的抗干擾度、聚類形狀和算法效率6個方面進行了綜合性能評價。
還有一些對聚類的評測指標,這里不打算展開介紹了。個人感覺通過聚類來輔助具體業務場景的分析會比較重要,就像開頭說的那樣,聚類算法可以作為獨立方法將數據聚成不同簇,也可以作為數據挖掘任務(例如分類、關聯規則等)的預處理。這里要提一嘴的是,很多聚類算法都已經被封裝在sklearn中,方便調用。
當然,聚類算法有很多的應用場景,例如目標用戶群體分類、異常值檢測等。說到這里,我接着想寫一個“異常檢測”專題了。
如果您對數據挖掘感興趣,歡迎瀏覽我的另幾篇博客:數據挖掘比賽/項目全流程介紹
如果你對智能推薦感興趣,歡迎先瀏覽我的另幾篇隨筆:智能推薦算法演變及學習筆記
如果您對人工智能算法感興趣,歡迎瀏覽我的另一篇博客:人工智能新手入門學習路線和學習資源合集(含AI綜述/python/機器學習/深度學習/tensorflow)、人工智能領域常用的開源框架和庫(含機器學習/深度學習/強化學習/知識圖譜/圖神經網絡)
如果你是計算機專業的應屆畢業生,歡迎瀏覽我的另外一篇博客:如果你是一個計算機領域的應屆生,你如何准備求職面試?
如果你是計算機專業的本科生,歡迎瀏覽我的另外一篇博客:如果你是一個計算機領域的本科生,你可以選擇學習什么?
如果你是計算機專業的研究生,歡迎瀏覽我的另外一篇博客:如果你是一個計算機領域的研究生,你可以選擇學習什么?
如果你對金融科技感興趣,歡迎瀏覽我的另一篇博客:如果你想了解金融科技,不妨先了解金融科技有哪些可能?
之后博主將持續分享各大算法的學習思路和學習筆記:hello world: 我的博客寫作思路