主成分分析法matlab实现_实例演示
时间:2026-01-18
时间:2026-01-18
利用Matlab编程实现主成分分析
1.概述
Matlab语言是当今国际上科学界 (尤其是自动控制领域) 最具影响力、也是
最有活力的软件。它起源于矩阵运算,并已经发展成一种高度集成的计算机语言。它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化与界面设计、与其他程序和语言的便捷接口的功能。Matlab 语言在各国高校与研究单位起着重大的作用。主成分分析是把原来多个变量划为少数几个综合指标的一种统计分析方法,从数学角度来看,这是一种降维处理技术。
1.1主成分分析计算步骤
① 计算相关系数矩阵
r11
r21
R
rp1
r12r22 rp2
r1p
r2p
rpp (1)
在(3.5.3)式中,rij(i,j=1,2,…,p)为原变量的xi与xj之间的相关系数,其计算公式为
rij
(x
k 1
n
ki
i)(xkj j)
2
(x
k 1
n
ki
i)
(x
k 1
n
kj
j)2
(2)
因为R是实对称矩阵(即rij=rji),所以只需计算上三角元素或下三角元素即可。
② 计算特征值与特征向量
首先解特征方程 I R 0,通常用雅可比法(Jacobi)求出特征值
i(i 1,2, ,p),并使其按大小顺序排列,即 , 0;然后分别求
12p
2
出对应于特征值 i的特征向量ei(i 1,2, ,p)。这里要求ei=1,即 eij 1,其
j 1p
中eij表示向量ei的第j个分量。
③ 计算主成分贡献率及累计贡献率 主成分zi的贡献率为
i
k 1
p
(i 1,2, ,p)
k
累计贡献率为
i
k 1k 1
p
k
(i 1,2, ,p)
k
一般取累计贡献率达85—95%的特征值 1, 2, , m所对应的第一、第二,…,第m(m≤p)个主成分。
④ 计算主成分载荷 其计算公式为
lij p(zi,xj) ieij(i,j 1,2, ,p)
(3)
得到各主成分的载荷以后,还可以按照(3.5.2)式进一步计算,得到各主成分的得分
z11
zZ 21
zn1
z12z22 zn2
z1m z2m
znm
(4)
2.程序结构及函数作用
在软件Matlab中实现主成分分析可以采取两种方式实现:一是通过编程来实现;二是直接调用Matlab种自带程序实现。下面主要主要介绍利用Matlab的矩阵计算功能编程实现主成分分析。
2.1程序结构
2.2函数作用
Cwstd.m——用总和标准化法标准化矩阵
Cwfac.m——计算相关系数矩阵;计算特征值和特征向量;对主成分进行排序;计算各特征值贡献率;挑选主成分(累计贡献率大于85%),输出主成分个数;计算主成分载荷
Cwscore.m——计算各主成分得分、综合得分并排序 Cwprint.m——读入数据文件;调用以上三个函数并输出结果
3.源程序
3.1 cwstd.m总和标准化法标准化矩阵
%cwstd.m,用总和标准化法标准化矩阵 function std=cwstd(vector)
cwsum=sum(vector,1); %对列求和
[a,b]=size(vector); %矩阵大小,a为行数,b为列数 for i=1:a
for j=1:b
std(i,j)= vector(i,j)/cwsum(j); end end
3.2 cwfac.m计算相关系数矩阵
%cwfac.m
function result=cwfac(vector); fprintf('相关系数矩阵:\n')
std=CORRCOEF(vector) %计算相关系数矩阵 fprintf('特征向量(vec)及特征值(val):\n')
[vec,val]=eig(std) %求特征值(val)及特征向量(vec) newval=diag(val) ;
[y,i]=sort(newval) ; %对特征根进行排序,y为排序结果,i为索引 fprintf('特征根排序:\n') for z=1:length(y)
newy(z)=y(length(y)+1-z); end
fprintf('%g\n',newy) rate=y/sum(y);
fprintf('\n贡献率:\n') newrate=newy/sum(newy)
sumrate=0;
newi=[];
for k=length(y):-1:1
sumrate=sumrate+rate(k); newi(length(y)+1-k)=i(k); if sumrate>0.85 break; end
end %记下累积贡献率大85%的特征值的序号放入newi中 fprintf('主成分数:%g\n\n',length(newi)); fprintf('主成分载荷:\n') for p=1:length(newi) for q=1:length(y)
result(q,p)=sqrt(newval(newi(p)))*vec(q,newi(p)); end
end %计算载荷 disp(result)
3.3 cwscore.m
%cwscore.m,计算得分
function score=cwscore(vector1,vector2); sco=vector1*vector2; csum=sum(sco,2);
[newcsum,i]=sort(-1*csum); [newi,j]=sort(i);
fprintf('计算得分:\n')
score=[sco,csum,j]
%得分矩阵:sco为各主成分得分;csum为综合得分;j为排序结果
3.4 cwprint.m
%cwprint.m
function print=cwprint(filename,a,b);
%filename为文本文件文件名,a为矩阵行数(样本数),b为矩阵列数(变量指标数) fid=fopen(filename,'r')
vector=fscanf(fid,'%g',[a b]); fprintf('标准化结果如下:\n') v1=cwstd(vector) result=cwfac(v1); cwscore(v1,result);
4.程序测试
4.1原始数据
中国大陆35个大城市某年的10项社会经济统计指标数据见下表。
4.2运行结果
>> cwprint('cwbook.txt',35,10)
fid =
6
数据标准化结果如下:
v1 =
0.0581 0.0356 0.0435 0.0680 0.0557 0.1112 0.1194 0.1184 0.1083 0.1392 0.0423 0.0346 0.0354 0.0770 0.0089 0.0642 0.0483 0.0499 0.0534 0.0544 0.0407 0.0139 0.0688 0.0234 0.0080 0.0047 0.0151 0.0314 0.0252 0.0183 0.0139 0.0391 0.0056 0.0093 0.0053 0.0290 0.0087 0.0174 0.0234 0.0158 0.0097 0.0263 0.0086 0.0028 0.0064 0.0064 0.0045 0.0062 0.0111 0.0075 0.0315 0.0375 0.030 …… 此处隐藏:6360字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:错误 339-解决方案
下一篇:竞争法学一份试题