聚類算法總結

訓練深度學習網絡分爲監督學習無監督學習半監督學習強化學習

聚類算法屬於無監督學習的範疇,主要的六大算法有K-MeansMean ShiftDBSCANGMM凝聚層次聚類圖團體檢測


K-Means(K 均值聚類)

K-Means 是最知名的聚類算法,簡單地使用均值。

算法流程:

  1. 初始化,隨機選取k箇中心點;
  2. 遍歷所有數據,將每個數據劃分到最近的中心點中(歐式距離L2距離);
  3. 計算每個聚類的平均值,並作爲新的中心點;
  4. 重複2-3,直到這k箇中心點不再變化(收斂了),或執行了足夠多的迭代,結束。

時間複雜度:O(I * n * k * m)
空間複雜度:O(n * m)

其中n爲數據量,I爲迭代次數,k爲類別數,m爲數據點的維數。一般I,k,m均可認爲是常量,所以時間和空間複雜度可以簡化爲O(n),即線性的。

優點:速度快,真正在做的是計算點和組中心之間的距離。
缺點:

  • k值需要我們自己來選擇,理想情況下,我們希望聚類算法能夠幫我們解決分多少類的問題,因爲它的目的是從數據中獲得一些見解。
  • 當數據數量不是足夠大時,初始化分組很大程度上決定了聚類,影響聚類結果。
  • 使用算術平均值對outlier不魯棒。可以換成K-Medians來客服這一點。
    K-Means的缺點

K-Medians 是與 K-Means 有關的另一個聚類算法。區別:

  1. 不是用均值而是用類別的中值向量來重新計算類別中心。這種方法 對異常值不敏感(因爲使用中值),但對於較大的數據集要慢得多,因爲在計算中值向量時,每次迭代都需要進行排序。
  2. 步驟2使用的曼哈頓距離L1距離。

K值的選擇:參考博客,給出了很多方法,沒有完全看懂。????Cross Validation,有人用貝葉斯,還有的用bootstrap。

爲什麼K-Means使用L2距離??????
而距離度量又是另外一個問題,比較常用的是選用歐式距離。可是這個距離真的具有普適性嗎?《模式分類》中指出歐式距離對平移是敏感的,這點嚴重影響了判定的結果。在此必須選用一個對已知的變換(比如平移、旋轉、尺度變換等)不敏感的距離度量。書中提出了採用切空間距離(tangent distance)來替代傳統的歐氏距離。


Mean Shift(均值漂移聚類)

均值漂移聚類是基於滑動窗口的算法,它試圖找到數據點的密集區域。

算法流程:

  1. 初始化,從一個以C點(隨機選擇)爲中心,r爲半徑的滑動窗口(高維球)開始;
    在這裏插入圖片描述
    Sh:以x爲中心點,半徑爲h的高維球區域;
    k:包含在Sh範圍內點的個數;
    xi:包含在Sh範圍內的點
  2. 滑動窗口通過將中心點移向窗口內點的均值,來移向更高密度區域;
    在這裏插入圖片描述
    Mt爲t狀態下求得的偏移均值;
    xt爲t狀態下的中心;
  3. 重複2,直到沒有滑動窗口不能容納更多的點;
  4. 重複1~3,創建多個滑動窗口,如果存在重疊,保留包含數據點最多的窗口,即爲聚類結果,結束。

優點:與 K-means 聚類相比,不需要選擇簇數量,因爲均值漂移自動發現這一點。
缺點:半徑r需要自己選擇,對聚類結果影響大。

應用:

  • 聚類(K均值聚類)
  • 圖像分割(將圖像映射到特徵空間,對採樣點進行均值漂移聚類)
  • 對象輪廓檢驗(光線傳播算法)
  • 目標跟蹤(求解最優化Bhattacharya係數函數)

DBSCAN(基於密度的聚類方法)

全名Density-Based Spatial Clustering of Applications with Noise,是一個基於密度的聚類算法。

算法流程:

  1. 初始化,將所有數據點標記爲未訪問;
  2. 從任意一個未訪問的數據點開始,定義一個當前簇,通過距離 ε提取鄰域;
  3. 如果鄰域中包含足夠數量的點(根據minPoints),則聚類開始,將所有鄰域中的點歸入當前簇,否則標記爲「噪聲」。在這兩種情況下,該點都被標記爲「已訪問」。
  4. 對當前簇中其它未訪問的點,重複2、3;
  5. 完成當前簇的聚類後,再完成其它簇的聚類,重複2~4;

優點:自動發現簇的數量,自動發現異常值。
缺點:

  • 如果樣本集的密度不均勻、聚類間距差相差很大時,聚類質量較差。
    這是因爲當密度變化時,用於識別鄰域點的距離閾值 ε 和 minPoints 的設置將會隨着簇而變化。
  • DBScan不能很好反映高維數據。
    在高維數據中,距離閾值 ε 變得難以估計。

用高斯混合模型(GMM)的最大期望(EM)聚類

下圖是K-Means的兩個失敗案例,K-Means 的一個主要缺點是它對於聚類中心均值的簡單使用,不能處理簇中心接近的情況。GMM首先假設數據點符合高斯分佈。
在這裏插入圖片描述
算法流程:

  1. 初始化,選擇簇的數量(如 K-Means 所做的),隨機初始化每個簇的高斯分佈參數。也可以通過快速查看數據來嘗試爲初始參數提供一個好的猜測。
  2. 給定每個簇的高斯分佈,計算每個數據點屬於一個特定簇的概率。一個點越靠近高斯的中心,它就越可能屬於該簇。
  3. 基於這些概率,使用EM的優化算法去更新每個簇的高斯分佈參數(例如均值和標準差)。可以使用數據點位置的加權和來計算這些新參數,其中權重是數據點屬於該特定簇的概率。
  4. 重複步驟 2 和 3 直到收斂,其中分佈在迭代中的變化不大。

優點:

  • GMMs 比 K-Means 在簇協方差方面更靈活;因爲標準差參數,簇可以呈現任何橢圓形狀,而不是被限制爲圓形。K-Means 實際上是 GMM 的一個特殊情況,這種情況下每個簇的協方差在所有維度都接近 0。
  • 因爲 GMMs 使用概率,所以每個數據點可以有很多簇。因此如果一個數據點在兩個重疊的簇的中間,我們可以簡單地通過說它百分之 X 屬於類 1,百分之 Y 屬於類 2 來定義它的類。

凝聚層次聚類

通過合併的方式來聚類,停止條件決定了簇的個數。

算法流程:

  1. 初始化,我們首先將每個數據點視爲一個單一的簇,即如果我們的數據集中有 X 個數據點,那麼我們就有 X 個簇。計算每個簇之間的距離。
  2. 在每次迭代中,我們根據最短距離將兩個簇合併成一個。
  3. 重新計算簇之間的距離。
  4. 重複步驟 2~3,直到只有一個包含所有數據點的簇。這樣我們只需要選擇何時停止合併簇,來選擇最終需要多少個簇。

優點:

  • 層次聚類不需要我們指定簇的數量,我們甚至可以選擇哪個數量的簇看起來最好,因爲我們正在構建一棵樹;
  • 對於距離度量標準的選擇並不敏感。

缺點:

  • 層次聚類的這些優點是以較低的效率爲代價的,因爲它具有 O(n³) 的時間複雜度。

圖團體檢測(Graph Community Detection)

當我們的樣本以及樣本之間的關係可以被表示爲一個網絡或圖(graph)時,可能存在這樣的需求——我們想找出來網絡中聯繫比較”緊密”的樣本。

舉個例子,在社交網站中,用戶以及用戶之間的好友關係可以表示成下面的無向圖,圖中的頂點表示每個用戶,頂點之間的邊表示用戶是否爲好友關係。
在這裏插入圖片描述
算法流程:

  1. 初始化,每個頂點自己的獨自構成一個聚類,然後計算整個網絡的模塊性M;
  2. 嘗試選擇兩個聚類融合到了一起,計算由此造成的模塊性改變ΔM。
  3. 取ΔM出現了最大增長的兩個聚類進行融合。然後爲這個聚類計算新的模塊性 M,並記錄下來。
  4. 不斷重複第2步和第3步,每一次都融合一對聚類,得到ΔM的最大增益,然後記錄新的聚類模式及其相應的模塊性M。
  5. 直到所有的頂點都被分組成了一個聚類時爲止。然後該算法會檢查這個聚類過程中的所有記錄,然後找到其中返回了最高M值的聚類模式,這就是算法得到的聚類結構。

解釋模塊性:
在這裏插入圖片描述
L表示圖包含的邊的數量,N表示頂點數量,ki表示頂點i的度(degree),Aij的值爲鄰接矩陣中的值(真實情況下存在連接爲1,否則爲0),ci表示頂點i的聚類,δ則是克羅內克函數(Kronecker-delta function)。

克羅內克函數δ的邏輯很簡單,兩個參數相等則返回1,不等則返回0。所以如果頂點i,j屬於同一聚類,則δ(ci,cj)返回1,否則返回0。

ki*kj/2L可以理解爲當該網絡是隨機分配的時候頂點i和j之間的預期邊數,當ki,kj都比較小的時候,連接頂點i,j的邊出現的概率就越小,描述兩個頂點關係準確性也高。
Aij−ki*kj/2L可以理解爲網絡的真實結構和隨機組合時的預期結構之間的差。研究它的值可以發現,當 Aij=1且 ki*kj/2L很小時,其返回的值最高。這意味着,當在頂點i和j之間存在連接,但是i, j之間存在連接的預期又比較小的時候,得到的值更高。再有,如果把這樣的兩個頂點分到一個聚類,則能提高網絡的模塊性。

優點:在典型的結構化數據中和現實網狀數據都有非常好的性能。
缺點:它的侷限性主要體現在會忽略一些小的集羣,且只適用於結構化的圖模型。


Ref
數據科學家必須瞭解的六大聚類算法:帶你發現數據之美
均值漂移(Meanshift)算法
GMM公式+代碼
GMM算法k-means算法的比較

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