K-Means(K均值)、GMM(高斯混合模型),通俗易懂,先收藏了!

1. 聚類算法都是無監督學習嗎?

什麼是聚類算法?聚類是一種機器學習技術,它涉及到數據點的分組。給定一組數據點,我們可以使用聚類算法將每個數據點劃分爲一個特定的組。理論上,同一組中的數據點應該具有相似的屬性和/或特徵,而不同組中的數據點應該具有高度不同的屬性和/或特徵。聚類是一種無監督學習的方法,是許多領域中常用的統計數據分析技術。

常用的算法包括K-MEANS、高斯混合模型(Gaussian Mixed Model,GMM)、自組織映射神經網絡(Self-Organizing Map,SOM)

2. k-means(k均值)算法

2.1 算法過程

K-均值是最普及的聚類算法,算法接受一個未標記的數據集,然後將數據聚類成不同的組。

K-均值是一個迭代算法,假設我們想要將數據聚類成 n 個組,其方法爲:

  • 首先選擇𝐾個隨機的點,稱爲聚類中心(cluster centroids);
  • 對於數據集中的每一個數據,按照距離𝐾箇中心點的距離,將其與距離最近的中心點關聯起來,與同一個中心點關聯的所有點聚成一類。
  • 計算每一個組的平均值,將該組所關聯的中心點移動到平均值的位置。
  • 重複步驟,直至中心點不再變化。

u1,u2,...,uku^1,u^2,...,u^k 來表示聚類中心,用𝑐(1),𝑐(2),…,𝑐(𝑚)來存儲與第𝑖個實例數據最近的聚類中心的索引,K-均值算法的僞代碼如下:

Repeat {
    for i = 1 to m
    c(i) := index (form 1 to K) of cluster centroid closest to x(i)
    for k = 1 to K
    μk := average (mean) of points assigned to cluster k
}

算法分爲兩個步驟,第一個 for 循環是賦值步驟,即:對於每一個樣例𝑖,計算其應該屬於的類。第二個 for 循環是聚類中心的移動,即:對於每一個類𝐾,重新計算該類的質心。

K-均值算法也可以很便利地用於將數據分爲許多不同組,即使在沒有非常明顯區分的組羣的情況下也可以。下圖所示的數據集包含身高和體重兩項特徵構成的,利用 K-均值算法將數據分爲三類,用於幫助確定將要生產的 T-恤衫的三種尺寸。

2.2 損失函數

K-均值最小化問題,是要最小化所有的數據點與其所關聯的聚類中心點之間的距離之和,因此 K-均值的代價函數(又稱畸變函數 Distortion function)爲:

J(c(1),c(2),...,c(m),u1,...,uk)=1mi=1mX(1)uc(i)2J(c^{(1)},c^{(2)},...,c^{(m)},u_1,...,u_k)=\frac{1}{m}\sum_{i=1}^{m}||X^{(1)}-u_{c^{(i)}}||^2

其中 uc(i)u_{c^{(i)}} 代表與 x(i)x^{(i)} 最近的聚類中心點。 我們的的優化目標便是找出使得代價函數最小的 c(1),c(2),...,c(m)c^{(1)},c^{(2)},...,c^{(m)}u1,u2,...,uku_1,u_2,...,u_k

2.3 k值的選擇

在運行 K-均值算法的之前,我們首先要隨機初始化所有的聚類中心點,下面介紹怎樣做:

  1. 我們應該選擇𝐾 < 𝑚,即聚類中心點的個數要小於所有訓練集實例的數量。
  2. 隨機選擇𝐾個訓練實例,然後令𝐾個聚類中心分別與這𝐾個訓練實例相等K-均值的一個問題在於,它有可能會停留在一個局部最小值處,而這取決於初始化的情況。

爲了解決這個問題,我們通常需要多次運行 K-均值算法,每一次都重新進行隨機初始化,最後再比較多次運行 K-均值的結果,選擇代價函數最小的結果。這種方法在𝐾較小的時候(2–10)還是可行的,但是如果𝐾較大,這麼做也可能不會有明顯地改善。

沒有所謂最好的選擇聚類數的方法,通常是需要根據不同的問題,人工進行選擇的。選擇的時候思考我們運用 K-均值算法聚類的動機是什麼。有一個可能會談及的方法叫作**“肘部法則”**。關 於“肘部法則”,我們所需要做的是改變𝐾值,也就是聚類類別數目的總數。我們用一個聚類來運行 K 均值聚類方法。這就意味着,所有的數據都會分到一個聚類裏,然後計算成本函數或者計算畸變函數𝐽。𝐾代表聚類數字。

我們可能會得到一條類似於這樣的曲線。像一個人的肘部。這就是“肘部法則”所做的,讓我們來看這樣一個圖,看起來就好像有一個很清楚的肘在那兒。你會發現這種模式,它的畸變值會迅速下降,從 1 到 2,從 2 到 3 之後,你會在 3 的時候達到一個肘點。在此之後,畸變值就下降的非常慢,看起來就像使用 3 個聚類來進行聚類是正確的,**這是因爲那個點是曲線的肘點,畸變值下降得很快,𝐾 = 3之後就下降得很慢,那麼我們就選𝐾 = 3。**當你應用“肘部法則”的時候,如果你得到了一個像上面這樣的圖,那麼這將是一種用來選擇聚類個數的合理方法。

2.4 KNN與K-means區別?

K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。

KNN K-Means
1.KNN是分類算法
2.屬於監督學習
3.訓練數據集是帶label的數據
1.K-Means是聚類算法
2.屬於非監督學習
3.訓練數據集是無label的數據,是雜亂無章的,經過聚類後變得有序,先無序,後有序。
沒有明顯的前期訓練過程,屬於memory based learning 有明顯的前期訓練過程
K的含義:一個樣本x,對它進行分類,就從訓練數據集中,在x附近找離它最近的K個數據點,這K個數據點,類別c佔的個數最多,就把x的label設爲c。 K的含義:K是人工固定好的數字,假設數據集合可以分爲K個蔟,那麼就利用訓練數據來訓練出這K個分類。

相似點

都包含這樣的過程,給定一個點,在數據集中找離它最近的點。即二者都用到了NN(Nears Neighbor)算法思想。

2.5 K-Means優缺點及改進

k-means:在大數據的條件下,會耗費大量的時間和內存。 優化k-means的建議:

  1. 減少聚類的數目K。因爲,每個樣本都要跟類中心計算距離。

  2. 減少樣本的特徵維度。比如說,通過PCA等進行降維。

  3. 考察其他的聚類算法,通過選取toy數據,去測試不同聚類算法的性能。

  4. hadoop集羣,K-means算法是很容易進行並行計算的。

  5. 算法可能找到局部最優的聚類,而不是全局最優的聚類。使用改進的二分k-means算法。

    二分k-means算法:首先將整個數據集看成一個簇,然後進行一次k-means(k=2)算法將該簇一分爲二,並計算每個簇的誤差平方和,選擇平方和最大的簇迭代上述過程再次一分爲二,直至簇數達到用戶指定的k爲止,此時可以達到的全局最優。

3. 高斯混合模型(GMM)

3.1 GMM的思想

高斯混合模型(Gaussian Mixed Model,GMM)也是一種常見的聚類算法,與K均值算法類似,同樣使用了EM算法進行迭代計算。高斯混合模型假設每個簇的數據都是符合高斯分佈(又叫正態分佈)的,當前數據呈現的分佈就是各個簇的高斯分佈疊加在一起的結果。

第一張圖是一個數據分佈的樣例,如果只用一個高斯分佈來擬合圖中的數據,圖 中所示的橢圓即爲高斯分佈的二倍標準差所對應的橢圓。直觀來說,圖中的數據 明顯分爲兩簇,因此只用一個高斯分佈來擬和是不太合理的,需要推廣到用多個 高斯分佈的疊加來對數據進行擬合。第二張圖是用兩個高斯分佈的疊加來擬合得到的結果。**這就引出了高斯混合模型,即用多個高斯分佈函數的線形組合來對數據分佈進行擬合。**理論上,高斯混合模型可以擬合出任意類型的分佈。

高斯混合模型的核心思想是,假設數據可以看作從多個高斯分佈中生成出來 的。在該假設下,每個單獨的分模型都是標準高斯模型,其均值 uiu_i 和方差 i\sum_i 是待估計的參數。此外,每個分模型都還有一個參數 πi\pi_i,可以理解爲權重或生成數據的概 率。高斯混合模型的公式爲:

p(x)=i=1kπiN(xui,i)p(x)=\sum_{i=1}^{k}\pi_iN(x|u_i,\sum_i)

通常我們並不能直接得到高斯混合模型的參數,而是觀察到了一系列 數據點,給出一個類別的數量K後,希望求得最佳的K個高斯分模型。因此,高斯 混合模型的計算,便成了最佳的均值μ,方差Σ、權重π的尋找,這類問題通常通過 最大似然估計來求解。遺憾的是,此問題中直接使用最大似然估計,得到的是一 個複雜的非凸函數,目標函數是和的對數,難以展開和對其求偏導。

**在這種情況下,可以用EM算法。 **EM算法是在最大化目標函數時,先固定一個變量使整體函數變爲凸優化函數,求導得到最值,然後利用最優參數更新被固定的變量,進入下一個循環。具體到高 斯混合模型的求解,EM算法的迭代過程如下。

首先,初始隨機選擇各參數的值。然後,重複下述兩步,直到收斂。

  • E步驟。根據當前的參數,計算每個點由某個分模型生成的概率。
  • M步驟。使用E步驟估計出的概率,來改進每個分模型的均值,方差和權重。

高斯混合模型是一個生成式模型。可以這樣理解數據的生成過程,假設一個最簡單的情況,即只有兩個一維標準高斯分佈的分模型N(0,1)和N(5,1),其權重分別爲0.7和0.3。那麼,在生成第一個數據點時,先按照權重的比例,隨機選擇一個分佈,比如選擇第一個高斯分佈,接着從N(0,1)中生成一個點,如−0.5,便是第一個數據點。在生成第二個數據點時,隨機選擇到第二個高斯分佈N(5,1),生成了第二個點4.7。如此循環執行,便生成出了所有的數據點。

也就是說,我們並不知道最佳的K個高斯分佈的各自3個參數,也不知道每個 數據點究竟是哪個高斯分佈生成的。所以每次循環時,先固定當前的高斯分佈不 變,獲得每個數據點由各個高斯分佈生成的概率。然後固定該生成概率不變,根據數據點和生成概率,獲得一個組更佳的高斯分佈。循環往復,直到參數的不再變化,或者變化非常小時,便得到了比較合理的一組高斯分佈。

3.2 GMM與K-Means相比

高斯混合模型與K均值算法的相同點是:

  • 它們都是可用於聚類的算法;
  • 都需要 指定K值;
  • 都是使用EM算法來求解;
  • 都往往只能收斂於局部最優。

而它相比於K 均值算法的優點是,可以給出一個樣本屬於某類的概率是多少;不僅僅可以用於聚類,還可以用於概率密度的估計;並且可以用於生成新的樣本點。

4. 聚類算法如何評估

由於數據以及需求的多樣性,沒有一種算法能夠適用於所有的數據類型、數 據簇或應用場景,似乎每種情況都可能需要一種不同的評估方法或度量標準。例 如,K均值聚類可以用誤差平方和來評估,但是基於密度的數據簇可能不是球形, 誤差平方和則會失效。在許多情況下,判斷聚類算法結果的好壞強烈依賴於主觀 解釋。儘管如此,聚類算法的評估還是必需的,它是聚類分析中十分重要的部分之一。

聚類評估的任務是估計在數據集上進行聚類的可行性,以及聚類方法產生結 果的質量。這一過程又分爲三個子任務。

  1. 估計聚類趨勢。

    這一步驟是檢測數據分佈中是否存在非隨機的簇結構。如果數據是基本隨機 的,那麼聚類的結果也是毫無意義的。我們可以觀察聚類誤差是否隨聚類類別數 量的增加而單調變化,如果數據是基本隨機的,即不存在非隨機簇結構,那麼聚 類誤差隨聚類類別數量增加而變化的幅度應該較不顯著,並且也找不到一個合適 的K對應數據的真實簇數。

  2. 判定數據簇數。

    確定聚類趨勢之後,我們需要找到與真實數據分佈最爲吻合的簇數,據此判定聚類結果的質量。數據簇數的判定方法有很多,例如手肘法和Gap Statistic方 法。需要說明的是,用於評估的最佳數據簇數可能與程序輸出的簇數是不同的。 例如,有些聚類算法可以自動地確定數據的簇數,但可能與我們通過其他方法確 定的最優數據簇數有所差別。

  3. 測定聚類質量。

    在無監督的情況下,我們可以通過考察簇的分離情況和簇的緊 湊情況來評估聚類的效果。定義評估指標可以展現面試者實際解決和分析問題的 能力。事實上測量指標可以有很多種,以下列出了幾種常用的度量指標,更多的 指標可以閱讀相關文獻。

    輪廓係數、均方根標準偏差、R方(R-Square)、改進的HubertΓ統計。

5. 代碼實現

高斯混合模型代碼

K-Means代碼

作者:@mantchs

GitHub:https://github.com/NLP-LOVE/ML-NLP

歡迎大家加入討論!共同完善此項目!羣號:【541954936】NLP面試學習羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章