维数灾难(Curse of Dimensionality):通常是指在涉及到向量的计算的问题中,随着维数的增加,计算量呈指数倍增长的一种现象。在很多机器学习问题中,训练集中的每条数据经常伴随着上千、甚至上万个特征。要处理这所有的特征的话,不仅会让训练非常缓慢,还会极大增加搜寻良好解决方案的困难。这个问题就是我们常说的维数灾难。
维数灾难涉及数字分析、抽样、组合、机器学习、数据挖掘和数据库等诸多领域。在机器学习的建模过程中,通常指的是随着特征数量的增多,计算量会变得很大,如特征达到上亿维的话,在进行计算的时候是算不出来的。有的时候,维度太大也会导致机器学习性能的下降,并不是特征维度越大越好,模型的性能会随着特征的增加先上升后下降。
降维(Dimensionality Reduction)是将训练数据中的样本(实例)从高维空间转换到低维空间,该过程与信息论中有损压缩概念密切相关。同时要明白的,不存在完全无损的降维。有很多种算法可以完成对原始数据的降维,在这些方法中,降维是通过对原始数据的线性变换实现的。
**奇异值分解 (Singular Value Decomposition,以下简称 SVD)**是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域。是很多机器学习算法的基石。
假设矩阵 是一个 × 的矩阵,通过SVD是对矩阵进行分解,那么我们定义矩阵 的 SVD 为:
符号定义
= T = 111T + ⋯ + T
其中是一个 × 的矩阵,每个特征向量叫做 的左奇异向量。
是一个 × 的矩阵,除了主对角线上的元素以外全为 0,主对角线上的每个元素都称为奇异值 。
是一个 × 的矩阵,每个特征向量叫做 的右奇异向量。
和 都是酉矩阵,即满足:T = , T = 。
为矩阵的秩(rank)。
SVD求解 矩阵求解
方阵T为 × 的一个方阵,那么我们就可以进行特征分解,得到的特
征值和特征向量满足下式:
可以得到矩阵T的 个特征值和对应的 个特征向量了。
将T的所有特征向量组成一个 × 的矩阵,就是我们 公式里面的 矩阵了。
一般我们将中的每个特征向量叫做 的左奇异向量。
注意:T = (VT)(VT)T = (T)UT
上式证明使用了T = , T = 。可以看出的T特征向量组成的矩阵就是我们 SVD 中的 矩阵。
矩阵求解
如果我们将 的转置和 做矩阵乘法,那么会得到 × 的一个方阵T。既然T是方阵,那么我们就可以进行特征分解,得到的特征值和特征向量满足下式:
这样我们就可以得到矩阵T的 个特征值和对应的个特征向量了。
将T的所有特征向量组成一个 × 的矩阵,就是我们 SVD 公式里面的 矩阵了。一般我们将 中的每个特征向量叫做 的右奇异向量。
注意:T = (VT)T (VT)=V(T)VT
上式证明使用了UTU = , T = 。可以看出的T特征向量组成的矩阵就是我们 SVD 中的 V矩阵。
SVD分解可以将一个矩阵进行分解,对角矩阵对角线上的特征值递减存放,而且奇异值的减少特别的快,在很多情况下,前 10%甚至 1%的奇异值的和就占了全部的奇异值之和的 99%以上的比例。
也就是说,对于奇异值,它跟我们特征分解中的特征值类似,我们也可以用最大的 个的奇异值和对应的左右奇异向量来近似描述矩阵。
主成分分析(Principal Component Analysis,PCA)是一种降维方法,通过将一个大的特征集转换成一个较小的特征集,这个特征集仍然包含了原始数据中的大部分信息,从而降低了原始数据的维数。
减少一个数据集的特征数量自然是以牺牲准确性为代价的,但降维的诀窍是用一点准确性换取简单性。因为更小的数据集更容易探索和可视化,并且对于机器学习算法来说,分析数据会更快、更容易,而不需要处理额外的特征。
PCA 减少维到维:
设有条维数据,将原始数据按列组成行列矩阵
第一步是均值归一化。我们需要计算出所有特征的均值,然后令 = − 。(为均值)。如果特征是在不同的数量级上,我们还需要将其除以标准差 2。
第二步是计算协方差矩阵(covariance matrix):
第三步是计算协方差矩阵的特征向量(eigenvectors),可以利用奇异值分解(SVD)来求解。