本系列意在長期連載分享,內容上可能也會有所增刪改減;
因此如果轉載,請務必保留源地址,非常感謝!
知乎專欄: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定義,即
- An initial clustering is created by choosing k random centroids from the dataset.
- For each data point, calculate the distance from all centroids, and assign its
membership to the nearest centroid. - Recalculate the new cluster centroids by the average of all data points that are
assigned to the clusters. - 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算法,作者提出了一種新的聚類算法,同時也提出了一種初始化聚類中心的辦法:
- 該聚類算法本質是通過定義損失函數,迭代將每個點分配到更優的類別,促使損失函數持續減小;若損失函數不再減小,則停止迭代。思想上是梯度下降,因此與K-means一樣只能達到局部最優。
- 在作者也提出了一種初始化聚類中心的方法,即:先計算整體樣本中心,然后根據樣本點到中心的距離,由近至遠均勻采樣作為初試聚類中心。這樣可以避免初次聚類后,某類為空的問題。
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的一些性質進行了理論上的推導與證明:
- 作者首先根據最初K-means的定義給出損失函數表達式P:
- 然后給出等價的損失函數RP,並證明其是非凸的:
- 接下來給出K-means類型的聚類算法的思想(本質就是現在所說的EM算法的一種應用):
- 當距離定義為minkowski距離時,K-means可能無法收斂到局部最小值,即
- 當距離定義為二次距離時,K-means可以收斂到局部最小值,即
1995年
在“Cheng, Yizong. "Mean shift, mode seeking, and clustering." 1995”中,作者對前人提出的Mean Shift算法進行了擴展並研究了其性質,同時證明了K-means算法是Mean Shift算法的特殊形式。這篇文章也奠定了Mean Shift算法能被廣泛使用的基礎。
- 作者首先給出原始Mean Shift算法的定義。算法本質就是迭代去尋找離某每個點最近的,且穩定的點;接下來把收斂到同個穩定點的所有點作為一類。這里穩定可以理解該點鄰域質心與鄰域中心一致。
- 然后作者在此基礎上進行了擴展,加入了核函數和權重。由於Mean Shift本質是迭代逼近密度局部最大的點,有了核函數,就可以自由定義這種密度的表達,因此適用性大大增強
- 作者表示,一篇關於“Maximum Entropy”的文章里已經證明了K-means為“Maximum Entropy”算法的特殊形式;本文作者又證明了“Maximum Entropy”算法為擴展后Mean Shift的特殊形式,於是K-means即為Mean Shift的特殊形式
- 作者嘗試利用Mean Shift進行聚類,而現在Mean Shift也是一種常見的聚類算法之一
- 由於Mean Shift可以逼近概率密度局部最大點,作者也嘗試利用Mean Shift來求解最優化問題
- 此外,作者還定義了很多相關概念,並進行了性質的說明與證明,此處不再贅述
在“Chinrungrueng, C., and C. H. Sequin. "Optimal adaptive k-means algorithm with dynamic adjustment of learning rate. " 1995”中,作者對之前on-line的k-means算法進行了修改
- 作者先定義K-means算法的損失函數,即最小均方誤差
- 接下來介紹以前的Adaptive K-means算法,這種算法的思想跟梯度下降法差不多。其所存在的問題也跟傳統梯度下降法一樣,如果
過小,則收斂時間慢;如果
過大,則可能在最優點附近震盪。
- 接下來,作者將損失函數進行修改,即改成了加權的最小均方誤差
- 然后作者引用文獻的證明,表示“當類別數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時,說明是長條或非凸的。為了求邊界點,先求取所有候選邊界點,的方式如下。本質就是如果一個點很少被別的點包圍,則處於邊界。
- 然后開始求取邊界點:給定邊界點數目m,邊界點的求解公式如下,本質就是從所有候選邊界點中找出m個最突出的作為邊界點
- 接下來初始化聚類中心。本質還是認為密度較大的,即聚類中心。通過找到密度最大點,然后將它周圍的球體區域內的點都認為暫時屬於這個類,並從整體數據中刪除。重復這個過程,直到得到所有的聚類中心。
- 初次聚類:根據最近鄰,將每個點分配到相應的聚類中心。
- 為了讓一個類別能出現多個聚類中心,作者增加了一步,即類別合並(本質是從上往下的層次聚類):即將所有聚類中心看做圖的節點,邊的權重即兩個聚類中心的距離,然后對這幅圖繪出最小生成樹;在生成了樹后,再重新計算每條邊的權重,這時候權重被重新定義為一種”疏遠度“;迭代剪斷”疏遠度“最大的邊,直到剩下的類別數為K。整個流程被作者描述的相當復雜,如下
- 更新聚類中心:此步驟包含兩個子步驟
6.1 為數據重新分配類別。每個數據點的類別定義為,離它最近的聚類中心的類別。
6.2 分別更新類內聚類中心。對每個類別,若有多個聚類中心,則按照標准kmeans的更新聚類中心方法重新計算聚類中心。 - 重復5~6步,直到達到一定迭代次數或者聚類中心穩定。
除了提出算法外,作者文中還提到幾種初始化聚類中心的方法:
- 初步將數據分成K個區域,將每個區域中心作為初始聚類中心
- 計算出每個點的”密度“,認為”密度“較大的是聚類中心。先把”密度“最大的挑出作為第一個聚類中心,從剩下的點中找出密度最大,且離所有已有聚類中心大於一定距離的點作為下一個聚類中心,直到選擇了K個
- 計算整體均值,作為第一個聚類中心。從剩下的點中順序尋找,當遇到離所有已有聚類中心大於一定距離的點,則作為下一個聚類中心,直到選擇了K個
1999年
在Pelleg, et al. "Accelerating exact k -means algorithms with geometric reasoning." 1999.中,針對傳統K-means算法計算復雜度高因此費時的情況,作者提出通過“KD樹”來加速K-means算法。作者通過實驗說明,加速后的算法比原始K-means算法快25~175倍。
首先,將數據用“KD樹”這種結構存儲。關於構造“KD樹”的詳細資料,可以參考本文的KD-trees部分。這里僅進行一些額外的補充說明:
- “kd樹”其實就是一種二叉樹
- 樹的每個節點代表一個矩形,存儲着這個矩形中數據點的信息: ,這兩個向量用於描述這個矩形的邊界;矩形中數據點的數量
- 樹的每個非葉子節點還額外存儲關於分裂成子樹的信息:划分子樹的值;此數值所在的維度
- 樹的根節點表示囊括所有數據的大矩形
- 樹的葉子節點存儲具體的數據點信息,即該矩形中每個數據點的值
- 樹的深度是提前設定好的,並不一定要分裂到不可再分
在將數據用“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
作者先提出k-means聚類算法面臨的三個主要問題,並表示X-means能解決前兩個問題,並改善第三個問題
- 計算量大
- 聚類數量K需要提前設定
- 只能收斂到局部最優
算法的整體思路如下,本質就是由上而下的層次聚類法:
2.1 先設定K的范圍 , 令
2.2 迭代2.3~2.4, 並令 ,直到
2.3 執行傳統K-means
2.4 將每一個聚類中心分裂成兩個,並檢驗性能是否提升,是則保留,否則放棄分裂
文章截圖如下
聚類中心分裂算法:
3.1 對於其中一個聚類中心,首先將它分裂成兩個,並讓這兩個點沿着相反的方向移動。移動的距離與這個區域大小成正比,移動的方向隨機
3.2 在父聚類中心的區域中,對這兩個分裂后的聚類中心執行傳統K-means算法
3.3 利用 Bayesian information criterion (BIC)/Schwarz criterion計算得分,挑選得分較優秀的模型作為最終模型。BIC本質就是計算似然,但是為了克服過擬合,又增加對參數數量的懲罰項。詳情可以參考wiki的BIC詞條。文中的BIC定義如下。
本文作者與上文Pelleg, et al. "Accelerating exact k -means algorithms with geometric reasoning." 1999.作者是一樣的,因此作者還提出能夠用“KD樹”來加速X-means算法。加速算法的細節不再贅述