1. K-Means原理解析
2. K-Means的優化
3. sklearn的K-Means的使用
4. K-Means和K-Means++實現
1. 前言
上一篇博文K-Means原理解析簡單清晰的闡述了K-Means的原理和過程。但是還有一些在使用K-Means過程中會遇到的問題,我們本文進行分析和討論。比如:如何選取初始質心的位置,如何處理距離計算的時候效率低的問題。
2. 選取初始質心的位置
假設我們已經通過上一篇K-Means原理解析確定了質心k的大小,那如何確定k個質心的位置呢?用過K-Means的同學都知道k個初始化的質心的位置選擇對最后的聚類結果和運行時間都有很大的影響,因此需要選擇合適的k個質心。如果僅僅是完全隨機的選擇,有可能導致算法收斂很慢。K-Means++算法就是對K-Means隨機初始化質心的方法的優化。
K-Means++的對於初始化質心的優化策略也很簡單,如下:
- 從輸入的數據點集合中隨機選擇一個點作為第一個聚類中心\(\mu_1\).
- 對於數據集中的每一個點\(x_i\),計算它與已選擇的聚類中心中最近聚類中心的距離.
- 選擇一個新的數據點作為新的聚類中心,選擇的原則是:\(D(x)\)較大的點,被選取作為聚類中心的概率較大
- 重復2和3直到選擇出k個聚類質心。
- 利用這k個質心來作為初始化質心去運行標准的K-Means算法。
3 處理距離計算效率低
3.1 elkan K-Means
在傳統的K-Means算法中,我們在每輪迭代時,要計算所有的樣本點到所有的質心的距離,這樣會比較的耗時。那么,對於距離的計算有沒有能夠簡化的地方呢?elkan K-Means算法就是從這塊入手加以改進。它的目標是減少不必要的距離的計算。那么哪些距離不需要計算呢?
elkan K-Means利用了兩邊之和大於等於第三邊,以及兩邊之差小於第三邊的三角形性質,來減少距離的計算。
第一種規律是對於一個樣本點\(x\)和兩個質心\(\mu_{j1},\mu_{j2}\)。如果我們預先計算出了這兩個質心之間的距離\(D(j_1,j_2)\),則如果計算發現\(2D(x,j_1)≤D(j_1,j_2)\),我們立即就可以知道\(D(x,j_1)≤D(x,j_2)\)。此時我們不需要再計算\(D(x,j_2)\),也就是說省了一步距離計算。
第二種規律是對於一個樣本點\(x\)和兩個質心\(\mu_{j1},\mu_{j2}\)。我們可以得到\(D(x,j_2)≥max\{0,D(x,j_1)-D(j_1,j_2)\}\)。這個從三角形的性質也很容易得到。
利用上邊的兩個規律,elkan K-Means比起傳統的K-Means迭代速度有很大的提高。但是如果我們的樣本的特征是稀疏的,有缺失值的話,這個方法就不使用了,此時某些距離無法計算,則不能使用該算法。
3.2 大樣本優化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算法,用得到不同的隨機采樣集來得到聚類簇,選擇其中最優的聚類簇。
4. 總結
本文主要介紹的是如何對傳統K-Means算法的優化過程,下一篇博文會重點介紹如何用sklearn來使用K-Means,對數據進行聚類。