线性方程组的SVD解法

  • Post author:
  • Post category:其他




SVD方法求解线性方程组

本文详细推导如果利用奇异值分解得到



A

X

=

0

AX=0






A


X




=








0









A

X

=

b

AX=b






A


X




=








b





的解,推导如下。



齐次方程组求解AX=0

对于一个维度为



m

×

n

m\times n






m




×








n





的矩阵



A

A






A





来说,我们可以将其进行奇异值分解得到:





A

m

×

n

=

U

m

×

m

W

m

×

n

V

n

×

n

T

A_{m\times n} = U_{m \times m} W_{m\times n}V^T_{n\times n}







A











m


×


n





















=









U











m


×


m




















W











m


×


n




















V











n


×


n









T























我们知道对于齐次线性方程组来说,如果位置量的维度为



n

n






n





,并且



r

a

n

k

(

A

)

=

m

>

n

rank(A)=m>n






r


ank


(


A


)




=








m




>








n





的话,约束多于位置量个数,一般这种情况我们会使用最小二乘法进行求解:





x

+

=

arg

min

A

X

2

x^{+}=\arg \min\Vert AX\Vert^2







x











+












=








ar

g





min







A


X














2














此时,



x

+

x^{+}







x











+













代表最小二乘法最优值。



基于拉格朗日法推导

我们将式(2)转换为一个带等式约束的最优问题:





x

+

=

arg

min

A

X

2

s

.

t

.

  

X

2

=

1

x^{+} = \arg\min\Vert AX \Vert^2 \\ s.t.~~ \Vert X \Vert^2 = 1







x











+












=








ar

g





min







A


X














2















s


.


t


.









X














2











=








1







我们知道



k

\forall k









k





那么



k

A

X

=

0

kAX=0






k


A


X




=








0





,所以我们可以这么限制。

针对式(3)使用拉格朗日乘子法:





L

(

X

,

λ

)

=

A

X

2

+

λ

(

1

X

2

)

=

A

X

X

T

A

T

+

λ

(

1

X

T

X

)

L(X, \lambda) = \Vert AX \Vert^2 + \lambda(1 – \Vert X \Vert^2)\\ = AXX^TA^T + \lambda(1 – X^TX)






L


(


X


,




λ


)




=











A


X














2











+








λ


(


1
















X














2









)








=








A


X



X










T










A










T











+








λ


(


1














X










T









X


)







让朗格朗日函数



L

L






L









λ

\lambda






λ









x

x






x





求导得:





L

λ

=

1

X

T

X

=

0

L

X

=

2

A

T

A

X

2

λ

X

=

0

\frac{\partial L}{\partial \lambda} = 1-X^TX = 0\\ \frac{\partial L}{\partial X} = 2A^TAX-2\lambda X = 0




















λ

















L






















=








1














X










T









X




=








0






















X

















L






















=








2



A










T









A


X













2


λ


X




=








0







于是得到:





A

T

A

=

λ

A^TA = \lambda







A










T









A




=








λ







于是,式(2)可以化简为:





x

+

=

arg

min

A

X

2

=

arg

min

X

T

A

T

A

X

=

arg

min

X

T

λ

X

x^{+}=\arg \min\Vert AX\Vert^2\\ =\arg\min X^TA^TAX\\ =\arg\min X^T\lambda X







x











+












=








ar

g





min







A


X














2















=








ar

g





min





X










T










A










T









A


X








=








ar

g





min





X










T









λ


X







由式(7),我们知道这里的



λ

\lambda






λ





其实是



A

T

A

A^TA







A










T









A





的特征值,也就是说这里的



λ

\lambda






λ





最小为



A

T

A

A^TA







A










T









A





最小特征值。带入式(8),



x

+

x^{+}







x











+













对应着



A

T

A

A^TA







A










T









A





最小特征值对应的特征向量。对应着也就是矩阵



A

A






A





对应的右奇异矩阵最后一行特征向量。



基于SVD推导

我们直接将式(1)带入式(2),得到:





x

+

=

arg

min

U

W

V

T

X

2

=

arg

min

W

V

T

X

2

x^{+}=\arg \min\Vert UWV^TX\Vert^2\\ =\arg\min\Vert WV^TX \Vert^2\\







x











+












=








ar

g





min







U


W



V










T









X














2















=








ar

g





min







W



V










T









X














2
















我们令



Y

=

V

T

X

Y = V^TX






Y




=









V










T









X





,于是我们要最小化



W

Y

2

\Vert WY\Vert^2









WY














2












,其中



W

=

d

i

g

(

σ

1

,

σ

2

,


,

σ

n

)

W=dig(\sigma_1,\sigma_2,\cdots, \sigma_n)






W




=








d


i


g


(



σ










1


















,





σ










2


















,











,





σ










n


















)





,于是上式等价于:





x

+

=

arg

min

W

Y

2

=

arg

min

Y

T

W

T

W

Y

x^{+}=\arg\min\Vert WY \Vert^2\\ =\arg\min Y^TW^TWY







x











+












=








ar

g





min







WY














2















=








ar

g





min





Y










T










W










T









WY







其中:



Y

T

W

T

W

Y

=

σ

1

2

y

1

2

+

σ

2

2

y

2

2

+

+

σ

n

2

y

n

2

Y^TW^TWY=\sigma_1^2y_1^2+\sigma_2^2y_2^2+\cdots+\sigma_n^2y_n^2







Y










T










W










T









WY




=









σ










1








2



















y










1








2




















+









σ










2








2



















y










2








2




















+













+









σ










n








2



















y










n








2





















,我们知道奇异值是按大小排序得,也就是最后那个奇异值最小,那么当



Y

=

(

0

,

0

,


,

1

)

Y = (0,0,\cdots,1)






Y




=








(


0


,




0


,











,




1


)





时取最小值。

我们反代回去得:





X

=

V

T

[

0

0

1

]

X = V^T\begin{bmatrix} 0\\0\\\vdots\\1 \end{bmatrix}






X




=









V










T


































































0








0





















1





































































可知当



X

X






X





取右奇异值最后一行时,式(2)取最小值。



非齐次方程求解AX=b

这里使用SVD进行求解,与齐次方程类似,我们定义最小二乘法的代价函数:





x

+

=

arg

min

A

X

b

2

=

arg

min

U

W

V

T

X

b

2

=

arg

min

W

V

T

X

U

T

b

2

x^{+} = \arg\min \Vert AX -b\Vert^2\\ =\arg\min\Vert UWV^TX-b\Vert^2 \\ = \arg\min\Vert WV^TX-U^Tb\Vert ^2







x











+












=








ar

g





min







A


X













b














2















=








ar

g





min







U


W



V










T









X













b














2















=








ar

g





min







W



V










T









X














U










T









b














2














我们定义



Y

=

V

T

X

Y = V^TX






Y




=









V










T









X





以及



b

ˉ

=

U

T

b

\bar{b}=U^Tb













b







ˉ










=









U










T









b





,得:





x

+

=

arg

min

W

Y

b

ˉ

2

x^{+} = \arg \min \Vert WY-\bar{b}\Vert^2







x











+












=








ar

g





min







WY




















b







ˉ




















2














要使得上式最小:





W

m

×

n

Y

n

×

1

=

b

ˉ

m

×

1

W_{m\times n}Y_{n\times 1}= \bar{b}_{m\times 1}







W











m


×


n




















Y











n


×


1





















=
















b







ˉ

















m


×


1
























对于一般非齐次线性方程



A

m

×

n

x

n

×

1

=

b

m

×

1

A_{m\times n}x_{n\times 1}=b_{m\times 1}







A











m


×


n




















x











n


×


1





















=









b











m


×


1






















,一般我们遇到得问题通常



m

>

n

m > n






m




>








n





,于是我们可以得到最优解:





x

+

=

V

m

×

m

W

m

×

n

1

U

n

×

n

T

b

m

×

1

x^{+} = V_{m\times m} W_{m\times n}^{-1}U^T_{n\times n} b_{m\times 1}







x











+












=









V











m


×


m




















W











m


×


n













1




















U











n


×


n









T



















b











m


×


1
























另外,我们知道



x

+

x^{+}







x











+













得维度为



n

×

1

n\times 1






n




×








1





,如果



m

>

n

m >n






m




>








n





的话,我们只取到有效为的奇异值



σ

i

\sigma_i







σ










i





















,其他的用1代替。即:





x

+

=

V

n

×

n

[

{

U

m

×

m

T

B

m

×

1

}

1

:

r

[

σ

1

  

σ

2

  

  

σ

r

r

]

r

×

1

1

  

  

1

n

r

]

n

×

1

T

x^{+} = V_{n\times n} \begin{bmatrix} \frac{ \{U_{m \times m}^TB_{m \times 1}\}_{1:r} } {\begin{bmatrix} \overbrace{ \sigma_1 ~~ \sigma_2 ~~ \cdots ~~ \sigma_r}^{r} \end{bmatrix}}_{r\times 1} &\overbrace{ 1 ~~\dots ~~ 1}^{n-r} \end{bmatrix}_{n\times 1}^T







x











+












=









V











n


×


n





























































































[






























σ










1























σ










2


































σ










r






















































r





































]



















{




U











m


×


m









T



















B











m


×


1




















}











1


:


r















































r


×


1





























































1

















1





























n





r
















































































n


×


1









T























上述的



r

[

1

,

n

]

r\in [1,n]






r













[


1


,




n


]







MATLAB求解

% determine the effective rank r of A using singular values
r = 1;
while( r < size(A,2) & s(r+1) >= max(size(A))*eps*s(1) )
r = r+1;
end
d = U'*b;
x = V* ( [d(1:r)./s(1:r); zeros(n-r,1) ] );



c++代码求解

#include <bits/stdc++.h>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

int main() {
    srand(time(NULL));
    Matrix3d A;
    A << rand()%10, rand()%10, rand()%10, 
        rand()%10, rand()%10, rand()%10, 
        rand()%10, rand()%10, rand()%10;
    cout << "A = " << endl << A << endl;
    Vector3d B(1, 4, 6);
    cout << "B = " << B.transpose() << endl;
    JacobiSVD<MatrixXd> svd(A, ComputeThinU | ComputeThinV);
    Matrix3d U = svd.matrixU();
    Matrix3d V = svd.matrixV();
    Matrix3d W = Matrix3d::Zero();
    Vector3d w = svd.singularValues();
    for(int i = 0; i < 3; ++i) W.row(i)[i] = w[i];
    cout << "U = " << endl << U << endl;
    cout << "W = " << endl << W << endl;
    cout << "V = " << endl << V << endl;

    Vector3d x = V*W.inverse()*U.transpose()*B;
    cout << "x = " << x.transpose() << endl;
    Vector3d b_ = A*x;
    cout << "A*x =  " << b_ << endl;
    return 0;    
}

输出:

A =
1 5 8
1 2 5
1 4 6
B = 1 4 6
U =
 0.723064   0.26416 -0.638278
 0.412049 -0.906546 0.0915979
 0.554432  0.329233  0.764337
W =
 13.1138        0        0
       0 0.987561        0
       0        0 0.231648
V =
 0.128837 -0.317097  0.939601
 0.507645  0.835026  0.212197
 0.851879 -0.449645 -0.268555
x = 18  3 -4
A*x =  1
4
6



版权声明:本文为qq_38555897原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。