主成分分析matlab程序.doc
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab 编程实现主成分分析
. 程序结构及函数作用
在软件 Matlab 中实现主成分分析可以采取两种方式实现:一是通过编程来
实现;二是直接调用 Matlab 种自带程序实现。
下面主要主要介绍利用 Matlab 的矩阵计算功能编程实现主成分分析。
1程序结构
主函数
子函数
2函数作用——用总和标准化法
标准化矩阵
——计算相关系数矩阵;计算特征值和特征向量;对主成分进行排序;计算各特征值贡献率;挑选主成分(累计贡献率大于 85%),输出主成分个数;计算
主成分载荷
——计算各主成分得分、综合得分并排序
——读入数据文件;调用以上三个函数并输出结果
3.源程序
总和标准化法标准化矩阵
%,用总和标准化法标准化矩阵function std=cwstd(vector)
cwsum=sum(vector,1);% [a,b]=size(vector);%
for i=1:a
for j=1:b 对列求和矩
阵大小 ,a 为行数 ,b 为列数
std(i,j)= vector(i,j)/cwsum(j);
end
end
计算相关系数矩阵
%
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> 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)
%,计算得分
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 为排序结果
%
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.程序测试例题
原始数据
中国大陆 35 个大城市某年的10 项社会经济统计指标数据见下表。
非
客运 货运 地方财 城乡居
年底 农业 农 业 工业 政 民年底 城 总量 总量 市 人口 总产值 总产值
预算内 储蓄余 名 总人口 ( 万 ( 万 称
收入 ( 万 额
( 万人 ) 比 ( 万元 ) ( 万元 ) 人 ) 吨 )
( 万元 ) (%)
元 ) 北
8 1 843 19 999 20 45 2 790 26 806
1 427 706 323 56
2 86
3 646 京
天 9
1 501 2
2 645
3 26 1 128 11 301
津 136
502 259 317 073 931
在岗 职工
人数 ( 万
人 )
在岗职
工工资
总额
( 万元 )
5 773 301
2 254
343
石 家 2
2 918 6 885
庄
680
768
太
3 236 038
2 737
原
750
呼和浩
2
365 343 816 452 特
沈 9 1 295 5 826 阳
418 733
大
6
1 879 8 426
连
739 385
长 8 1 853 5 966 春
210 343
哈 尔 7
2 66
3
4 186
滨
855 123
上 1
4
2 069 54 529
海 019 098
南 1 989 199 13 072 京
737 杭 6
1 414 1
2 000 州
737 796
宁 7
1 428 10 622
波
235 866
合
4 628 764 2 514
肥
125
福
3 2 152 6 555 州
288 351
厦 5 333 374
5 751
门
124
南
8 688 289 2 305
昌
881
2 1 7 095 929
911 352 348
875
1 11 203 277 3 943 937 895 100
2 2 105 78
3 1 396
351 623 588
7 15
9 016 782 412 567 919 998
10 19 709 227 7 556
780 187 796
4 9 357 096
4 803 810 532 744
6 7 6 450
720 520 481 443 020 6 44 4 318 25 971
406 485 500 200
14 11 664 299 5 680
269 193 472
17 11 449 593
7 425 883 684 967
22 10 5 246 215 298 501 723 350
4 1 233 628 1 622 893 517 931
8 7 467 524 5 030 851 190 220
3 2 2 108 728 570 418 758 331
3 3 167 71
4 2 640 674 189 460
758 877
654 023
309 337
1 15
2 811
965 922 884 447
1 309 151
5 605 445
1 357
861
1 180
947
824 034
369 577
680 607
657 484
479 ,55
5
济 5 1 486 6 285 5 11 460 690 南302 882 915 775
青
3 2 382 11 492 13 17
658 435
岛320 036 408 038
郑
4 677 42
5 5 287 10 6
387 252
州601 433 768
武
9 1 211 7 506 9 15
604 658
汉291 085 793 442
长
7 1 146 3 098 8 5
323 660
沙367 179 706 718
广
4 1 600 23 348 22 23 1 761
州738 139 007 854 499
深
1 299 66
2 20 368 8 4 1 847
圳295 754 274 908
南
4 720 486 1 149
5 3
149 700
宁691 130 293
海
4 44 81
5 717 461 5 2
115 174
口345 356
重
7 4 168 8 585 52 25
898,912
3
780 525 441 124
庆
成 1 935 5 894 40 19
561 189 1
590 289 140 632
都
贵
7 362 061 2 247 15 4
197 908
阳934 703 143
昆 5 793 356 3 605 5 12 524 216 明729 604 042
西
4 739 90
5 3 665 10 9
408 896
安942 311 766
兰
5 259 444 2 940 1 4
169 540
州884 832 749
西
7 65 848 711 310 1 1
49 134
宁746 469
银
9 171 603 661 226 2 1
74 758
川106 193
乌鲁木
4 78 513 1 847 2 9
254 870
齐241 668 041
4126
970
4978
045
5135
338
5748
055
3461
244
20401
811
9519
900
2190
918
1626
800
9090
969
7479
684
1787
748
4127
900
5863
980
2641
568
855 051
814 103
2365
508
756696
961704
696 848
1314
766
596 986
3047
594
1890
338
371 809
198 138
1606
804
1200
671
419681
842321
885169
550890
219251
178621
517622
运行结果
>>cwprint('',35,10)
fid =
6
数据标准化结果如下:v1 =
相关系数矩阵 :
std =
特征向量 (vec) :
vec =
特征值 (val)
val =
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
特征根排序:
各主成分贡献率:
newrate =
第一、二主成分的载荷:
1
3
7
5
6
3
7
7
9
6
第一、二、三、四主成分的得分:score =
5 9 4
6 6 2
8 3 4
6 1 7
9 5 4
8 0 8 0。