PCA简单的说,它是一种通用的降维工具。在我们处理高维数据的时候, 了能降低后续计算的复杂度,在“预处理”阶段通常要先对原始数据进行降维,而PCA就是干这个事的 本质上讲,PCA就是将高维的数据通过线性变换投影到低维空间上去,但这个投影可不是随便投投,遵循一个指导思想,那就是:找出最能够代表原始数据的投影方法。这里怎么理解这个思想呢?“最表原始数据”希望降维后的数据不能失真,也就是说,被PCA降掉的那些维度只能是那些噪声或是冗余数据。这里的噪声和冗余我认为可以这样认识:噪声:我们常说“噪音污染”,意思就是“噪声”干扰我们想听到的真正声音。同样,假设样本中某主要的维度A,它能代表原始数据,是“我们真正想听到的东西”,它本身含有的“能量”(即该维度方差,为啥?别急,后文该解释的时候就有啦~)本来应该是很大的,但由于它与其他维度有那些千丝万缕的相关性,受到这些个相关维度的干扰,它的能量被削弱了,我们就希望通过PCA理后,使维度A与其他维度的相关性尽可能减弱,进而恢复维度A应有的能量,让我们“听的更清楚”! 冗余:冗余也就是多余的意思,就是有它没它都一样,放着就是占地方。同样,假如样本中有个维度,在所有的样本上变化不明显(极端情况:在所有的样本中该维度都等于同一个数),也说该维度上的方差接近于零,那么显然它对区分不同的样本丝毫起不到任何作用,这个维度即冗余的,有它没它一个样,所以PCA应该去掉这些维度。PCA的目的就是“降噪”和“去冗余”。“降噪”的目的就是使保留下来的维度间的相关性尽可能小,而“去冗余”的目的就是使保留下来的维度含有的“能量”即方差尽可能大。那首先的首先,我们得需要知道各维度间的相关性以及个维度上的方差啊!那有什么数据结构能同时表现不同维度间的相关性以及各个维度上的方差呢?自然是非协方差矩阵莫属。协方差矩阵度量的是维度与维度之间的关系,而非样本与样本之间。协方差矩阵的主对角线上的元素是各个维度上的方差(即能量),其他元素是两两维度间的协方差(即相关性)。我们要的东西协方差矩阵都有了,先来看“降噪”,让保留下的不同维度间的相关性尽可能小,也就是说让协方差矩阵中非对角线元素都基本为 零。达到这个目的的方式自然不用说,线代中奖的很明确——矩阵对角化。而对角化后得到的矩阵,其对角线上是协方差矩阵的特征值,它还有两个身份:首先,它还是各个维度上的新方差;其次,它是各个维度本身应该拥有的能量(能量的概念伴随特征值而来)。这也就是我们为何在前面称“方差”为“能量”的原因。也许第二点可能存在疑问,但我们应该注意到这个事实,通过对角化后,剩余维度间的相关性已经减到最弱,已经不会再受“噪声”的影响了,故此时拥有的能量应该比先前大了。看完了“降噪”,我们的“去冗余”还没完呢。对角化后的协方差矩阵,对角线上较小的新方差对应的就是那些该去掉的维度。所以我们只取那些含有较大能量(特征值)的维度,其余的就舍掉即可。 PCA的本质其实就是对角化协方差矩阵。我也是刚学的,代码如下 for i=1:29 Xnor(i,:)=X(i,:)./sum(X(i,:)); end [p,t,latent]=princomp(Xnor,'econ'); latent=latent./sum(latent)*100; latent(1:10) 第一步导入矩阵29 X 14 前15对照组求特征值 plot(t(1:15,1),t(1:15,2),'o') hold on plot(t(16:29,1),t(16:29,2),'*') xlabel('PC1(36.3%)') ylabel('PC2(26.9%)') function [Y,V,E,D] = pca(X) % do PCA on image patches % % INPUT variables: % X matrix with image patches as columns % % OUTPUT variables: % Y the project matrix of the input data X without whiting % V whitening matrix % E principal component transformation (orthogonal) % D variances of the principal components %去除直流成分 X = X-ones(size(X,1),1)*mean(X); % Calculate the eigenvalues and eigenvectors of the new covariance matrix. covarianceMatrix = X*X'/size(X,2); %求出其协方差矩阵 %E是特征向量构成,它的每一列是特征向量,D是特征值构成的对角矩阵 %这些特征值和特征向量都没有经过排序 [E, D] = eig(covarianceMatrix); % Sort the eigenvalues and recompute matrices % 因为sort函数是升序排列,而需要的是降序排列,所以先取负号,diag(a)是取出a的对角元素构成 % 一个列向量,这里的dummy是降序排列后的向量,order是其排列顺序 [dummy,order] = sort(diag(-D)); E = E(:,order);%将特征向量按照特征值大小进行降序排列,每一列是一个特征向量 Y = E'*X; d = diag(D); %d是一个列向量 %dsqrtinv是列向量,特征值开根号后取倒,仍然是与特征值有关的列向量 %其实就是求开根号后的逆矩阵 dsqrtinv = real(d.^(-0.5)); Dsqrtinv = diag(dsqrtinv(order));%是一个对角矩阵,矩阵中的元素时按降序排列好了的特征值(经过取根号倒后) D = diag(d(order));%D是一个对角矩阵,其对角元素由特征值从大到小构成 V = Dsqrtinv*E';%特征值矩阵乘以特征向量矩阵 |
|
来自: 昵称21520021 > 《matlab code》