已遷移到我新博客,閱讀體驗更佳LDA && NCA: 降維與度量學習
代碼實現放在個人github上:click megit
線性判別分析(LDA)是一種監督學習的分類和降維的方法,但更可能是被用來降維。LDA的原理是讓投影后同一類中數據的投影點之間儘量地靠近,而類不一樣類別中數據的類別中心之間的距離儘量遠,用一句話歸納就是「投影后類內方差最小,類間方差最大」。github
假設咱們的數據集D={(x1,y1),(x2,y2),...,((xm,ym))},其中任意樣本xixi爲n維向量,yi\(\in\){C1,C2,...,Ck}。咱們定義Nj(j=1,2...k)爲第j類樣本的個數,Xj(j=1,2...k)爲第j類樣本的集合,而μj(j=1,2...k)爲第j類樣本的均值向量,定義Σj(j=1,2...k)爲第j類樣本的協方差矩陣。因爲咱們是多類向低維投影,則此時投影到的低維空間就不是一條直線,而是一個超平面了。假設咱們投影到的低維空間的維度爲d,對應的基向量爲(w1,w2,...wd),基向量組成的矩陣爲W, 它是一個n×d的矩陣。此時優化的目標變成
\[ \frac{W^TS_bW}{W^TS_wW} \]
其中\(S_b=\sum_{j=1}^{k}N_{j}(\mu_{j}-\mu)(\mu_j-\mu)^T\),\(\mu\)爲全部樣本均值向量。\(S_{\mathcal{w}}=\sum_{j=1}^{k}\sum_{x \in X_{j}}(x-\mu_j)(x-\mu_j)^T\)。可是有一個問題,就是\(W^TS_bW\)和\(W^TS_{\mathcal{w}}W\)都是矩陣,不是標量,沒法做爲一個標量函數來優化。能夠用以下的替代優化目標
\[ \begin{aligned} \mathop{\arg\max_{\mathrm{W}}}\ \| \mathrm{J}(\mathrm{W})\|&=\frac{\prod_{diag}W^TS_bW}{\prod_{diag}W^TS_{\mathcal{w}}W}\\ & =\prod_{i=1}^{d}\frac{\mathcal{w}_i^TS_b\mathcal{w}_i}{\mathcal{w}_i^TS_\mathcal{w}\mathcal{w}_i} \end{aligned} \]
其中\(\prod_{diag}A\)爲A的主對角線元素的乘積。利用廣義瑞利商可知,最大值是\(S_{w}^{-1}S_b\)的最大特徵值,而最大的d個值的乘積就是\(S_{w}^{-1}S_b\)最大的d個特徵值的乘積,而W即爲\(S_{w}^{-1}S_b\)最大的d個特徵值對應的d個特徵向量張成的矩陣,這樣就獲得用於降維的轉換矩陣W。這裏有一點須要注意的是W降維的大小不能超過k-1即數據類別數-1。由於矩陣的秩小於等於各個相加獲得它的矩陣的秩的和,而累加獲得\(S_{b}\)的\((\mu_{j}-\mu)(\mu_{j}-\mu)^T\)的秩爲1,因此\(S_{b}\)的秩不超過k,又由於第k個\(\mu_{k}-\mu\)可由前k-1個\(\mu_{j}-\mu\)線性表示,所以\(S_b\)秩最大爲k-1,則不爲0的特徵值最多有k-1個。函數
近鄰成分分析(NCA)是由Jacob Goldberger和Geoff Hinton等大佬們在2005年發表於NIPS上的一項工做1,屬於度量學習(Metric Learning)和降維(Dimension Reduction)領域。NCA的原理是以馬氏距離爲距離度量的KNN爲基礎,經過不斷優化KNN分類的準確率來學習轉換矩陣,最終獲得對原數據進行降維的轉換矩陣。性能
接下來對NCA學習轉換矩陣的數學推導,設\(x_i(1 \le i \le n)\)表示原數據的列向量表示,A是d*D的轉換矩陣,其中D爲原數據的維度,而d爲降維後的維度,定義\(p_{ij}\)爲==映射空間中歐氏距離==(至關於原空間中的馬氏距離)的softmax機率值
\[ p_{ij}=\frac{exp(- \|Ax_{i}-Ax_{j}\|^{2})}{\sum_{k \ne i}exp(-\|Ax_{i}-A_{k}\|)},\ p_{ii}=0 \]
設\(p_{i}\)爲i可以被正確分類的機率,\(C_{i}\)表示與i屬於同一類的樣本的集合,那麼
\[ p_{i}=\sum_{j \in C_{i}}p_{ij} \]
優化目標就是最大化能被正確分類的點的數目
\[ f(A)=\sum_{i}\sum_{j \in C_{i}}p_{ij}=\sum_{i}p_{i} \]
f(A)對A求偏導,定義\(x_{ij}=x_{i}-x_{j}\)
\[ \begin{aligned} f^{'}(A)=\frac{\partial f}{\partial A}&=-2A\sum_{i}\sum_{j \in C_{i}}p_{ij}(x_{ij}x_{ij}^{T}-\sum_{k}p_{ik}x_{ik}x_{ik}^T)\\ &=2A\sum_{i}(p_{i}\sum_{k}p_{ik}x_{ik}x_{ik}^T-\sum_{j \in C_{i}}p_{ij}x_{ij}x_{ij}^T) \end{aligned} \]
有了目標函數對A梯度以後就能夠設定迭代次數和A的初始值\(A_{0}\),利用梯度降低法不斷優化目標函數上限(固然也可使用其它的優化方法好比擬牛頓法),設學習率爲\(\alpha\),\(A_{0}\)經過下面公式迭代
\[ A_{0}=A_{0}+\alpha f^{'}(A_{0}) \]學習