聚類算法


聚類算法有很多,常見的有幾大類:划分聚類、層次聚類、基於密度的聚類。本篇內容包括k-means、層次聚類、DBSCAN 等聚類方法。

k-means 方法

  1. 初始k個聚類中心;
  2. 計算每個數據點到聚類中心的距離,重新分配每個數據點所屬聚類;
  3. 計算新的聚簇集合的平均值作為新的聚類中心;
  4. 迭代,直到不再重新分配.

k-means 損失函數

設k個聚類中心為\(\mu_1,\mu_2,\dots,\mu_k\),用\(r_{nk}\in \{0,1\}\)表示\(x_n\)是否屬於聚類k.則損失函數定義為:

\[J(\mu,r)=\sum_{n=1}^N\sum_{k=1}^K r_{nk} \|x_n-\mu_k\|^2 \]

其表征了數據的混亂度.

最小化損失函數的過程是一個NP問題,而k-means的迭代過程是一個收斂到局部最低點的過程.

k的選定

"肘點"法
選取不同的k值,畫出損失函數,選取突然變緩的地方的k值.

差方和geek.ai100.com.cn/wp-content/uploads/hI0gcqy98IiV6LL.png

輪廓系數:旨在將某個對象與自己的簇的相似程度和與其他簇的相似程度進行比較。輪廓系數最高的簇的數量表示簇的數量的最佳選擇。如下圖的最高點:

輪廓系數geek.ai100.com.cn/wp-content/uploads/nFHrhCQwMc8sQJZ.png

初始化方法

k-means初始化方法包括 Forgy 和隨機分區。Forgy 方法從數據集中隨機選擇k個觀測值,並將其作為初始值。隨機分區方法是先隨機為每個觀測值分配一個簇,隨后進行更新,簇的隨機分配點的質心就是計算后得到的初始平均值。

異常點免疫

一些異常點可能嚴重影響聚類中心,可以通過一些調整來減少影響,比如中心點不取均值,而是取離均值最近的樣本點(中值k-median,又稱k-medoids). k-medoids 對每個聚簇選取中心點時需要再遍歷一遍聚簇,因此增加O(n)的計算量. k-medoids 相比 k-means 對於噪聲數據不再敏感.

k-means優缺點

優點:簡單,速度快

缺點:最終的聚類結果嚴重依賴於初始點選擇,容易陷入局部最優(與簡單的爬山算法容易陷入局部最優類似),並且需要提前知道k的值.

  • 存儲空間大
  • 時間復雜度高(要分類的實例需與所有已知實例比較)
  • 樣本分布不均衡時,k近鄰容易被錯誤歸類

針對第三個缺點的改進: 計算相似度時加上與距離相關的權重(如距離的倒數).

初始聚類中心敏感

緩解辦法:

  1. 初始第一個中心為某點后初始第二個點時選擇離他最遠的點,后面的點選擇離這些點最遠的點.
  2. 多初始化幾遍,選擇損失最小的(sklearn等庫通常會有此參數)
  3. 采用k-means++等優化的初始化聚類方法.

k-means++

與k-means相比,改進之處在於初始中心集合的選擇:

  1. 初始中心點集合為空.
  2. 從數據點中隨機選第一個中心點.
  3. 重復以下過程選出k個初始中心
  4. a) 計算每個數據點到其最近的中心點的距離D.
  5. b) 以正比於D的概率(輪盤賭選擇法),隨機選擇一個新數據點加入中心點集合中.

k-means++算法的缺點
  雖然k-means++算法可以確定地初始化聚類中心,但是從可擴展性來看,它存在一個缺點,那就是它內在的有序性特性:下一個中心點的選擇依賴於已經選擇的中心點。 針對這種缺陷,k-means||算法提供了解決方法。

k-means||[1]

k-means||是對k-means++的一種並行化實現, 在Spark ML框架中做了實現. k-means||算法來自12年的論文Scalable K-Means++.

k-means||算法是在k-means++算法的基礎上做的改進,和k-means++算法不同的是,它采用了一個采樣因子l,並且l=A(k),在spark的實現中l=2k。這個算法首先如k-means++算法一樣,隨機選擇一個初始中心, 然后計算選定初始中心確定之后的初始花費\(\psi\)(指與最近中心點的距離)。之后處理\(log(\psi )\)次迭代,在每次迭代中,給定當前中心集,通過概率\(ld^{2}(x,C)/\phi_{X}(C)\)來 抽樣x,將選定的x添加到初始化中心集中,並且更新\(\phi_{X}(C)\)。該算法的步驟如下圖所示:

Scalable K-Means++

第1步隨機初始化一個中心點,第2-6步計算出滿足概率條件的多個候選中心點C,候選中心點的個數可能大於k個,所以通過第7-8步來處理。第7步給C中所有點賦予一個權重值\(w_{x}\) ,這個權重值表示距離x點最近的點的個數。 第8步使用本地k-means++算法聚類出這些候選點的k個聚類中心。在spark的源碼中,迭代次數是人為設定的,默認是5。

該算法與k-means++算法不同的地方是它每次迭代都會抽樣出多個中心點而不是一個中心點,且每次迭代不互相依賴,這樣我們可以並行的處理這個迭代過程。由於該過程產生出來的中心點的數量遠遠小於輸入數據點的數量, 所以第8步可以通過本地k-means++算法很快的找出k個初始化中心點。何為本地k-means++算法?就是運行在單個機器節點上的k-means++。

Mini Batch K-Means

Mini Batch K-Means算法是K-Means算法的變種,采用小批量的數據子集減小計算時間,同時仍試圖優化目標函數,這里所謂的小批量是指每次訓練算法時所隨機抽取的數據子集,采用這些隨機產生的子集進行訓練算法,大大減小了計算時間,其產生的結果,一般僅略差於標准算法。

該算法的迭代步驟有兩步:

  1. 從數據集中隨機抽取一些數據形成小批量,把他們分配給最近的質心
  2. 更新質心

與K均值算法相比,數據的更新是在每一個小的樣本集上。對於每一個小批量,通過計算平均值得到更新質心,並把小批量里的數據分配給該質心,隨着迭代次數的增加,這些質心的變化是逐漸減小的,直到質心穩定或者達到指定的迭代次數,停止計算.Mini Batch K-Means比K-Means有更快的收斂速度,但同時也降低了聚類的效果,但是在實際項目中卻表現得不明顯.

層次聚類

假設有個待聚類的樣本,對於層次聚類來說,步驟(與霍夫曼編碼過程類似,自下而上構建樹):

  1. (初始化)把每個樣本歸為一類,計算每兩個類之間的距離
  2. 尋找各個類之間最近的兩個類,把它們歸為一類
  3. 重新計算新生成的這個類與各個舊類之間的相似度
  4. 重復2和3直到所有樣本點都歸為一類,結束。

整個聚類過程建立了一棵樹,在建立的過程中,可以通過在第二步上設置一個閾值,當最近的兩個類之間的距離大於這個閾值,則認為迭代可以終止。
兩個類之間的距離(相似度)有多種計算方法:

  • SingleLinkage,又叫nearest-neighbor,就是取兩個類中距離最近的兩個樣本的距離作為這兩個集合的距離。
  • CompleteLinkage,與SingleLinkage正相反,取兩個集合中距離最遠的兩個點的距離作為兩個集合的距離。其效果也是剛好相反。
  • Average-linkage:這種方法就是把兩個集合中的點兩兩的距離全部放在一起求一個平均值,相對也能得到合適一點的結果。這種方法的一種變種就是取兩兩距離的中值,與取均值相比更加能夠解除個別偏離樣本對結果的干擾。
  • ward是一種質心算法。質心方法通過計算集群的質心之間的距離來計算兩個簇的接近度。對於 Ward 方法來說,兩個簇的接近度指的是當兩個簇合並時產生的平方誤差的增量。

\[TD_{c_1\cup c_2}=\sum_{x\in c_1\cup c_2}D(x,\mu_{c_1\cup c_2})^2 \]

表示每個點x到合並后簇中心點的距離,平方后加起來,又稱error sum of squares(ESS),等於 \(n\times \text{Var}(X)\)

通過觀察樹狀圖,可以很好的判斷出不同組的簇數。根據下圖,水平線貫穿過的樹狀圖中垂直線的數量將是簇數的最佳選擇,這條線保證了垂直橫穿最大距離並且不與簇相交。

tree-structure

在圖中的例子中,簇的數量最佳選擇是4,因為紅色水平線涵蓋了最大的垂直距離AB。

BIRCH 聚類

BIRCH 聚類特征樹的構造是不斷插入對象節點的過程, 對樹從上到下進行比較,插入節點后如果某節點的孩子節點數超出限制,則進行分裂.分裂規則是選出蔟間距最大的兩個孩子作為兩個子節點,其它孩子就近分配.
BIRCH 聚類算法可以在任何內存下運行,主要用於處理超大規模數據集,是基於距離的層次聚類。只需掃描一遍構造聚類特征樹,比較快速。缺點:不適合非球形簇;對高維數據不好;結果依賴於數據點的插入順序。

層次聚類與k-means的比較:

k-means的計算復雜度只有\(O(tkn)\),t是迭代次數,k是設定的聚類數目,而n是數據量,相比起很多其它算法,k-means算是比較高效的。但是k的值往往不容易確定,用戶如果選擇了不正確的聚類數目,會使得本應同一個cluster的數據被判定為屬於兩個大的類別,這是我們不想看到的。因為需要數據點的坐標,這個方法的適用性也受到限制。但是效率是它的一個優勢,在數據量大或者對聚類結果要求不是太高的情況下,可以采用k-means算法來計算,也可以在實驗初期用來做測試看看數據集的大致情況。

而層次聚類則不適合大數據, 對異常點敏感。層次聚類時間復雜度\(O(n^3)\),形式很像哈夫曼編碼,可解釋性較好。

下面介紹基於密度的聚類方法: DBSCAN 與 mean-shift.

DBSCAN

DBSCAN(Density-Based Spatial Clustering of Applications with Noise) 是一種基於密度的聚類算法, 包括兩個變量, 半徑范圍eps, 半徑內指定的點的數目minPts.
基本思想是以某點為核心,在指定半徑范圍內擁有超過指定點數的點形成一個簇. 將核心點周圍密度可達的點中滿足指定半徑范圍內擁有超過指定點數minPts的點標記為已訪問,而將指定半徑范圍內小於minPts標記為噪聲點. 重復此過程直到所有點都被標記.
DBSCAN的主要優點有:

  1. DBSCAN聚類算法基於點的密度,不需要確定簇的數量。
    可以對任意形狀的稠密數據集進行聚類,相對的,K-Means之類的聚類算法一般只適用於凸數據集。
  2. 可以在聚類的同時發現異常點,對數據集中的異常點不敏感。
  3. 聚類結果沒有偏倚,相對的,K-Means之類的聚類算法初始值對聚類結果有很大影響。

DBSCAN的主要缺點有:

  1. 對於高維數據不能很好地反映;
    不能很好用於密度不斷變化的數據集中。如果樣本集的密度不均勻、聚類間距差相差很大時,聚類質量較差,這時用DBSCAN聚類一般不適合。
  2. 如果樣本集較大時,聚類收斂時間較長,此時可以對搜索最近鄰時建立的KD樹或者球樹進行規模限制來改進。
  3. 調參相對於傳統的K-Means之類的聚類算法稍復雜,主要需要對距離閾值,鄰域樣本數閾值MinPts聯合調參,不同的參數組合對最后的聚類效果有較大影響。

均值漂移(mean-shift)

mean-shift 是一種非參數估計算法,它將每個數據點划歸到近鄰當中密度最高的簇.

由於用核密度估計方法計算密度,時間開銷較大, mean-shift 通常比 DBSCAN 或 質心法速度慢.

每個數據點\(x^{(l)}\in R^d\)的近鄰密度為:

\[f(x^{(l)})={1\over Nh^d}\sum_{i=1}^N K({x^{(l)}-x^{(i)}\over h}) \]

其中,h為帶寬(半徑), 是唯一需要調節的參數, h較小,則得到的簇的數量較多, h較大,則得到的簇的數量較少; K為核函數, 常見形式有:

  • 高斯核: \(K(x^{(i)})=e^{-(x^{(i)})^2\over 2\sigma^2}\)
  • Epanechnikov 核: \(K(x^{(i)})={3\over 4}(1-(x^{(i)})^2) \text{ if } |x^{(i)}|\le 1 \text{ else 0}\)

mean-shift 通過對\(f(x^{(l)})\)求導,迭代計算,得到\(f(x^{(l)})\)的最大值.

衡量指標

可以使用誤差平方和(sum of squared error,SSE),又稱散度(scatter)來度量聚類之后所有簇的質量,越小越好.

\[SSE=\sum_{i=1}^k \sum_{x\in C_i} \text{dist}(c_i,x)^2 \]

其它的評估聚類質量的方法有:輪廓系數(silhouette cofficient):

\[s(i)={d_{rest}(i)- d_s(i)\over \max(d_{rest}(i),d_s(i))} \]

\(d_s(i)\) 為每個數據點i與同簇各數據點之間的平均距離;
\(d_{rest}(i)\) 為每個數據點i與其它各簇數據點之間的最小距離.
所有數據點的平均輪廓系數為總輪廓系數, 其值越接近於1越好;越接近-1越差.

如果能夠得到數據真正的標簽,則可以計算同質性和完整性,及其調和均值. 但是往往我們很難得到標簽.


聚類分析

聚類分析(cluster analysis),是一種現代統計學分析方法,其划分方式有多種:

  1. 根據分類對象的不同,可以分為:Q型聚類分析R型聚類分析

    • 對樣本進行研究稱為樣本聚類或Q型聚類;
    • 對變量即觀測指標進行研究,稱為變量聚類或R型聚類.
      R型聚類通過了解變量間的相似程度和親疏關系,以此選出有代表性的變量,從而達到降維的效果,同時,也可以對結果再進行Q型聚類.
  2. 按照分析方法的不同,又可以分為:系統聚類法快速聚類法模糊聚類法。k-means就是快速聚類法中的一種。


  1. https://github.com/endymecy/spark-ml-source-analysis/blob/master/聚類/k-means/k-means.md ↩︎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM