1. 程式人生 > 實用技巧 >《吳恩達機器學習》學習筆記008_聚類(Clustering)

《吳恩達機器學習》學習筆記008_聚類(Clustering)

http://www.ai-start.com/ml2014/html/week8.html

聚類(Clustering)

K-Means聚類

用$μ1$,$μ2$,...,$μ^k$ 來表示聚類中心,用$c{(1)}$,$c{(2)}$,...,$c^{(m)}$來儲存與第$i$個例項資料最近的聚類中心的索引,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迴圈是賦值步驟,即:對於每一個樣例$i$,計算其應該屬於的類。第二個for迴圈是聚類中心的移動,即:對於每一個類$K$,重新計算該類的質心。

優化目標

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

$$J(c{(1)},...,c{(m)},μ_1,...,μ_K)=\dfrac {1}{m}\sum^{m}{i=1}\left| X^{\left( i\right) }-\mu{c^{(i)}}\right| ^{2}$$

其中${{\mu }_{{{c}{(i)}}}}$代表與${{x}

{(i)}}$最近的聚類中心點。 我們的的優化目標便是找出使得代價函式最小的 $c{(1)}$,$c{(2)}$,...,$c{(m)}$和$μ1$,$μ2$,...,$μk$:

回顧剛才給出的: K-均值迭代演算法,我們知道,第一個迴圈是用於減小$c^{(i)}$引起的代價,而第二個迴圈則是用於減小${{\mu }_{i}}$引起的代價。迭代的過程一定會是每一次迭代都在減小代價函式,不然便是出現了錯誤。

隨機初始化

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

我們應該選擇$K<m$,即聚類中心點的個數要小於所有訓練集例項的數量

隨機選擇$K$個訓練例項,然後令$K$個聚類中心分別與這$K$個訓練例項相等

K-均值的一個問題在於,它有可能會停留在一個區域性最小值處,而這取決於初始化的情況。

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

聚類數的選擇

當人們在討論,選擇聚類數目的方法時,有一個可能會談及的方法叫作“肘部法則”。關於“肘部法則”,我們所需要做的是改變$K$值,也就是聚類類別數目的總數。我們用一個聚類來執行K均值聚類方法。這就意味著,所有的資料都會分到一個聚類裡,然後計算成本函式或者計算畸變函式$J$。$K$代表聚類數字。


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

降維(Dimensionality Reduction)

動機一:資料壓縮

動機二:資料視覺化

主成分分析(PCA)

主成分分析(PCA)是最常見的降維演算法。

在PCA中,我們要做的是找到一個方向向量(Vector direction),當我們把所有的資料都投射到該向量上時,我們希望投射平均均方誤差能儘可能地小。方向向量是一個經過原點的向量,而投射誤差是從特徵向量向該方向向量作垂線的長度。

面給出主成分分析問題的描述:

問題是要將$n$維資料降至$k$維,目標是找到向量$u{(1)}$,$u{(2)}$,...,$u^{(k)}$使得總的投射誤差最小。主成分分析與線性回顧的比較:

主成分分析與線性迴歸是兩種不同的演算法。主成分分析最小化的是投射誤差(Projected Error),而線性迴歸嘗試的是最小化預測誤差。線性迴歸的目的是預測結果,而主成分分析不作任何預測。

上圖中,左邊的是線性迴歸的誤差(垂直於橫軸投影),右邊則是主要成分分析的誤差(垂直於紅線投影)。

PCA將$n$個特徵降維到$k$個,可以用來進行資料壓縮,如果100維的向量最後可以用10維來表示,那麼壓縮率為90%。同樣影象處理領域的KL變換使用PCA做影象壓縮。但PCA 要保證降維後,還要保證資料的特性損失最小。

PCA技術的一大好處是對資料進行降維的處理。我們可以對新求出的“主元”向量的重要性進行排序,根據需要取前面最重要的部分,將後面的維數省去,可以達到降維從而簡化模型或是對資料進行壓縮的效果。同時最大程度的保持了原有資料的資訊。

主成分分析演算法

PCA 減少$n$維到$k$維:

第一步是均值歸一化。我們需要計算出所有特徵的均值,然後令 $x_j= x_j-μ_j$。如果特徵是在不同的數量級上,我們還需要將其除以標準差 $σ^2$。

第二步是計算協方差矩陣(covariance matrix)$Σ$: $\sum=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T}$

第三步是計算協方差矩陣$Σ$的特徵向量(eigenvectors):

在 Octave 裡我們可以利用奇異值分解(singular value decomposition)來求解,[U, S, V]= svd(sigma)。


$$Sigma=\dfrac {1}{m}\sum^{n}_{i=1}\left( x^{(i)}\right) \left( x^{(i)}\right) ^{T}$$


對於一個 $n×n$維度的矩陣,上式中的$U$是一個具有與資料之間最小投射誤差的方向向量構成的矩陣。如果我們希望將資料從$n$維降至$k$維,我們只需要從$U$中選取前$k$個向量,獲得一個$n×k$維度的矩陣,我們用$U_{reduce}$表示,然後通過如下計算獲得要求的新特徵向量$z^{(i)}$: $$z{(i)}=U{T}_{reduce}*x^{(i)}$$

其中$x$是$n×1$維的,因此結果為$k×1$維度。注,我們不對方差特徵進行處理。

選擇主成分的數量

主要成分分析是減少投射的平均均方誤差:

訓練集的方差為:$\dfrac {1}{m}\sum^{m}_{i=1}\left| x^{\left( i\right) }\right| ^{2}$

我們希望在平均均方誤差與訓練集方差的比例儘可能小的情況下選擇儘可能小的$k$值。

如果我們希望這個比例小於1%,就意味著原本資料的偏差有99%都保留下來了,如果我們選擇保留95%的偏差,便能非常顯著地降低模型中特徵的維度了。

我們可以先令$k=1$,然後進行主要成分分析,獲得$U_{reduce}$和$z$,然後計算比例是否小於1%。如果不是的話再令$k=2$,如此類推,直到找到可以使得比例小於1%的最小$k$ 值(原因是各個特徵之間通常情況存在某種相關性)。

還有一些更好的方式來選擇$k$,當我們在Octave中呼叫“svd”函式的時候,我們獲得三個引數:[U, S, V] = svd(sigma)。

其中的$S$是一個$n×n$的矩陣,只有對角線上有值,而其它單元都是0,我們可以使用這個矩陣來計算平均均方誤差與訓練集方差的比例: $$\dfrac {\dfrac {1}{m}\sum^{m}{i=1}\left| x^{\left( i\right) }-x^{\left( i\right) }{approx}\right| ^{2}}{\dfrac {1}{m}\sum^{m}{i=1}\left| x^{(i)}\right| ^{2}}=1-\dfrac {\Sigma{k}{i=1}S_{ii}}{\Sigma{m}{i=1}S{ii}}\leq 1%$$

也就是:$$\frac {\Sigma{k}{i=1}s{ii}}{\Sigma{n}{i=1}s{ii}}\geq0.99$$

在壓縮過資料後,我們可以採用如下方法來近似地獲得原有的特徵:$$x^{\left( i\right) }{approx}=U{reduce}z^{(i)}$$