K Means聚類演算法原理

2022-03-17 06:25:26 字數 3839 閱讀 4396

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

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

如果用資料表示式表示,假設簇劃分為$(c_1,c_2,...c_k)$,則我們的目標是最小化平方誤差e:$$ e = \sum\limits_^k\sum\limits_ ||x-\mu_i||_2^2$$

其中$\mu_i$是簇$c_i$的均值向量,有時也稱為質心,表示式為:$$\mu_i = \frac\sum\limits_x$$

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

k-means採用的啟發式方式很簡單,用下面一**就可以形象的描述。

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

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

在上一節我們對k-means的原理做了初步的**,這裡我們對k-means的演算法做乙個總結。

首先我們看看k-means演算法的一些要點。

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

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

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

輸入是樣本集$d=\$,聚類的簇樹k,最大迭代次數n

輸出是簇劃分$c=\$ 

1) 從資料集d中隨機選擇k個樣本作為初始的k個質心向量: $\$

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

a) 將簇劃分c初始化為$c_t = \varnothing \;\; t =1,2...k$

b) 對於i=1,2...m,計算樣本$x_i$和各個質心向量$\mu_j(j=1,2,...k)$的距離:$d_ = ||x_i - \mu_j||_2^2$,將$x_i$標記最小的為$d_$所對應的類別$\lambda_i$。此時更新$c_ = c_ \cup \$

c) 對於j=1,2,...,k,對$c_j$中所有的樣本點重新計算新的質心$\mu_j = \frac\sum\limits_x$

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

3) 輸出簇劃分$c=\$

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

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

a)  從輸入的資料點集合中隨機選擇乙個點作為第乙個聚類中心$\mu_1$

b) 對於資料集中的每乙個點$x_i$,計算它與已選擇的聚類中心中最近聚類中心的距離$d(x_i) = arg\;min||x_i- \mu_r||_2^2\;\;r=1,2,...k_$

c) 選擇乙個新的資料點作為新的聚類中心,選擇的原則是:$d(x)$較大的點,被選取作為聚類中心的概率較大

d) 重複b和c直到選擇出k個聚類質心

e) 利用這k個質心來作為初始化質心去執行標準的k-means演算法

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

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

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

第二種規律是對於乙個樣本點$x$和兩個質心$\mu_, \mu_$。我們可以得到$d(x,j_2) \geq max\$。這個從三角形的性質也很容易得到。

利用上邊的兩個規律,elkan k-means比起傳統的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演算法,用得到不同的隨機取樣集來得到聚類簇,選擇其中最優的聚類簇。

初學者很容易把k-means和knn搞混,兩者其實差別還是很大的。

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

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

k-means是個簡單實用的聚類演算法,這裡對k-means的優缺點做乙個總結。

k-means的主要優點有:

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

2)聚類效果較優。

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

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

k-means的主要缺點有:

1)k值的選取不好把握

2)對於不是凸的資料集比較難收斂

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

4) 採用迭代方法,得到的結果只是區域性最優。

5) 對噪音和異常點比較的敏感。

K Means聚類演算法原理

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

K Means聚類演算法 K D樹原理

10.14日誌 聚類 事先不知道資料會分為幾類,通過聚類分析將資料聚合成幾個群體。聚類不需要對資料進行訓練和學習。屬於無監督學習。裡的應用情況 k means演算法如何自動確定聚類數目k 這裡師兄寫的那個自迴圈找出k很迷啊 kd樹 k dimensional樹的簡稱 是一種分割k維資料空間的資料結構...

Kmeans聚類演算法原理與實現

k means 演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演算法之一。k means 演算法的基本思想是 以空間中 k個點為中心進行聚類,對最靠近他們的物件歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。假設要把樣本集分為 k個類別,演算法描述如下 1 適當選擇 ...