機器學習公開課筆記(8):k-means聚類和PCA降維


K-Means算法

非監督式學習對一組無標簽的數據試圖發現其內在的結構,主要用途包括:

  • 市場划分(Market Segmentation)
  • 社交網絡分析(Social Network Analysis)
  • 管理計算機集群(Organize Computer Clusters)
  • 天文學數據分析(Astronomical Data Analysis)

K-Means算法屬於非監督式學習的一種,算法的輸入是:訓練數據集$\{x^{(1)},x^{(2)},\ldots, x^{(m)}\}$(其中$x^{(i)}\in R^{n}$)和聚類數量$K$(將數據划分為$K$類);算法輸出是$K$個聚類中心$\mu_1, \mu_2, \ldots, \mu_K$和每個數據點$x^{(i)}$所在的分類。

K-Means算法步驟

  1. 隨機初始化$K$個聚類中心(cluster centroid) $\mu_1, \mu_2, \ldots, \mu_K$
  2. Cluster Assignment: 對於每個數據點$x^{(i)}$,尋找離它最近的聚類中心,將其歸入該類;即$c^{(i)}=\min\limits_k||x^{(i)}-\mu_k||^2$,其中$c^{(i)}$表示$x^{(i)}$所在的類
  3. Move Centroid: 更新聚類中心$u_k$的值為所有屬於類$k$的數據點的平均值
  4. 重復2、3步直到收斂或者達到最大迭代次數

圖1 K-Means算法示例

K-Means算法的優化目標

用$\mu_{c^{(i)}}$表示第$i$個數據點$x^{(i)}$所在類的中心,則K-Means優化的代價函數為$$J(c^{(1)},\ldots,c^{(m)},\mu_1,\ldots,\mu_K)=\frac{1}{m}\sum\limits_{i=1}^{m}||x^{(i)}-\mu_{c^{(i)}}||^2$$希望找到最優參數使得該函數最小化,即$$\min\limits_{\substack{c^{(1)},\ldots,c^{(m)} \\ \mu_1,\ldots,\mu_K}}J(c^{(1)},\ldots,c^{(m)},\mu_1,\ldots,\mu_K)$$

需要注意的問題

  • 隨機初始化:常用的初始化方法是,從訓練數據點中隨機選擇$K$($K < m$)個數據點,作為初始的聚類中心$\mu_1, \mu_2, \ldots, \mu_K$
  • 局部最優:算法聚類的性能與初始聚類中心的選擇有關,為避免陷入局部最優(如圖2所示),應該運行多次(50次)取使得$J$最小的結果
  • $K$值選擇:Elbow方法,繪制$J$隨$K$的變化曲線,選擇下降速度突然變慢的轉折點作為K值;對於轉折不明顯的曲線,可根據K-Means算法后續的目標進行選擇。

   
圖2 K-Means算法的全局最優解和局部最優解   
                  

圖3  用Elbow方法選擇K值的情況(左)和Elbow法不適用的情況(右)

 PCA降維算法

動機

數據壓縮:將高維數據(n維)壓縮為低維數據(k維)

數據可視化:將數據壓縮到2維/3維方便可視化

PCA問題形式化

如果需要將二維數據點,壓縮為一維數據點,我們需要找到一個方向,使得數據點到這個方向上投射時的誤差最小(即點到該直線的距離最小);更一般地,如果需要將$n$維的數據點壓縮到$k$維,我們需要找到$k$個新的方向$u^{(1)}, u^{(2)}, \ldots, u^{(k)}$使得數據點投射到每個方向$u^{(i)}$時的誤差最小。


圖4 PCA實例,將2維數據點壓縮為1維數據點,找到新的方向$u_1$,使得投射誤差(圖中的垂線距離如$x^i$到${\widetilde x}^i$)最小

注意:PCA和線性回歸的區別,PCA是保證投射的誤差(圖5右的黃線)最小,而線性回歸是保證沿$y$方向的誤差(圖5左的黃線)最小.

圖5 線性回歸和PCA優化目標的區別

PCA算法步驟

1. 數據預處理:mean normalization:$\mu_j = \frac{1}{m}\sum\limits_{i=1}^{m}x_j^{(i)}, x_j^{(i)}=x_j-\mu_j$;feature scaling:(可選,不同特征范圍差距過大時需要) , $x_j^{(i)}=\frac{x^{(i)}-\mu_j}{\sigma_j}$ 

2. 計算協方差矩陣(Convariance Matrix) $$\Sigma=\frac{1}{m}\sum\limits_{i=1}^{m}x^{(i)}(x^{(i)})^T \quad \text{or} \quad \Sigma = \frac{1}{m}X^TX$$

3. 計算協方差矩陣$\Sigma$的特征向量  [U, S, V] = svd(Sigma) 

4. 選擇U矩陣的前k個列向量作為k個主元方向,形成矩陣$U_{reduce}$

5. 對於每個原始數據點$x$($x\in R^n$),其降維后的數據點$z$($z \in R^k$)為 $z=U_{reduce}^T x$

應用PCA

重構數據:對於降維后k維數據點z,將其恢復n維后的近似點為 $x_{apporx}(\approx x)=U_{reduce}z$

選擇k值

  • 平均投射誤差(Average square projection error):$\frac{1}{m}\sum\limits_{i=1}^{m}||x^{(i)}-x^{(i)}_{approx}||^2$
  • total variation: $\frac{1}{m}\sum\limits_{i=1}^{m}||x^{(i)}||^2$
  • 選擇最小的k值使得 $\frac{\frac{1}{m}\sum\limits_{i=1}^{m}||x^{(i)}-x^{(i)}_{approx}||^2}{\frac{1}{m}\sum\limits_{i=1}^{m}||x^{(i)}||^2} \leq 0.01(0.05)$,也可以使用SVD分解后的S矩陣進行選擇 $1-\frac{\sum\limits_{i=1}^{k}S_{ii}}{\sum\limits_{i=1}^{n}S_{ii}}\leq 0.01(0.05)$

應用PCA的建議

  • 用於加速監督式學習:(1) 對於帶標簽的數據,去掉標簽后進行PCA數據降維,(2)使用降維后的數據進行模型訓練,(3) 對於新的數據點,先PCA降維得到降維后數據,帶入模型獲得預測值。:應僅用訓練集數據進行PCA降維獲取映射$x^{(i)}\rightarrow z^{(i)}$,然后將該映射(PCA選擇的主元矩陣$U_{reduce}$)應用到驗證集和測試集
  • 不要用PCA阻止過擬合,用regularization。
  • 在使用PCA之前,先用原始數據進行模型訓練,如果不行,再考慮使用PCA;而不要上來直接使用PCA。

參考文獻

[1] Andrew Ng Coursera 公開課第八周

[2] 漫談Clustering:k-means. http://blog.pluskid.org/?p=17

[3] k-means clustering in a GIF. http://www.statsblogs.com/2014/02/18/k-means-clustering-in-a-gif/

[4] Wikipedia: Principal component analysis. https://en.wikipedia.org/wiki/Principal_component_analysis

[5] Explained Visually: Principal component analysis http://setosa.io/ev/principal-component-analysis/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM