维数约减又称为降维。
使用维数约减的原因:
1. 数据压缩(减少空间占用,同时为算法提速)
例1:从2D→1D
存在如下图所示样本集,x(i)∈R2
希望找到如下图中所示直线,把所有样本映射到这条线上
如此,就可以使用下图来表示样本位置,只需要一个特征变量即可:
x(1)∈R2→z(1)∈R
x(2)∈R2→z(2)∈R
⋯
x(m)∈R2→z(m)∈R
例2:从3D→2D
存在如下图所示样本集,x(i)∈R3
把所有样本投影到一个二维平面上,如下图所示:
则可以使用两个特征值来表示样本点的位置,如下图:
z(i)=[z(i)1z(i)2]
2. 数据可视化
当x(i)∈R50时,无法有效观察理解数据,将其降维至z(i)∈R3或z(i)∈R2,就可以呈现为3D或2D的图像。
主成分分析法(PCA):是当前最常用的降维算法。
PCA实质为寻找一个低维的面,把数据投射在上面,使得样本点到面的垂直距离的平方和达到最小值。这些垂直距离也称为投影误差。
更一般化的表达是:从n维降到k维,找到k个向量u(1),u(2),⋯,u(k),将样本数据投射在这k个向量上,使得投影误差最小。
在应用PCA之前,通常会进行均值归一化和特征规范化。
训练集:{x(1),x(2),⋯,x(m)}
在执行PCA算法前的数据预处理:
- 均值归一化
μj=1m∑i=1mx(i)j
用x(i)j−μj替换x(i)j
- 特征缩放(可选)
如果不同特征值取值范围差异较大,则进行特征缩放,使得各特征值具有类似的取值范围。
用x(i)j−μjsj替换x(i)j,sj表示特征值xj的最大值-最小值或标准差。
PCA算法:
将数据从n维降维到k维:
⇒计算协方差矩阵:Σ=1m∑i=1m(x(i))(x(i))T(注:Σ表示希腊字母Sigma)
Octave代码:Sigma=(1/m)*X'*X
其中X=⎡⎣⎢⎢⎢⎢⎢⎢x(1)Tx(2)T⋮x(m)T⎤⎦⎥⎥⎥⎥⎥⎥
⇒计算矩阵Σ的特征向量:
Octave代码:[U,S,V]=svd(Sigma);
svd表示奇异值分解,在Octave中,也可以用eig()命令求特征向量;
Sigma协方差矩阵是一个n×n矩阵;
上述语句输出三个矩阵,我们需要的是U矩阵,也是n×n矩阵;
U矩阵的列就是我们需要的向量:U=[u(1),u(2),⋯,u(n)]∈Rn×n;
⇒提取U矩阵的前k列向量组成矩阵Ureduce=[u(1),u(2),⋯,u(k)]∈Rn×k
Octave代码:Ureduce=U(:,1:k);
⇒我们的目的是x∈Rn→z∈Rk,z=UreduceTx
其中,UreduceT∈Rk×n,x∈Rn×1,所以z∈Rk
Octave代码:z=Ureduce'*x;
注:使用PCA算法,x∈Rn,没有x0=1这一项。
PCA算法压缩数据的原始数据重构:
由上已知:z=UreduceTx,我们现在需要z∈Rk→x∈Rn
所以:xapprox=Ureducez≈x,Ureduce为n×k矩阵,z为k×1向量,故xapprox为n×1向量。
PCA算法中,把n维特征变量降维到k维特征变量,k也被称为主成分的数量。
如何选择k?
两个定义:
平均平方映射误差:1m∑i=1m∥x(i)−x(i)approx∥2,表示样本x和其在低维平面映射点之间的距离的平方的均值。
数据的总变差:1m∑i=1m∥x(i)∥2,训练样本长度的平方的均值,表示训练样本与0向量的平均距离。
选择k的法则:
使
1m∑i=1m∥x(i)−x(i)approx∥21m∑i=1m∥x(i)∥2⩽0.01
的最小的
k值。
此时,保留了
99%的差异性。
算法:
⇒用k=1尝试PCA算法:
计算Ureduce,z(1),z(2),⋯,z(m),x(1)approx,⋯,x(m)approx;
⇒检查1m∑i=1m∥x(i)−x(i)approx∥21m∑i=1m∥x(i)∥2是否⩽0.01;
⇒若符合条件,取k=1,若不符合条件,k++,直到找到满足条件的最小的k值。
上述算法的计算过于繁杂,对该算法进行改进。
改进版算法:
⇒执行语句[U,S,V]=svd(Sigma)
会得到S矩阵;
S矩阵是一个正方形矩阵,形式为⎡⎣⎢⎢⎢⎢⎢S11S22⋱Snn⎤⎦⎥⎥⎥⎥⎥
⇒对于给定的k值,只需满足1−∑i=1kSii∑i=1nSii⩽0.01即∑i=1kSii∑i=1nSii⩾0.99
⇒不断增加k的取值来寻求满足的条件的最小k值。
当使用特定的k值时,也可以用∑i=1kSii∑i=1nSii来表示PCA算法性能。
PCA算法应用
⋆监督学习算法加速
⇒存在样本集{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))};
⇒提取出输入特征值,无标签数据集{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))};
⇒提出基于新训练样本的假设函数hθ(z)。
注:x(i)→z(i)的映射关系是通过在训练集上运行PCA算法定义的,这个映射关系同样适用于交叉验证集和测试集的输入特征值。
常见的PCA算法应用:
- 数据压缩(节约存储空间,算法加速)
选择k值,保留x%的差异性。
- 数据可视化
k=2或3。
PCA算法误用
∗避免过拟合
用z(i)代替x(i)来减少特征数量:n→k,且k<n;
因为特征值越少,似乎越不容易过拟合;
这方法可能会有作用,但并不是好方法,避免过拟合应该用正则化方法。
∗在设计机器学习系统时,直接使用PCA算法
建议:在执行PCA算法前,首先在原始数据x(i)上执行相关算法,只有当算法收敛缓慢,占用内存/磁盘空间很大时,再执行PCA算法,使用z(i)计算。