《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
§10.利用 Matlab 编程实现主成分分析
1.概述
Matlab 语言是当今国际上科学界 (尤其是自动控制领域) 最具影响力、也是
最有活力的软件。它起源于矩阵运算,并已经发展成一种高度集成的计算机语言。
它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化与界面设
计、与其他程序和语言的便捷接口的功能。Matlab 语言在各国高校与研究单位
起着重大的作用。主成分分析是把原来多个变量划为少数几个综合指标的一种统
计分析方法,从数学角度来看,这是一种降维处理技术。
1.1 主成分分析计算步骤
① 计算相关系数矩阵
R
r
11
r
21
r
1
p
r
12
r
22
r
p
2
p
r
1
r
2
p
r
pp
(1)
在(3.5.3)式中,rij(i,j=1,2,…,p)为原变量的 xi 与 xj 之间的相关系
数,其计算公式为
r
ij
n
k
1
(
x
ki
x
i
)(
x
kj
x
j
)
n
k
1
(
x
ki
x
i
2
)
n
k
1
(
x
kj
x
j
2
)
(2)
因为 R 是实对称矩阵(即 rij=rji),所以只需计算上三角元素或下三角元素即可。
58
《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
② 计算特征值与特征向量
首 先 解 特 征 方 程
RI
0
, 通 常 用 雅 可 比 法 ( Jacobi ) 求 出 特 征 值
(
ii
,2,1
,
p
)
,并使其按大小顺序排列,即
1
2
,
p
0
;然后分别求
p
2
ije
j
1
1
,其
出对应于特征值 i的特征向量
(
iei
,2,1
,
p
)
。这里要求 ie =1,即
中 ije 表示向量 ie 的第 j 个分量。
③ 计算主成分贡献率及累计贡献率
主成分 iz 的贡献率为
(
i
,2,1
,
p
)
i
p
k
1
k
累计贡献率为
i
k
1
p
k
1
k
k
(
i
,2,1
,
p
)
,
m
1 所对应的第一、第
,
,
2
一般取累计贡献率达 85—95%的特征值
二,…,第 m(m≤p)个主成分。
④ 计算主成分载荷
其计算公式为
l
ij
(
,
xzp
i
j
)
i
,(
ie
ij
j
,2,1
,
p
)
(3)
59
《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
得到各主成分的载荷以后,还可以按照(3.5.2)式进一步计算,得到各主成
分的得分
Z
11
z
z
21
z
1
n
12
z
z
22
z
n
2
z
z
1
m
2
m
z
nm
(4)
2.程序结构及函数作用
在软件 Matlab 中实现主成分分析可以采取两种方式实现:一是通过编程来
实现;二是直接调用 Matlab 种自带程序实现。下面主要主要介绍利用 Matlab 的
矩阵计算功能编程实现主成分分析。
2.1 程序结构
Cwprint.m
主函数
子函数
Cwstd.m
Cwfac.m
Cwscore.m
2.2 函数作用
Cwstd.m——用总和标准化法标准化矩阵
Cwfac.m——计算相关系数矩阵;计算特征值和特征向量;对主成分进行排
序;计算各特征值贡献率;挑选主成分(累计贡献率大于 85%),输出主成分个
数;计算主成分载荷
60
《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
Cwscore.m——计算各主成分得分、综合得分并排序
Cwprint.m——读入数据文件;调用以上三个函数并输出结果
3.源程序
3.1 cwstd.m
%cwstd.m,用总和标准化法标准化矩阵
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
3.2 cwfac.m
%cwfac.m
function result=cwfac(vector);
fprintf('相关系数矩阵:\n')
std=CORRCOEF(vector)
fprintf('特征向量(vec)及特征值(val):\n')
[vec,val]=eig(std)
newval=diag(val) ;
[y,i]=sort(newval) ;
fprintf('特征根排序:\n')
for z=1:length(y)
%计算相关系数矩阵
%求特征值(val)及特征向量(vec)
%对特征根进行排序,y 为排序结果,i 为索引
newy(z)=y(length(y)+1-z);
end
fprintf('%g\n',newy)
rate=y/sum(y);
fprintf('\n 贡献率:\n')
newrate=newy/sum(newy)
61
《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
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
%记下累积贡献率大 85%的特征值的序号放入 newi 中
end
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);
62
《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
4.程序测试
4.1 原始数据
中国大陆 35 个大城市某年的 10 项社会经济统计指标数据见下表。
城 市
名 称
年底
总人口
(万人)
非农
业
人口比
(%)
农 业
工业
客运
货运
地方财政
总产值
总产值
总量
总量
(万元)
(万元)
(万人)
(万吨)
预算内收
入(万元)
城乡居民
年底储蓄
余额
(万元)
在岗职
在岗职工
工人数
(万人)
工资总额
(万元)
北
天
京 1 249.90 0.597 8 1 843 427 19 999 706 20 323 45 562 2 790 863 26 806 646 410.80
5 773 301
津 910.17
0.580 9 1 501 136 22 645 502 3 259 26 317 1 128 073 11 301 931 202.68
2 254 343
石 家 庄 875.40
0.233 2 2 918 680 6 885 768 2 929 1 911
352 348
7 095 875
太
原 299.92
0.656 3
236 038
2 737 750 1 937 11 895
203 277
3 943 100
呼和浩特 207.78
0.441 2
365 343
816 452
2 351 2 623
105 783
1 396 588
95.60
88.65
42.11
758 877
654 023
309 337
沈
大
长
阳 677.08
0.629 9 1 295 418 5 826 733 7 782 15 412 567 919
9 016 998
135.45
1 152 811
连 545.31
0.494 6 1 879 739 8 426 385 10 780 19 187 709 227
7 556 796
94.15
965 922
春 691.23
0.406 8 1 853 210 5 966 343 4 810 9 532
357 096
4 803 744
102.63
884 447
哈 尔 滨 927.09
0.462 7 2 663 855 4 186 123 6 720 7 520
481 443
6 450 020
172.79
1 309 151
上
南
杭
宁
合
福
厦
南
济
青
郑
武
长
广
深
海 1 313.12 0.738 4 2 069 019 54 529 098 6 406 44 485 4 318 500 25 971 200 336.84
5 605 445
京 537.44
0.534 1
989 199
13 072 737 14 269 11 193
664 299
5 680 472
113.81
1 357 861
州 616.05
0.355 6 1 414 737 12 000 796 17 883 11 684
449 593
7 425 967
波 538.41
0.254 7 1 428 235 10 622 866 22 215 10 298 501 723
5 246 350
肥 429.95
0.318 4
628 764
2 514 125 4 893 1 517
233 628
1 622 931
州 583.13
0.273 3 2 152 288 6 555 351 8 851 7 190
467 524
5 030 220
门 128.99
0.486 5
333 374
5 751 124 3 728 2 570
418 758
2 108 331
昌 424.20
0.398 8
688 289
2 305 881 3 674 3 189
167 714
2 640 460
南 557.63
0.408 5 1 486 302 6 285 882 5 915 11 775
460 690
4 126 970
96.90
62.15
47.27
69.59
46.93
62.08
83.31
1 180 947
824 034
369 577
680 607
657 484
479 ,555
756 696
岛 702.97
0.369 3 2 382 320 11 492 036 13 408 17 038 658 435
4 978 045
103.52
961 704
州 615.36
0.342 4
677 425
5 287 601 10 433 6 768
387 252
5 135 338
84.66
696 848
汉 740.20
0.586 9 1 211 291
7 506 085 9 793 15 442 604 658
5 748 055
149.20
1 314 766
沙 582.47
0.310 7 1 146 367 3 098 179 8 706 5 718
323 660
3 461 244
69.57
596 986
州 685.00
0.621 4 1 600 738 23 348 139 22 007 23 854 1 761 499 20 401 811 182.81
3 047 594
圳 119.85
0.793 1
299 662
20 368 295 8 754 4 274 1 847 908 9 519 900
91.26
1 890 338
63
《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
宁 285.87
0.406 4
720 486
1 149 691 5 130 3 293
149 700
2 190 918
口 54.38
0.835 4
44 815
717 461
5 345 2 356
115 174
1 626 800
45.09
19.01
371 809
198 138
庆 3 072.34 0.206 7 4 168 780 8 585 525 52 441 25 124 898,912
9 090 969
223.73
1 606 804
都 1 003.56
0.335
1 935 590 5 894 289 40 140 19 632 561 189
7 479 684
132.89
1 200 671
阳 321.50
0.455 7
362 061
2 247 934 15 703 4 143
197 908
1 787 748
明 473.39
0.386 5
793 356
3 605 729 5 604 12 042 524 216
4 127 900
55.28
88.11
419 681
842 321
安 674.50
0.409 4
739 905
3 665 942 10 311 9 766
408 896
5 863 980
114.01
885 169
65.83
27.21
23.72
55.27
550 890
219 251
178 621
517 622
南
海
重
成
贵
昆
西
兰
西
银
州 287.59
0.544 5
259 444
2 940 884 1 832 4 749
169 540
2 641 568
宁 133.95
0.522 7
65 848
711 310
1 746 1 469
49 134
川 95.38
0.570 9
171 603
661 226
2 106 1 193
74 758
855 051
814 103
乌鲁木齐 158.92
0.824 4
78 513
1 847 241 2 668 9 041
254 870
2 365 508
4.2 运行结果
>> cwprint('cwbook.txt',35,10)
fid =
6
数据标准化结果如下:
v1 =
0.0581
0.0423
0.0407
0.0139
0.0097
0.0315
0.0253
0.0321
0.0431
0.0610
0.0250
0.0286
0.0250
0.0200
0.0356
0.0346
0.0139
0.0391
0.0263
0.0375
0.0295
0.0242
0.0276
0.0440
0.0318
0.0212
0.0152
0.0190
0.0435
0.0354
0.0688
0.0056
0.0086
0.0305
0.0443
0.0437
0.0628
0.0488
0.0233
0.0334
0.0337
0.0148
0.0680
0.0770
0.0234
0.0093
0.0028
0.0198
0.0286
0.0203
0.0142
0.1853
0.0444
0.0408
0.0361
0.0085
0.0557
0.0089
0.0080
0.0053
0.0064
0.0213
0.0295
0.0132
0.0184
0.0176
0.0391
0.0490
0.0609
0.0134
0.1112
0.0642
0.0047
0.0290
0.0064
0.0376
0.0468
0.0233
0.0184
0.1086
0.0273
0.0285
0.0251
0.0037
0.1194
0.0483
0.0151
0.0087
0.0045
0.0243
0.0304
0.0153
0.0206
0.1848
0.0284
0.0192
0.0215
0.0100
0.1392
0.1184 0.1083
0.0544
0.0534
0.0499
0.0183
0.0314
0.0252
0.0234
0.0174
0.0158
0.0111 0.0075
0.0062
0.0398
0.0357
0.0278
0.0233
0.0248
0.0334
0.0213
0.0270
0.0212
0.0285
0.0455
0.0316
0.1352
0.0888
0.1148
0.0327
0.0300
0.0251
0.0328
0.0255
0.0285
0.0199
0.0164
0.0232
0.0072
0.0125
0.0089
64
《计量地理学》(徐建华,高等教育出版社,2005)配套实习指导
0.0271
0.0060
0.0197
0.0259
0.0327
0.0286
0.0344
0.0271
0.0318
0.0056
0.0133
0.0025
0.1428
0.0466
0.0149
0.0220
0.0313
0.0134
0.0062
0.0044
0.0074
0.0223
0.0508
0.0163
0.0195
0.0079
0.0290
0.0078
0.0162
0.0237
0.0214
0.0350
0.0243
0.0391
0.0562
0.0220
0.0180
0.0160
0.0204
0.0255
0.0286
0.0349
0.0105
0.0270
0.0185
0.0793
0.0377
0.0370
0.0692
0.0071
0.0472
0.0170
0.0039
0.0242
0.0011 0.0024
0.0497
0.0292
0.0983
0.0123
0.0200
0.0456
0.0199
0.0076
0.0085
0.0271
0.0187
0.0123
0.0230
0.0125
0.0174
0.0244
0.0100
0.0324
0.0061
0.0311 0.0016
0.0024
0.0022
0.0040
0.0340
0.0491
0.0019
0.0063
0.0243
0.0102
0.0101
0.0162
0.0367
0.0286
0.0268
0.0239
0.0603
0.0240
0.0141
0.0146
0.1437
0.1100
0.0430
0.0154
0.0283
0.0050
0.0048
0.0058
0.0073
0.0175
0.0063
0.0078
0.0287
0.0416
0.0165
0.0377
0.0140
0.0582
0.0104
0.0080
0.0057
0.0613
0.0479
0.0101
0.0294
0.0238
0.0116
0.0036
0.0029
0.0221
0.0200
0.0179
0.0072
0.0197
0.0282
0.0166
0.0259
0.0139
0.0754
0.0791
0.0064
0.0049
0.0385
0.0240
0.0085
0.0224
0.0175
0.0073
0.0021
0.0032
0.0109
0.0222
0.0093
0.0117
0.0182
0.0220
0.0227
0.0254
0.0153
0.0901
0.0421
0.0097
0.0072
0.0402
0.0331
0.0079
0.0182
0.0259
0.0117
0.0038
0.0036
0.0105
0.0164
0.0183
0.0159
0.0124
0.0116
0.0164
0.0182
0.0220
0.0232
0.0273
0.0168
0.0223
0.0317
0.0393
0.0144
0.0183
0.0735
0.0482
0.0240
0.0456
0.0119 0.0090
0.0050
0.0048
0.0387
0.0590
0.0290
0.0350
0.0101
0.0146
0.0232
0.0203
0.0213
0.0300
0.0133
0.0173
0.0072
0.0053
0.0043
0.0063
0.0146
0.0125
相关系数矩阵:
std =
1.0000
-0.3444
0.8425
0.3603
0.7390
0.6215
0.4039
0.4967
0.6761
0.4689
-0.3444
1.0000
-0.4750
0.3096
-0.3539
0.1971
0.3571
0.2600
0.1570
0.3090
0.8425
-0.4750
1.0000
0.3358
0.5891
0.5056
0.3236
0.4456
0.5575
0.3742
0.3603
0.3096
0.3358
1.0000
0.1507
0.7664
0.9412
0.8480
0.7320
0.8614
0.7390
-0.3539
0.5891
0.1507
1.0000
0.4294
0.1971
0.3182
0.3893
0.2595
0.6215
0.1971
0.5056
0.7664
0.4294
1.0000
0.8316
0.8966
0.9302
0.9027
0.4039
0.3571
0.3236
0.9412
0.1971
0.8316
1.0000
0.9233
0.8376
0.9527
0.4967
0.2600
0.4456
0.8480
0.3182
0.8966
0.9233
1.0000
0.9201
0.9731
0.6761
0.1570
0.5575
0.7320
0.3893
0.9302
0.8376
0.9201
1.0000
0.9396
0.4689
0.3090
0.3742
0.8614
0.2595
0.9027
0.9527
0.9731
0.9396
1.0000
特征向量(vec):
vec =
-0.1367
0.2282
-0.0329 -0.0217
-0.2628
0.0009
0.1939
0.0446
0.6371 -0.2163
-0.1447 -0.4437
0.3176
0.4058
-0.1312
-0.4191
-0.5562 0.5487
0.2758
0.0593
65