特征工程 | PCA降维

基本思想

主成分分析(PCA)是一种多元统计方法,主要利用降维的思想,在损失很少信息的前提下,把多个变量转化为少数几个互不相关的综合变量,各综合变量即称为主成分。简单来说,主成分与原变量之间应有如下关系:

  • 主成分是原变量的线性组合;
  • 各主成分之间互不相关;
  • 主成分的数目远远小于原变量的数目,且保留了原变量绝大多数信息。

假设有p个变量,分别用

表示,随机向量

,设随机向量X的均值为μ,协方差矩阵为Σ。

对X进行线性变换得Y,且

,其中

,即:

方差

,希望

尽可能的大,但需设置

限制条件,才使求

的最大值有意义。所以求主成分是在下面约束下的线性变换问题:

(i=1, 2, ..., p)

相互无关(i≠j; i, j=1, 2, ..., p)

是所有线性组合中方差最大者;

是与

不相关的所有线性组合中方差最大;依次类推,

是与

都不相关的所有线性组合中方差最大者。

求主成分

假设

为随机向量X协方差矩阵Σ的特征值,

为各特征值对应的标准正交特征向量。

(1)即有:

做线性变换

(2)主成分方差:

,即主成分方差就是协方差对应的特征值,并有:

.

(3)不同主成分的协方差为:

因而不同主成分是不相关的。

所以,该线性变换满足上述3个约束条件,得到的新变量即为主成分。第一主成分

是将最大特征值

对应的特征向量

作为线性变换系数的X的线性组合,且

的方差为

;第二主成分

是将第二大特征值

对应的特征向量

作为线性变换系数的X的线性组合,且

的方差为

;依次类推。也就是说,求主成分问题就变成了求特征值和特征向量的问题。

求主成分既可以从原始数据的协方差矩阵出发求特征值和特征向量进而求得主成分;也可以从原始数据的相关矩阵出发求特征值和特征向量进而求得主成分。后者相当于先对原始数据进行标准化处理,然后求标准化后的数据的协方差矩阵的特征值和特征向量,并且主成分是标准化后的数据的线性组合。

不过,两种方法的使用是有一定差异的。如果各变量的取值范围或量级差异比较大,最好先进行标准化处理,否则直接从原始数据的协方差出发求主成分,取值范围或量级大的变量将在主成分中起主导作用,其他变量将很难在主成分中体现出来。当然标准化处理后,各变量的方差均变为1,会损失一部分信息。如果各变量的取值范围或量级差异较小,可以考虑直接从原始数据的协方差出发求主成分。

主成分的贡献率

  • 第k个主成分

的方差贡献率为:

贡献率是主成分的差异占原始数据总差异的比例,贡献率越大,说明主成分对总差异的解释能力越强。

  • 前m个主成分

的累积贡献率为:

累积贡献率用于选择合适的主成分个数,比如当m的取值使累积贡献率达到85%以上时,可以认为是一个比较合适的主成分个数。

例子

以python自带iris数据集为例,简单展示scikit-learn的PCA用法。

  • 载入iris数据集:
from sklearn.datasets import load_iris
iris_X = iris.data
  • 主成分计算:
from sklearn.decomposition import PCA
pca = PCA(n_components=4)
pca.fit(iris_X)
  • 协方差的特征值(主成分的方差):
# 特征值
pca.explained_variance_
Out[1]: array([4.22484077, 0.24224357, 0.07852391, 0.02368303])
  • 主成分方差贡献率:
# 方差贡献率
pca.explained_variance_ratio_
Out[2]: array([0.92461621, 0.05301557, 0.01718514, 0.00518309])
  • 累积贡献率:
# 累积贡献率
import numpy as np
np.cumsum(pca.explained_variance_ratio_)
Out[3]: array([0.92461621, 0.97763178, 0.99481691, 1.])

由累积贡献率绘制碎石图(scree plot):

# 碎石图
import matplotlib.pyplot as plt
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.title('Scree Plot')

可以看出,前两个主成分解释了原数据97.8%的方差,所以用两个主成分几乎可以完全代替原4个变量。

  • 协方差的特征向量(线性组合的系数),以下结果每一行对应一个特征向量:
# 特征向量
pca.components_
Out[4]:
array([[ 0.36158968, -0.08226889, 0.85657211, 0.35884393],
    [ 0.65653988, 0.72971237, -0.1757674 , -0.07470647],
    [-0.58099728, 0.59641809, 0.07252408, 0.54906091],
    [ 0.31725455, -0.32409435, -0.47971899, 0.75112056]])
  • 主成分(第一列是第一主成分,第二列是第二主成分):
pca.transform(iris_X)
Out[5]:
array([[-2.68420713e+00, 3.26607315e-01, -2.15118370e-02, 1.00615724e-03],
   [-2.71539062e+00, -1.69556848e-01, -2.03521425e-01, 9.96024240e-02],
   [-2.88981954e+00, -1.37345610e-01, 2.47092410e-02, 1.93045428e-02],
   [-2.74643720e+00, -3.11124316e-01, 3.76719753e-02, -7.59552741e-02],
   [-2.72859298e+00, 3.33924564e-01, 9.62296998e-02, -6.31287327e-02]])

本文分享自微信公众号 - 大数据建模的一点一滴(bigdatamodeling),作者:小石头

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 算法 | 随机森林

    随机森林是集成学习的一种方法,是将多棵树进行集成的算法,随机是指训练每棵树的样本和变量具有随机性,而多棵树组合在一起就像“森林”一样。

    小石头
  • 徒手撸算法 | 线性回归

    其中,x1, x2, ..., xp是预测变量,x0恒为1;θ1, θ2, ..., θp是预测变量系数(权重或参数),θ0是偏置项(截距),令θ=(θ0, θ...

    小石头
  • 闲扯 | 信贷场景中数据使用的那点事

    本文聊聊信贷场景中数据使用的一些问题。对于持牌机构,除了查询人行征信,也会查询某些外部数据以补充人行征信覆盖不到的信息;而对于非持牌无人行征信查询资质的公...

    小石头
  • java基础学习_面向对象(上)03_day08总结

    ============================================================================= ==...

    黑泽君
  • 提前在VR中定好型,寻找最适合自己的“傲人双峰”

    VRPinea
  • 捐资3000万支持食管癌研究,技术男李彦宏的执念

    在扎克伯格写给女儿的那封信中,有一句话让我印象深刻:Technological progress in every field means your life ...

    罗超频道
  • django2用模板代码图标字体丢失报404 cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff

    玩蛇的胖纸
  • @font-face 属性

    @font-face 允许网页开发者为其网页指定在线字体。 通过这种作者自备字体的方式,@font-face 可以消除对用户电脑字体的依赖。 @font-f...

    Html5知典
  • [C#] 常用工具类——直接在浏览器输出数据

    跟着阿笨一起玩NET
  • Android开发之 全局替换字体

    第一反应是好简单,换个TypeFace不就完了,但是不可能每个控件去设置一个吧?不存在的。

    Xiaolei123

扫码关注云+社区

领取腾讯云代金券