作业2:主成分分析:步骤、应用及代码实现。代码可以用任何你熟悉的编程语言。
本文涉及主成分分析的步骤、应用、代码实现
步骤
主成分分析,即Principal Component Analysis,PCA, 是一种统计方法。
通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
该方法是基于原始数据方差的一种降维过程,可以用于提取更加有价值的信息。
一般步骤(假设先需将m个N维向量降维至K维)
1数据标准化处理;
2构造N行m列的原始数据矩阵X;
3计算原始数据协方差矩阵;
4计算协方差矩阵的特征值与特征向量;
5在N个特征向量中由大到小取前K个特征向量单位化,并组成K行N列的基矩阵与N行m列的原始数据矩阵X相乘,得到降维后的K行m列的矩阵。
应用
主成分分析是一种基础的数学分析方法,可以降低一组数据的维数,在不甚影响数据特征的前提下减小处理数据所需的运算量,其实际应用十分广泛,在比如统计学、图像处理、数据压缩、分子动力学模拟、数学建模等方向均有应用,是一种常用的多变量分析方法。
matlab代码实现
法1
clc;
clear all;
x=[1 2 4;
2 3 4;
-6 2 1];
n=size(x,1);
m=size(x,2);
%得到的数据矩阵的行数和列数或[n,m]=size(x)
for i=1:m
Sx(:,i)=(x(:,i)-mean(x(:,i)))/std(x(:,i));
end
%z-score标准化处理:得到标准化后的矩阵SA;或直接利用Sx=zscore(x)
M=cov(Sx) ;
%计算协方差矩阵:M.(经过标准化处理后相关系数矩阵即为协方差矩阵,或CM=corrcoef(Sx))
[V,D]=eig(M);
%计算M的特征值和特征向量.[V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量
d=diag(D);
%取出特征根矩阵列向量(提取出每一主成分的贡献率)
eig1=sort(d,'descend');
%将贡献率按从大到小元素排列
v=fliplr(V);
%重新排列特征向量
S=0;
i=0;
while S/sum(eig1)<0.6
i=i+1;
S=S+eig1(i);
end
%可以在此处调整对于主成分贡献值得要求,如要求求出累积贡献率大于60%的主成分
NEW=Sx*v(:,1:i)
%输出产生的降维后的数据
法2
直接利用princomp函数
clc;
clear all;
x=[1 2 4;
2 3 4;
-6 2 1];
n=size(x,1);
m=size(x,2);
%得到的数据矩阵的行数和列数或[n,m]=size(x)
for i=1:m
Sx(:,i)=(x(:,i)-mean(x(:,i)))/std(x(:,i));
end
%z-score标准化处理:得到标准化后的矩阵SA;或直接利用Sx=zscore(x)
[coef,score,latent,t]=princomp(Sx);
%利用princomp处理矩阵
s=0;
i=1;
while s/sum(latent)<0.6
s=s+latent(i);
i=i+1;
end
%获得累计贡献率大于60%几组数据
NEW=Sx*coef(:,1:i-1)
%输出降维后的数据
此例运用以上两种方法结果均为:
NEW =
0.3643
1.3404
-1.7047