1. 程式人生 > >k-means原理、優缺點及改進

k-means原理、優缺點及改進

ima 中心 views art 分享 nbsp 很慢 計算 次數

k-means 的原理,優缺點以及改進

 K-Means算法是無監督的聚類算法,它實現起來比較簡單,聚類效果也不錯,因此應用很廣泛。K-Means算法有大量的變體,本文就從最傳統的K-Means算法講起,在其基礎上講述K-Means的優化變體方法。包括初始化優化K-Means++, 距離計算優化elkan K-Means算法和大數據情況下的優化Mini Batch K-Means算法。

1. K-Means原理初探

    K-Means算法的思想很簡單,對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點盡量緊密的連在一起,而讓簇間的距離盡量的大。

    如果用數據表達式表示,假設簇劃分為,則我們的目標是最小化平方誤差E:

    其中是簇的均值向量,有時也稱為質心,表達式為:

    如果我們想直接求上式的最小值並不容易,這是一個NP難的問題,因此只能采用啟發式的叠代方法。

    K-Means采用的啟發式方式很簡單,用下面一組圖就可以形象的描述。

技術分享圖片

    上圖a表達了初始的數據集,假設k=2。在圖b中,我們隨機選擇了兩個k類所對應的類別質心,即圖中的紅色質心和藍色質心,然後分別求樣本中所有點到這兩個質心的距離,並標記每個樣本的類別為和該樣本距離最小的質心的類別,如圖c所示,經過計算樣本和紅色質心和藍色質心的距離,我們得到了所有樣本點的第一輪叠代後的類別。此時我們對我們當前標記為紅色和藍色的點分別求其新的質心,如圖4所示,新的紅色質心和藍色質心的位置已經發生了變動。圖e和圖f重復了我們在圖c和圖d的過程,即將所有點的類別標記為距離最近的質心的類別並求新的質心。最終我們得到的兩個類別如圖f。

    當然在實際K-Mean算法中,我們一般會多次運行圖c和圖d,才能達到最終的比較優的類別。

2. 傳統K-Means算法流程

    在上一節我們對K-Means的原理做了初步的探討,這裏我們對K-Means的算法做一個總結。

    首先我們看看K-Means算法的一些要點。

    1)對於K-Means算法,首先要註意的是k值的選擇,一般來說,我們會根據對數據的先驗經驗選擇一個合適的k值,如果沒有什麽先驗知識,則可以通過交叉驗證選擇一個合適的k值。

    2)在確定了k的個數後,我們需要選擇k個初始化的質心,就像上圖b中的隨機質心。由於我們是啟發式方法,k個初始化的質心的位置選擇對最後的聚類結果和運行時間都有很大的影響,因此需要選擇合適的k個質心,最好這些質心不能太近。

    好了,現在我們來總結下傳統的K-Means算法流程。 

    輸入是樣本集,聚類的簇樹k,最大叠代次數N

    輸出是簇劃分 

    1) 從數據集D中隨機選擇k個樣本作為初始的k個質心向量:

    2)對於n=1,2,...,N

      a) 將簇劃分C初始化為

      b) 對於i=1,2...m,計算樣本和各個質心向量的距離:,將標記最小的為所對應的類別。此時更新

      c) 對於j=1,2,...,k,對中所有的樣本點重新計算新的質心

      e) 如果所有的k個質心向量都沒有發生變化,則轉到步驟3)

    3) 輸出簇劃分

3. K-Means初始化優化K-Means++

    在上節我們提到,k個初始化的質心的位置選擇對最後的聚類結果和運行時間都有很大的影響,因此需要選擇合適的k個質心。如果僅僅是完全隨機的選擇,有可能導致算法收斂很慢。K-Means++算法就是對K-Means隨機初始化質心的方法的優化。

    K-Means++的對於初始化質心的優化策略也很簡單,如下:

    a) 從輸入的數據點集合中隨機選擇一個點作為第一個聚類中心
    b) 對於數據集中的每一個點,計算它與已選擇的聚類中心中最近聚類中心的距離
    c) 選擇一個新的數據點作為新的聚類中心,選擇的原則是:較大的點,被選取作為聚類中心的概率較大
    d) 重復b和c直到選擇出k個聚類質心
    e) 利用這k個質心來作為初始化質心去運行標準的K-Means算法

4. K-Means距離計算優化elkan K-Means

    在傳統的K-Means算法中,我們在每輪叠代時,要計算所有的樣本點到所有的質心的距離,這樣會比較的耗時。那麽,對於距離的計算有沒有能夠簡化的地方呢?elkan K-Means算法就是從這塊入手加以改進。它的目標是減少不必要的距離的計算。那麽哪些距離不需要計算呢?

    elkan K-Means利用了兩邊之和大於等於第三邊,以及兩邊之差小於第三邊的三角形性質,來減少距離的計算。

    第一種規律是對於一個樣本點和兩個質心。如果我們預先計算出了這兩個質心之間的距離,則如果計算發現,我們立即就可以知道。此時我們不需要再計算,也就是說省了一步距離計算。

    第二種規律是對於一個樣本點和兩個質心。我們可以得到。這個從三角形的性質也很容易得到。

    利用上邊的兩個規律,elkan K-Means比起傳統的K-Means叠代速度有很大的提高。但是如果我們的樣本的特征是稀疏的,有缺失值的話,這個方法就不使用了,此時某些距離無法計算,則不能使用該算法。

5. 大樣本優化Mini Batch K-Means

    在統的K-Means算法中,要計算所有的樣本點到所有的質心的距離。如果樣本量非常大,比如達到10萬以上,特征有100以上,此時用傳統的K-Means算法非常的耗時,就算加上elkan K-Means優化也依舊。在大數據時代,這樣的場景越來越多。此時Mini Batch K-Means應運而生。

    顧名思義,Mini Batch,也就是用樣本集中的一部分的樣本來做傳統的K-Means,這樣可以避免樣本量太大時的計算難題,算法收斂速度大大加快。當然此時的代價就是我們的聚類的精確度也會有一些降低。一般來說這個降低的幅度在可以接受的範圍之內。

    在Mini Batch K-Means中,我們會選擇一個合適的批樣本大小batch size,我們僅僅用batch size個樣本來做K-Means聚類。那麽這batch size個樣本怎麽來的?一般是通過無放回的隨機采樣得到的。

    為了增加算法的準確性,我們一般會多跑幾次Mini Batch K-Means算法,用得到不同的隨機采樣集來得到聚類簇,選擇其中最優的聚類簇。

6. K-Means與KNN

    初學者很容易把K-Means和KNN搞混,兩者其實差別還是很大的。

    K-Means是無監督學習的聚類算法,沒有樣本輸出;而KNN是監督學習的分類算法,有對應的類別輸出。KNN基本不需要訓練,對測試集裏面的點,只需要找到在訓練集中最近的k個點,用這最近的k個點的類別來決定測試點的類別。而K-Means則有明顯的訓練過程,找到k個類別的最佳質心,從而決定樣本的簇類別。

    當然,兩者也有一些相似點,兩個算法都包含一個過程,即找出和某一個點最近的點。兩者都利用了最近鄰(nearest neighbors)的思想。

7. K-Means小結

    K-Means是個簡單實用的聚類算法,這裏對K-Means的優缺點做一個總結。

    K-Means的主要優點有:

    1)原理比較簡單,實現也是很容易,收斂速度快。

    2)聚類效果較優。

    3)算法的可解釋度比較強。

    4)主要需要調參的參數僅僅是簇數k。

    K-Means的主要缺點有:

    1)K值的選取不好把握(改進:可以通過在一開始給定一個適合的數值給k,通過一次K-means算法得到一次聚類中心。對於得到的聚類中心,根據得到的k個聚類的距離情況,合並距離最近的類,因此聚類中心數減小,當將其用於下次聚類時,相應的聚類數目也減小了,最終得到合適數目的聚類數。可以通過一個評判值E來確定聚類數得到一個合適的位置停下來,而不繼續合並聚類中心。重復上述循環,直至評判函數收斂為止,最終得到較優聚類數的聚類結果)。

    2)對於不是凸的數據集比較難收斂(改進:基於密度的聚類算法更加適合,比如DESCAN算法)

    3)如果各隱含類別的數據不平衡,比如各隱含類別的數據量嚴重失衡,或者各隱含類別的方差不同,則聚類效果不佳。

    4) 采用叠代方法,得到的結果只是局部最優。

    5) 對噪音和異常點比較的敏感(改進1:離群點檢測的LOF算法,通過去除離群點後再聚類,可以減少離群點和孤立點對於聚類效果的影響;改進2:改成求點的中位數,這種聚類方式即K-Mediods聚類(K中值))。

6)初始聚類中心的選擇(改進1:k-means++;改進2:二分K-means)

k-means原理、優缺點及改進