主成分分析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-');
  • 9
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值