主成分分析PCA

简介

主成分分析 principal component analysis(PCA) 顾名思义是要提取主要数据信息,这是一种非常常用的数据降维手段,也是分析数据特征的一种方法。本文就简单概述一下这个方法以及如何通过sklearn来使用这个工具。

原理

实际中,不论是机器学习还是数据挖掘,数据的维度都可能是很大的,因此不能用二维或者三维图像来展示,那么如何将数据从高维降低到低纬并且尽量少的丢失数据信息呢?

我们先来看一个二维数据散点图,

p1

如果我们用最傻的方式,直接舍弃一个维度会怎么样?比如下面展示的,我们只保留x1维度,

p2

p3

我们可以很直接的知道,我们已经失去了所有x2的信息,这种数据是无效的。所以我们要换一种思路,如果把这根投影线转动一下怎么样呢?用数学的话来说,利用已有的x1和x2维度来做线性组合得到一个新的维度怎么样呢?\(Y = aX_1 + bX_2\)

我们就得到了这样的图,

p4

p5

从图中我们可以看到,原始数据被投影到了这根轴线上,现在似乎可以捕捉到更多原始数据的信息了,如果我们持续转动这根线(寻找线性组合),一定有一个位置,我们可以保留最多的原始信息。那么要怎么度量呢?

我们通过计算新维度下数据的方差来定义lose information,也就是说在线性变换中,我们希望最大化这个方差 \(Var(Yi)\)

为什么是最大化方差呢?通过下面这个图你就明白了,如果我们将数据投影到x1上,我们最后只能得到一个点,丢失了其他全部信息。

p6

p7

PCA的原理就是要将 p个n维数据 \(X_i\) (i=1,2,...,n) 通过线性变换得到 \(Y_i\),然后我们取最重要的前k个主成分PC就得到了降维后的数据,这样的降维方式有效减少了数据信息的丢失。

那么,怎么来衡量每个PC的重要性以及如何选择k个PC?答案是特征值。特征值越大,所对应特征向量(新的维度特征)也就越重要。另外,实际中求pca特征可以利用我们上一篇讲的SVD方法。

sklearn

最后部分,我们来简单演示一下如何使用sklearn来实现pca,直接上代码,

from sklearn.decomposition import PCA

# 假设我们的数据集是train, 测试集是test
pca = PCA(n_components=3)      # 指定降维后的维度
pca.fit(train)
print(pca.explained_variance_ratio_)      # 打印重要性占比
print(pca.explained_variance_)      # 打印特征值
print(pca.components_)      # 打印各个PC

# 对训练集和测试集应用新的特征
pca.transform(train)
pca.transform(test)

具体文档戳这里

posted @ 2020-09-22 02:20  MrDoghead  阅读(227)  评论(0编辑  收藏  举报