03-01 K-Means聚類算法

更新、更全的《機器學習》的更新網站,更有python、go、數據結構與算法、爬蟲、人工智能教學等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython

K-Means聚類算法

K-means聚類算法屬於無監督學習算法,它實現簡單而且聚類效果優良,因此在工業界也被普遍應用。同時K-Means聚類算法也有大量的變體,本文將從最傳統的K-Means聚類算法講起,讓後在其基礎上講解K-Means聚類算法的變體,其中它的變體包括初始化優化K-Means++、距離計算優化elkan K-Means和大數據狀況下的優化Mini Batch K-Means算法。算法

1、K-Means聚類算法學習目標

  1. K-Means聚類算法原理以及它的優缺點
  2. K-Means初始化優化之K-Means++算法
  3. K-Means距離計算優化之elkan K-Means算法
  4. 大數據優化之Mini Batch K-Means算法
  5. K-Means聚類算法和KNN(k近鄰算法)的區別

2、K-Means聚類算法詳解

2.1 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難的問題(計算量很是大的問題),所以求上式的最小值只能採用啓發式的迭代方法。機器學習

K-Means聚類迭代過程

上圖a表示初始的數據集,假設k=2,即咱們要分紅對上述數據集分紅兩個簇。首先咱們須要隨機選擇兩個k類所對應的類別質心,即圖b中的紅點和藍點;而後分別計算樣本中全部點到這兩個質心的距離,同時標記每一個樣本的類別爲該樣本距離最小的質心的類別,此時咱們獲得第一輪迭代後的類別,如圖c所示;對於已經被標記爲兩個不一樣的類別,咱們計算這兩個類別的新的質心,如圖d所示;而後咱們重複圖c和圖d的過程,將全部點的類別標記爲距離最近的質心的類並求新的質心,最終算法將會收斂至圖f。學習

2.2 K-Means聚類算法和KNN

相同點:大數據

  1. K-Means聚類算法和KNN(K近鄰算法)都是找到離某一個點最近的點,即二者都使用了最近領的思想

不一樣點:優化

  1. K-Means聚類算法是無監督學習算法,沒有樣本輸出;KNN是監督學習算法,有對應的類別輸出
  2. K-Means在迭代的過程當中找到K個類別的最佳質心,從而決定K個簇類別;KNN則是找到訓練集中離某個點最近的K個點

3、傳統的K-Means聚類算法流程

對於傳統的K-Means聚類算法,咱們須要注意如下兩點:網站

  1. 咱們須要注意K-Means聚類算法的K值的選擇,通常咱們會根據對數據的先驗經驗選擇一個合適的K,便可以經過專家的經驗進行選擇;若是沒有先驗知識,咱們能夠經過交叉驗證的方法選擇一個合適的K值。
  2. 肯定K值,即質心的個數以後。咱們須要肯定這個K個質心的位置,由於這K個質心的位置對最後的聚類結果和運行時間都有必定的影響,所以須要選擇合適的K個質心,通常狀況下這K個質心不要太近。

3.1 輸入

樣本集\(D=\{x_1,x_2,\cdots,x_m\}\),聚類簇的個數k,最大迭代次數N。人工智能

3.2 輸出

簇劃分\(C=\{C_1,C_2,\cdots,C_k\}\)

3.3 流程

  1. 從數據集D中隨機選擇k個樣本做爲初始的k個質心向量:\(\{\mu_1,\mu_2,\cdots,\mu_k\}\)
  2. 對於\(n=1,2,\cdots,N\),對如下步驟循環
    1. 將簇劃分初始化爲\(C_t=\emptyset{,}\,t=1,2,\cdots,k\)
    2. 對於\(i=1,2,\cdots,m\),計算樣本\(x_i\)和各個質心向量\(\mu_j,\,j=1,2,\cdots,k\)的距離:\(d_{ij}=||x_i-\mu_j||_2^2\),將\(x_i\)標記最小的爲\(d_{ij}\)所對應的類別\(\lambda_i\)。此時更新\(C_{\lambda{i}}=C_{\lambda{i}}\bigcup\{x_i\}\)
    3. 對於\(j=1,2,\cdots,k\)\(C_j\)中全部的樣本點從新計算新的質心\(\mu_j=\frac{1}{C_j}\sum_{x\in{C_j}}x\)
    4. 若是全部的k個質心向量都沒有發生變化,則中止循環
  3. 輸出簇劃分\(C=\{C_1,C_2,\cdots,C_k\}\)

4、K-Means初始化優化之K-Means++

對於傳統的K-Means聚類算法,它的k個質心是咱們隨機選擇的,可是在前文講到質心的位置對最後的聚類結果和運行時間有着很大的影響。所以若是咱們徹底隨機的選擇質心,頗有可能會致使酸奶發收斂很慢。K-Means++算法就是對K-Means隨機初始化質心方法的優化。

K-Means++算法初始化質心的策略以下:

  1. 從輸入的數據集中隨機選擇一個點做爲聚類中心\(\mu_r\)
  2. 對於數據集中的每個點\(x_i\),計算它與已選擇的聚類中心最近聚類中心的距離,\(D(x_i)=argmin||x_i-\mu_r||_2^2,\,r=1,2,\cdots,k_{selected}\)
  3. 選擇一個新的數據點做爲新的聚類中心,選擇的原則爲:對於\(x_i\)而言,\(D(x_i)\)越大的點,則\(\mu_r\)被選取做爲\(x_i\)聚類中心的機率則越大
  4. 重複步驟2和3直到選出K個聚類質心
  5. 利用這K個質心做爲初始化質心去運行傳統的K-Means聚類算法

5、K-Means距離計算優化之elkan K-Means

對於傳統的K-Means聚類算法,在每輪迭代中,咱們須要計算全部的樣本點到全部質心的距離,這樣運行時間會過長。elkan K-Means算法則是對這一步進行改進,減小沒必要要的距離的計算。它主要的使用的思想是:利用兩邊之和大於等於第三邊,兩邊之差小於第三邊的三角形的性質,所以達到減小距離計算的目的。如下則是elkan K-Means算法利用的兩個規則:

  1. 對於一個樣本點x和兩個質心\(\mu_{j_1},\mu_{j_2}\)。若是咱們先計算出這兩個質心的距離\(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)\),即省了一步距離的計算。
  2. 對於一個樣本點x和兩個質心\(\mu_{j_1},\mu_{j_2}\),咱們能夠獲得\(D(x,j_2)\geq\max\{0,D(x,j_1)-D(j_1,j_2)\}\)

利用上述的兩個規則,能夠必定程度上提高傳統K-Means聚類算法的迭代速度。可是若是樣本的特徵是稀疏的,並具備缺失值,因爲有些距離沒法計算,則沒法使用該算法。

6、大數據優化之Mini Batch 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算法,使用不一樣的無放回的隨機採樣獲得的樣本集獲得聚類簇,最後選擇最優的聚類簇。

7、K-Means聚類算法優缺點

7.1 優勢

  1. 簡單易懂,算法收斂速度快
  2. 算法的可解釋性強

7.2 缺點

  1. k值的選取通常須要先驗經驗(專家經驗)
  2. 採用迭代的方法,獲得的結果只是局部最優
  3. 因爲須要計算質心到全部點的距離,對噪音和異常點比較敏感
  4. 若是各隱含類別的數據量嚴重失衡,或者個各隱含類別的方差不一樣,則聚類效果不佳

8、小結

本文主要和你們介紹了無監督學習中的K-Means聚類算法,它的原理簡單易懂,而且代碼上容易實現,因爲屬於無監督學習,在工業中通常做爲中間算法。例如微博中的好友關係分類,其次就是一種分簇的體現。

介紹了傳統的K-Means聚類算法以後,對於傳統K-Means聚類算法在質心選擇上的缺陷,咱們介紹了它的優化算法——K-Means++算法,因爲每一輪迭代,咱們都須要計算質心到全部樣本點的距離,所以咱們也介紹了相應的兩種優化算法——elkan K-Means算法和Mini Batch K-Means算法。固然,這些都只是理論。對於聚類算法,其實特徵設計頗有必要,特徵的設計能夠參考特徵工程部分。

相關文章
相關標籤/搜索