数据降维(PCA算法在数据降维中的应用)

维度灾难

在实际问题中,我们常常会遇到采集到的数据特征数量过多的情况,甚至有时会出现训练集容量比特征数量还少的极端情况(在图片处理领域尤其常见),然而事实上,并不是采集到的每一个特征都对模型有训练意义。
维度的增加会导致相当棘手的情况出现,这通常会带来训练数据在高维空间的稀疏性质,为了获得在统计学上正确并且有可靠的结果,用来支撑这一结果所需要的数据量通常随着维数的提高而呈指数级增长。
此外,维度的增加会使模型训练的时间增加到无法忍耐的程度。
对于这样的问题,对数据进行降维将是很重要的一个手段。

主成分分析法

有时候,我们会发现描述某些数据并不需要过多的特征。换句话说,使用为数不多的几个特殊特征就能将某个点确定下来。
在所有的特征中,有些特征是强力的,它体现在似乎其他特征都或多或少依赖于这个特征。而有些特征是很弱的,体现在该特征似乎对每一个样本都没有什么区分度,这意味着大量数据集中在一簇或几个簇。
举一个例子,对于一个合法公民来说,身份证号是一个“强”的特征,因为它区分度足够强,能够将数据分散成不同的簇。而身高是一个“没那么强”的特征,因为大量样本会在某个范围内聚簇。
同时我们注意到,如果我们有了几个足够强的特征,也许我们不需要那么多弱特征来对数据进行区分或者识别了。
主成分分析法(Principal components analysis,以下简称PCA)是一个来给数据进行降维相当常用的手段。

算法流程

输入:样本集 X = X n ( m ) X=X^{(m)}_n X=Xn(m)规模 ( m × n ) (m\times n) (m×n),需要将数据从 n n n维降到 d d d维。

输出:降维后的样本集 X ′ X^{'} X

  1. 对所有的样本中心化(使其无偏): X j = X j − 1 m ∑ i = 1 m X j ( i ) X_j=X_j−\frac{1}{m}\sum_{i=1}^m{X^{(i)}_j} Xj=Xjm1i=1mXj(i)
  2. 计算样本的协方差矩阵 C o v ( X ) Cov(X) Cov(X)
  3. 对矩阵 C o v ( X ) Cov(X) Cov(X)进行特征值分解得到 Q Λ Q − 1 Q\Lambda Q^{-1} QΛQ1
  4. 取出最大的 d d d个特征值对应的特征向量 ( Q ( 1 ) , Q ( 2 ) , . . . , Q ( d ) ) (Q^{(1)},Q^{(2)}, ... ,Q^{(d)}) (Q(1),Q(2),...,Q(d)), 组成新矩阵 W W W
  5. 降维后的样本集 X ′ = X W X^{'}=XW X=XW

Python实现

下面给出了一个由2维降到1维的数据实例

import numpy as np
from random import random


def f(x):
    return [i + random() for i in x]


data = np.array(np.arange(0, 10, 0.5))
data = np.c_[data, f(data)]

# 数据中心化
for i in range(data.shape[1]):
    data[:, i] -= (sum(data[:, i]) / len(data[:, i]))

cov = np.cov(data, rowvar=False)
print(f'协方差矩阵:\n{cov}')

K, V, D = np.linalg.svd(cov)
print(f'特征值:{V}')
# 特征值对应的第一列特征向量
W = K[:, :1]
PCA_data = np.dot(data, W)

print(f'原始数据是:\n{data}')
print(f'降维后数据是:\n{PCA_data}')

数据降维(PCA算法在数据降维中的应用)_第1张图片
可以看到,上面的数据只需要通过斜线方向的一个维度就能近似描述。因此我们上面做的就是找到一个新的坐标系,在那个坐标系中,数据的投影。
我们将换了坐标系后的数据画出来:
数据降维(PCA算法在数据降维中的应用)_第2张图片
可以看到,我们换了坐标系后,只需要x一个维度就可以大致的描述数据。事实上,我们上面算法中找到的矩阵 W W W,就是从一个坐标系到另一个坐标系的变换矩阵。

算法证明

现在让我们回到上面的图,思考:我们要找怎样的一个超平面,并把数据投影上去呢?
由上面的图,我们很容易想到,要让数据投影在超平面上分布足够分散。否则数据聚成一簇,这绝不是一个好的投影。
比如在上面的图中,我们的目标就是找到斜向右上的向量,因为数据在它上的投影足够分散。
因此,我们给出“投影足够分散”的数学描述。

我们需要找一个矩阵 W W W X W XW XW是数据在另一个坐标系中的投影,我们要让投影取得最大方差,并找到此时的 W W W。投影的方差是投影 X W XW XW的协方差矩阵中的对角线元素之和,也即协方差矩阵 W T X T X W W^TX^TXW WTXTXW的迹。

目标: max t r ( W T X T X W ) tr(W^TX^TXW) tr(WTXTXW)
使得: W T W = I W^TW=I WTW=I

这是一个标准的约束下极值问题,因此我们可用拉格朗日乘数法来解决。
拉格朗日函数为:
L = t r ( W T X T X W ) + λ ( W T W − I ) L=tr(W^TX^TXW)+\lambda (W^TW-I) L=tr(WTXTXW)+λ(WTWI)
现在问题变成了求上面拉格朗日函数的最大值
对参数 W W W求偏导并使其等0得到:
X T X W + λ W = 0 X^TXW+\lambda W=0 XTXW+λW=0
其中,在 X X X中心化之后
C o v ( X ) = E ( ( X − X ˉ ) T ( X − X ˉ ) ) = X T X Cov(X)=E((X-\bar X)^T(X-\bar X))=X^TX Cov(X)=E((XXˉ)T(XXˉ))=XTX
c = − λ c=-\lambda c=λ,有:
C o v ( X ) W = c W Cov(X)W=cW Cov(X)W=cW
因此 W W W C o v ( X ) Cov(X) Cov(X)的特征向量, c = − λ c=-\lambda c=λ是特征值。
此时,我们就找到了换坐标系所乘的矩阵 W W W,它是 C o v ( X ) Cov(X) Cov(X)的特征向量。
特征值标志着该特征向量的重要性,因此,我们可以取出重要的几个特征(特征值最大的几个新特征)来构成新的特征矩阵。
至此,我们已经完成了降维工作。

总结

主成分分析(PCA)是一种统计分析、简化数据集的方法。它利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值。
作为一个非监督学习的降维方法,它只需要特征值分解,就可以对数据进行压缩,去噪。因此在实际场景应用很广泛。
降维在很大程度上,会使我们的模型更易训练,但同时应当说明的是,由高维到低维的降维变换导致的信息损失是不可逆的。也就是说,这部分数据信息量受到了损失,信息熵也会变化。
因此,在使用PCA方法进行降维时,应当将信息量与维度的矛盾统一看待,并从中找到一个平衡。
数据降维(PCA算法在数据降维中的应用)_第3张图片

你可能感兴趣的:(机器学习,人工智能,机器学习,数据挖掘,线性代数,算法)