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算法步驟
- 隨機初始化$K$個聚類中心(cluster centroid) $\mu_1, \mu_2, \ldots, \mu_K$
- Cluster Assignment: 對於每個數據點$x^{(i)}$,尋找離它最近的聚類中心,將其歸入該類;即$c^{(i)}=\min\limits_k||x^{(i)}-\mu_k||^2$,其中$c^{(i)}$表示$x^{(i)}$所在的類
- Move Centroid: 更新聚類中心$u_k$的值為所有屬於類$k$的數據點的平均值
- 重復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/