[Scikit-learn] 2.3 Clustering - kmeans

參考html

 

Clusering, GMM, Variational Inference, The Dirchlet Process 這是一個學習漸進的過程,那麼,就先從聚類開始。算法

From: 漫談 Clustering 系列函數


 

K-means

cluster

那麼計算機要如何來完成這個任務呢?固然,計算機尚未高級到可以「經過形狀大體看出來」,不過,對於這樣的 N 維歐氏空間中的點進行聚類,有一個很是簡單的經典算法,也就是本文標題中提到的 k-means 。性能

在介紹 k-means 的具體步驟以前,讓咱們先來看看它對於須要進行聚類的數據的一個基本假設吧:對於每個 cluster ,咱們能夠選出一箇中心點 (center) ,使得該 cluster 中的全部的點到該中心點的距離小於到其餘 cluster 的中心的距離。雖然實際狀況中獲得的數據並不能保證老是知足這樣的約束,但這一般已是咱們所能達到的最好的結果,而那些偏差一般是固有存在的或者問題自己的不可分性形成的。例以下圖所示的兩個高斯分佈,從兩個分佈中隨機地抽取一些數據點出來,混雜到一塊兒,如今要讓你將這些混雜在一塊兒的數據點按照它們被生成的那個分佈分開來:學習

【這裏的圖例對理解頗有幫助】優化

gaussian

因爲這兩個分佈自己有很大一部分重疊在一塊兒了,例如,對於數據點 2.5 來講,它由兩個分佈產生的機率都是相等的,你所作的只能是一個猜想;稍微好一點的狀況是 2 ,一般咱們會將它歸類爲左邊的那個分佈,由於機率大一些,spa

然而此時它由右邊的分佈生成的機率仍然是比較大的,咱們仍然有不小的概率會猜錯。orm

而整個陰影部分是咱們所能達到的最小的猜錯的機率,這來自於問題自己的不可分性,沒法避免。所以,咱們將 k-means 所依賴的這個假設看做是合理的。htm

 

基於這樣一個假設,咱們再來導出 k-means 所要優化的目標函數:設咱們一共有 N 個數據點須要分爲 K 個 cluster ,k-means 要作的就是最小化blog

\displaystyle J = \sum_{n=1}^N\sum_{k=1}^K r_{nk} \|x_n-\mu_k\|^2

這個函數,其中 r_{nk} 在數據點 n 被歸類到 cluster k 的時候爲 1 ,不然爲 0 。直接尋找 r_{nk} 和 \mu_k 來最小化 J 並不容易,不過咱們能夠採起迭代的辦法:先固定 \mu_k ,選擇最優的 r_{nk} ,很容易看出,只要將數據點歸類到離他最近的那個中心就能保證 J 最小。下一步則固定 r_{nk},再求最優的 \mu_k。將 J 對 \mu_k 求導並令導數等於零,很容易獲得 J 最小的時候 \mu_k 應該知足:

\displaystyle \mu_k=\frac{\sum_n r_{nk}x_n}{\sum_n r_{nk}}

亦即 \mu_k 的值應當是全部 cluster k 中的數據點的平均值。【這裏很像GMM的PI值】

因爲每一次迭代都是取到 J 的最小值,所以 J 只會不斷地減少(或者不變),而不會增長,這保證了 k-means 最終會到達一個極小值。雖然 k-means 並不能保證老是能獲得全局最優解,可是對於這樣的問題,像 k-means 這種複雜度的算法,這樣的結果已是很不錯的了。

下面咱們來總結一下 k-means 算法的具體步驟:【算法】

    1. 選定 K 箇中心 \mu_k 的初值。這個過程一般是針對具體的問題有一些啓發式的選取方法,或者大多數狀況下采用隨機選取的辦法。由於前面說過 k-means 並不能保證全局最優,而是否能收斂到全局最優解其實和初值的選取有很大的關係,因此有時候咱們會屢次選取初值跑 k-means ,並取其中最好的一次結果。
    2. 將每一個數據點歸類到離它最近的那個中心點所表明的 cluster 中。
    3. 用公式 \mu_k = \frac{1}{N_k}\sum_{j\in\text{cluster}_k}x_j 計算出每一個 cluster 的新的中心點。
    4. 重複第二步,一直到迭代了最大的步數或者先後的 J 的值相差小於一個閾值爲止。

 

短板,弊端,無能爲力之處:

然而並非全部的數據都能知足這樣的要求,對於數值類型的特徵,好比身高,能夠很天然地用這樣的方式來處理,可是類別 (categorical) 類型的特徵就不行了。舉一個簡單的例子,若是我如今要對犬進行聚類,而且但願直接在全部犬組成的空間中進行,k-means 就無能爲力了,由於歐氏距離 \|x_i-x_j\|^2 在這裏不能用了:一隻 Samoyed 減去一隻 Rough Collie 而後在平方一下?天知道那是什麼!再加上一隻 German Shepherd Dog 而後求一下平均值?根本無法算,k-means 在這裏步履維艱!

 

k-medoids

而且咱們已經證實在固定了各個數據點的 assignment 的狀況下,這樣選取的中心點可以把目標函數 J 最小化。然而在 k-medoids 中,咱們將中心點的選取限制在當前 cluster 所包含的數據點的集合中

換句話說,在 k-medoids 算法中,咱們將從當前 cluster 中選取這樣一個點——它到其餘全部(當前 cluster 中的)點的距離之和最小——做爲中心點。

【理解小助手】

k-means 和 k-medoids 之間的差別就相似於一個數據樣本的均值 (mean) 和中位數 (median) 之間的差別:前者的取值範圍能夠是連續空間中的任意值,然後者只能在給樣本給定的那些點裏面選。那麼,這樣作的好處是什麼呢?
一個最直接的理由就是 k-means 對數據的要求過高了,它使用歐氏距離描述數據點之間的差別 (dissimilarity) ,從而能夠直接經過求均值來計算中心點。這要求數據點處在一個歐氏空間之中。

 

  • 時間複雜度

從 k-means 變到 k-medoids ,時間複雜度陡然增長了許多:在 k-means 中只要求一個平均值 O(N) 便可,而在 k-medoids 中則須要枚舉每一個點,並求出它到全部其餘點的距離之和,複雜度爲 O(N^2) 。

  • 對類似度的定義

在 k-medoids 中,咱們把原來的目標函數 J 中的歐氏距離改成一個任意的 dissimilarity measure 函數 \mathcal{V}

\displaystyle\tilde{J} = \sum_{n=1}^N\sum_{k=1}^K r_{nk}\mathcal{V}(x_n,\mu_k)

最多見的方式是構造一個 dissimilarity matrix \mathbf{D} 來表明 \mathcal{V},其中的元素 \mathbf{D}_{ij} 表示第 i 只狗和第 j 只狗之間的差別程度,例如,兩隻 Samoyed 之間的差別能夠設爲 0 ,一隻 German Shepherd Dog 和一隻 Rough Collie 之間的差別是 0.7,和一隻 Miniature Schnauzer 之間的差別是 1 ,等等。

 

K-Means

K-Medoids

初始據點隨機選取

初始隨機據點限定在樣本點中

使用Means(均值)做爲聚點,對outliers(極值)很敏感

使用Medoids(中位數)做爲聚點

對數據要求高,要求數據點處於歐式空間中

可適用類別(categorical)類型的特徵——(4)

時間複雜度:O(n*k*t),t爲迭代次數

時間複雜度:O(n^2 *k*t),t爲迭代次數——(4)

K-Means 算法對小規模數據集較高效

K-Medoids算法對大規模數據性能更好,但伸縮性較差——(3)

都有可能陷入局部最優解的困境之中

K的含義相同,都須要開始人爲設定簇數目

都是無監督算法

References:

    1. Velmurugan T. Efficiency of K-Means and K-Medoids algorithms for clustering arbitrary data points[J]. International Journal of Computer Technology & Applications, 2012, 3(5): 1758-64.
    2. Arbin N, Mokhtar N Z, Suhaimi N S, et al. Comparative Analysis between K-Means and K-Medoids for Statistical Clustering[J].
    3. Velmurugan T, Santhanam T. Computational complexity between K-means and K-medoids clustering algorithms for normal and uniform distributions of data points[J]. Journal of computer science, 2010, 6(3): 363.
    4. http://blog.pluskid.org/?p=40
    5. https://www.youtube.com/watch?v=u1NtKPuXQKo

 

Vector Quantization by k-means

實際作法就是:

  1. 將每一個像素點看成一個數據,跑一下 K-means ,獲得 k 個 centroids。
  2. 而後用這些 centroids 的像素值來代替對應的 cluster 裏的全部點的像素值。
  3. 對於彩色圖片來講,也能夠用一樣的方法來作,例如 RGB 三色的圖片,每個像素被看成是一個 3 維向量空間中的點。 

 【一種容易理解的壓縮算法】

相關文章
相關標籤/搜索