机器学习笔记之主成分分析(PCA)
主成分分析(principle components analysis ,PCA)是比较基础的机器学习算法,主要是通过保留数据的特征来进行编码与解码。
假设在Rn\R^nRn空间中有mmm个点{x(1),x(2),⋯ ,x(m)}\{x^{(1)},x^{(2)},\cdots,x^{(m)}\}{x(1),x(2),⋯,x(m)},我们希望对这些点进行压缩。压缩的目的是我们可以使用更少的内存来储存这些数据,但是同时又希望压缩损失的信息(精度)尽可能少。
编码这些点的一种方式就是使用低维表示。对于每个x(i)∈Rnx^{(i)}\in\R^nx(i)∈Rn,会有一个对应的编码向量c(i)∈Rlc^{(i)}\in\R^lc(i)∈Rl。如果lll比nnn小,那么我们就可以使用更少的内存来储存数据。我们希望找到一个编码函数,根据输入返回编码,f(x)=cf(x)=cf(x)=c,同时我们也希望找到一个解码函数,给定编码能够重构输入,x≈(f(x))x\approx(f(x))x≈(f(x))。
具体来说,我们可以使用一个矩阵乘法将编码器映射回Rn\R^nRn,即g(c)=Dcg(c)=Dcg(c)=Dc,其中D∈Rn×lD\in\R^{n\times l}D∈Rn×l是定义解码的矩阵。但是这存在一个小问题,有可能存在多个解。因为如果我们按比例地缩小所有点对应的编码向量c(i)c^{(i)}c(i),那么只需要按比例放大D:iD_{:i}D:i,即可以保持结果不变。为了使问题有唯一解,我们限制DDD中所有列向量都有单位范数。为了简化问题,PCA 限制 DDD的列向量彼此正交。
那么我们如何选择一个根据每一个输入x\boldsymbol xx得到最优编码c∗\boldsymbol c^*c∗?一种最常见的方法就是最小化原始输入向量x\boldsymbol xx和重构向量g(c∗)g(\boldsymbol c^*)g(c∗)之间的距离,使用范数来衡量它们之间的距离。常用L2L^2L2范数,即c∗=argminc∥x−g(c∗)∥2\boldsymbol c^*=\arg \min\limits_c\|\boldsymbol x-g(\boldsymbol c^*)\|_2c∗=argcmin∥x−g(c∗)∥2我们可以使用平方L2L^2L2范数替代L2L^2L2范数。因为二者在相同的值c上取得最小值。
c∗=argminc∥x−g(c∗)∥22=argminc(x−g(c∗)T(x−g(c∗))=argmincxTx−xTg(c)−g(c)Tx⎵标量+g(c)Tg(c)=argmincxTx⎵与c无关−2xTg(c)+g(c)Tg(c)⇒argminc−2xTg(c)+g(c)Tg(c)=argminc−2xTDc+cTDTDc=argminc−2xTDc+cTIlc=−2xTDc+cTc\begin{aligned}\boldsymbol c^*&=\arg\min\limits_c\|\boldsymbol x-g(\boldsymbol c^*)\|_2^2=\arg\min\limits_c(\boldsymbol x-g(\boldsymbol c^*)^T(\boldsymbol x-g(\boldsymbol c^*))\\&=\arg\min\limits_c \boldsymbol x^T\boldsymbol x-\boldsymbol x^Tg(\boldsymbol c)-\underbrace{g(\boldsymbol c)^T\boldsymbol x}_{\text{标量}}+g(\boldsymbol c)^Tg(\boldsymbol c)\\&=\arg\min\limits_c\underbrace{\boldsymbol x^T\boldsymbol x}_{\text{与c无关}}-2\boldsymbol x^Tg(\boldsymbol c)+g(\boldsymbol c)^Tg(\boldsymbol c)\\&\Rightarrow\arg\min\limits_c-2\boldsymbol x^Tg(\boldsymbol c)+g(\boldsymbol c)^Tg(\boldsymbol c)\\&=\arg\min\limits_c-2\boldsymbol {x^TDc}+\boldsymbol c^TD^TD\boldsymbol c\\&=\arg\min\limits_c-2\boldsymbol {x^TDc}+\boldsymbol c^TI_l\boldsymbol c\\&=-2\boldsymbol {x^TDc}+\boldsymbol c^T\boldsymbol c\end{aligned}c∗=argcmin∥x−g(c∗)∥22=argcmin(x−g(c∗)T(x−g(c∗))=argcminxTx−xTg(c)−标量g(c)Tx+g(c)Tg(c)=argcmin与c无关xTx−2xTg(c)+g(c)Tg(c)⇒argcmin−2xTg(c)+g(c)Tg(c)=argcmin−2xTDc+cTDTDc=argcmin−2xTDc+cTIlc=−2xTDc+cTc对ccc求导,∇(−2xTDc+cTc)=0⇒−2DTx+2c=0⇒c=DTx∴f(x)=DTx\nabla(-2\boldsymbol {x^TDc}+\boldsymbol c^T\boldsymbol c)=0\Rightarrow-2\boldsymbol D^Tx+2c=0\Rightarrow\boldsymbol c=\boldsymbol D^Tx\\\therefore f(x)=\boldsymbol D^Tx∇(−2xTDc+cTc)=0⇒−2DTx+2c=0⇒c=DTx∴f(x)=DTx
进一步使用矩阵乘法,我们可以定义重构操作:r(x)=g(f(x))=DDTxr(x)=g(f(x))=\boldsymbol{DD}^Txr(x)=g(f(x))=DDTx,因为重构要求最小化所有维数和所有点上的误差矩阵的Frobenius范数:D∗=argminD∑i,j(xj(i)−r(x(i))j)2subjecttoDTD=Il\begin{aligned}&\boldsymbol D^*=\arg\min\limits_{D}\sqrt{\sum_{i,j}\Big(x_j^{(i)}-r(x^{(i)})_j\Big)^2}\\&subject\quad to\quad D^TD=I_l\end{aligned}D∗=argDmini,j∑(xj(i)−r(x(i))j)2subjecttoDTD=Il
为了简化推导,首先考虑l=1l=1l=1的情况。此时DDD简化为一个单一向量ddd,即d∗=argmind∑i∥x(i)−ddTx(i)⎵标量∥22=argmind∑i∥x(i)−dTx(i)d∥22=argmind∑i∥x(i)−x(i)Tdd∥22subjectto∥d∥2=1\begin{aligned}&\boldsymbol d^*=\arg\min\limits_d\sum_{i}\|\boldsymbol x^{(i)}-\boldsymbol d\underbrace{\boldsymbol d^T\boldsymbol x^{(i)}}_{\text{标量}}\|_2^2\\&=\arg\min\limits_d\sum_{i}\|\boldsymbol x^{(i)}-\boldsymbol d^T\boldsymbol x^{(i)}\boldsymbol d\|_2^2\\&=arg\min\limits_d\sum_{i}\|\boldsymbol x^{(i)}-\boldsymbol x^{(i)T}\boldsymbol d\boldsymbol d\|_2^2\\&subject\quad to\quad \|\boldsymbol d\|_2=1\end{aligned}d∗=argdmini∑∥x(i)−d标量dTx(i)∥22=argdmini∑∥x(i)−dTx(i)d∥22=argdmini∑∥x(i)−x(i)Tdd∥22subjectto∥d∥2=1将各点的向量写成矩阵形式,记为X∈Rm×nX\in\R^{m\times n}X∈Rm×n,其中XI,:=x(i)TX_{I,:}=\boldsymbol x^{(i)T}XI,:=x(i)T
∴d∗=argmind∥X−XddT∥F2,subjecttoddT=1\therefore\boldsymbol d^*=\arg\min\limits_{d}\|\boldsymbol{X}-\boldsymbol{Xdd}^T\|_F^2,\quad subject\quad to\quad \boldsymbol{dd}^T=1∴d∗=argdmin∥X−XddT∥F2,subjecttoddT=1
又∵∥A∥F=∑i,jAi,j2,Tr(A)=∑iAi,i,∥A∥F=Tr(AAT)又\begin{aligned}\because\|A\|_F=\sqrt{\sum_{i,j}A^2_{i,j}},Tr(A)=\sum_{i}A_{i,i},\|A\|_F=\sqrt{Tr(AA^T)}\end{aligned}又∵∥A∥F=i,j∑Ai,j2,Tr(A)=i∑Ai,i,∥A∥F=Tr(AAT)
∴d∗=argmind∥X−XddT∥F2=argmindTr((X−XddT)T(X−XddT))=argmindTr(XTX−XTXddT−ddTXTX+ddTXTXddT)=argmindTr(XTX⎵与d无关)−Tr(XTXddT)−Tr(ddTXTX)+Tr(ddTXTXddT)⇒argmind−Tr(XTXddT)−Tr(ddTXTX)+Tr(ddTXTXddT)=argmind−2Tr(XTXddT)++Tr(XTXddTd⎵dTd=1dT)=argmind−Tr(XTXddT)=argmaxdTr(XTXddT)=argmaxdTr(dTXTXd)\therefore\begin{aligned}\boldsymbol d^*&=\arg\min\limits_{d}\|\boldsymbol{X}-\boldsymbol{Xdd}^T\|_F^2=\arg\min\limits_{d}Tr\bigg(\Big(\boldsymbol{X}-\boldsymbol{Xdd}^T\Big)^T\Big(\boldsymbol{X}-\boldsymbol{Xdd}^T\Big)\bigg)\\&=\arg\min\limits_{d}Tr\Big(\boldsymbol{X^TX-X^TXdd^T-dd^TX^TX+dd^TX^TXdd^T}\Big)\\&=\arg\min\limits_{d}\underbrace{Tr\Big(\boldsymbol{X^TX}}_{与d无关}\Big)-Tr\Big(\boldsymbol{X^TXdd^T}\Big)-Tr\Big(\boldsymbol{dd^TX^TX}\Big)+Tr\Big(\boldsymbol{dd^TX^TXdd^T}\Big)\\&\Rightarrow\arg\min\limits_{d}-Tr\Big(\boldsymbol{X^TXdd^T}\Big)-Tr\Big(\boldsymbol{dd^TX^TX}\Big)+Tr\Big(\boldsymbol{dd^TX^TXdd^T}\Big)\\&=\arg\min\limits_{d}-2Tr\Big(\boldsymbol{X^TXdd^T}\Big)++Tr\Big(\boldsymbol{X^TXd\underbrace{d^Td}_{d^Td=1}d^T}\Big)\\&=\arg\min\limits_{d}-Tr(\boldsymbol{X^TXdd^T})=\arg\max\limits_{d}Tr(\boldsymbol{X^TXdd^T})\\&=\arg\max\limits_{d}Tr(\boldsymbol{d^TX^TXd})\end{aligned}∴d∗=argdmin∥X−XddT∥F2=argdminTr((X−XddT)T(X−XddT))=argdminTr(XTX−XTXddT−ddTXTX+ddTXTXddT)=argdmin与d无关Tr(XTX)−Tr(XTXddT)−Tr(ddTXTX)+Tr(ddTXTXddT)⇒argdmin−Tr(XTXddT)−Tr(ddTXTX)+Tr(ddTXTXddT)=argdmin−2Tr(XTXddT)++Tr(XTXddTd=1dTddT)=argdmin−Tr(XTXddT)=argdmaxTr(XTXddT)=argdmaxTr(dTXTXd)
∴\therefore∴矩阵XTXX^TXXTX的最大特征值所对应的特征向量就是d\boldsymbol{d}d,同理可得矩阵D就是由前lll个最大的特征值所对应的特征向量构成。