什麼是聚類算法?聚類是一種機器學習技術,它涉及到數據點的分組。給定一組數據點,咱們可使用聚類算法將每一個數據點劃分爲一個特定的組。理論上,同一組中的數據點應該具備類似的屬性和/或特徵,而不一樣組中的數據點應該具備高度不一樣的屬性和/或特徵。聚類是一種無監督學習的方法,是許多領域中經常使用的統計數據分析技術。git
經常使用的算法包括K-MEANS、高斯混合模型(Gaussian Mixed Model,GMM)、自組織映射神經網絡(Self-Organizing Map,SOM)github
K-均值是最普及的聚類算法,算法接受一個未標記的數據集,而後將數據聚類成不一樣的組。面試
K-均值是一個迭代算法,假設咱們想要將數據聚類成 n 個組,其方法爲:算法
用 \(u^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-恤衫的三種尺寸。函數
K-均值最小化問題,是要最小化全部的數據點與其所關聯的聚類中心點之間的距離之和,所以 K-均值的代價函數(又稱畸變函數 Distortion function)爲:oop
\[J(c^{(1)},c^{(2)},...,c^{(m)},u_1,...,u_k)=\frac{1}{m}\sum_{i=1}^{m}||X^{(1)}-u_{c^{(i)}}||^2\]性能
其中 \(u_{c^{(i)}}\) 表明與 \(x^{(i)}\) 最近的聚類中心點。 咱們的的優化目標即是找出使得代價函數最小的 \(c^{(1)},c^{(2)},...,c^{(m)}\) 和 \(u_1,u_2,...,u_k\) 。學習
在運行 K-均值算法的以前,咱們首先要隨機初始化全部的聚類中心點,下面介紹怎樣作:
爲了解決這個問題,咱們一般須要屢次運行 K-均值算法,每一次都從新進行隨機初始化,最後再比較屢次運行 K-均值的結果,選擇代價函數最小的結果。這種方法在𝐾較小的時候(2--10)仍是可行的,可是若是𝐾較大,這麼作也可能不會有明顯地改善。
沒有所謂最好的選擇聚類數的方法,一般是須要根據不一樣的問題,人工進行選擇的。選擇的時候思考咱們運用 K-均值算法聚類的動機是什麼。有一個可能會談及的方法叫做「肘部法則」。關 於「肘部法則」,咱們所須要作的是改變𝐾值,也就是聚類類別數目的總數。咱們用一個聚類來運行 K 均值聚類方法。這就意味着,全部的數據都會分到一個聚類裏,而後計算成本函數或者計算畸變函數𝐽。𝐾表明聚類數字。
咱們可能會獲得一條相似於這樣的曲線。像一我的的肘部。這就是「肘部法則」所作的,讓咱們來看這樣一個圖,看起來就好像有一個很清楚的肘在那兒。你會發現這種模式,它的畸變值會迅速降低,從 1 到 2,從 2 到 3 以後,你會在 3 的時候達到一個肘點。在此以後,畸變值就降低的很是慢,看起來就像使用 3 個聚類來進行聚類是正確的,這是由於那個點是曲線的肘點,畸變值降低得很快,𝐾 = 3以後就降低得很慢,那麼咱們就選𝐾 = 3。當你應用「肘部法則」的時候,若是你獲得了一個像上面這樣的圖,那麼這將是一種用來選擇聚類個數的合理方法。
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)算法思想。
k-means:在大數據的條件下,會耗費大量的時間和內存。 優化k-means的建議:
減小聚類的數目K。由於,每一個樣本都要跟類中心計算距離。
減小樣本的特徵維度。好比說,經過PCA等進行降維。
考察其餘的聚類算法,經過選取toy數據,去測試不一樣聚類算法的性能。
hadoop集羣,K-means算法是很容易進行並行計算的。
算法可能找到局部最優的聚類,而不是全局最優的聚類。使用改進的二分k-means算法。
二分k-means算法:首先將整個數據集當作一個簇,而後進行一次k-means(k=2)算法將該簇一分爲二,並計算每一個簇的偏差平方和,選擇平方和最大的簇迭代上述過程再次一分爲二,直至簇數達到用戶指定的k爲止,此時能夠達到的全局最優。
高斯混合模型(Gaussian Mixed Model,GMM)也是一種常見的聚類算法,與K均值算法相似,一樣使用了EM算法進行迭代計算。高斯混合模型假設每一個簇的數據都是符合高斯分佈(又叫正態分佈)的,當前數據呈現的分佈就是各個簇的高斯分佈疊加在一塊兒的結果。
第一張圖是一個數據分佈的樣例,若是隻用一個高斯分佈來擬合圖中的數據,圖 中所示的橢圓即爲高斯分佈的二倍標準差所對應的橢圓。直觀來講,圖中的數據 明顯分爲兩簇,所以只用一個高斯分佈來擬和是不太合理的,須要推廣到用多個 高斯分佈的疊加來對數據進行擬合。第二張圖是用兩個高斯分佈的疊加來擬合獲得的結果。這就引出了高斯混合模型,即用多個高斯分佈函數的線形組合來對數據分佈進行擬合。理論上,高斯混合模型能夠擬合出任意類型的分佈。
高斯混合模型的核心思想是,假設數據能夠看做從多個高斯分佈中生成出來 的。在該假設下,每一個單獨的分模型都是標準高斯模型,其均值 \(u_i\) 和方差 \(\sum_i\) 是待估計的參數。此外,每一個分模型都還有一個參數 \(\pi_i\),能夠理解爲權重或生成數據的概 率。高斯混合模型的公式爲:
\[p(x)=\sum_{i=1}^{k}\pi_iN(x|u_i,\sum_i)\]
一般咱們並不能直接獲得高斯混合模型的參數,而是觀察到了一系列 數據點,給出一個類別的數量K後,但願求得最佳的K個高斯分模型。所以,高斯 混合模型的計算,便成了最佳的均值μ,方差Σ、權重π的尋找,這類問題一般經過 最大似然估計來求解。遺憾的是,此問題中直接使用最大似然估計,獲得的是一 個複雜的非凸函數,目標函數是和的對數,難以展開和對其求偏導。
在這種狀況下,能夠用EM算法。 EM算法是在最大化目標函數時,先固定一個變量使總體函數變爲凸優化函數,求導獲得最值,而後利用最優參數更新被固定的變量,進入下一個循環。具體到高 斯混合模型的求解,EM算法的迭代過程以下。
首先,初始隨機選擇各參數的值。而後,重複下述兩步,直到收斂。
高斯混合模型是一個生成式模型。能夠這樣理解數據的生成過程,假設一個最簡單的狀況,即只有兩個一維標準高斯分佈的分模型N(0,1)和N(5,1),其權重分別爲0.7和0.3。那麼,在生成第一個數據點時,先按照權重的比例,隨機選擇一個分佈,好比選擇第一個高斯分佈,接着從N(0,1)中生成一個點,如−0.5,即是第一個數據點。在生成第二個數據點時,隨機選擇到第二個高斯分佈N(5,1),生成了第二個點4.7。如此循環執行,便生成出了全部的數據點。
也就是說,咱們並不知道最佳的K個高斯分佈的各自3個參數,也不知道每一個 數據點到底是哪一個高斯分佈生成的。因此每次循環時,先固定當前的高斯分佈不 變,得到每一個數據點由各個高斯分佈生成的機率。而後固定該生成機率不變,根據數據點和生成機率,得到一個組更佳的高斯分佈。循環往復,直到參數的再也不變化,或者變化很是小時,便獲得了比較合理的一組高斯分佈。
高斯混合模型與K均值算法的相同點是:
而它相比於K 均值算法的優勢是,能夠給出一個樣本屬於某類的機率是多少;不只僅能夠用於聚類,還能夠用於機率密度的估計;而且能夠用於生成新的樣本點。
因爲數據以及需求的多樣性,沒有一種算法可以適用於全部的數據類型、數 據簇或應用場景,彷佛每種狀況均可能須要一種不一樣的評估方法或度量標準。例 如,K均值聚類能夠用偏差平方和來評估,可是基於密度的數據簇可能不是球形, 偏差平方和則會失效。在許多狀況下,判斷聚類算法結果的好壞強烈依賴於主觀 解釋。儘管如此,聚類算法的評估仍是必需的,它是聚類分析中十分重要的部分之一。
聚類評估的任務是估計在數據集上進行聚類的可行性,以及聚類方法產生結 果的質量。這一過程又分爲三個子任務。
估計聚類趨勢。
這一步驟是檢測數據分佈中是否存在非隨機的簇結構。若是數據是基本隨機 的,那麼聚類的結果也是毫無心義的。咱們能夠觀察聚類偏差是否隨聚類類別數 量的增長而單調變化,若是數據是基本隨機的,即不存在非隨機簇結構,那麼聚 類偏差隨聚類類別數量增長而變化的幅度應該較不顯著,而且也找不到一個合適 的K對應數據的真實簇數。
斷定數據簇數。
肯定聚類趨勢以後,咱們須要找到與真實數據分佈最爲吻合的簇數,據此斷定聚類結果的質量。數據簇數的斷定方法有不少,例如手肘法和Gap Statistic方 法。須要說明的是,用於評估的最佳數據簇數可能與程序輸出的簇數是不一樣的。 例如,有些聚類算法能夠自動地肯定數據的簇數,但可能與咱們經過其餘方法確 定的最優數據簇數有所差異。
測定聚類質量。
在無監督的狀況下,咱們能夠經過考察簇的分離狀況和簇的緊 湊狀況來評估聚類的效果。定義評估指標能夠展示面試者實際解決和分析問題的 能力。事實上測量指標能夠有不少種,如下列出了幾種經常使用的度量指標,更多的 指標能夠閱讀相關文獻。
輪廓係數、均方根標準誤差、R方(R-Square)、改進的HubertΓ統計。
做者:@mantchs