降维之主成分分析法(PCA) (4)

降维之主成分分析法(PCA)

同理,第k个主成分的表达式为:

降维之主成分分析法(PCA)

我们知道用主成分的方差来衡量其所能解释的数据集的方差,而主成分的方差就是X的协方差矩阵的特征值λ,所以第k个主成分的方差就是λk。我们来定义一个指标,叫做主成分Yk的方差贡献率,它是第k个主成分的方差占总方差的比例:

降维之主成分分析法(PCA)

那么前k个主成分的方差累计贡献率为:

降维之主成分分析法(PCA)

如果前k个主成分的方差累计贡献率超过了85%,那么说明用前k个主成分去代替原来的n个变量后,不能解释的方差不足15%,没有损失太多信息,于是我们可以把n个变量减少为k个变量,达到降维的目的。

五、主成分分析法的流程总结

我们为了推导出主成分分析法的线性代数解法,铺垫了很多,但推导出的结果却是相当简洁漂亮。现在我们省略中间的过程,看主成分分析法的计算流程。

假设我们拿到了一份数据集,有m个样本,每个样本由n个特征(变量)来描述,那么我们可以按照以下的步骤进行降维:

1、将数据集中的每个样本作为列向量,按列排列构成一个n行m列的矩阵;

2、将矩阵的每一个行向量(每个变量)都减去该行向量的均值,从而使得新行向量的均值为0,得到新的数据集矩阵X;

3、求X的协方差矩阵

降维之主成分分析法(PCA)

,并求出协方差矩阵的特征值λ和单位特征向量e;

4、按照特征值从大到小的顺序,将单位特征向量排列成矩阵,得到转换矩阵P,并按PX计算出主成分矩阵;

5、用特征值计算方差贡献率和方差累计贡献率,取方差累计贡献率超过85%的前k个主成分,或者想降至特定的k维,直接取前k个主成分。

六、主成分分析法计算的案例

为了更好地掌握主成分分析法的计算过程,我们来看一个例子。

假设我们想研究上海、北京房地产指数与其他价格指数之间的关系,设定了4个变量,如下表所示。

降维之主成分分析法(PCA)

样本数据取自1997年1月~2000年6月的统计资料,时间跨度为42个月,因此样本容量为m=42,为了简单起见,数据就不展示了。

第一步:计算数据集的协方差矩阵

将每个样本作为列向量构成一个矩阵,并对矩阵的每一个行向量进行0均值化,得到了4行42列的数据集矩阵X。我们直接由X得到其协方差矩阵:

降维之主成分分析法(PCA)

第二步:计算协方差矩阵的特征值和单位特征向量

我们用numpy来计算,代码如下:

import numpy as np from numpy import linalg # 协方差矩阵 C = [[1,-0.339,0.444,0.525], [-0.339,1,0.076,-0.374], [0.444,0.076,1,0.853], [0.525,-0.374,0.853,1]] # 计算特征值和特征向量 value,vector = linalg.eig(C) print(\'特征值为:\',np.round(value,4),\'\n\') for i in range(4): print(\'特征值\',np.round(value[i],4),\'对应的特征向量为:\n\',np.round(vector[:,i].T,4),\'\n\') # 求每一列的L2范数,如果都是1,则已经单位化了。 print(\'特征向量已经是单位特征向量了:\',linalg.norm(vector,ord=2,axis=0))

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwxdfd.html