主成分分析matlab代码实现

转载自:https://blog.csdn.net/It_BeeCoder/article/details/80365563

方法一:
1:用zscore函数对原始数据S进行标准化。
2:用cov函数求出标准化后的数据的协方差。
3:求出此协方差的特征向量与特征根(eig函数)。
4:将产生的特征向量依据特征根大小从大到小进行排列(即将特征向量按列倒序)。
5:依据需求取出倒序后的向量的前几列(一般根据特征根来算贡献率,使得累计贡献率大于85%),组成新的矩阵T
6:做S*T得到分析后的新的数据。
7:依据特征根算贡献率,并绘图。
代码如下:

X=load('shuju.txt')
z=zscore(X)               %数据标准化
M=cov(z)                  %协方差
[V,D]=eig(M);             %求出协方差矩阵的特征向量、特征根
d=diag(D);                %取出特征根矩阵列向量(提取出每一主成分的贡献率)
eig1=sort(d,'descend')      %将贡献率按从大到小元素排列
v=fliplr(V)                %依照D重新排列特征向量
S=0;
i=0;
while S/sum(eig1)<0.85
    i=i+1;
    S=S+eig1(i);
end                         %求出累积贡献率大于85%的主成分
NEW=z*v(:,1:i)              %输出产生的新坐标下的数据
W=100*eig1/sum(eig1)
figure(1)
pareto(W);                  %画出贡献率的直方图
 

方法二:
1:用zscore函数对原始数据S进行标准化,(同上)。
2:利用matlab自带的princomp函数直接求得其特征向量,新坐标下的数据,特征根(并且已经排列好了)。
3:选择恰当的前几项主成分与标准化后的数据相乘。得到在新坐标下的数据。
4:如方法一,利用特征根算贡献率。
代码如下:

X=load('shuju.txt')
x=zscore(X)                       %标准化
[coef,score,eig,t]=princomp(x);   %利用princomp处理矩阵
t                                 %每一组数据在新坐标下到原点的距离
s=0;
i=1;
while s/sum(eig)<0.85
    s=s+eig(i);
    i=i+1;
end                              %获得累计贡献率大于85%几组数据
NEW=x*coef(:,1:i-1)              %输出新的数据
figure
pareto(eig/sum(eig));          %输出贡献率直方图
figure(2)
plot(eig,'r+');
hold on
plot(eig,'b-');

你可能感兴趣的:(#,SLAM)