无监督学习里面涉及到的另一个问题是
降维问题
数据的降维主要有两个方面的作用:
1. 数据压缩
- 节省内存空间
- 加速算法学习
2. 数据可视化
数据的降维,是将高维空间里面的数据映射成为低维空间里面的数据。它并不是单纯地去掉一些特征,而是将关联程度比较高的多个特征映射成单个特征来表示。
在数据降维中,我们使用的一个重要手段是
主成分分析PCA
principal component analysis
那么,我们首先需要回答的问题是:什么是PCA
主成分分析PCA就是寻找一个平面(2D时是线),将原有的高维空间里面的数据(在经过归一化处理后)映射到这个平面上来。并且这个平面应该使得projection error最小,也就是原来点到该平面的距离之和最短。
%注意PCA和SVM在某些方面有一点相似%
PCA和Linear Regression是不同的,不同的点在于:PCA是点到线/面的垂直距离,而LR是点到线的y轴距离
在进行数据降维的过程中,我们并不是单纯地减少了一些特征,而是将高维空间中关联程度比较高的多个特征映射成低维空间里面的数据。
我们知道,高维空间可以由对应的基向量组来表示。也就是说,对于一个高维空间,我们可以用
Rn
来表示,也可以用
u(1),u(2),...,u(n),
来表示。
那么,原有的映射过程其实就可以看作是将高维空间的基向量组
u(1),u(2),...,u(n),
映射成为低维空间的基向量组
u(1),u(2),...,u(k)
这个时候,我们的PCA问题其实就可以分解成这么几个子问题:
1. 我们如何找到那个平面,也就是找到该空间所对应的基向量组
u(1),u(2),...,u(k)
2. 在基向量组中,我们的那个k要怎么确定下来
3. 确定基向量组以后,我们怎么求对应的映射值z
找基向量组
- 计算协方差矩阵covariance matrix
Σ
Σ=1m∑i=1mx(i)(x(i))T - 计算协方差矩阵的特征向量eigenvector
U
[U S V]=svd(Σ) - 取特征向量U的前k列
Ureduce
Ureduce=U(:,1:k)
求映射值Z
-
Z=(Ureduce)′∗X
X=((x(1))T,(x(2))T,...,(x(m))T)
确定K
确定K的时候有一个很重要的原则是:
取使下式成立的最小k
其中, 1m∑mi=1∥x(i)−x(i)approx∥2 是均方映射误差, 1m∑mi=1∥x(i)∥2 是总方差(数据点与原点之间的距离平方和)
对于 (1) 这个公式来讲,它所表达的是“保留了99%的方差”
那么,我们怎么样确定k?
很明显的一个方法就是从
k=1
开始挨个计算对应的参数,并且看是否满足
(1)
,直到找到最小的那个k为止。
但是上面的这个方法费时费力,有没有更好的方法,有!就直接从我们前面计算特征向量
[U S V]=svd(Σ)
的时候就可以得到。
其中,
S
是通过对
那么我们就把问题转化成,
求最小的k使得
至此,我们就完成了PCA的全部工作。
关于PCA的其他一些小问题:
我们在把高维数据PCA降维以后,能不能够把 Z 转换回原来的
X ?
Xapprox=Ureduce∗ZPCA加速supervised learning
- 对数据集 (x(1),y(1)),(x(2),y(2)),...,(x(m),y(m)) ,提取无label的数据集 x(1),x(2),...,x(m)∈R10000
- 使用PCA降维成 z(1),z(2),...,z(m)∈R1000
- 构建新的训练集
(z(1),y(1)),(z(2),y(2)),...,(z(m),y(m))
注意:只对原来的训练集用PCA,验证集和测试集不用。映射 x→z 在训练集/验证集/测试集上都可以用。
- PCA效果不太好的情况
- 避免overfit的情况
在PCA的过程中,特征被减少了,这个时候按照我们以前的知识,learning curve是朝着underfit的那个方向移动的,也就是会避免overfit的情况。但是不要想当然!!!PCA在避免overfit上有一定的效果,但是并不是一个好的方法,因为我们已经有了 λ 的惩罚项 - 在设计ML系统的时候不要滥用PCA进行降维
在设计ML系统的时候,我们可能会因为特征值太多而选择先降维,然后利用降维以后的 (Z,y) 来训练模型,最后将测试集上的数据也映射成 (Ztest,y) 来进行测试。但这也不是一个好方法!!
不要一开始就直接PCA降维!!!
不要一开始就直接PCA降维!!!
不要一开始就直接PCA降维!!!
先要从原始数据 X 上设计模型进行训练和测试。只有原始数据的效果很差的时候才开始用PCA降维使用降维数据Z
- 避免overfit的情况