降维,顾名思义就是将高维数据映射到低维数据。在正式介绍降维之前我们先来考虑一个问题,为什么要进行降维?
我们平常所接触到的各种数据一般都具有很多特征,所以可以被看作高维数据,并且这些数据中很多纬度的特征对于我们要预测的结果起到的作用是微乎其微的,如果不加处理的把这些数据直接丢到模型里面去训练不但要花费很大多的时间,最后的预测结果又有可能受到这些几乎无关的数据的影响从而因为准确率,所以降维显得尤为关键。
可能上述描述不够直观,那我们现在来看一个直观的例子:假设现在我们要做一个能够预测——预测一场考试中学生的考试成绩。这里我们获得的特征有:学生平时成绩、模拟题成绩、模拟考试成绩、学生的服饰、学生的发量、学生用的什么文具、学生是左脚进的教室还是右脚进的教室…等一百多条特征。很明显,选用学生的平时成绩、模拟题成绩、模拟考试成绩为特征最为合理,其他特征即便是稍微有些影响也是微乎其微的。
从上述的例子当中我们已经大致了解了降维的目的
在上述降维的概念中预测考试成绩的例子可以看作一个直观的例子。当有些特征和想要得到的结果完全无关的时候就可以直接去掉。当然这只是最理想的情况,很多情况下特征的划分是杂糅在一起的,这个时候就需要使用的奇异值分解或协方差矩阵。
我们已知在矩阵中各元素直接关系不变的情况下,对矩阵进行拉伸或者旋转,矩阵元素之间的关系不变。
假设我们拿到的数据矩阵是M,而U是M在坐标轴上的投影,这个投影能够很好的将杂糅的特征分割。当然,这个投影包括但不仅限于其中一个坐标轴,他是N维数据在n维坐标轴上的投影(n<=N)。
既然用向低维坐标投影的方式可以解决直接降维解决不了的特征杂糅问题,那么如何进行投影呢?
在中学阶段我们就已经了解到了,向一个方向进行投影就是在原来的数据的基础上乘上一个三角函数。现在我们进行一下思维的发散——在角度一定的情况下,三角函数的值就已经确定了,相当于在原来数据上乘上一个实数,在矩阵运算中对应的就是乘以一个矩阵。所以我们的目标就变为了如何求能使得原数据M在低维坐标轴上进行投影的矩阵。
M = U S V T M = USV^T M=USVT
其中
M:代表的是原数据
U:可以看作是低维坐标轴上的数据
S:作用是对数据U进行拉伸(在线性代数中矩阵可以乘以一个对角矩阵,也称拉伸矩阵对数据进行拉伸。)
V.T:作用是对US进行旋转
先假设有一个在低维坐标系能够很好的进行数据划分的矩阵U、通过对U进行拉伸和旋转能够得到矩阵M。而我们拿到的矩阵是M那么只需要求的S和V.T就可以求的U。在这个我们再深入的思考一下:其实这里并没有必要求出S,因为S只是对U做拉伸变换,即便是进行了拉伸变换数据依然可以很好的分离,所以问题就变为了求出V.T就可以求出US的值,即U进行拉伸变换后的值
前提条件U和V都是标准正交基,所以
( U T ) U = E , V T = V − 1 (U^T)U=E, V^T= V^{-1} (UT)U=E,VT=V−1
M = U S V T ( M T ) M = ( U S V T ) T ( U S V T ) ( M T ) M = ( V S U T ) ( U S V T ) ( M T ) M = V S U T U S V T ( M T ) M = V S S V T ( M T ) M V = V S S M = USV^T \\ (M^T)M = (USV^T)^T(USV^T) \\(M^T)M=(VSU^T)(USV^T) \\(M^T)M=VSU^TUSV^T \\(M^T)M=VSSV^T \\(M^T)MV=VSS M=USVT(MT)M=(USVT)T(USVT)(MT)M=(VSUT)(USVT)(MT)M=VSUTUSVT(MT)M=VSSVT(MT)MV=VSS
这里大家可以观察一下推导结果,SS是(M.T)M的特征值,V是(M.T)M的特征向量,这里只需要求(M.T)M的特征向量即可求出V
X = M W X = MW X=MW 这里不禁发出疑问,为什么取前n个列向量可以降维呢? 这里假设M矩阵的形状是m×n,U的形状是m×m,S的形状是m×s, V.T的形状是s×n,V的形状是n×s。 最初的M矩阵形状是m×n,而变换后变成了m×k(k<=n),很明显特征的数目减少了,所以达到了降维的效果。 这里取V的前k项相当于把V的形状变为了n×k,则V.T的形状变成k×n,S的形状变为m×k。(k<=s) 协方差矩阵的特征向量是主成分分析(PCA)主成分的方向,其实和奇异值分解法的方法类似,都是找到一个旋转矩阵去对原来数据进行旋转。 c o v ( x , y ) = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) n − 1 cov(x, y)=\frac { \sum_{i=1}^n {(x_i- \bar{x})}{(y_i- \bar{y})}}{n-1} cov(x,y)=n−1∑i=1n(xi−xˉ)(yi−yˉ) 这里以二维数据为例 C = 1 n − 1 M T M = 1 n − 1 V S S V T C=\frac{1}{n-1}M^TM \\=\frac{1}{n-1}VSSV^T C=n−11MTM=n−11VSSVT 代码实现请参照我的另一篇博客
其中W中的向量是V中前k个列向量 0降维原因直观理解
降维原因推导解释
由于S为伸缩矩阵,伸缩矩阵减少了列向量,相当于将原先S矩阵的一部分数据清0了。在U与S相乘时U其中的一部分列向量会被清0,其作用相当于去掉了一部分特征值,所以达到了降维的效果。协方差法
协方差原理剖析
公式
主成分方向求取
C = [ c o v ( x , x ) c o v ( x , y ) c o v ( x , y ) c o v ( y , y ) ] = [ ∑ i = 1 n x i 2 n − 1 ∑ i = 1 n x i y i n − 1 ∑ i = 1 n y i x i n − 1 ∑ i = 1 n y i 2 n − 1 ] C=\begin{bmatrix} cov(x, x) & cov(x, y) \\ cov(x, y) & cov(y, y) \\ \end{bmatrix} \\ =\begin{bmatrix} \frac { \sum_{i=1}^n {x_i^2}}{n-1} & \frac { \sum_{i=1}^n {x_iy_i}}{n-1} \\ \frac { \sum_{i=1}^n {y_ix_i}}{n-1} & \frac { \sum_{i=1}^n {y_i^2}}{n-1} \\ \end{bmatrix} C=[cov(x,x)cov(x,y)cov(x,y)cov(y,y)]=[n−1∑i=1nxi2n−1∑i=1nyixin−1∑i=1nxiyin−1∑i=1nyi2]
如果仔细观察可以发现:
C = 1 n − 1 [ x 1 x 2 ⋅ ⋅ ⋅ x n y 1 y 2 ⋅ ⋅ ⋅ y n ] [ x 1 y 1 x 2 y 2 ⋅ ⋅ ⋅ ⋅ x n y n ] = 1 n − 1 M T M C= \frac{1}{n-1} \begin{bmatrix} x_1 & x_2 & \cdot\cdot\cdot &x_n\\ y_1 & y_2 & \cdot\cdot\cdot & y_n \\ \end{bmatrix} \begin{bmatrix} x_1 & y_1 \\ x_2 & y_2 \\ \cdot & \cdot \\ \cdot & \cdot \\x_n & y_n\\\end{bmatrix} \\= \frac{1}{n-1}M^TM C=n−11[x1y1x2y2⋅⋅⋅⋅⋅⋅xnyn]⎣⎢⎢⎢⎢⎡x1x2⋅⋅xny1y2⋅⋅yn⎦⎥⎥⎥⎥⎤=n−11MTM协方差和奇异值分解的关联
C V = 1 n − 1 V S S CV=\frac{1}{n-1}VSS CV=n−11VSS
可以看到使用协方差和奇异值分解对于矩阵的旋转效果的效果是一样的代码实现
通俗易懂的机器学习——协方差、奇异值分解、PCA降维代码实现