當我們在談論kmeans(2)



本系列意在長期連載分享,內容上可能也會有所增刪改減;
因此如果轉載,請務必保留源地址,非常感謝!
知乎專欄:https://zhuanlan.zhihu.com/data-miner
博客園:http://www.cnblogs.com/data-miner(暫時公式顯示有問題)

當我們在談論kmeans:論文概述(1)

引言

  上一篇文章,對從1969年以來,與kmeans相關文章的數據進行了簡單描述,並對其中某些數據趨勢嘗試分析。這屬於對數據的整體情況的一個簡要分析。
  本篇文章,則希望能通過簡單介紹kmeans一路以來一些重要或者有意義的文章,進而能大概梳理下該算法的發展進程。

算法歷程

1967年

  公認的k-means術語的最初使用是在"J. MacQueen, Some Methods for classification and Analysis of Multivariate Observations, 1967"。根據wiki的說法,k-means的算法還能追溯到更早的時候,然而這就不在本文的討論范圍內了。其中給出了最初的k-means定義,即

  1. An initial clustering is created by choosing k random centroids from the dataset.
  2. For each data point, calculate the distance from all centroids, and assign its
    membership to the nearest centroid.
  3. Recalculate the new cluster centroids by the average of all data points that are
    assigned to the clusters.
  4. Repeat step 2 and 3 until convergence.

1979年

  在"Hartigan, J. A.; Wong, M. A., "Algorithm AS 136: A K-Means Clustering Algorithm, 1979"中,參考K-means算法,作者提出了一種新的聚類算法,同時也提出了一種初始化聚類中心的辦法:

  1. 該聚類算法本質是通過定義損失函數,迭代將每個點分配到更優的類別,促使損失函數持續減小;若損失函數不再減小,則停止迭代。思想上是梯度下降,因此與K-means一樣只能達到局部最優。
  2. 在作者也提出了一種初始化聚類中心的方法,即:先計算整體樣本中心,然后根據樣本點到中心的距離,由近至遠均勻采樣作為初試聚類中心。這樣可以避免初次聚類后,某類為空的問題。

1984年

  在“Selim, Shokri Z., and Mohamed A. Ismail. "K-means-type algorithms: a generalized convergence theorem and characterization of local optimality." 1984”中,作者表示還沒有文章對K-means的性質進行系統的理論分析。針對這一情況,作者主要對K-means的一些性質進行了理論上的推導與證明:

  1. 作者首先根據最初K-means的定義給出損失函數表達式P:
  2. 然后給出等價的損失函數RP,並證明其是非凸的:


  3. 接下來給出K-means類型的聚類算法的思想(本質就是現在所說的EM算法的一種應用):

  4. 當距離定義為minkowski距離時,K-means可能無法收斂到局部最小值,即
  5. 當距離定義為二次距離時,K-means可以收斂到局部最小值,即

1995年

  在“Cheng, Yizong. "Mean shift, mode seeking, and clustering." 1995”中,作者對前人提出的Mean Shift算法進行了擴展並研究了其性質,同時證明了K-means算法是Mean Shift算法的特殊形式。這篇文章也奠定了Mean Shift算法能被廣泛使用的基礎。

  1. 作者首先給出原始Mean Shift算法的定義。算法本質就是迭代去尋找離某每個點最近的,且穩定的點;接下來把收斂到同個穩定點的所有點作為一類。這里穩定可以理解該點鄰域質心與鄰域中心一致。
  2. 然后作者在此基礎上進行了擴展,加入了核函數和權重。由於Mean Shift本質是迭代逼近密度局部最大的點,有了核函數,就可以自由定義這種密度的表達,因此適用性大大增強
  3. 作者表示,一篇關於“Maximum Entropy”的文章里已經證明了K-means為“Maximum Entropy”算法的特殊形式;本文作者又證明了“Maximum Entropy”算法為擴展后Mean Shift的特殊形式,於是K-means即為Mean Shift的特殊形式
  4. 作者嘗試利用Mean Shift進行聚類,而現在Mean Shift也是一種常見的聚類算法之一
  5. 由於Mean Shift可以逼近概率密度局部最大點,作者也嘗試利用Mean Shift來求解最優化問題
  6. 此外,作者還定義了很多相關概念,並進行了性質的說明與證明,此處不再贅述

  在“Chinrungrueng, C., and C. H. Sequin. "Optimal adaptive k-means algorithm with dynamic adjustment of learning rate. " 1995”中,作者對之前on-line的k-means算法進行了修改

  1. 作者先定義K-means算法的損失函數,即最小均方誤差
  2. 接下來介紹以前的Adaptive K-means算法,這種算法的思想跟梯度下降法差不多。其所存在的問題也跟傳統梯度下降法一樣,如果 μ 過小,則收斂時間慢;如果 μ 過大,則可能在最優點附近震盪。
  3. 接下來,作者將損失函數進行修改,即改成了加權的最小均方誤差

  4. 然后作者引用文獻的證明,表示“當類別數K很大,且樣本的真實概率密度函數P平滑的假設下,使用K-means算法進行分割,每一個區域的方差是相同的”。於是,在這個前提下,即“每個類別的方差相同”的前提下,修改后的K-means可以自適應計算learning rate μ μ 會在初期近似於1,而在接近最優時會趨於0,加快了搜索速度,同時避免步長太大在最優點附近震盪的情況。限於篇幅, μ 的更新公式不再本文貼出,有興趣的可以去文章中找。

1997年

  在“Chaudhuri, D., and B. B. Chaudhuri. "A novel multiseed nonhierarchical data clustering technique. " 1997”中,針對傳統K-means算法在非凸數據集下較差的表現,作者提出了修改的K-means。傳統的k-means針對每一個類別選擇一個聚類中心,但是對於非凸或長條狀的類別,一個聚類中心並不是很好的選擇(博主注:針對非凸與長條等數據,個人認為也可以在特征轉換層面處理,但是這樣就要求首先對數據有深入的分析,而且適用性比較差)。本文提出,一個類別可以包含多個聚類中心,使K-means在非凸情況下也能有較好的表現。

  1. 為了判斷聚類的形狀,作者首先提出可以通過找出邊界點,然后根據邊界點“最大最小距離比”來判斷。當比值接近1時,說明形狀是接近超球體的;當比值遠大於1時,說明是長條或非凸的。為了求邊界點,先求取所有候選邊界點,的方式如下。本質就是如果一個點很少被別的點包圍,則處於邊界。

  2. 然后開始求取邊界點:給定邊界點數目m,邊界點的求解公式如下,本質就是從所有候選邊界點中找出m個最突出的作為邊界點
  3. 接下來初始化聚類中心。本質還是認為密度較大的,即聚類中心。通過找到密度最大點,然后將它周圍的球體區域內的點都認為暫時屬於這個類,並從整體數據中刪除。重復這個過程,直到得到所有的聚類中心。
  4. 初次聚類:根據最近鄰,將每個點分配到相應的聚類中心。
  5. 為了讓一個類別能出現多個聚類中心,作者增加了一步,即類別合並(本質是從上往下的層次聚類):即將所有聚類中心看做圖的節點,邊的權重即兩個聚類中心的距離,然后對這幅圖繪出最小生成樹;在生成了樹后,再重新計算每條邊的權重,這時候權重被重新定義為一種”疏遠度“;迭代剪斷”疏遠度“最大的邊,直到剩下的類別數為K。整個流程被作者描述的相當復雜,如下


  6. 更新聚類中心:此步驟包含兩個子步驟
    6.1 為數據重新分配類別。每個數據點的類別定義為,離它最近的聚類中心的類別。
    6.2 分別更新類內聚類中心。對每個類別,若有多個聚類中心,則按照標准kmeans的更新聚類中心方法重新計算聚類中心。
  7. 重復5~6步,直到達到一定迭代次數或者聚類中心穩定。

除了提出算法外,作者文中還提到幾種初始化聚類中心的方法:

  1. 初步將數據分成K個區域,將每個區域中心作為初始聚類中心
  2. 計算出每個點的”密度“,認為”密度“較大的是聚類中心。先把”密度“最大的挑出作為第一個聚類中心,從剩下的點中找出密度最大,且離所有已有聚類中心大於一定距離的點作為下一個聚類中心,直到選擇了K個
  3. 計算整體均值,作為第一個聚類中心。從剩下的點中順序尋找,當遇到離所有已有聚類中心大於一定距離的點,則作為下一個聚類中心,直到選擇了K個

1999年

  在Pelleg, et al. "Accelerating exact k -means algorithms with geometric reasoning." 1999.中,針對傳統K-means算法計算復雜度高因此費時的情況,作者提出通過“KD樹”來加速K-means算法。作者通過實驗說明,加速后的算法比原始K-means算法快25~175倍。

  1. 首先,將數據用“KD樹”這種結構存儲。關於構造“KD樹”的詳細資料,可以參考本文的KD-trees部分。這里僅進行一些額外的補充說明:

    • “kd樹”其實就是一種二叉樹
    • 樹的每個節點代表一個矩形,存儲着這個矩形中數據點的信息: h ( m a x ) h ( m i n ) ,這兩個向量用於描述這個矩形的邊界;矩形中數據點的數量
    • 樹的每個非葉子節點還額外存儲關於分裂成子樹的信息:划分子樹的值;此數值所在的維度
    • 樹的根節點表示囊括所有數據的大矩形
    • 樹的葉子節點存儲具體的數據點信息,即該矩形中每個數據點的值
    • 樹的深度是提前設定好的,並不一定要分裂到不可再分
  2. 在將數據用“KD樹”存儲后,利用樹的性質,一般能比傳統K-means更快找到每個點最近的聚類中心。詳細的算法比較復雜,有興趣的可以參考論文。這里給出幾點說明幫助理解:

    • 比之傳統K-means對每個樣本點找最近鄰聚類中心,“KD樹”對其中的一個矩形找最近的聚類中心。對某個矩形(即樹中某節點),若它平面中的每個點(區別於樣本點)到某聚類中心的距離,比到其他聚類中心的距離都近,那么該矩形中所有樣本點的最近鄰聚類中心就能一次性確定下來了。
    • 由於並非樹中所有矩形(即節點),都能找到滿足以上條件的聚類中心。對於這些矩形,只能用傳統辦法求其中樣本點的最近鄰聚類中心
    • 因此,在最壞情況下,即樹中每個矩形都不滿足上述條件,“KD樹”的K-means算法會比傳統K-means更慢(因為還要構造樹)。於是,“KD樹”分裂的深度,是影響這個算法性能的一個重要參數

2000年

  在Pelleg, et al. "X-means: Extending K-means with Efficient Estimation of the Number of Clusters. Intelligent Data Engineering and Automated Learning" 2000.中,作者提出了一種改進的K-means算法,即X-means

  1. 作者先提出k-means聚類算法面臨的三個主要問題,並表示X-means能解決前兩個問題,並改善第三個問題

    • 計算量大
    • 聚類數量K需要提前設定
    • 只能收斂到局部最優
  2. 算法的整體思路如下,本質就是由上而下的層次聚類法:
    2.1 先設定K的范圍 [ K m i n , K m a x ] , 令 K = K m i n
    2.2 迭代2.3~2.4, 並令 K = K 2 ,直到 K > K m a x
    2.3 執行傳統K-means
    2.4 將每一個聚類中心分裂成兩個,並檢驗性能是否提升,是則保留,否則放棄分裂
    文章截圖如下

  3. 聚類中心分裂算法:
    3.1 對於其中一個聚類中心,首先將它分裂成兩個,並讓這兩個點沿着相反的方向移動。移動的距離與這個區域大小成正比,移動的方向隨機
    3.2 在父聚類中心的區域中,對這兩個分裂后的聚類中心執行傳統K-means算法
    3.3 利用 Bayesian information criterion (BIC)/Schwarz criterion計算得分,挑選得分較優秀的模型作為最終模型。BIC本質就是計算似然,但是為了克服過擬合,又增加對參數數量的懲罰項。詳情可以參考wiki的BIC詞條。文中的BIC定義如下。

  4. 本文作者與上文Pelleg, et al. "Accelerating exact k -means algorithms with geometric reasoning." 1999.作者是一樣的,因此作者還提出能夠用“KD樹”來加速X-means算法。加速算法的細節不再贅述


免責聲明!

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



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