PCA的理解
PCA是经常用来减少数据集的维数,同时保留数据集中对方差贡献最大的特征来达到简化数据集的目的。PCA的原理就是将原来的样本数据投影到一个新的空间中,相当于我们在矩阵分析里面学习的将一组矩阵映射到另外的坐标系下。通过一个转换坐标,也可以理解成把一组坐标转换到另外一组坐标系下,但是在新的坐标系下,表示原来的原本不需要那么多的变量,只需要原来样本的最大的一个线性无关组的特征值对应的空间的坐标即可。PCA算法核心思想就是将 n 维特征映射到 k 维上(k < n),这 k 维是全新的正交特征。我们将这 k 维成为主元,是重新构造出来的 k 维特征,而不是简单地从 n 维特征中取出其余 n-k 维特征。在信号处理中认为信号具有较大的方差,噪声有较小的方差,信噪比就是信号与噪声的方差比,越大越好。
PCA的计算步骤
计算相关系数矩阵(可以利用matlab自带函数corrcoef) 在这
r
i
j
r_{ij}
rij分别是原来变量
x
i
,
x
j
x_i,x_j
xi,xj的相关系数,其计算公式为: 其中R是一个关于主对称轴对称的矩阵,因为
r
i
j
=
r
j
i
r_{ij}=r_{ji}
rij=rji计算特征值与特征向量 将求出的特征值由大到小排列,并分别求出其对应的特征向量。计算主成分贡献率及累计贡献率,一般取累计贡献率达85%~95% 主成分
z
i
z_i
zi贡献率: 累计贡献率: 计算主成分载荷(主成分分析中原始变量与主成分之间的相关系数) 最后可进一步计算主成分得分:
PCA函数
matlab自带函数pca()
以前是princomp()函数,但我发现在我的matlab2018a中,这个函数已经被pca()代替了,具体的根据自己的matlab版本而定
coeff = pca(X) coeff = pca(X,Name,Value) [coeff,score,latent] = pca(___) [coeff,score,latent,tsquared] = pca(___) [coeff,score,latent,tsquared,explained,mu] = pca(___)
coeff = pca(X)返回n*p数据矩阵X的主成分系数,也称为载荷。X的行对应于观测值,列的对应于变量。系数矩阵是p乘p的。coeff的每一列都包含一个主成分的系数,并且这些列按成分方差的降序排列。默认情况下,pca会将数据居中并使用奇异值分解(SVD)算法。coeff = pca(X,Name,Value)使用用于计算和处理特殊数据类型(由一个或多个Name,Value对参数指定)的附加选项,返回以前语法中的任何输出参数。例如,您可以指定pca返回的主成分数或要使用的SVD以外的算法。[coeff,score,latent] = pca(___)还会返回主成分分数得分和潜在主成分方差。您可以使用先前语法中的任何输入参数。主成分分数是X在主成分空间中的表示形式。分数行对应于观察,列对应于组成部分。主成分方差是X的协方差矩阵的特征值。[coeff,score,latent,tsquared] = pca(___)还返回X中每个观测值的Hotelling T平方统计量。[coeff,score,latent,tsquared,mu] = pca(___)也返回解释,由每个主成分和mu解释的总方差的百分比,X中每个变量的估计平均值。 以上是翻译出的中文解释,具体可输入help pca自行在matlab中查看。
自写的matlab代码
转自https://blog.csdn.net/qq_24163555/article/details/89288145
function [V,S,E]=princa(X)
[m,n]=size(X); %计算矩阵的行m和列n
%-------------第一步:标准化矩阵-----------------%
mv=mean(X); %计算各变量的均值
st=std(X); %计算各变量的标准差
X=(X-repmat(mv,m,1))./repmat(st,m,1); %标准化矩阵X
%-------------第二步:计算相关系数矩阵-----------------%
% R1=X'*X/(m-1); %方法一:协方差矩阵计算公式
% R2=cov(X); %方法二:协方差矩阵计算函数
R=corrcoef(X); %方法三:相关系数矩阵函数
%-------------第三步:计算特征向量和特征值-----------------%
[V,D]=eig(R); %计算矩阵R的特征向量矩阵V和特征值矩阵D,特征值由小到大
V=(rot90(V))'; %将特征向量矩阵V从大到小排序
D=rot90(rot90(D)); %将特征值矩阵由大到小排序
E=diag(D); %将特征值矩阵转换为特征值向量
%-------------第四步:计算贡献率和累计贡献率-----------------%
ratio=0; %累计贡献率
for k=1:n
r=E(k)/sum(E); %第k主成份贡献率
ratio=ratio+r; %累计贡献率
if(ratio>=0.9) %取累计贡献率大于等于90%的主成分
break;
end
end
%-------------第五步:计算得分-----------------%
S=X*V;
|