【老生谈算法】matlab实现主成分算法源码——主成分

主成分(matlab数据处理)与MATLAB源码

1、算法详解:

主成分分析(principal component Analysis)又称主分量分析,是由皮尔逊(pearson)于1901年首先引入,后来由霍特林(hotelling)于1933年进行了发展。主成分分析是一种通过降维技术把多个变量化为少数几个主成分(即综合变量)的多元统计方法,这些主成分能够反映原始变量的大部分信息,通常表示为原始变量的线性组合,为使得这些主成分所包含的信息互不重叠,要求各主成分之间互不相关。主成分分析在很多领域有着广泛的应用,一般来说,当研究的问题涉及很多变量,并且变量间相关性明显,即包含的信息有所重叠时,可以考虑用主成分分析的方法,这样容易抓住事物的主要矛盾,使得问题得到简化。

本章主要内容包括:主成分分析的理论简介,主成分分析的MATLAB实现,主成分分析的主要具体案例。
11.1主成分分析简介
11.1.1主成分分析的几何意义

【老生谈算法】matlab实现主成分算法源码——主成分_第1张图片

主成分分析的过程其实就是坐标系旋转的过程,新坐标系的各个坐标系的轴的方向是原始数据变差最大的方向,各主成分表达式就是新旧坐标转换关系式。

11.1.2 总体的主成分

1从总体协方差矩阵出发求解主成分

在这里插入图片描述

【老生谈算法】matlab实现主成分算法源码——主成分_第2张图片

【老生谈算法】matlab实现主成分算法源码——主成分_第3张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第4张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第5张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第6张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第7张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第8张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第9张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第10张图片
【老生谈算法】matlab实现主成分算法源码——主成分_第11张图片

其中,均为单位向量。下面求,使得的方差达到最大。
设为的个特征值,为相应的正交单位特征向量,即,,,,
由矩阵知识可知

其中为正交矩阵,是对角元素为的对角矩阵。
考虑的方差

          (11.3)

由式(11.3)可知,当时,的方差达到最大,最大值为。称为第一主成分。如果第一主成分从数据中提取的信息还不够多,还应考虑第二主成分。下面求,在条件下使得的方差达到最大。由

可得,于是

        (11.4)

由式(11.4)可知,当时,的方差达到最大,最大值为。称为第二主成分。类似的,在约束下可得,当时的方差达到最大,最大值为。称
为第i主成分。
2主成分的性质
(1)主成分向量的协方差矩阵为对角阵

(11.5)


即主成分向量的协方差矩阵为对角矩阵。
(2)主成分的总方差等于原始变量的总方差:
设协方差矩阵,则,于是
由此可见,原始数据的总方差等于个互不相关的主成分的方差之和,也就是说个互不相关的主成分包含了原始数据中的全部信息,但是主成分所包含的信息更为集中。
总方差中第个主成分的方差所占的比例称为主成分的贡献率。主成分的贡献率反映了主成分综合原始变量信息的能力,也可理解为解释原始变量的能力。由贡献率定义知,个主成分的贡献率依次递减,即综合原始变量信息的能力依次递减。第一个主成分的贡献率最大,即第一个主成分综合原始变量信息的能力强。
前个主成分的贡献率之和称为前个主成分的累积贡献率,它反映了前个主成分综合原始变量信息(或解释原始变量)的能力。由于主成分分析的主要目的是降维,所以需要在信息损失不太多的情况下,用少数几个主成分来代替原始变量,以进行后续的分析,究竟用几个主成分来代替原始变量才合适呢?通常的做法是取较小的,使得恰前个主成分的累积贡献率不低于某一水平(如85%以上),这样就达到了降维的目的。
(3)原始变量与主成分之间的相关系数
由式(11.5)可知于是
(11.6)
从而

(4)前个主成分对变量的贡献率

为前个主成分对变量的贡献率。这个贡献率反映了前个主成分从变量中提取的信息的多少。由式(11.6)可知,固所有个主成分对变量的贡献率为

(5)原始变量对主成分的贡献
主成分的表达式为

称为第个主成分在第个原始变量上的载荷,它反映了对的重要程度。在实际问题中,通常根据载荷解释主成分的实际意义。
3,从总体相关系数矩阵出发求解主成分
当总体各变量取值的单位或数量级不同时,从总体协方差矩阵出发求解主成分就显得不合适了,此时应将每个变量标准化。记标准化变量为

则可以从标准化总体的协方差矩阵求解主成分,即从总体的相关系数矩阵出发求解主成分,因为总体协方差矩阵就是的相关系数矩阵。
设总体的相关系数矩阵为,从出发求解主成分的步骤与从出发求解主成分的步骤一样,设为的个特征值,为相应的正交单位特征向量。则个主成分为
(11.7)
记 (11.8)
则有以下结论

此时前个主成分的累积贡献率为。
11.1.3 样本的主成分
在实际生活问题中,总体的协方差矩阵或相关系数矩阵往往是未知的,需要由样本进行估计。设为取自总体的样本,其中。记样本观测值矩阵为

的每一行对应一个样品,每一列对应一个变量。记样本协方差矩阵和样本相关系数矩阵分别为

其中为样本均值。将作为的估计,作为的估计,从或出发可求得样本的主成分
1.从样本协方差矩阵出发求解主成分
设为的个特征值,为相应的正交单位特征向量,则样本的个主成分为
(11.9)
将样品的观测值带入第个主成分,称得到的值为样品的观测值带入第主成分得分。
从样本相关系数矩阵出发求解主成分
设为的个特征值,为相应的正交单位特征向量,则样本的个主成分为
(11.10)
将样品标准化后的观测值带入第个主成分,即可得样品的第主成分得分

3,由主成分得分重建(恢复)原始数据
假定从样本协方差矩阵出发求解主成分,记为样本的主成分得分值矩阵,则
(11.11)
注意到为正交矩阵,则有,于是由式(11.11)可得,也就是说根据主成分得分和主成分表达式,可以重建(恢复)原始数据,这在数据压缩与解压缩中有着重要的作用。当然在实际应用中,可能不会得到全部的个主成分,假定只用前个主成分记样本的前个主成分的得分矩阵为

当前个主成分的累积贡献率达到一个比较高的水平时,由得到的矩阵可以作为原始样本观测值矩阵的一个很好的近视,此时为样本的残差,MATLAB统计工具箱中提供了重建数据和求残差的函数pcares。若和的数据量小于原始样本观测值矩阵的数据量,就能起到数据压缩的目的。
以上讨论的是从样本协方差矩阵出发求解主成分,然后由样本的主成分得分重建原始数据。若从样本的相关系数矩阵出发求解主成分,同样可以由样本的主成分得分重建原始数据,只是此时需要进行逆标准化变换,这里不再作详细讨论。
11.1.4关于主成分表达式的两点说明
这里需要说明的是,即使限定了方差矩阵或相关系数矩阵的个特征值对应的特征向量为正交单位向量,它们也是不唯一的,从而主成分的表达式也是不唯一的,假如若是总体或样本的一个主成分,则也是总体或样本的一个主成分。主成分表达式的不唯一对后续分析没有太大影响。
若第个主成分的贡献率非常非常小,可认为第个主成分的方差,即(为一个常数),这揭示了变量之间的一个共线性关系:。
11.2 主成分分析的MATLAB函数
与主成分相关的MATLAB函数主要有pcacov,princomp和pcares,下面分别介绍。
11.2.1 pcacov函数
pcacov函数用来根据协方差矩阵或相关系数矩阵进行主成分分析,其调用格式如下:
COEFF=pacov(v)
[COEFF,latent]= pcacov(v)
[COEFF,latent,explained]=pcacov(v)
以上调用的输入参数V是总体或样本的协方差矩阵或相关系数矩阵,对于维总体,V是的矩阵。输出参数COEFF是个主成分的系数矩阵,它是的矩阵,它的第i列是第i个主成分的系数向量。输出参数latent是个主成分的方差构成的列向量,即V的个特征值(从大到小)构成的向量。输出参数explained是个主成分的贡献率向量,已经转化为百分比。
11.2.2 princomp函数
princomp函数用来根据样本观测值矩阵进行主成分分析,其调用格式如下:
1)[COEFF,SCORE]=princomp(x)
根据样本观测值矩阵X进行主成分分析。输入参数X是n行p列的矩阵,每一行对应一个观测(样品),每一列对应一个变量。输出参数COEFF是个主成分的系数矩阵,它是的矩阵,它的第i列是第i个主成分的系数向量。输出参数SCORE是n个样品的个主成分的得分矩阵,它是n行p列的矩阵,每一行对应一个观测值,每一列对应一个主成分,第i行第j列元素是i个样品的第j个主成分得分。
2)[COEFF,SCORE,latent]=princomp(x)
返回样本协方差矩阵的特征向量latent,它是由p个特征值构成的列向量,其中特征值按降序排列。
3)[COEFF,SCORE,latent,tsqure]=princomp(x)
返回一个包含p个元素的列向量tsqure,它的第i个元素是第i个观测对应的霍特林(Hotelling)统计量,描述了第i个观测与数据集(样本观测矩阵)的中心之间的距离,可用来寻找远离中心的极端数据。
设为样本协方差矩阵的p个特征值,并设第i个样品的第j个主成分得分,则第i个样品对应的(Hotelling)统计量为

注意:princomp函数对样本数据进行了中心化处理,即把X中的每一个元素减去其所在列的均值,相应地,princomp函数返回的主成分就是中心化的主成分得分。
当,即观测的个数小于或等于维数时,SCORE矩阵的第n列到第p列元素均为0,latent第n到第p个元素均为0。
4)[…]=princomp(x,‘econ’)
通过设置’econ’参数,使得当时,只返回latent中的前n-1个元素(去掉不必要的0元素)及COEFF和SCORE矩阵中相应的列。
11.2.3 pcares函数
在11.1.3节曾讨论过由样本的主成分得分重建(恢复)原始数据的问题,若只用前个主成分的得分来重建原始数据,则可能会有一定的误差,前面称之为残差。MATLAB统计工具箱中提供了pcares函数,用来重建数据,并求样本观测值矩阵中每个观测的每一个分量所对应的残差,其调用格式如下:
residuals=pcares(x,ndim)
[residuals,reconstructed]=pcares(x,ndim)
上述调用中X是n行p列的样本观测值矩阵,它的每一行对应一个观测(样品),每一列对应一个变量,ndim参数用来指定所用的主成分的个数,它是一个小于或等于p的正的标量,最好取为正整数。输出参数residuals是一个与X同样大小的矩阵,其元素为X中相应元素所对应的残差。输出参数reconstructed为用前ndim个主成分的得分重建的观测数据,它是X的一个近似。
注意:pcares调用了 princomp函数,它只能接受原始样本观测数据作为他的输入,并且它不会自动对数据作标准化变换,若需要对数据作标准化变换,可以先用zscore函数将数据标准化,然后调用pcares函数重建观测数据并求残差。若从协方差矩阵或相关系数矩阵出发求解主成分,请用pcacov函数,此时无法重建观测数据和求残差。
11.3 案例32:从协方差矩阵或相关系数矩阵出发求解主成分
在制定服装标准的过程中,对128名成年男子的身材进行了测量,每日测了六项指标,身高(),座高(),胸围(),手臂长(),肋围()和腰围(),样本相关系数矩阵如表11-1所列。试根据样本相关系数矩阵进行主成分分析。
表11-1 128名男子身材的六项指标的样本相关系数矩阵

变量
身高()
座高()
胸围()
手臂长()
肋围()
腰围()
身高()
1
0.79
0.36
0.76
0.25
0.51
座高()
0.79
1
0.31
0.55
0.17
0.35
胸围()
0.36
0.31
1
0.35
0.64
0.58
手臂长()
0.76
0.55
0.35
1
0.64
0.38
肋围()
0.25
0.17
0.64
0.16
1
0.63
腰围()
0.51
0.35
0.58
0.38
0.63
1

13.3.1 调用pcacov函数作主成分分析
对于本案例,调用pacov函数作主成分分析的命令与结果如下:

%定义相关系数矩阵PHO
PHO=[1  0.79	  0.36	 0.76	0.25	  0.51
0.79	   1	  0.31	 0.55	0.17	  0.35
0.36	   0.31	  1	     0.35	0.64	  0.58
0.76	   0.55	  0.35	 1	    0.16	  0.38
0.25       0.17	  0.64	 0.16	1	  0.63
0.51	   0.35   0.58	 0.38	0.63	  1];  
%利用pacov函数根据相关系数矩阵作主成分分析,返回主成分分析表达式的系数矩阵COEFF,%返回相关系数矩阵的特征向量latent和主成分分析贡献率向量explained
[COEFF,latent,explained]=pcacov(PHO) 

>> [COEFF,latent,explained]=pcacov(PHO)
COEFF =
   -0.4689   -0.3648    0.0922   -0.1224   -0.0797    0.7856
   -0.4037   -0.3966    0.6130    0.3264    0.0270   -0.4434
   -0.3936    0.3968   -0.2789    0.6557    0.4052    0.1253
   -0.4076   -0.3648   -0.7048   -0.1078   -0.2346   -0.3706
   -0.3375    0.5692    0.1643   -0.0193   -0.7305   -0.0335
   -0.4268    0.3084    0.1193   -0.6607    0.4899   -0.1788
latent =
    3.2872
    1.4062
    0.4591
    0.4263
    0.2948
    0.1263
explained =
   54.7867
   23.4373
    7.6516
    7.1057
    4.9133
    2.1054
%为了更直观,以元胞数组形式显示结果
result1(1,:)={'特征值','差值','贡献率','累积贡献率'};
result1(2:7,1)=num2cell(latent);
result1(2:6,2)=num2cell(-diff(latent));
result1(2:7,3:4)=num2cell([explained,cumsum(explained)])  


result1 = 
    '特征值'    '差值'      '贡献率'     '累积贡献率'
    [3.2872]    [1.8810]    [54.7867]    [   54.7867]
    [1.4062]    [0.9471]    [23.4373]    [   78.2240]
    [0.4591]    [0.0328]    [ 7.6516]    [   85.8756]
    [0.4263]    [0.1315]    [ 7.1057]    [   92.9813]
    [0.2948]    [0.1685]    [ 4.9133]    [   97.8946]
    [0.1263]          []    [ 2.1054]    [       100]
%以元胞数组形式显示前3个主成分表达式
>> s={'标准化变量';'x1:身高';'x2:座高';'x3:胸围';'x4:手臂长';'x5:肋围';'x6:腰围'};
>> result2(:,1)=s;
>> result2(1,2:4)={'prin1','prin2','prin3'};
>> result2(2:7,2:4)=num2cell(COEFF(:,1:3))

result2 = 
    '标准化变量'    'prin1'      'prin2'      'prin3'  
    'x1:身高'       [-0.4689]    [-0.3648]    [ 0.0922]
    'x2:座高'       [-0.4037]    [-0.3966]    [ 0.6130]
    'x3:胸围'       [-0.3936]    [ 0.3968]    [-0.2789]
    'x4:手臂长'     [-0.4076]    [-0.3648]    [-0.7048]
    'x5:肋围'       [-0.3375]    [ 0.5692]    [ 0.1643]
    'x6:腰围'       [-0.4268]    [ 0.3084]    [ 0.1193]

为了结果看上去更加直观,上面定义了两个元胞数组:result1和result2,用result1存放特征值,贡献率和累积贡献率,用result2存放3个主成分表达式的系数数据,即COEFF矩阵的前3列。这样做的目的仅是为了直观,读者也可以直接对pcacov函数返回的结果进行分析。
11.3.2 结果分析
从result1的结果来看,前3个主成分的累积贡献率达到了85.8756%,因此可以用前3个主成分后续的分析i;这样做虽然会有一定的信息损失,但损失不大,不影响大局。result2中列出了前3个主成分的相关结果,可知前3个主成分的表达式分别为

从第一主成分的表达式来看,它在每个标准化变量上有近似的负载荷,说明每个标准化变量对的重要性都差不多。当一个人的身材“五大三粗”,也就是说又高又胖时,,,,都比较大,此时的值就比较小,反之,当一个人又矮又瘦时,,,都比较小,此时的值就比较大,所以可以认为第一主成分是身材的综合成分(或魁梧成分)。
从第二主成分的表达式来看,它在标准化变量,,和上有近似的负载荷,在,,上有近似的正载荷,说明当,,和增大时,的值减小,当,,增大时,的值增大。当一个人的身材瘦高时,的值比较小,当一个人的身材矮胖时,的值比较大,所以可以认为第二主成分是身材的高矮和胖瘦的协调成分
从第三主成分的表达式来看,它在标准化变量上有比较大的正载荷,在上有比较大的负载荷,在其它变量上的载荷比较小,,说明(坐高)和(手臂长)对的影响比较大,也就是说反映坐高(即上半身)与手臂长之间的协调关系,这对做长袖上衣时制定衣服和袖子的长短提供了参考。所以可认为第三主成分是臂长成分
后3个主成分的贡献率比较小,分别只有7.1057%,4.9133%和2.1054%,可以不用对它们作出解释。最后一个主成分的贡献率非常小,它揭示了标准化变量之间的如下共线性关系

11.4 案例33:从样本观测值矩阵出发求解主成分

表11-2列出了2007年我国31个省,市,自治区和直辖市的农村居民家庭平均每人全年消费支出的8个主要变量数据。数据来源:中华人民共和国国家统计局网站,2008年《中国统计年鉴》。数据保存在文件 .xls中,数据格式如表11-2所列,是根据这8个主要变量的观测数据,进行主成分分析
地 区
食 品
衣 着
居 住
家庭设备
及 服 务
交通和
通 讯
文教娱乐
用品及服务
医疗保健
其他商品
及 服 务
北 京
2132.51
513.44
1023.21
340.15
778.52
870.12
629.56
111.75
天 津
1367.75
286.33
674.81
126.74
400.11
312.07
306.19
64.30
河 北
1025.72
185.68
627.98
140.45
318.19
243.30
188.06
57.40
山 西
1033.68
260.88
392.78
120.86
268.75
370.97
170.85
63.81
内蒙古
1280.05
228.40
473.98
117.64
375.58
423.75
281.46
75.29
辽 宁
1334.18
281.19
513.11
142.07
361.77
362.78
265.01
108.05
吉 林
1240.93
227.96
399.11
120.95
337.46
339.77
311.37
87.89
黑龙江
1077.34
254.01
691.02
104.99
335.28
312.32
272.49
69.98
上 海
3259.48
475.51
2097.21
451.40
883.71
857.47
571.06
249.04
江 苏
1968.88
251.29
752.73
228.51
543.97
642.52
263.85
134.41
浙 江
2430.60
405.32
1498.50
338.80
782.98
750.69
452.44
142.26
安 徽
1192.57
166.31
479.46
144.23
258.29
283.17
177.04
52.98
福 建
1870.32
235.61
660.55
184.21
465.40
356.26
174.12
107.00
江 西
1492.02
147.71
474.49
121.54
277.15
252.78
167.71
61.08
山 东
1369.20
224.18
682.13
195.99
422.36
424.89
230.84
71.98
河 南
1017.43
189.71
615.62
136.37
269.46
212.36
173.19
62.26
湖 北
1479.04
168.64
434.91
166.25
281.12
284.13
178.77
97.13
湖 南
1675.16
161.79
508.33
152.60
278.78
293.89
219.95
86.88
广 东
2087.58
162.33
763.01
163.85
443.24
254.94
199.31
128.06
广 西
1378.78
86.90
554.14
112.24
245.97
172.45
149.01
47.98
海 南
1430.31
86.26
305.90
93.26
248.08
223.98
95.55
73.23
重 庆
1376.00
136.34
263.73
138.34
208.69
195.97
168.57
39.06
四 川
1435.52
156.65
366.45
142.64
241.49
177.19
174.75
52.56
贵 州
998.39
99.44
329.64
70.93
154.52
147.31
79.31
34.16
云 南
1226.69
112.52
586.07
107.15
216.67
181.73
167.92
38.43
西 藏
1079.83
245.00
418.83
133.26
156.57
65.39
50.00
68.74
陕 西
941.81
161.08
512.40
106.80
254.74
304.54
222.51
55.71
甘 肃
944.14
112.20
295.23
91.40
186.17
208.90
149.82
29.36
青 海
1069.04
191.80
359.74
122.17
292.10
135.13
229.28
47.23
宁 夏
1019.35
184.26
450.55
109.27
265.76
192.00
239.40
68.17
新 疆
939.03
218.18
445.02
91.45
234.70
166.27
210.69
45.25

你可能感兴趣的:(matlab精选项目源码,matlab,算法,开发语言)