1. 程式人生 > >k-means++和k-means||

k-means++和k-means||

一、k-means演算法缺點:

1、需要提前指定k

2、k-means演算法對初始化非常敏感

k-means++主要用來解決第二個缺點

二、k-means++演算法原理分析

k-means++演算法選擇初始聚類中心的基本原則是:初始的聚類中心之間的相互距離要儘可能的遠。它選擇初始聚類中心的步驟是:

(1)從輸入的資料點集合中隨機選擇一個點作為第一個聚類中心;

(2)對於資料集中的每一個點x,計算它與最近聚類中心(指已選擇的聚類中心)的距離D(x),並根據以下概率選擇新的聚類中心。

(3)重複過程(2)直到找到k個聚類中心。

 第(2)步中,依次計算每個資料點與最近的種子點(聚類中心)的距離,依次得到D(1)、D(2)、...、D(n)構成的集合D,其中n表示資料集的大小。在D中,為了避免噪聲,不能直接選取值最大的元素,應該選擇值較大的元素,然後將其對應的資料點作為種子點。 如何選擇值較大的元素呢,下面是spark中實現的思路。

   求所有的距離和Sum(D(x))

   取一個隨機值,用權重的方式來取計算下一個“種子點”。這個演算法的實現是,先用Sum(D(x))乘以隨機值Random得到值r,然後用currSum += D(x),直到其currSum>r,此時的點就是下一個“種子點”。

 為什麼用這樣的方式呢?我們換一種比較好理解的方式來說明。把集合D中的每個元素D(x)想象為一根線L(x),線的長度就是元素的值。將這些線依次按照L(1)、L(2)、...、L(n)的順序連線起來,組成長線L。L(1)、L(2)、…、L(n)稱為L的子線。 根據概率的相關知識,如果我們在L上隨機選擇一個點,那麼這個點所在的子線很有可能是比較長的子線,而這個子線對應的資料點就可以作為種子點。

三、k-means++演算法的缺點

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

四、k-means||演算法原理分析

    k-means++ 最主要的缺點在於其內在的順序執行特性,得到 k 個聚類中心必須遍歷資料集 k 次,並且當前聚類中心的計算依賴於前面得到的所有聚類中心,這使得演算法無法並行擴充套件,極大地限制了演算法在大規模資料集上的應用。     k-means∥ 主要思路在於改變每次遍歷時的取樣策略,並非按照 k-means++ 那樣每次遍歷只取樣一個樣本,而是每次遍歷取樣 O(k) 個樣本,重複該取樣過程大約 O(logn) 次,重複取樣過後共得到 O(klogn) 個樣本點組成的集合,該集合以常數因子近似於最優解,然後再聚類這 O(klogn) 個點成 k 個點,最後將這 k 個點作為初始聚類中心送入Lloyd迭代中,實際實驗證明 O(logn) 次重複取樣是不需要的,一般5次重複取樣就可以得到一個較好的聚類初始中心。

五、參考文獻

1.Bahman Bahmani,Benjamin Moseley,Andrea Vattani.Scalable K-Means++
2.基於Spark的模糊c均值聚類演算法研究_樑鵬