投影矩阵广泛地应用在数学相关学科的各种证明中,但是由于其概念比较抽象,所以比较难理解。这篇文章主要从最小二乘法的推导导出投影矩阵,并且应用SVD分解,写出常用的几种投影矩阵的形式。

问题的提出

已知有一个这样的方程组:
\[Ax=b\]
其中,\(A \in R^{m \times n},x,b \in R^n\)

  • 当\(m=n\)时,且\(rank(A)=n\)时,这是一个适定方程组,有唯一解\(x=A^{-1}b\)
  • 当\(m<n\)时,或者\(rank(A)<n\)时,这是一个欠定方程组,有无穷多个解。对于这种情况,我们使用\(ran(A)\)中与\(b\)距离最近的向量对应的\(x\)作为最小二乘解。而相应的\(ran(A)\)中的这个向量就是\(b\)在空间\(ran(A)\)中的投影。

最小二乘法

几何解法

如上图所示,\(b\)不在\(ran(A)\)中,\(Ax_0\)是\(ran(A)\)空间中对\(b\)在欧几里得范数下的最好估计。此时\[\forall x \in {R^n},\left\langle {Ax,b - A{x_0}} \right\rangle = 0\]
等价于
\[{x^T}{A^T}(b - A{x_0}) = 0\]
由于x的任意性,所以
\[{A^T}(b - A{x_0}) = 0\]
整理得
\[{x_0} = {({A^T}A)^{ - 1}}{A^T}b = {A^\dagger }b\]
其中\({A^\dagger } = {({A^T}A)^{ - 1}}{A^T}\)称为A的伪逆。

数值解法

原问题等价于

\[\min ||Ax - b||_2^2\]

记$ f(x)=||Ax-b||_2^2=(Ax-b)^T(Ax-b)=x^TA^T A x-2 b^T A x + b^Tb$,对x求导得,

\[\nabla f = 2({A^T}Ax - {A^T}b) = 0\]
解得,
\[{x} = {({A^T}A)^{ - 1}}{A^T}b = {A^\dagger }b\]

投影矩阵

对最小二乘解两边同时乘以A,就是对应的投影向量,即

\[{Ax} = {A({A^T}A)^{ - 1}}{A^T}b=Pb\]

那么\(P={A({A^T}A)^{ - 1}}{A^T}\)就是将\(b\)投影到\(ran(A)\)的投影矩阵。因为

\[P^T={A({A^T}A)^{ - 1}}{A^T}=P,P^2=P\]
满足投影矩阵的定义。
所以\(ran(A)\)对应的投影矩阵为
\[P={A({A^T}A)^{ - 1}}{A^T}\]

SVD分解下的投影矩阵

秩为r的矩阵A的SVD分解为\(A = U\Sigma {V^T} \in R^{m \times n}\)。其中,

\[U = [{U_r}|{\tilde U_r}],V = [{V_r}|{\tilde V_r}]\]

那么,带入公式可以得到

\(V_r V_r^T\)是\(ran(A^T)={null(A)}^\bot\)空间的投影矩阵
\(U_r U_r^T\)是\(ran(A)\)空间的投影矩阵

对于\(\forall x \in R^n\),有

\[ \left\langle {V_r V_r^T x,\tilde V_r {\tilde V_r}^T x} \right\rangle =x^T V_r V_r^T \tilde V_r {\tilde V_r}^T x=0\]

所以,\(\tilde V_r {\tilde V_r}^T\)是\(null(A)\)空间的投影矩阵
同理,\(\tilde U_r {\tilde U_r}^T\)是\(null(A^T)={ran(A)}^\bot\)空间的投影矩阵

投影矩阵、最小二乘法和SVD分解的更多相关文章

  1. 机器学习中的矩阵方法04:SVD 分解

    前面我们讲了 QR 分解有一些优良的特性,但是 QR 分解仅仅是对矩阵的行进行操作(左乘一个酉矩阵),可以得到列空间.这一小节的 SVD 分解则是将行与列同等看待,既左乘酉矩阵,又右乘酉矩阵,可以得出 ...

  2. 矩阵的SVD分解

    转自 http://blog.csdn.net/zhongkejingwang/article/details/43053513(实在受不了CSDN的广告) 在网上看到有很多文章介绍SVD的,讲的也都 ...

  3. SVD分解及线性最小二乘问题

    这部分矩阵运算的知识是三维重建的数据基础. 矩阵分解 求解线性方程组:,其解可以表示为. 为了提高运算速度,节约存储空间,通常会采用矩阵分解的方案,常见的矩阵分解有LU分解.QR分解.Cholesky ...

  4. gemm() 与 gesvd() 到矩阵求逆(inverse)(根据 SVD 分解和矩阵乘法求矩阵的逆)

    可逆方阵 A 的逆记为,A−1,需满足 AA−1=I. 在 BLAS 的各种实现中,一般都不会直接给出 matrix inverse 的直接实现,其实矩阵(方阵)的逆是可以通过 gemm()和gesv ...

  5. SVD分解的理解[转载]

    http://www.bfcat.com/index.php/2012/03/svd-tutorial/ SVD分解(奇异值分解),本应是本科生就掌握的方法,然而却经常被忽视.实际上,SVD分解不但很 ...

  6. SVD分解技术详解

    版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系wheeleast@gm ...

  7. SVD分解 解齐次线性方程组

    SVD分解 只有非方阵才能进行奇异值分解 SVD分解:把矩阵分解为 特征向量矩阵+缩放矩阵+旋转矩阵 定义 设\(A∈R^{m×n}\),且$ rank(A) = r (r > 0) $,则矩阵 ...

  8. 机器学习之SVD分解

    一.SVD奇异值分解的定义 假设是一个的矩阵,如果存在一个分解: 其中为的酉矩阵,为的半正定对角矩阵,为的共轭转置矩阵,且为的酉矩阵.这样的分解称为的奇异值分解,对角线上的元素称为奇异值,称为左奇异矩 ...

  9. opencv2.4中SVD分解的几种调用方法

    原帖地址: http://blog.sina.com.cn/s/blog_6109b5d00101ag7a.html       在摄影测量和计算机视觉中,考虑最优解问题时,经常要用到SVD分解.奇异 ...

随机推荐

  1. Linux下Java、Maven、Tomcat的安装

    1.安装Java(此处假定安装文件夹位/usr/local) 1)下载jdk(jdk-7),下载地址例如以下: 32位:http://download.oracle.com/otn-pub/java/ ...

  2. Verilog 浮点数运算模块

    算法中常常会到浮点数运算,而浮点数的处理常常是Verilog初学中常常遇到的问题.以下将就一个简单的例子说明Verilog中浮点数运算处理. 在JPEG图像压缩时遇到色彩空间变换的问题,将YCbCr转 ...

  3. TC2安装方法

    电驴下载TC2英文原版安装文件,3 Disk,安装方法记录如下: cmd.exe chcp 437 挂载安装文件夹1到A盘 subst a: d:\c\Disk1 另开一个cmd,转到A盘,输入ins ...

  4. 使用MongoDB 记录业务日志

    最近公司有个需求,要对业务日志进行记录并根据日志排查问题,以前都是使用log4net之类的日志组件来记录到文件,这种方式已经不能满足业务的需要,因为日志文件会很大,即使进行分割后,查找也是很不方便,何 ...

  5. 【Mysql】之基础sql语句模板

    ==============新建数据库============ create database if not exists XXX; ==============删除数据库============ d ...

  6. 同样的代码在java和c++中结果不同

    #include <iostream> using namespace std; /* run this program using the console pauser or add y ...

  7. Cocos2d-x中使用第三方so库

    项目中假设使用到第三方的SDK,大多数是以.so动态共享库的文件打包给我们使用.怎样使用他们,见以下分析. 1.获得库文件 假如我们得到的库文件是libxxx.so(注:关于.so文件的命名方式,可百 ...

  8. 为什么是kafka(二)

    回答几个网友提出的问题,不清楚的能够看上一篇内容. 1.  kafka的删除策略应该怎么配置?为了提升性能.我是不是应该1小时删除一次消费过的数据. 全然能够依据磁盘大小配置.仅仅要磁盘足够用,全然不 ...

  9. Linux下文件的基本操作

    文件的基本操作 新建和删除文件夹 命令#mkdir /file 在当前目录创建file文件夹 命令#rmdir /file 删除当前目录下file文件夹 复制和移动文件 命令#cp text/file ...

  10. Python 字符串拼接、格式化输出、深浅复制

    拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...