K-means:無監督聚類的經典算法

K-means:無監督聚類的經典算法

做者:鄭培html

無監督學習是一類用於在數據中尋找模式的機器學習技術。無監督學習算法使用的輸入數據都是沒有標註過的,這意味着數據只給出了輸入變量(自變量 X)而沒有給出相應的輸出變量(因變量)。在無監督學習中,算法自己將發掘數據中有趣的結構。在監督學習中,系統試圖從以前給出的示例中學習。(而在無監督學習中,系統試圖從給定的示例中直接找到模式。)所以,若是數據集被標註過了,這就是一個監督學習問題;而若是數據沒有被標註過,這就是一個無監督學習問題。git

聚類屬於無監督學習,以往的迴歸、樸素貝葉斯、SVM等都是有類別標籤y的,也就是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定y,只有特徵x。K-means 是咱們最經常使用的基於歐式距離的聚類算法,它是數值的、非監督的、非肯定的迭代的,該算法旨在最小化一個目標函數——偏差平方函數(全部的觀測點與其中心點的距離之和),其認爲兩個目標的距離越近,類似度越大,因爲具備出色的速度和良好的可擴展性,Kmeans聚類算法算得上是最著名的聚類方法。本文將帶你們回顧K-means算法的理論內涵以及初始化優化K-Means++方法。github

本文的項目實例實如今Momodel平臺上,能夠邊看邊學哦!
mo平臺項目地址:https://momodel.cn/workspace/5eb7e4a31089644d6a4e5c4b?type=appweb

1 簡介

直觀瞭解K-means算法有許多有趣的例子,其中有一個最著名的解釋,即牧師—村民模型:算法

有四個牧師去郊區佈道,一開始牧師們隨意選了幾個佈道點,而且把這幾個佈道點的狀況公告給了郊區全部的村民,因而每一個村民到離本身家最近的佈道點去聽課。聽課以後,你們以爲距離太遠了,因而每一個牧師統計了一下本身的課上全部的村民的地址,搬到了全部地址的中心地帶,而且在海報上更新了本身的佈道點的位置。牧師每一次移動不可能離全部人都更近,有的人發現A牧師移動之後本身還不如去B牧師處聽課更近,因而每一個村民又去了離本身最近的佈道點…… 就這樣,牧師每一個禮拜更新本身的位置,村民根據本身的狀況選擇佈道點,最終穩定了下來。app

咱們能夠看到該牧師的目的是爲了讓每一個村民到其最近中心點的距離和最小。在實際生活中,許多數據的聚類能夠經過觀察得出,可是如何讓計算機找出聚類的點羣就須要像K-means這類的算法幫助。
K-means目標
圖一 K-means目標機器學習

在聚類問題中,給咱們的訓練樣本是 $ \left\{x^{(1)}, \ldots, x^{(m)}\right\}, \quad x^{(i)} \in \mathbb{R}^{n} $,K-means算法是將樣本聚類成$k$個簇(cluster),具體算法描述以下:函數

  1. 隨機選取$k$個聚類質心點(cluster centroids)爲$\mu_{1}, \mu_{2}, \ldots, \mu_{k} \in \mathbb{R}^{n}$_
  2. 重複下面過程直到收斂:學習

    1. 對於每個樣例i,計算其應該屬於的類:$c^{(i)}:=\arg \min _{j}\left\|x^{(i)}-\mu_{j}\right\|^{2}$
    2. 對於每個類j,從新計算該類的質心:$\mu_{j}:=\frac{\sum_{i=1}^{m} 1\left\{c^{(i)}=j\right\} x^{(i)}}{\sum_{i=1}^{m} 1\left\{c^{(i)}=j\right\}}$

K是咱們事先給定的聚類數,$c^{(i)}$ 距離最近的那個類,$c^{(i)}$的值是1到k中的一個。質心 $\mu_{j}$ 表明咱們對屬於同一個類的樣本中心點的猜想,拿星團模型來解釋就是要將全部的星星聚成k個星團,首先隨機選取k個宇宙中的點(或者k個星星)做爲k個星團的質心,而後第一步對於每個星星計算其到k個質心中每個的距離,而後選取距離最近的那個星團做爲 $c^{(i)}$,這樣通過第一步每個星星都有了所屬的星團;第二步對於每個星團,從新計算它的質心 $\mu_{j}$(對裏面全部的星星座標求平均)。重複迭代第一步和第二步直到質心不變或者變化很小。大數據

下圖展現了對n個樣本點進行K-means聚類的效果,這裏k取2。

K-means面對的第一個問題是如何保證收斂,前面的算法中強調結束條件就是收斂,能夠證實的是K-means徹底能夠保證收斂性。下面咱們定性的描述一下收斂性,咱們定義畸變函數(distortion function)以下:
$$J(c, \mu)=\sum_{i=1}^{m}\left\|x^{(i)}-\mu_{c^{(i)}}\right\|^{2}$$

$J$函數表示每一個樣本點到其質心的距離平方和。K-means是要將J調整到最小。假設當前J沒有達到最小值,那麼首先能夠固定每一個類的質心$\mu_{j}$,調整每一個樣例的所屬的類別 $c^{(i)}$ 來讓J函數減小。一樣,固定$c^{(i)}$,調整每一個類的質心$\mu_{j}$也可使J減少。這兩個過程就是內循環中使J單調遞減的過程。當J遞減到最小時,$\mu$和$c$也同時收斂。(在理論上,能夠有多組不一樣的$\mu$和$c$值可以使得J取得最小值,但這種現象實際上不多見)。

因爲畸變函數J是非凸函數,意味着咱們不能保證取得的最小值是全局最小值,也就是說k-means對質心初始位置的選取比較感冒,但通常狀況下k-means達到的局部最優已經知足需求。但若是你怕陷入局部最優,那麼能夠選取不一樣的初始值跑多遍k-means,而後取其中最小的J對應的$\mu$和$c$輸出。

2 K-means 細節與調優

K-means 算法具備不少優勢,例如:聚類效果良好,局部最優在不少狀況可以知足需求;在處理大數據集時,能夠保證較好的伸縮性;算法複雜度低;當簇近似高斯分佈的時候,效果優良。可是K-Means主要有兩個最重大的缺陷——都和初始值有關:

  1. K 是事先給定的,這個 K 值的選定是很是難以估計的。不少時候,事先並不知道給定的數據集應該分紅多少個類別才最合適。
  2. K-Means算法須要用初始隨機種子點來計算,這個隨機種子點過重要,不一樣的隨機種子點會有獲得徹底不一樣的結果。

2.1 K值選取

K 值的選取對 K-means 影響很大,這也是 K-means 最大的缺點,常見的選取 K 值的方法有:手肘法、Gap statistic 方法。
若是咱們拿到的樣本,客觀存在J個「天然小類」,這些真實存在的小類是隱藏於數據中的。三維如下的數據咱們還能畫圖肉眼分辨一下J的大概數目,更高維的就不能直觀地看到了,咱們只能從一個比較小的K,譬如K=2開始嘗試,去逼近這個真實值$J$。

  • 當K小於樣本真實簇數J時,K每增大一個單位,就會大幅增長每一個簇的聚合程度,這時距離和的降低幅度會很大;
  • 當K接近J時,再增長K所獲得的聚合程度回報會迅速變小,距離和的降低幅度也會減少;
  • 隨着K的繼續增大,距離和的變化會趨於平緩。

例以下圖,真實的J咱們事先不知道,那麼從K=2開始嘗試,發現K=3時,距離和大幅降低,K=4時,降低幅度急速縮水,再後面就愈來愈平緩。因此咱們認爲J應該爲3,所以能夠將K設定爲3。

手肘法的缺點在於須要人工看不夠自動化,因此咱們又有了 Gap statistic 方法,這個方法出自斯坦福大學的幾個學者的論文:Estimating the number of clusters in a data set via the gap statistic, 對應公式以下:

$$\operatorname{Gap}(K)=\mathrm{E}\left(\log D_{k}\right)-\log D_{k}$$

其中 $D_{k}$ 爲損失函數,這裏 $E\left(\log D_{k}\right)$ 指的是 $\log D_{k}$ 的指望。這個數值一般經過蒙特卡洛模擬產生,咱們在樣本里所在的區域中按照均勻分佈隨機產生和原始樣本數同樣多的隨機樣本,並對這個隨機樣本作 K-Means,從而獲得一個 $D_{k}$。如此往復屢次,一般 20 次,咱們能夠獲得 20 個 $\log D_{k}$。對這 20 個數值求平均值,就獲得了 $E\left(\log D_{k}\right)$ 的近似值。最終能夠計算 Gap Statisitc。而 Gap statistic 取得最大值所對應的 K 就是最佳的 K。

由圖可見,當 K=3 時,Gap(K) 取值最大,因此最佳的簇數是 K=3。

2.2  K-means++

在上文中咱們提到,k個初始化的質心的位置選擇對最後的聚類結果和運行時間都有很大的影響,所以須要選擇合適的k個質心。若是僅僅是徹底隨機的選擇,有可能致使算法收斂很慢。K-Means++算法就是對K-Means隨機初始化質心的方法的優化。K-Means++的對於初始化質心的優化策略也很簡單,以下:
1)  從輸入的數據點集合中隨機選擇一個點做爲第一個聚類中心$μ_1$
2) 對於數據集中的每個點$x_i$,計算它與已選擇的聚類中心中最近聚類中心的距離:$D(X_i)=arg\; min||x_i-μ_r||^2_2 \qquad r=1,2……k_selected$
3) 選擇一個新的數據點做爲新的聚類中心,選擇的原則是:$D(x)$較大的點,被選取做爲聚類中心的機率較大
4) 重複2和3直到選擇出k個聚類質心
5) 利用這k個質心來做爲初始化質心去運行標準的K-Means算法
簡單的來講,就是 K-means++ 就是選擇離已選中心點最遠的點。這也比較符合常理,聚類中心固然是互相離得越遠越好。

3 K-means算法應用

看到這裏,你會說,K-Means算法看來很簡單,並且好像就是在玩座標點,沒什麼真實用處。並且,這個算法缺陷不少,還不如人工呢。是的,前面的例子只是玩二維座標點,的確沒什麼意思。可是你想一下下面的幾個問題:
1) 不是二維的,是多維的,如5維的,那麼,就只能用計算機來計算了。
2) 座標點的X, Y 座標,實際上是一種向量,是一種數學抽象。現實世界中不少屬性是能夠抽象成向量的,好比,咱們的年齡,咱們的喜愛,咱們的商品,等等,能抽象成向量的目的就是可讓計算機知道某兩個屬性間的距離。如:咱們認爲,18歲的人離24歲的人的距離要比離12歲的距離要近,鞋子這個商品離衣服這個商品的距離要比電腦要近,等等。只要能把現實世界的物體的屬性抽象成向量,就能夠用K-Means算法來歸類了

mo平臺項目地址:https://momodel.cn/workspace/5eb7e4a31089644d6a4e5c4b?type=app

參考文獻:

[1]https://ww2.mathworks.cn/help/stats/kmeans.html
[2]https://en.wikipedia.org/wiki/K-means%2B%2B
[3]https://github.com/Anfany/Machine-Learning-for-Beginner-by-Python3/tree/master/Kmeans%20Cluster

關於咱們

Mo(網址:https://momodel.cn) 是一個支持 Python的人工智能在線建模平臺,能幫助你快速開發、訓練並部署模型。

近期 Mo 也在持續進行機器學習相關的入門課程和論文分享活動,歡迎你們關注咱們的公衆號獲取最新資訊!

相關文章
相關標籤/搜索