1.5 PCA/SVD/MCA

1.PCA引入和推导:

引例:有5个二维空间的点(以列向量形式给出):\begin{bmatrix} -1 &-1 & 0 &2 & 0\\ -2& 0&0 & 1&1 \end{bmatrix},如图:,可以很清晰地发现:它们可以由一个斜向量近似表示出来,这个斜向量就是\bigl(\begin{smallmatrix} 1/\sqrt2\\1 /\sqrt2 \end{smallmatrix}\bigr),因为原先的5个2维向量中,第一个维度和第二个维度有着比例关系,所以可以进行降维处理,方法就是投影到这个斜向量上,以这个斜向量重新作为一个基,也能恢复保存原先的结构不发生大的变换。如果作为基的向量是一组标准基,那么投影之前的向量投影到这组新基后的座标就是与这些新的标准基做内积,即:

\bigl(\begin{smallmatrix} 1/\sqrt2 & 1/\sqrt2 \end{smallmatrix}\bigr)\begin{bmatrix} -1 &-1 & 0 &2 & 0\\ -2& 0&0 & 1&1 \end{bmatrix}=\bigl(\begin{smallmatrix} -3/\sqrt2 ,&-1/\sqrt2 ,&0 , &3/\sqrt2 ,&1/\sqrt2 \end{smallmatrix}\bigr)。更为形式化的语言表述如下:

\large X_{m,n}=\begin{bmatrix} \mathbf{x_1 }&\mathbf{x_2} &... & \mathbf{x_n }\end{bmatrix}_{m,n}是n个m维列向量的集合,记P_{k,m}=\begin{bmatrix} p_1^T\\ p_2^T\\ ...\\p_k^T \end{bmatrix}_{k,m},那么有:

\large P_{k,m}X_{m,n}=\begin{bmatrix} p_1^T\\ p_2^T\\ ...\\p_k^T \end{bmatrix}_{k,m}\begin{bmatrix} \mathbf{x_1 }&\mathbf{x_2} &... & \mathbf{x_n }\end{bmatrix}_{m,n}=\begin{bmatrix} p_1^Tx_1 & p_2^Tx_2 & ... & p_1^Tx_n\\ p_2^Tx_1 & p_2^Tx_2 & ... & p_2^Tx_n\\ ...& ... & ... & ...\\ p_k^Tx_1 & p_k^Tx_2 & ... & p_k^Tx_n \end{bmatrix},观察乘积后的矩阵,是一个KxN的矩阵,这个矩阵中第一列是原先x_1在新基下的表示,以此类推,第j列是原先n个向量中,第j个向量在新基下的表示,是一个k维的向量。

那么如何选取这k个m维的向量呢?

 

如上图所示,x为原先的向量,p是新的标准基,\hat{x}是x在p方向上的投影,e就是误差。如果我们想让投影后的数据保留更多的信息,即投影前和投影后的误差项||e||就要尽可能的小,同时因为||x||是固定的,那么||\hat{x}||的模长就就更大一些。即满足:

对于每一个新基p向量,都有:\frac{1}{n}\sum_{i=1}^{n}(p^Tx_i)^2最大化,\sum_{i=1}^{n}(p^Tx_i)^2=\sum_{i=1}^{n}(p^Tx_i)^T(p^Tx_i)=\sum_{i=1}^{n}x_i^Tpp^Tx_i注意到这样的变形是有问题的:因为我们的x_i是已知的,这里的p是未知的!因为p^Tx=x^Tp,所以我们这样推导:\sum_{i=1}^{n}(p^Tx_i)^2=\sum_{i=1}^{n}(x_i^Tp)^2=\sum_{i=1}^{n}(x_i^Tp)^T(x_i^Tp)=\sum_{i=1}^{n}p^Tx_ix_i^Tp。前面再加上1/n,就得到:\frac{1}{n}\sum_{i=1}^{n}p^Tx_ix_i^Tp=p^T(\frac{1}{n}\sum_{i=1}^{n}x_ix_i^T)p

当我们在预处理的时候,将m个特征每一个都做了标准化后(即满足X的每一行均值为0,方差为1),那么就可以明显的知道,

\frac{1}{n}\sum_{i=1}^{n}x_ix_i^T其实就是X的协方差矩阵\SigmaX必须进行了标准化!):协方差不懂的朋友可以看这里

因为我们选取的新基向量必须是标准基,所以我们有如下的优化问题:

\max_{\mathbf{p}}\ p^T\Sigma p\\s.t. p^Tp=1(按照p是向量去优化,不以整个矩阵去优化)利用拉格朗日乘子法,可以得到\Sigma p=\lambda p,即p是协方差矩阵\Sigma的特征向量。

如果没有做标准化,\frac{1}{n}\sum_{i=1}^{n}x_ix_i^T=\frac{1}{n}(x_1x_1^T+x_2x_2^T+...+x_nx_n^T)=\frac{1}{n}(XX^T)=E(xx^T),其实中间的矩阵就不在是协方差矩阵了,而是自相关矩阵。关于自相关矩阵和自协方差矩阵,可以看我的1.3(随机变量和随机向量)中详细的讲解。

根据协方差矩阵/XX^T算出来的特征向量后,选取K个比较大的特征值对应的特征向量,每一个按行向量的形式,组成P_{k,m},

然后算得P_{k,m}X_{m,n},就得到了降维后的向量。maltab代码如下:
(1)自己算特征值分解法:

X = [-1 -1 0 2 0;-2 0 0 1 1];
[eigvectors,eigvalues]=eig(X*X');
Y = eigvectors(:,2)'*X;

X是数据矩阵,第一行是第一个特征在n个样本上的取值,第一列是一个样本的所有特征取值。

eig()给出的eigvectors是列向量形式的。eigvalues是对角阵,对角元素是特征值。因为第二个比较大,所以取出来后,与X做内积,得到1x5矩阵。

(2)调用库函数法:

X = [-1 -1 0 2 0;-2 0 0 1 1];
[coff,score,latent]=pca(X');


results:
coff =

    0.7071    0.7071
    0.7071   -0.7071
score =

   -2.1213    0.7071
   -0.7071   -0.7071
         0         0
    2.1213    0.7071
    0.7071   -0.7071
latent =

    2.5000
    0.5000

X仍然是原先的X,但是送入pca函数中要转置一下,送入pca函数中的矩阵必须是这样的:每一行是一个样本,每一列是在一个特征上,所有样本的取值。给出的结果中,latent是从小到大的特征值,coff依次是对应的特征向量(列向量),score是原向量投影在新基下的座标,每一行是一个样本,每一列是一个特征,也是按“重要性”的顺序排序。

(3)PCA应用:

a.降维:在coursera上的PCA作业中,完成一个任务就是降维。

在降维过后,用了100个人脸图像集合,每一张图像向量化后作为一个样本,然后用这100个样本去分析它们的“主成分”,即分析这些人脸主要的轮廓。

b.可视化数据:

c.进行排序:

d.和PCA思想相似的一个应用:图像处理中彩色转换成灰度图片。

\large A_{m \times n \times 3}是一个彩色图像,\large X_{3 \times mn}\large X的每一列是一个像素点,有mn列(每一行都要做归一化!)。记\large u=\begin{bmatrix} \alpha\\\beta \\\gamma \end{bmatrix}

从彩色到灰度的映射就是:对于一个图像R,G,B三个图像,分别给与不同的权值\large \alpha,\beta ,\gamma加权平均\large \alpha+\beta +\gamma=1

而比较满意的效果就是,加权组合后的灰度值差异尽可能的“大”,即方差大。所以有如下式子:

\large \max_{z} (u^TX)(u^TX)^T,\large u^TX就是映射后的所以样本点,是一个1xMN的行向量,因为只有一个维度,所以协方差就是方差。

化简就是:\large \mathbf{\max_{z} u^TXX^Tu }\\s.t.\mathbf{ 1^Tu=1,u\succeq 0}。观察可以发现和PCA很像,但是不一样。详细的求解这里不涉及。

2.SVD的应用:

主要针对单个的矩阵\large A=U\Sigma V^T=\sum_{i=1}^{r}\sigma_iu_iv_i^T可以讲矩阵进行压缩。更实际的就是一个图像,进行图像的压缩,和分析主要的部分。

3.MCA:次分量分析:利用数据向量的次分量(小特征值对应的特征向量)进行数据分析称为次分量分析。

暂时没有详细接触,只是有个概念。伴随着疑问:较小的特征值对应的不是噪声之类的东西吗?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章