多项式拟合曲线时使用最小二乘法,把问题化简为A*x=B
的线性方程组;
然后使用LU矩阵分解算法求解线性方程组A*x=B
,具体做法是:
- 先对矩阵
A
进行行初等变换
得到上三角矩阵U
; - 再求出
下三角矩阵L
,就变成了求解L*U*x=B
,由于L
、U
是下三角或上三角矩阵,所以很容易求解x
;
SVD奇异值分解也是用来对矩阵进行分解,他是把一个矩阵分解为三个矩阵。它是使用特殊方法来求解出矩阵的左奇异矩阵U
和右奇异矩阵V
和奇异值矩阵。但是求解U
、V
的方法有很多种,并非只有使用A^T*A
这一个方法,而且计算矩阵A^T*A
这个方法计算量太大,不合适。该博客是以这种方法为例,所以这一点需要明白。
SVD
的实现算法有很多种,可以不用先求出矩阵 X^T * X
,也能求出我们的右奇异矩阵V
。也就是说,我们的PCA算法可以不用做特征分解
,而是做SVD
来完成。这个方法在样本量很大的时候很有效。
实际上,scikit-learn
的PCA算法的背后真正的实现就是用的SVD,而不是我们我们认为的暴力特征分解。
涉及到求矩阵X
的协方差矩阵
的,都需要进行以下步骤:
- 求
X
的各个维度 均值; - 将
X
的各个维度减去均值,再赋值给X
,即in place
就地操作; - 计算
X
的协方差矩阵C = 1/m * X * X^T
;
深入理解PCA与SVD的关系讲解了PCA问题可以转化为SVD问题求解。