聚類算法 - K-Means、二分K-Means、K-Means 、K-Means||、Canopy、Mini Batch K-Means算法

K-Means 系列:K-Means,二分K-Means,K-Means++,K-Meansll,canopy算法,MiniBatchK-Means算法。

 

K-Means系列聚類算法原理: https://www.cnblogs.com/pinard/p/6164214.html

用scikit-learn學習K-Means聚類https://www.cnblogs.com/pinard/p/6169370.html

  • 一個是傳統的K-Means算法,對應的類是KMeans。
  • 另一個是基於採樣的Mini Batch K-Means算法

聚類算法 一句話概括:

  • K-means:(1)初始化K個類別中心,(2)用樣本均值更新類別中心
  • 二分K-means:不斷選擇較大的簇,用k-means一分爲二
  • K-means++:任選一個節點爲第一個簇中心,然後依次選擇距離已有簇較遠的點爲下一個簇中心。
  • Canopy:列表獲取節點,根據大小圈,判斷是否屬於某一個簇,不屬於就新建一個簇。
  • Mini-Batch-K-means:採樣一部分樣本用k-means進行聚類,然後不斷批量添加新樣本,對簇中心進行更新。

面試題:

(1)K-means 和KNN 的區別:

k-means是聚類(無監督學習),先定好k個類別,然後隨機確定k個座標(聚類中心),各點離哪個座標近就算做哪類,然後不停算平均值求出中心,直到穩定,聚類完成。有訓練的過程。
knn = k nearest neighbor是分類(監督學習),定好k直接把待分類點周邊最近的k個點計數,數量多的那類定爲待分類點的類別。無訓練的過程。Ref:https://blog.csdn.net/Saphon/article/details/98357271

 

一、傳統K-Means算法

1. 步驟

2. 優缺點

二、K-Means算法衍生

1、二分k-means算法

  二分k-means算法是分層聚類(Hierarchical clustering)的一種,分層聚類是聚類分析中常用的方法。
分層聚類的策略一般有兩種:

  • 聚合。這是一種自底向上的方法,每一個觀察者初始化本身爲一類,然後兩兩結合
  • 分裂。這是一種自頂向下的方法,所有觀察者初始化爲一類,然後遞歸地分裂它們

  二分k-means算法是分裂法的一種。

(1)優點:

    二分k-means算法是k-means算法的改進算法,解決K-Means算法對初始簇心比較敏感的問題,二分K-Means算法是一種弱化初始質心的一種算法,相比k-means算法,它有如下優點:

  • 二分k-means算法可以加速k-means算法的執行速度,因爲它的相似度計算少了???
  • 能夠克服k-means收斂於局部最小的缺點

(2)思路步驟:

  • 將所有樣本數據作爲一個簇放到一個隊列中。
  • 從隊列中選擇一個簇進行K-means算法劃分,劃分爲兩個子簇,並將子簇添加到隊列中。
  • 循環迭代第二步操作,直到中止條件達到(聚簇數量、最小平方誤差、迭代次數等)。
  • 隊列中的簇就是最終的分類簇集合。

從隊列中選擇劃分聚簇的規則一般有兩種方式;分別如下:

  • 對所有簇計算誤差和SSE(SSE也可以認爲是距離函數的一種變種),選擇SSE最大的聚簇進行劃分操作(優選這種策略)。
  • 選擇樣本數據量最多的簇進行劃分操作:

  以上過程隱含着一個原則是:因爲聚類的誤差平方和能夠衡量聚類性能,該值越小表示數據點越接近於它們的質心,聚類效果就越好。
所以我們就需要對誤差平方和最大的簇進行再一次的劃分,因爲誤差平方和越大,表示該簇聚類越不好,越有可能是多個簇被當成一個簇了,所以我們首先需要對這個簇進行劃分。

(3) 二分k-means的源碼分析

參考: https://blog.csdn.net/BaiHuaXiu123/article/details/54883099

           https://www.jianshu.com/p/f0727880c9c0

2、K-Means++算法

解決K-Means算法對初始簇心比較敏感的問題,K-Means++算法和K-Means算法的區別主要在於初始的K箇中心點的選擇方面,K-Means算法使用隨機給定的方式,K-Means++算法採用下列步驟給定K個初始質點:

1、從數據集中任選一個節點作爲第一個聚類中心。
2、對數據集中的每個點x,計算x到所有已有聚類中心點的距離和D(X),基於D(X)採用線性概率選擇出下一個聚類中心點(距離較遠的一個點成爲新增的一個聚類中心點)。
3、重複步驟2直到找到k個聚類中心點。

缺點:由於聚類中心點選擇過程中的內在有序性,在擴展方面存在着性能方面的問題(第k個聚類中心點的選擇依賴前k-1個聚類中心點的值)

另一種選擇簇中心的方法: https://www.cnblogs.com/pinard/p/6164214.html

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

3、K-Means||算法 ()

解決K-Means++算法缺點而產生的一種算法;主要思路是改變每次遍歷時候的取樣規則,並非按照K-Means++算法每次遍歷只獲取一個樣本,而是每次獲取K個樣本,重複該取樣操作O(logn)次(n是樣本的個數),然後再將這些抽樣出來的樣本聚類出K個點,最後使用這K個點作爲K-Means算法的初始聚簇中心點。實踐證明:一般5次重複採用就可以保證一個比較好的聚簇中心點。

梳理步驟:

  • 1、在N個樣本中抽K個樣本,一共抽logn次,形成一個新的樣本集,一共有Klogn個數據。
  • 2、在新數據集中使用K-Means算法,找到K個聚簇中心。
  • 3、把這K個聚簇中心放到最初的樣本集中,作爲初始聚簇中心。
  • 4、原數據集根據上述初始聚簇中心,再用K-Means算法計算出最終的聚簇。

4、Canopy算法

(1)步驟:Canopy算法屬於一種“粗”聚類算法,執行速度較快,但精度較低,算法執行步驟如下:

  • 1、給定樣本列表L=x1,x,2...,xm以及先驗值r1和r2(r1>r2);(先驗值 - 自己猜的,人爲定義的值)
  • 2、從列表L中獲取一個節點P,計算P到所有聚簇中心點的距離(如果不存在聚簇中心,那麼此時點P形成一個新的聚簇),並選擇出最小距離D(P,aj);
  • 3、如果距離D小於r1,表示該節點屬於該聚簇,添加到該聚簇列表中。
  • 4、如果距離D小於r2,表示該節點不僅僅屬於該聚簇,還表示和當前聚簇中心點非常近,所以將該聚簇的中心點設置爲P,並將P從列表L中刪除。
  • 5、如果距離D大於r1,那麼節點P形成一個新的聚簇。
  • 6、直到列表L中的元素數據不再有變化或者元素數量爲0的時候,結束循環操作。

   Canopy算法得到的最終結果的值,聚簇之間是可能存在重疊的,但是不會存在某個對象不屬於任何聚簇的情況。

(2)Canopy算法常用應用場景:

由於K-Means算法存在初始聚簇中心點敏感的問題,常用使用Canopy+K-Means算法混合形式進行模型構建。
1、先使用canopy算法進行“粗”聚類得到K個聚類中心點。
2、K-Means算法使用Canopy算法得到的K個聚類中心點作爲初始中心點,進行“細”聚類。

(3)優缺點:
1、執行速度快(先進行了一次聚簇中心點選擇的預處理);
2、不需要給定K值,應用場景多。
3、能夠緩解K-Means算法對於初始聚類中心點敏感的問題。

5、Mini Batch K-Means

Mini Batch K-Means算法是K-Means算法的一種優化變種,採用小規模的數據子集(每次訓練使用的數據集是在訓練算法的時候隨機抽取的數據子集)減少計算時間,同時試圖優化目標函數;Mini Batch K-Means算法可以減少K-Means算法的收斂時間,而且產生的結果效果只是略差於標準K-Means算法。

算法步驟如下:
1、首先抽取部分數據集,使用K-Means算法構建出K個聚簇點的模型。
2、繼續抽取訓練數據集中的部分數據集樣本數據,並將其添加到模型中,分配給距離最近的聚簇中心點。
3、更新聚簇的中心點值。
4、循環迭代第二步和第三步操作,直到中心點穩定或者達到迭代次數,停止計算操作。

 

參考: https://blog.csdn.net/weixin_33726318/article/details/89588860


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章