目錄html
更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
K-means聚類算法屬於無監督學習算法,它實現簡單而且聚類效果優良,因此在工業界也被普遍應用。同時K-Means聚類算法也有大量的變體,本文將從最傳統的K-Means聚類算法講起,讓後在其基礎上講解K-Means聚類算法的變體,其中它的變體包括初始化優化K-Means++、距離計算優化elkan K-Means和大數據狀況下的優化Mini Batch K-Means算法。算法
K-Means的思想很是簡單,對於給定的樣本集,按照樣本集之間的距離大小,將樣本集分紅K個簇。須要注意的是:每一個簇之間的點儘可能相近,而簇與簇之間的距離儘可能較大。數據結構
假設目前有k個簇分別爲\(\{C_1,C_2,\cdots,C_k\}\),在這裏咱們使用均方偏差度量簇內點與點的偏差,即偏差定義爲:
\[ E = \sum_{i=1}^k\sum_{x\in{C_i}}||x-\mu_i||_2^2 \]
其中\(\mu_i\)是簇\(C_i\)的均值向量,有時有稱爲質心,表達式爲:
\[ \mu_i = \frac{1}{C_i}\sum_{x\in{C_i}}x \]
對於上式,它是一個NP難的問題(計算量很是大的問題),所以求上式的最小值只能採用啓發式的迭代方法。機器學習
上圖a表示初始的數據集,假設k=2,即咱們要分紅對上述數據集分紅兩個簇。首先咱們須要隨機選擇兩個k類所對應的類別質心,即圖b中的紅點和藍點;而後分別計算樣本中全部點到這兩個質心的距離,同時標記每一個樣本的類別爲該樣本距離最小的質心的類別,此時咱們獲得第一輪迭代後的類別,如圖c所示;對於已經被標記爲兩個不一樣的類別,咱們計算這兩個類別的新的質心,如圖d所示;而後咱們重複圖c和圖d的過程,將全部點的類別標記爲距離最近的質心的類並求新的質心,最終算法將會收斂至圖f。學習
相同點:大數據
不一樣點:優化
對於傳統的K-Means聚類算法,咱們須要注意如下兩點:網站
樣本集\(D=\{x_1,x_2,\cdots,x_m\}\),聚類簇的個數k,最大迭代次數N。人工智能
簇劃分\(C=\{C_1,C_2,\cdots,C_k\}\)。
對於傳統的K-Means聚類算法,它的k個質心是咱們隨機選擇的,可是在前文講到質心的位置對最後的聚類結果和運行時間有着很大的影響。所以若是咱們徹底隨機的選擇質心,頗有可能會致使酸奶發收斂很慢。K-Means++算法就是對K-Means隨機初始化質心方法的優化。
K-Means++算法初始化質心的策略以下:
對於傳統的K-Means聚類算法,在每輪迭代中,咱們須要計算全部的樣本點到全部質心的距離,這樣運行時間會過長。elkan K-Means算法則是對這一步進行改進,減小沒必要要的距離的計算。它主要的使用的思想是:利用兩邊之和大於等於第三邊,兩邊之差小於第三邊的三角形的性質,所以達到減小距離計算的目的。如下則是elkan K-Means算法利用的兩個規則:
利用上述的兩個規則,能夠必定程度上提高傳統K-Means聚類算法的迭代速度。可是若是樣本的特徵是稀疏的,並具備缺失值,因爲有些距離沒法計算,則沒法使用該算法。
對於傳統的K-Means算法,在每輪迭代中,咱們須要計算全部的樣本點到全部質心的距離,即便用優化後的elkan K-Means算法,計算開銷也是很是大的。尤爲是如今這個大數據的時代。所以Mini Batch K-Means算法應運而生。
Mini Batch讓人很容聯想到的就是隨機梯度降低法。其實就是如此,Mini Batch,就是用樣本集中的一部分樣原本作傳統的K-Means,這樣能夠避免大數據時代下計算開銷大的問題,算法的收斂速度也會大大加快。固然,此時算法的精確度也會有小幅的下降,這就須要咱們對不一樣的問題進行不一樣的衡量了,也就是說咱們須要去考慮是要較高的精確度,仍是須要較小的計算開銷。
有時候爲了提升Mini Batch K-Means算法的精確度,咱們會多跑幾回Mini Batch K-Means算法,使用不一樣的無放回的隨機採樣獲得的樣本集獲得聚類簇,最後選擇最優的聚類簇。
本文主要和你們介紹了無監督學習中的K-Means聚類算法,它的原理簡單易懂,而且代碼上容易實現,因爲屬於無監督學習,在工業中通常做爲中間算法。例如微博中的好友關係分類,其次就是一種分簇的體現。
介紹了傳統的K-Means聚類算法以後,對於傳統K-Means聚類算法在質心選擇上的缺陷,咱們介紹了它的優化算法——K-Means++算法,因爲每一輪迭代,咱們都須要計算質心到全部樣本點的距離,所以咱們也介紹了相應的兩種優化算法——elkan K-Means算法和Mini Batch K-Means算法。固然,這些都只是理論。對於聚類算法,其實特徵設計頗有必要,特徵的設計能夠參考特徵工程部分。