降维(Dimensionality Reduction)也是一种无监督学习。
目标
降维的目标之一是数据压缩,使得硬盘、内存占用更少,并且对学习算法进行加速。
如上图所示,通过映射我们可以将二维平面的特征数据 投影到一维的直线上 。也可以把三维空间的特征数据 投影到二维平面上 ,如下图所示:
降维的另一个目标则是数据可视化,这可以帮助我们更好地了解数据,从而更好地对算法进行优化。
上图为全世界各个国家的各项指标统计情况,每个国家包含50个特征,这很难可视化。我们尝试将 50 维数据降到 2 维,并且将其在二维平面上画出来,如下图所示:
这时的两个特征 已经不是具有单个物理意义的特征,通过画图可以发现, 是国家总体的经济活跃度,国家 GDP 等的综合体现,而 是个人经济活跃度,人均 GDP,人均幸福指数,人均收入,医疗保障等的综合体现。
PCA
PCA(主成分分析)是解决降维问题最常用的算法。如图,PCA 会将数据投影到一个低维平面(或直线)上,使得原数据到投影数据的距离(即投影误差)最小。为了计算出这个低维平面,PCA 要尝试找到一个向量 ,图中是一维向量(即直线),要找一个能够最小化投影误差的方向,从而得到最小的重构误差,比如 这条向量延展的直线。无论是 还是 ,都定义了相同的直线。如果有 N 维数据,目标是要降到 K 维,那么需要寻找 K 个向量 ,将数据投影到 K 个向量展开的线性子空间上,也就是 K 维平面,来对数据进行投影,并最小化投影误差。如下图是从 3 维降到 2 维,就需要两个方向的向量,因为两个向量即可定义一个 2 维平面。
下图展示了线性回归和 PCA 的区别,线性回归是拟合一条直线,最小化点到直线的平方误差,点到直线的垂直距离是和 轴垂直的。而 PAC 是计算点到投影平面的距离,即正交距离,是与投影平面垂直的。线性回归是根据给定 值来预测 的值。而 PAC 是拟合投影平面,用投影的低维数据来表示原有的高维数据。
PCA 计算过程
在应用 PCA 前,需要对数据进行预处理,包括均值标准化和特征缩放,使得特征数据的均值为 0,且数值在可比较的范围内。对于均值标准化,首先计算每个特征的均值,用原特征值 减去其均值 的结果作为新的特征值,即 ,其中 ,这将使得每个特征的均值正好为 0。如果特征值的差异较大,则需在均值标准化的基础上再除以一个值 (该值可以是最大值与最小值的差也可以是标准差),将特征值限制在一定范围之内,即 。
为了得到 K 维向量 ,和低维数据 。首先,PCA 需要计算协方差矩阵 :
协方差矩阵 可以通过 SVD (奇异值分解)计算得出,由于 是 N * 1 维的向量, 是 1 * N 维的向量,所以 是 N * N 的矩阵,所以 也是一个 N * N 的矩阵。SVD 的结果会输出三个矩阵 ,我们只需要其中的矩阵 , 也是一个 N * N 的矩阵, 矩阵的列为 ,如果我们想要将数据从 N 维降到 K 维,只需要提取前 K 个向量 ,这时我们就得到了 K 个方向,即数据投影的方向。即通过 N * N 维的矩阵 得到 N * K 维的矩阵 。
接下来我们要通过原始数据集 ,计算出低维数据 。,其中 是 K * N 维的矩阵, 是 N * 1 维的矩阵,所以结果 是 K * 1 维的矩阵,即 K 维向量。
协方差矩阵 的向量化计算为:
通过提取 矩阵的前 K 列,计算得出低维数据 :
原始数据重构
有时我们会想要通过压缩的低维数据 来重构原有的高维数据 。
由于 ,原始数据 的近似值
其中 是 N * K 维的向量, 是 K * 1 维的向量,所以 是 N 维向量,如果投影误差不是很大的话, 会接近 。
主成分数量 K 的选择
PCA 的目的是减小投影误差平方的均值(即 和 在低维平面的投影距离的平方和的均值):
数据集的总方差等于每个训练样本的平均长度(即 到原点的距离和的均值):
限定 K 值可以使得上面两个公式的比值小于一个阈值,如 0.01
即如果选择的 K 使得 平均投影误差平方 / 数据的总方差 < 0.01,代表这个 K 保留了数据 99% 的方差。通常可以先将 K 赋值为 1,计算 和 以及 ,然后检查 平均投影误差平方 / 数据的总方差 是否小于 0.01,如果没有则提高 K 值,重复上述计算步骤,直到小于 0.01 为止。
这里有一个相对高效的计算方法,我们利用 SVD 得出 ,其中 是一个N * N 的方阵,即对角线 是这个矩阵唯一的非零元素,对角线之外的所有元素都是 0。平均投影误差平方 / 数据的总方差的值可以用下述公式计算得出:
这种方式只需要调用一次 SVD 算法即可,所以计算效率更高。
PCA 应用
数据压缩、算法加速
对于数据压缩或算法加速,通常选择的 K 值能够保留数据 99% 的方差。
假设我们需要对像素为 100 * 100 的图片进行分类,输入特征就是 10000 个像素值,计算速度将会非常缓慢。我们可以通过 PCA 将 10000 维特征的训练集 映射为 1000 维特征的训练集 ,然后将 输入到学习算法,拟合得到假设函数,接着用训练集得到的 PCA 对验证集和测试集进行映射,再用映射后的数据来进行评估。通常情况下,我们可以利用 PCA 减少 或 的维度,减少对内存和硬盘的需求,提高运行效率,并且不影响分类精度。
可视化
对于可视化应用,通常可以设置 K 等于 2 或 3,通过 2D 或 3D 的形式来展示数据。
Bad Case
PCA 并不适合解决过拟合问题,虽然 PCA 可以通过减小特征数来减小过拟合的可能性,但是 PCA 不会学习到标签信息,所以有可能会舍掉一些对学习标签有价值的特征信息。
在项目开始阶段并不适合直接使用 PCA,可以先尝试不使用 PCA,当原始数据达不到目的的情况下再考虑 PCA。
网友评论