MATLAB主成分分析-----------2019/8/23

主成分分析

  • 定义:
    主成分分析实际上是一种降维方法。主成分分析的主要目的是希望用较少的变量去解释原来资料中的大部分变异,将我们手中许多相关性很高的变量转化成彼此相互独立或不相关的变量。通常是选出比原始变量个数少,能解释大部分资料中的变异的几个新变量,即所谓主成分,并用以解释资料的综合性指标。

  • 注意:
    1)主成分分析的结果受量纲的影响 (回归分析结果不受量纲的影响),所以实际中先把各变量的数据标准化,然后使用协方差矩阵或相关系数矩阵进行分析。
    2)使方差达到最大的主成分分析不用转轴(由于统计软件常把主成分分析和因子
    分析放在一起,后者往往需要转轴,使用时应注意)
    3)主成分的保留。用相关系数矩阵求主成分时,Kaiser主张将特征值小于1的主成
    分予以放弃(这也是SPSS软件的默认值)。
    4)在实际研究中,由于主成分的目的是为了降维,减少变量的个数,故一般选取少量的主成分(不超过5或6个),只要它们能解释变异的70%~80%(称累积贡献率)就行了。

  • 特征值因子的筛选
    单纯考虑累积贡献率有时是不够的,还需要考虑选择的主成分对原始变量的贡献值

  • 主成分估计:

  1. 定义:是回归系数参数的一种线性有偏估计,是为了克服最小二乘(LS)估计在设计阵病态(即存在多重共线性)时表现出的不稳定性而提出的。
  2. 方法:主成分估计采用的方法是将原来的回归自变量变换到另一组变量,即主成分,选择
    其中一部分重要的主成分作为新的自变量(此时丢弃了一部分影响不大的自变量,这实
    际达到了降维的目的),然后用最小二乘法对选取主成分后的模型参数进行估计,最后
    再变换回原来的模型求出参数的估计。
    在这里插入图片描述
    (数据在代码中)
    解:
sn=[7 26 6 60 78.5 
1 29 15 52 74.3 
11 56 8 20 104.3 
11 31 8 47 87.6 
7 52 6 33 95.9 
11 55 9 22 109.2 
3 71 17 6 102.7 
1 31 22 44 72.5 
2 54 18 22 93.1 
21 47 4 26 115.9 
1 40 23 34 83.8 
11 66 9 12 113.3 
10 68 8 12 109.4];
[m,n]=size(sn); 
x0=sn(:,1:n-1);y0=sn(:,n); 
r=corrcoef(x0) %计算相关系数矩阵 
xb=zscore(x0); %对设计矩阵进行标准化处理 
yb=zscore(y0); %对y0进行标准化处理 
%以下命令利用设计矩阵进行主成分分析,返回值c的列向量对应着主成分的系数 
%返回值s对应着式(26)中的Z矩阵,t返回的是特征值 
[c,s,t]=princomp(xb) 
contr=cumsum(t)/sum(t) %计算累积贡献率,第i个分量表示前i个主成分的贡献率 
num=input('请选项主成分的个数:') %通过累积贡献率交互式选择主成分的个数 
hg1=[ones(m,1),x0]\y0; %计算普通最小二乘法回归系数 
hg1=hg1' 
%下面显示普通最小二乘法回归结果 
fprintf('y=%f',hg1(1)); 
for i=1:n-1 
 fprintf('+%f*x%d',hg1(i+1),i); 
end 
fprintf('\n') 
hg=s(:,1:num)\yb; %主成分变量的回归系数 
hg=c(:,1:num)*hg; %标准化变量的回归方程系数 
%下面计算原始变量回归方程的系数 
hg2=[mean(y0)-std(y0)*mean(x0)./std(x0)*hg, std(y0)*hg'./std(x0)] 
%下面显示主成分回归结果 
fprintf('y=%f',hg2(1)); 
for i=1:n-1 
 fprintf('+%f*x%d',hg2(i+1),i); 
end 
fprintf('\n') 
%下面计算两种回归分析的剩余标准差 
rmse1=sqrt(sum((x0*hg1(2:end)'+hg1(1)-y0).^2)/(m-n)) 
rmse2=sqrt(sum((x0*hg2(2:end)'+hg2(1)-y0).^2)/(m-num-1))
  • 基于主成分分析法的综合评价
a=[5.96 310 461 1557 931 319 44.36 2615 2.20 13631 
3.39 234 308 1035 498 161 35.02 3052 0.90 12665
2.35 157 229 713 295 109 38.40 3031 0.86 9385 
1.35 81 111 364 150 58 30.45 2699 1.22 7881
1.50 88 128 421 144 58 34.30 2808 0.54 7733 
1.67 86 120 370 153 58 33.53 2215 0.76 7480
1.17 63 93 296 117 44 35.22 2528 .58 8570
1.05 67 92 297 115 43 32.89 2835 0.66 7262 
0.95 64 94 287 102 39 31.54 3008 0.39 7786
0.69 39 71 205 61 24 34.50 2988 0.37 11355 
0.56 40 57 177 61 23 32.62 3149 0.55 7693 
0.57 58 64 181 57 22 32.95 3202 0.28 6805
0.71 42 62 190 66 26 28.13 2657 0.73 7282 
0.74 42 61 194 61 24 33.06 2618 0.47 6477 
0.86 42 71 204 66 26 29.94 2363 0.25 7704 
1.29 47 73 265 114 46 25.93 2060 0.37 5719
1.04 53 71 218 63 26 29.01 2099 0.29 7106 
0.85 53 65 218 76 30 25.63 2555 0.43 5580 
0.81 43 66 188 61 23 29.82 2313 0.31 5704
0.59 35 47 146 46 20 32.83 2488 0.33 5628 
0.66 36 40 130 44 19 28.55 1974 0.48 9106 
0.77 43 63 194 67 23 28.81 2515 0.34 4085 
0.70 33 51 165 47 18 27.34 2344 0.28 7928 
0.84 43 48 171 65 29 27.65 2032 0.32 5581 
1.69 26 45 137 75 33 12.10 810 1.00 14199 
0.55 32 46 130 44 17 28.41 2341 0.30 5714 
0.60 28 43 129 39 17 31.93 2146 0.24 5139 
1.39 48 62 208 77 34 22.70 1500 0.42 5377 
0.64 23 32 93 37 16 28.12 1469 0.34 5415 
1.48 38 46 151 63 30 17.87 1024 0.38 7368];
a=zscore(a);
%数据标准化
r=corrcoef(a);
%计算相关系数矩阵
%***********
%下面利用相关系数阵进行主成分分析,vec1的列是r的特征向量,即主成分系数
%***********
[vec1,lamda,rate]=pcacov(r)
%lamda是r的特征值,rate是各个主成分的贡献率
contr=cumsum(rate)
%计算累积贡献率

f=repmat(sign(sum(vec1)),size(vec1,1),1);
%构造与vec1同维数的元素为±1的矩阵
vec2=vec1.*f;
%修改特征向量的正负号,使得每个特征向量的分量和为正
num=5;
%num为选取的主成分的个数
df=a*vec2(:,1:num);
%计算各个主成分的得分
tf=df*rate(1:num)/100;
%计算综合得分
[stf,ind]=sort(tf,'descend');
%把得分按从高到低的次序排序
stf=stf'
ind=ind'
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值