最流行降维算法:主成分分析法(PCA)

  • 在应用PCA前,要先进行均值归一化和特征规范化,使得数值在可以比较的范围内
PCA目标
  • 当把数据集从二维降到一维时,要求我们找到一个向量,使得数据集每个点到向量所在直线的投影之间的距离尽可能小。即蓝色线段的长度,称为投影误差

image

  • 当从n维到k维时,就是找到k个向量,使得数据的投影误差最小
  • 总之,PCA的目标就是找到一个低维平面,将数据投影到低维平面上,然后最小化投影误差的平方,即每个点和投影到直线的点的距离
PCA和线性回归的关系
  • PCA和线性回归很相似,但不是线性回归。线性回归时,我们需要输出x预测y,要最小化点和平行y轴方向交点的平均平方误差;而PCA不用预测y,要最小化点到直线上投影的误差

image

PCA算法流程
  • 使用PCA前,有一个数据预处理的过程:先进行均值归一化,然后进行特征缩放。这两步和监督学习完全相同,先计算x的均值,然后用x-均值代替每个x(均值归一化);若变量的范围差距比较大(预测房价一个是大小一个是卧室数目),x-均值/s(表示x向量的度量范围,最大值-最小值)

image

  • 然后使用PCA设法找到一个低维子空间,使得数据投影到低维子空间的投影误差最小。总之,PCA要找到一种方法来计算出两个东西:(1)计算出低维空间的向量(2)计算出数据在低维空间的坐标

image

步骤

image

  • 首先计算出协方差方阵(注意协方差方阵的符号和求和符号类似,不要搞混了),并存入变量Sigma
  • 然后计算出Sigma矩阵的特征向量,使用【U,S,V】=svd(Sigma)命令实现(在matlab中svd和eig都能用来计算特征向量,只是svd更稳定;在其他编程环境中,我们只要找到一个能进行奇异值分解的函数库也可以实现)
  • 奇异值分解得到的U矩阵是一个nn矩阵,我们想从n维降到k维,就只要前k列,得到一个n k矩阵,我们记为U'reduce
  • 低维平面向量z=U'reduce的转置x,得到一个k 1的矩阵

image
当特征向量用矩阵表示时,直接可以通过下图计算得到sigma矩阵
image

反压缩

  • PCA作为压缩数据的算法,能把1000维降到100维;那么是否有算法能把压缩过的数据近似的还原到原始的高纬度数据呢
  • X'approx=U'reducez,得到n 1维向量,类似于将数据还原到二维平面的直线上,和原始数据非常接近了已经

image

怎样选择k

  • k是一个参数,称为主成分的数量。人们如何选择参数k,使得平均平方误差最小化呢
  • X(原始数据)-X'approx(映射数据)。我们想最小化x和投影点的平均平方误差,地位平面映射回去正好是投影点
  • 数据的总变差:样本长度平方的均值。我们选择能使平均平方误差/数据的总变差小于等于0.01的最小k值。选择了k,使得99%的差异性得以保留。还可以0.05、0.1、0.15

image

计算流程
  • 按照上边来看,我们要从k=1开始,算出每一个z,继而得到X'approx,带入公式看比值。若不满足k+1,重复上述步骤直到满足为止。这个过程的效率是相当低的
  • 前边使用svd命令得到的矩阵S是一个n*n方阵,主对角线非0,其余元素为0。对于给定的k,1-s的k求和/n求和小于等于0.01即可;即s/s大于0.99.这样我们只要调用一次svd即可,不需要重复计算X'approx

image

PCA的应用

  • 提高机器学习算法的速度。将10000维的向量降到1000维,加快计算速度。这时要注意,不仅仅训练集要降维为低维向量,测试集、交叉验证集都要降维为低维向量

image

  • 压缩数据,减少内存、磁盘的使用,来存储更多数据
  • 数据可视化。高维数据不好作图,降为二维或者三维好作图
错误应用
  • 过拟合。确实参数少了不容易过拟合,但是效果很差。因为pca不考虑标签,是在对标签y不知情的情况下,将某些信息舍弃掉了,里边难免有有效信息;过拟合拟合数据时则要率标签y。因此正则化才是最好的方式

image


无欲则刚
76 声望15 粉丝