01 引言
之前发了几篇文章关于矩阵中 特征向量和PCA主元分析的文章,大家反响不错。当时并没有涉及到数学运算,只是大概讲了讲原理。
这篇文章我们一起来一步一步解读
- PCA的计算过程
- 如何用Python实现PCA分析
02 第一步:数据获取
第一步,大量的数据收集是必须的。手边此时并没有数据,就通过python自己制造点数据吧。
我们的项目计划是 看看 白种人和黄种人的基因差别。
gene = ['gene' + str(i) for i in range(1, 101)] #创造100个基因
白种人取5人(Wh1 到 Wh5)和黄种人取5人(Ye1 到 Ye5)。
white = ['Wh' + str(i) for i in range(1, 6)]
yellow = ['Ye' + str(i) for i in range(1, 6)]
data = pd.DataFrame(columns = [*white, *yellow], index = gene)
将所有的数据通过pandas包放入一个数据矩阵中。如下所示:
现在,我们给这个矩阵赋值,完全随机的,不要去管数据严谨性,毕竟全是假设的数据。
搞定数据了,一般数据都是现成的。下一步,咱们开始PCA分析。
03 数据中心化
什么叫数据中心化呢?太高大上了!其实就是求平均值,将所有的数据和平均值联系起来。
我们还是用二维数据解释比较顺溜,假设数据如下:
假设我们有6组数据,x轴代表 影响因子1, y轴代表 影响因子2。蓝色小球代表数据,紫色小球代表数据平均值。
数据中心化,就是所有数据 减去 平均值,而图像的变化就是将平均值的点(紫色)移动到原点,其他数据点跟着移动。
简单吧!数据中心化后还有一步,是将数据缩放一下。
你看哦!
数据中心化的过程中,数据的方差是没有变化的。为了数据比较的方便,对数据还需要缩放一下,过程很简单。
所有数据 除以 方差,这样最后的数据的方差都变成 1 了。
上面的python代码我们创建了100个基因,10个人的数据包。总共数据是100 * 10。
我们给中间中心化和缩放一下。
scaled_data = preprocessing.scale(data.T) # 搞定!
04 PCA分析
线性规划大家还记得吧。
如上图所示,我们需要划出一条线使得所有的数据点到达这条线的距离的平方和(红色线段)最小。
为了详细说明线性规划,我们拿一个点来说明。
当B是无数数据点中的一个,AC(绿线)是一条最匹配的直线。那么我们需要保证:
- B到AC的距离,BC的长度的平方和最小;
- 或者C到A的距离平方和最大(勾股定理可证),两者是等效的。
所有数据点在主元坐标轴上的投射点到原点的距离(如上图中AC)的平方和叫做 Sum of Squared Distances (SSD)。
主元1 上的投射点的 Sum of Squared Distances 就是 主元1的特征值(Eigenvalue),可以参见我之前的文章。
主元2上的投射点的Sum of Squared Distances 就是 主元2的特征值(Eigenvalue)。
我们注意到上图中最后一列是Variation。这是通过:
SSD / (数据个数 - 1)求得的。
Variation有什么用的?
主元1的Variation是2.20,主元2的Variation是0.20。那么一共是2.2 + 0.2 = 2.4。
那么,主元1占有:2.2 / 2.4 = 91.5%
主元2占有:0.2 / 2.4 = 8.5%
也就是说,PCA分析后,主元1保留了91.5%的原始数据信息,占比比主元2大的多。那么,主元1就是第一主元。
分析完毕,大功告成!
对于上述数据做PCA分析后,我们看出主元1占比高达95%。自然是第一主元。
05 总结
如果大家喜欢我的文章,请关注“逃学博士”。
感谢StatQuest。
“逃学博士”:理工科直男一枚,在冰天雪地的加拿大攻读工程博士。闲暇之余分享点科学知识和学习干货。