主成分分析法MATLAB实现.docx
《主成分分析法MATLAB实现.docx》由会员分享,可在线阅读,更多相关《主成分分析法MATLAB实现.docx(22页珍藏版)》请在冰点文库上搜索。
主成分分析法MATLAB实现
.
MATLAB
结
课
作
业
.
.
指导老师:
张肃
班级:
信管121
姓名:
桂亚东
学号:
201200654118
利用Matlab编程实现主成分分析
概述
Matlab语言是当今国际上科学界(尤其是自动控制领域)最具影响力、也是
最有活力的软件。
它起源于矩阵运算,并已经发展成一种高度集成的计算机语言。
它提供了强大的科学运算、灵活的程序设计流程、高质量的图形可视化与界面设
计、与其他程序和语言的便捷接口的功能。
Matlab语言在各国高校与研究单位
起着重大的作用。
主成分分析是把原来多个变量划为少数几个综合指标的一种统
计分析方法,从数学角度来看,这是一种降维处理技术。
1.1主成分分析计算步骤
.
.
①计算相关系数矩阵
r
11
r
12
r
1p
R
r
21
r
22
r
2
p
rr
p1p2
r
pp
(1)
在(3.5.3)式中,rij(i,j=1,2,⋯,p)为原变量的xi与xj之间的相关
系数,其计算公式为
n
(x
ki
x
i
)(
x
kj
x
j
)
r
ij
n
k1
n
(x
ki
x
i
)
2
(xx
kj
j
)
2
k1k1
(2)
因为R是实对称矩阵(即rij=rji),所以只需计算上三角元素或下三角元素即可。
②计算特征值与特征向量
首先解特征方程IR0,通常用雅可比法(Jacobi)求出特征值
(i1,2,,p)
i,并使其按大小顺序排列,即12,p0;然后分别求
出对应于特征值
p
2
i的特征向量ei(i1,2,,p)。
这里要求ei=1,即e1,
ij
j1
其中
e表示向量ei的第j个分量。
ij
③计算主成分贡献率及累计贡献率
主成分
z的贡献率为
i
.
.
i
(i1,2,,p)p
k
k1
累计贡献率为
i
k
k
1ip
(1,2,,)p
k
k1
一般取累计贡献率达85—95%的特征值,2,,
1所对应的第一、第
m
二,⋯,第m(m≤p)个主成分。
④计算主成分载荷
其计算公式为
lp(z,x)e(i,j1,2,,p)
ij(3)
ijiij
得到各主成分的载荷以后,还可以按照(3.5.2)式进一步计算,得到各主
成分的得分
z
11
z
12
z
1m
Z
z
21
z
22
z
2m
z
n1
z
n2
z
nm
(4)
2.函数作用
.
.
Cwstd.m——用总和标准化法标准化矩阵
Cwfac.m——计算相关系数矩阵;计算特征值和特征向量;对主成分进行
排序;计算各特征值贡献率;挑选主成分(累计贡献率大于85%),输出主成分
个数;计算主成分载荷
Cwscore.m——计算各主成分得分、综合得分并排序
Cwprint.m——读入数据文件;调用以上三个函数并输出结果
1.2源程序
3.1cwstd.m总和标准化法标准化矩阵
%cwstd.m,用总和标准化法标准化矩阵
functionstd=cwstd(vector)
cwsum=sum(vector,1);%对列求和
[a,b]=size(vector);%矩阵大小,a为行数,b为列数
fori=1:
a
forj=1:
b
std(i,j)=vector(i,j)/cwsum(j);
end
.
.
end
3.2cwfac.m计算相关系数矩阵
%cwfac.m
functionresult=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')
forz=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=[];
.
.
fork=length(y):
-1:
1
sumrate=sumrate+rate(k);
newi(length(y)+1-k)=i(k);
ifsumrate>0.85break;
end
end%记下累积贡献率大85%的特征值的序号放入newi中
fprintf('主成分数:
%g\n\n',length(newi));
fprintf('主成分载荷:
\n')
forp=1:
length(newi)
forq=1:
length(y)
result(q,p)=sqrt(newval(newi(p)))*vec(q,newi(p));
end
end%计算载荷
disp(result)
3.3cwscore.m
%cwscore.m,计算得分
functionscore=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.4cwprint.m
%cwprint.m
functionprint=cwprint(filename,a,b);
%filename为文本文件文件名,a为矩阵行数(样本数),b为矩阵列数(变量指标数)
fid=fopen(filename,'r')
vector=fscanf(fid,'%g',[ab]);
fprintf('标准化结果如下:
\n')
v1=cwstd(vector)
result=cwfac(v1);
cwscore(v1,result);
3.2程序测试
4.1原始数据
中国大陆35个大城市某年的10项社会经济统计指标数据见下表。
.
.
城市
名称
年底
总人口
(万人)
非农
业
人口比
(%)
农业
总产值
(万元)
工业
总产值
(万元)
客运货运地方财政
总量
(万人)
总量
(万吨)
预算内收
入(万元)
城乡居民
年底储蓄
余额
(万元)
在岗职
工人数
(万人)
在岗职工
工资总额
(万元)
北京1249.90
1.3
8
1843427
19999
706
20
323
45
562
2790863
26806
646
3.35773301
天津910.17
4.2
9
1501136
22645
502
3259
26
317
1128073
11301
931
202.682254343
石家庄875.40
0.233
2
2918680688576829291911352348709587595.60758877
太原299.92
0.656
3
23603827377501937
11
895
203277394310088.65654023
呼和浩特207.78
0.441
2
36534381645223512623105783139658842.11309337
沈阳677.08
0.629
9
129541858267337782
15
412
5679199016998135.451152811
大连545.31
0.494
6
18797398426385
10
780
19
187
709227755679694.15965922
长春691.23
0.406
8
18532105966343481095323570964803744102.63884447
哈尔滨927.09
0.462
7
26638554186123672075204814436450020172.791309151
上海1313.12
0.738
4
2069019
54529
098
6406
44
485
4318500
25971
200
336.845605445
南京537.44
0.534
1
989199
13072
737
14
269
11
193
6642995680472113.811357861
杭州616.05
0.355
6
1414737
12000
796
17
883
11
684
449593742596796.901180947
宁波538.41
0.254
7
1428235
10622
866
22
215
10
298
501723524635062.15824034
合肥429.95
0.318
4
628764251412548931517233628162293147.27369577
福州583.13
0.273
3
2152288655535188517190467524503022069.59680607
厦门128.99
0.486
5
333374575112437282570418758210833146.93657484
南昌424.20
0.398
8
688289230588136743189167714264046062.08479,555
济南557.630.40814863026285882591511460690412697083.31756696
.
.
5775
青岛702.97
1.4
3
2382320
11492
036
13
408
17
038
6584354978045103.52961704
郑州615.36
3.4
4
6774255287601
10
433
6768387252513533884.66696848
武汉740.20
4.3
9
121129175060859793
15
442
6046585748055149.201314766
长沙582.47
202.69
7
1146367309817987065718323660346124469.57596986
广州685.00
0.234
4
1600738
23348
139
22
007
23
854
1761499
20401
811
0.6573047594
深圳119.85
0.442
1
299662
20368
295
875442741847908951990091.261890338
南宁285.87
0.630
4
720486114969151303293149700219091845.09371809
海口54.38
0.495
4
4481571746153452356115174162680019.01198138
重庆3072.34
0.407
7
41687808585525
52
441
25
124
898,9129090969223.731606804
成都1003.560.33519355905894289
40
140
19
632
5611897479684132.891200671
贵阳321.50
0.463
7
3620612247934
15
703
4143197908178774855.28419681
昆明473.39
0.739
5
79335636057295604
12
042
524216412790088.11842321
西安674.50
336.85
4
7399053665942
10
311
97664088965863980114.01885169
兰州287.59
0.535
5
259444294088418324749169540264156865.83550890
西宁133.95
0.356
7
65848711310174614694913485505127.21219251
银川95.38
0.255
9
171603661226210611937475881410323.72178621
乌鲁木齐158.92
0.319
4
78513184724126689041254870236550855.27517622
.
.
1.5运行结果
>>cwprint('cwbook.txt',35,10)
fid=
6
数据标准化结果如下:
v1=
3.50.03560.04350.06800.05570.11120.11940.11840.1083
4.4
202.700.03460.03540.07700.00890.06420.04830.04990.0534
0.235
0.6580.01390.06880.02340.00800.00470.01510.03140.0252
0.443
0.6310.03910.00560.00930.00530.02900.00870.01740.0234
0.496
0.4080.02630.00860.00280.00640.00640.00450.00620.0111
0.464
.
.
1.60.03750.03050.01980.02130.03760.02430.03980.0357
3.6
4.50.02950.04430.02860.02950.04680.03040.03340.0248
202.71
0.2360.02420.04370.02030.01320.02330.01530.02120.0270
0.659
0.4440.02760.06280.01420.01840.01840.02060.02850.0455
0.632
0.4970.04400.04880.18530.01760.10860.18480.11480.0888
0.409
0.4650.03180.02330.04440.03910.02730.02840.02510.0300
0.740
336.860.02120.03340.04080.04900.02850.01920.03280.0255
0.536
0.3570.01520.03370.03610.06090.02510.02150.02320.0164
0.256
0.2570.01900.01480.00850.01340.00370.01000.00720.0125
0.320
0.2740.01630.05080.02230.02430.01750.02000.02220.0183
0.487
0.3990.02900.00790.01950.01020.00630.01790.00930.0124
0.159
.
.
1.70.02370.01620.00780.01010.00780.00720.01170.0164
3.7
4.60.02430.03500.02140.01620.02870.01970.01820.0220
202.72
0.2370.02200.05620.03910.03670.04160.02820.02200.0273
0.660
0.4450.02040.01600.01800.02860.01650.01660.02270.0223
0.633
0.4980.03490.02860.02550.02680.03770.02590.02540.0393
0.410
0.4660.01850.02700.01050.02390.01400.01390.01530.0183
0.741
336.870.03700.03770.07930.06030.05820.07540.09010.0482
0.537
0.3580.04720.00710.06920.02400.01040.07910.04210.0240
0.258
0.3210.02420.01700.00390.01410.00800.00640.00970.0119
0.275
0.4880.04970.00110.00240.01460.00570.00490.00720.0050
0.400
0.1600.01230.09830.02920.14370.06130.03850.04020.0590
0.387
.
.
1.80.01990.04560.02000.11000.04790.02400.03310.0350
3.8
4.70.02710.00850.00760.04300.01010.00850.00790.0146
202.73
0.2380.02300.01870.01230.01540.02940.02240.01820.0232
0.661
0.4460.02440.01740.01250.02830.02380.01750.02590.0300
0.634
0.4990.03240.00610.01000.00500.01160.00730.01170.0173
0.411
0.4670.03110.00160.00240.00480.00360.00210.00380.0072
0.742
336.880.03400.00400.00220.00580.00290.00320.00360.0063
0.538
0.3590.04910.00190.00630.00730.02210.01090.01050.0146
0.259
相关系数矩阵:
std=
0.322-0.34440.84250.36030.73900.62150.40390.49670.6761
.
.
1.9
-0.34441.0000-0.47500.3096-0.35390.19710.35710.26000.1570
3.9
4.8-0.47501.00000.33580.58910.50560.32