概念
在机器学习中经常会碰到一些高维的数据集, 而在高维数据情形下会出现数据样本稀疏, 距离计算等困难, 这类问题是所有机器学习方法共同面临的严重问题, 称之为 "维度灾难". 另外在高维特征中容易出现特征之间的线性相关, 这也就意味着有的特征是冗余存在的. 基于这些问题, 降维思想就出现了.
降维方法有很多, 而且分为线性降维和非线性降维, 本篇文章主要讲解线性降维中的主成分分析法 (PCA) 降维. 顾名思义, 就是提取出数据中主要的成分, 是一种数据压缩方法, 常用于去除噪声, 数据预处理, 是机器学习中常见的降维方法.
PCA 的本质就是找一些投影方向, 使得数据在这些投影方向上的方差最大, 而且这些投影方向是相互正交的. 这其实就是找新的正交基的过程, 计算原始数据在这些正交基上投影的方差, 方差越大, 就说明在对应正交基上包含了更多的信息量. 可以证明原始数据协方差矩阵的特征值越大, 对应的方差越大, 在对应的特征向量上投影的信息量就越大.
PCA 的全部工作简单点说, 就是对原始的空间中顺序地找一组相互正交的坐标轴, 第一个轴是使得方差最大的, 第二个轴是在与第一个轴正交的平面中使得方差最大的, 第三个轴是在与第 1,2 个轴正交的平面中方差最大的, 这样假设在 N 维空间中, 我们可以找到 N 个这样的坐标轴, 我们取前 r 个去近似这个空间, 这样就从一个 N 维的空间压缩到 r 维的空间了, 但是我们选择的 r 个坐标轴能够使得空间的压缩使得数据的损失最小.
因此, 关键点就在于: 如何找到新的投影方向使得原始数据的 "信息量" 损失最少?
样本的 "信息量" 指的是样本在特征方向上投影的方差. 方差越大, 则样本在该特征上的差异就越大, 因此该特征就越重要. 在分类问题里, 样本的方差越大, 越容易将不同类别的样本区分开.
如上图中共有 3 个类别的数据, 很显然, 方差越大, 越容易分开不同类别的点. 样本在 X 轴上的投影方差较大, 在 Y 轴的投影方差较小. 方差最大的方向应该是中间斜向上的方向(图中红线方向). 如果将样本按照中间斜向上的方向进行映射, 则只要一维的数据就可以对其进行分类, 相比二维的原数据, 就相当降了一维.
在原始数据更多维的情况下, 先得到一个数据变换后方差最大的方向, 然后选择与第一个方向正交的方向, 该方向是方差次大的方向, 如此下去, 直到变换出与原特征个数相同的新特征或者变换出前 N 个特征(在这前 N 个特征包含了数据的绝大部分信息).
从参考文献中可以具体了解到前 \(n\)个大特征值对应的特征向量, 就是前 n 个主成分, 而且主成分 \(\xi_i\)对应的方差 \(var(\xi_i)\)即等于协方差矩阵的特征值 \(v\).
在多数情况下, 数据的不部分方差集中在较少的几个主成分上, 因此, 通常一般计算前 \(k\)个主成分就可以了. 前 \(k\)个主成分所代表的 \(n\)维原始数据全部方差的比例是
\[ \frac{\sum_{i=1}^k v_i}{\sum_{i=1}^n v_i} \]
通过方差的百分比来计算将数据降到多少维是比较合适的.
方差是用来描述一维数据的, 而协方差可以用来描述多维数据, 方差的定义如下:
\[ var(x) = \frac{\sum_{i=1}^n (x_i -\bar x)^2}{n-1} \]
相似的, 两个变量的协方差定义如下:
\[ cov(x, y) = \frac{\sum_{i=1}^n (x_i -\bar x)(y_i - \bar y)}{n - 1} \]
式中分母是 \(n-1\)而不是 \(n\), 是因为这样就能够使用样本的协方差的期望值去更好地逼近总体的协方差, 即 "无偏估计". 当变量多于两维时, 就需要协方差矩阵了. 协方差矩阵就是计算多个协方差, 变量两两之间计算协方差, 因为协方差具有 "对称性", 即 \(cov(x, y) = cov(y, x)\), 所以对于一个 \(n\)维的数据集的协方差矩阵, 需要计算 \(\frac{C^2_n}{2}\)次协方差, 而且这个矩阵是对称的. 假设数据是 3 维的, 它的协方差矩阵如下:
\[ \sum = \begin{pmatrix} cov(x, x) & cov(x, y) & cov(x, z) \\ ... & cov(y ,y) & cov(y, z) \\ ... & ... & cov(z, z) \\ \end{pmatrix} \]
总之, PCA 就是用一个超平面对所有样本进行恰当的表达, 这个超平面的维度小于原始维度, 所以总是不可避免的会丢失一些信息, 所以这也是 PCA 的缺点. 该超平面应该具有以下性质:
最近重构性: 样本点到这个超平面的距离都足够近;
最大可分性: 样本点在这个超平面上的投影能尽量分开.
这两种性质能够得到等价推导.
计算过程
算法步骤:
设有 m 条 n 维数据.
将原始数据按列组成 n 行 m 列矩阵 X
将 X 的每一行 (代表一个属性字段) 进行零均值化, 即减去这一行的均值
求出协方差矩阵
求出协方差矩阵的特征值及对应的特征向量
将特征向量按对应特征值大小从上到下按行排列成矩阵, 取前 k 行组成矩阵 P
即为降维到 k 维后的数据
PCA 计算举例
使用 Demo
- from sklearn.decomposition import PCA
- import numpy as np
- from sklearn.preprocessing import StandardScaler
- x = np.array([[10001, 2, 55], [16020, 4, 11], [12008, 6, 33], [13131, 8, 22]])
- # 标准化, 可取消
- X_scaler = StandardScaler()
- x = X_scaler.fit_transform(x)
- print(x, "\n")
- # PCA
- pca = PCA(n_components=0.9) # 保证降维后的数据保持 90% 的信息
- pca.fit(x)
- print(pca.transform(x))
- """
- 输出:
- [ 1.48440157 -0.4472136 -1.18321596]
- [-0.35938143 0.4472136 0.16903085]
- [ 0.15671236 1.34164079 -0.50709255]]
- [[ 2.36863319 0.38298087]
- [-1.50952734 1.23481789]
- [ 0.14360068 -0.58040917]
- [-1.00270653 -1.03738959]]
- """
PCA 方法参数 n_components, 如果设置为整数 \(x\), 则表示将数据降至 \(x\)维, 如果是小数, 则表明降维后保留的信息量比例.
参考链接
来源: https://www.cnblogs.com/zhhfan/p/11311895.html