本文所用为matlab2016a
matlab安装:待更新
matlab基础知识:待更新
如果本文内容已学会,可以看看python的哦
主成分分析(PCA)及其可视化——python_菜菜笨小孩的博客-CSDN博客
文章目录
3.求相关矩阵的特征值和相对应的特征向量(在此以协方差阵为例)
一、主成分分析的原理
主成分分析是利用降维的思想,在损失很少信息的前提下把多个指标转化为几个综合指标的多元统计方法。通常把转化生成的综合指标称之为主成分,其中每个主成分都是原始变量的线性组合,且各个主成分之间互不相关,这就使得主成分比原始变量具有某些更优越的性能。这样在研究复杂问题时就可以只考虑少数几个主成分而不至于损失太多信息,从而更容易抓住主要矛盾,揭示事物内部变量之间的规律性,同时使问题得到简化,提高分析效率。
主成分分析正是研究如何通过原来变量的少数几个线性组合来解释原来变量绝大多数信息的一种多元统计方法。
二、主成分分析的基本思想
研究某一问题涉及的众多变量之间有一定的相关性,就必然存在着起支配作用的共同因素,并根据这一点,通过对原始变量相关矩阵或协方差矩阵内部结构关系的研究,利用原始变量的线性组合形成几个综合指标(主成分),在保留原始变量主要信息的前提下起到降维与简化问题的作用,使得在研究复杂问题时更容易抓住主要矛盾。
利用主成分分析得到的主成分与原始变量之间有如下基本关系:
1.每一个主成分都是各原始变量的线性组合
2.主成分的数目大大少于原始变量的数目
3.主成分保留了原始变量绝大多数信息
4.各主成分之间互不相关
三、主成分分析步骤
1.主成分分析的步骤:
1.根据研究问题选取初始分析变量;
2.根据初始变量特性判断由协方差阵求主成分还是由相关阵求主成分(数据标准化的话需要用系数相关矩阵,数据未标准化则用协方差阵);
3.求协差阵或相关阵的特征根与相应标准特征向量;
4.判断是否存在明显的多重共线性,若存在,则回到第一步;
5.主成分分析的适合性检验
6.得到主成分的表达式并确定主成分个数,选取主成分;
7.结合主成分对研究问题进行分析并深入研究。
2.部分说明
一组数据是否可以用主成分分析,必须做适合性检验。可以用球形检验和KMO统计量检验。
(1)球形检验(Bartlett)
球形检验的假设:
H0:相关系数矩阵为单位阵(即变量不相关)
H1:相关系数矩阵不是单位阵(即变量间有相关关系)
(2)KMO(Kaiser-Meyer-Olkin)统计量
KMO统计量比较样本相关系数与样本偏相关系数,它用于检验样本是否适于作主成分分析。
KMO的值在0,1之间,该值越大,则样本数据越适合作主成分分析和因子分析。一般要求该值大于0.5,方可作主成分分析或者相关分析。
Kaiser在1974年给出了经验原则:
0.9以上 适合性很好
0.8~0.9 适合性良好
0.7~0.8 适合性中等
0.6~0.7 适合性一般
0.5~0.6 适合性不好
0.5以下 不能接受的
(3)主成分分析的逻辑框图
四、编程实现思路
1.主成分向量投射图
2.算法步骤
1.数据标准化
1.标准化的数据均值为0,标准差为1;就是原数据减去均值,再除以标准差(无偏估计)
2.求相关系数矩阵
3、求协方差矩阵C的特征值和相对应的特征向量
u为C的特征向量,lamda为u的特征值
4、将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k列组成矩阵P
5、Y=PX即为降维到k维后的数据
2.数据为标准化
1、对所有指标进行中心化:去均值
2、求协方差矩阵C
其中μ为指标的均值
3、求协方差矩阵C的特征值和相对应的特征向量
u为C的特征向量,lamda为u的特征值
4、将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k列组成矩阵P
5、Y=PX即为降维到k维后的数据
五、matlab主成分代码实现
1.读取数据
此为读取csv数据,括号内1,0;表示从第一行第一列读取,matlab默认以0行,0列开始读取
X= csvread('文件路径',1,0); %读取数据文件,第一行不读取
在此举例一个数据 data 下面都是用此数据进行做:
data = [1,-0.2,0.3,0.8,-0.5
-0.2,1,0.6,-0.7,0.2
0.3,0.6,1,0.5,-0.3
0.8,-0.7,0.5,1,0.7
-0.5,0.2,-0.3,0.7,1]
运行结果:
2.得到相关矩阵
(1)数据标准化做法
进行标准化:
z =zscore(data)
运行结果:
计算相关系数矩阵:
C = corr(z,'type','Pearson')
运行结果:
(2)数据未标准化做法
计算均值:
mapping.mean = mean(data, 1) %计算均值
运行结果:
进行中心化不会改变协方差阵的值,中心化不是标准化哦!!:
data = data - repmat(mapping.mean, [size(data, 1) 1])%去均值
运行结果:
计算协方差阵:
C = cov(data) %协方差矩阵
运行结果: