PCA——主成分分析

  PCA(Principal Components Analysis)是一个简单的机器学习算法,用于对矩阵的有损压缩。即缩小矩阵列向量的维度,并尽量减少精度的损失,以减小存储空间。当然,现在的硬盘已经足够大,根本不需要这样的有损压缩来减小存储容量了。它主要用于训练数据的降维、数据中噪点的去除等。因此是一个很有用的算法。下面把压缩称作编码,解压缩称作解码。

  首先定义矩阵$X\in R^{n\times m}$为原矩阵,由$m$个$n$维列向量$\{x_1,x_2,...,x_m\}$组成。PCA将把$X$编码成矩阵$C\in R^{l\times m},l<n$。然后定义解码操作,编码操作基于解码。解码操作为$C$左乘一个解码矩阵$D\in R^{n\times l}$:

$X^* = DC$

  因为解码编码操作只需按比例增大减小,结果就不会变,并且为了使编码简单,限制$D$的列向量为单位向量,且相互正交(因$l<n$所以所有列向量都能相互正交)。然后通过最小化每个列向量的精度损失,得到编码的定义:

$\begin{aligned}&c^*=\text{arg}\min\limits_c||x-Dc||_2^2\\&c^*=\text{arg}\min\limits_c(x-Dc)^T(x-Dc)\\&c^*=\text{arg}\min\limits_c(x^Tx-2x^TDc+c^TD^TDc)\\&c^*=\text{arg}\min\limits_c(-2x^TDc+c^TD^TDc)\\\end{aligned}$

  求导为0得:

$c^*=D^Tx$

  于是重构后的$x$为:

$\hat{x} = DD^Tx$

  获得编码解码的定义后,怎样才能让整个矩阵的精度损失最小呢?容易想到,直接让前后矩阵之差的Frobenius范数最小即可:

$\begin{aligned}&D=\text{arg}\min\limits_D||X-DD^TX||_F^2\\&D=\text{arg}\min\limits_D\text{Tr}\left[(X-DD^TX)^T(X-DD^TX)\right]\\&D=\text{arg}\min\limits_D\text{Tr}\left[X^TX-X^TDD^TX-X^TDD^TX+X^TDD^TDD^TX\right]\\&D=\text{arg}\min\limits_D\text{Tr}\left[-2X^TDD^TX+X^TDD^TX\right]\\&D=\text{arg}\max\limits_D\text{Tr}\left[X^TDD^TX\right]\\\end{aligned}$

  因为$X^TD$与$D^TX$互为转置,而$\text{Tr}(A^TA)=\text{Tr}(AA^T)$,所以

$D=\text{arg}\max\limits_D\text{Tr}\left[D^TXX^TD\right]$

  显然,$D$的列向量取$XX^T$的前$l$最大特征值对应的特征向量即可。

猜你喜欢

转载自www.cnblogs.com/qizhou/p/12960956.html