PS: 盼望已久的十一长假就要到了~祝大家国庆快乐,玩的开心!(*^__^*)
第十讲. 降维——Dimensionality Reduction
===============================
(一)、为什么要降维?
(二)、主成分分析Principal Component Analysis (PCA)
(三)、PCA 算法流程
(四)、从压缩数据中恢复原数据
(五)、怎样决定降维个数/主成分个数
(六)、应用PCA进行降维的建议
本章主要讲述应用PCA算法进行数据降维的原理
=====================================
(一)、为什么要降维?
我们需要一组关于XXX的数据,定义就铺天盖地的来了,百万级个特征拿过来,我们怎么进行机器学习啊?!李航老师在他的博客《机器学习新动向:从人机交互中》中提到,学习精度越高,学习确信度越高,学习模型越复杂,所需要的样本也就越多。样本复杂度满足以下不等式
由此可见,feature太多会造成模型复杂,训练速度过慢,因此我们引入降维。
多维数据很难进行可视化分析,因此我们需要降维分析。
=====================================
(二)、About Principal Component Analysis (PCA)
- PCA 目的:降维——find a low dimension surface on which to project data ~
如图所示,蓝色的点project到红色surface上得到绿点,寻找surface使得两点之间的orthogonal distance总和最小,就是PCA的任务。
- PCA 与 Linear Regression 的区别:
1. PCA衡量的是orthogonal distance, 而linear regression是所有x点对应的真实值y=g(x)与估计值f(x)之间的vertical distance距离
2. more general 的解释:PCA中为的是寻找一个surface,将各feature{x1,x2,...,xn}投影到这个surface后使得各点间variance最大(跟y没有关系,是寻找最能够表现这些feature的一个平面);而Linear Regression是给出{x1,x2,...,xn},希望根据x去预测y,所以进行回归
=====================================
(三)、PCA 算法流程
假设有m个samples,每个数据有n维。
----------------------------------------数据预处理----------------------------------------
1. 计算各个feature的平均值,计μj ;(Xj(i)表示第i个样本的第j维特征的value)
2. 将每一个feature scaling:将在不同scale上的feature进行归一化;
3. 将特征进行mean normalization
这样呢,我们需要做的就是两件事:
第一,如何寻找这个surface?
第二,给定surface,怎样求点到surface投影的value?
--------------------------------------- PCA算法选取k个主分量----------------------------------------
4. 求n×n的协方差矩阵Σ:
5. 根据SVD求取特征值和特征向量:
[U,S,V] = SVD(Σ)
其中,SVD为奇异值分解(singular
value decomposition),在matlab中有函数[U,S,V] = svd(A) 返回一个与A同大小的对角矩阵S(由Σ的特征值组成),两个酉矩阵U和V,且满足= U*S*V'。若A为m×n阵,则U为m×m阵,V为n×n阵。奇异值在S的对角线上,非负且按降序排列。
那么对于方阵Σ呢,就有
Σ = USV'
ΣΣ' = USV'*VS'U' = U(ΣΣ')U'
Σ'Σ = VS'U'*USV' = V(Σ'Σ)V'
i.e. U是ΣΣ'的特征向量矩阵;V是Σ'Σ的特征向量矩阵,都是n*n的矩阵
由于方阵的SVD相当于特征值分解,所以事实上U = V, 即Σ = USU', U是特征向量组成的正交矩阵
我们的目的是,从n维降维到k维,也就是选出这n个特征中最重要的k个,也就是选出特征值最大的k个~so...goto next step
6. 按特征值从大到小排列,重新组织U
如果使用matlab的svd求得特征值,就可以直接跳过这步了,因为该函数返回值中,奇异值在S的对角线上按照降序排列。否则的话应进行排序,并按照该次序找到对应的特征向量重新排列。
7. 选择k个分量
按照第五、六步中讲的svd过后,我们得到了一个n×n的矩阵Σ和U,这时,我们就需要从U中选出k个最重要的分量;即选择前k个特征向量,即为Ureduce,
该矩阵大小为n×k
这样对于一个n维向量x,就可以降维到k维向量z了:
=====================================
(四)、从压缩数据中恢复原数据
我们已经知道,可以根据z(i) = Ureduce'× x(i) 将n维向量x降维到k维向量z,那么有时我们需要恢复n维向量,怎么做呢?
由于Ureduce是正交矩阵(下面Ureduce简记为U),即U' = U-1, 所以
xapprox = (U')-1×z = (U-1)-1×z = Uz
(PS:这里的逆操作为伪逆操作)
注意:这里恢复出的xapprox并不是原先的x,而是向量x的近似值。
=====================================
(五)、怎样决定降维个数/主成分个数
首先从一个general一点的思路去想呢,我们是希望,选出主成分之后进行数据分析,不会造成大量特征的丢失,也就是说可以用下式的error ratio表示经过压缩后的性能如何。
error ratio =
然后呢,我们定义一个threshold(10% for example),如果error ratio<threshold,说明这样选取主成分是可以接受的,else not
从数学上可以证明,上面这个error ratio 可以表示为
所以,可以用下式进行k的合理选取:
=====================================
(六)、应用PCA进行降维的建议
1. PCA可以降维,那让我们联想到了之前说过拟合问题是由维度过高或者参数过多造成的,那么可不可以用PCA解决overfitting的问题呢?
Ans:NO!应用PCA提取主成分可能会解决一些overfitting的问题,但是呢,不建议用这种方法解决overfitting问题,还是建议用第三章中讲过的加入regularization项(也称为ridge regression)来解决。
2. PCA中主成分分析应用到那部分数据呢?
Ans:Only Training Data!可以用Cross-Validation data 和 test Data进行检验,但是选择主分量的时候只应用training data.
3. 不要盲目PCA
Notice:only 当你在原数据上跑到了一个比较好的结果,又嫌它太慢的时候才采取PCA进行降维,不然降了半天白降了~