SVD解线性方程组——秘密大起底

奇异值分解(SVD)是计算机视觉领域中一种使用最为广泛的矩阵分解技术。我们已经知道了一个矩阵A可以分解为下面这样一种形式: A = VDV' (1),这里V是一个正交矩阵(AA' = I),V' 代表V的转置, D是一个对角矩阵, 对角矩阵A中的每一个对角元都是A的特征值。

对于一个方阵A,我们总能找到一种特征值分解的方式,A可以表达为 (1)所示的形式,但当A不是一个方阵时,我们需要知道是否也存在一个相似的分解方法。幸运的是,这样的分解方式是存在的,这就是SVD。

对于任一给定的矩阵A(m * n),都存在这样的分解:A = UDV' 。 这里, U是一个m * m的正交矩阵,D是一个m * n的对角矩阵, V是一个n * n的正交矩阵。

D中的对角元叫做A的奇异值,U中的列向量叫做A的左奇异向量, V中的列向量叫做A的右奇异向量。

由于我们主要讲解如何用SVD解线性方程组,对于SVD的一些性质,我们不再详述,感兴趣的可以参考相关资料。


SVD解优化问题:

(1)解非齐次线性方程组(Ax = b)

我们可以用SVD解诸如 Ax = b 这样的线性方程组。这个问题其实就等价于最小化|| Ax - b ||2 (2),这是一个分线性优化问题。

已经知道svd(A) = UDV',并且对于一个正交矩阵M,满足这样一条性质: || Mv || = || v || (3), v是列向量。把(3)代入(2)中,得到:

min(|| Ax - b ||2)  = min(|| UDV' x - b ||) = min(DV' x - U'b) (4)。设y = V'x, b' = U'b,(4)式可重新表述为Dy = b'(D是一个对角矩阵),表达成矩阵的形式如下:


(ps: 如果无法浏览图片,可以访问这个网址https://img-blog.csdn.net/20140719101625906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdWxpeWFuZzE5OTA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

根据上式,方程组的解很容易得到 yi = bi' / di。

(2)解齐次方程组(Ax = 0)

相似的情况,我们把问题转化为最小化|| Ax ||2的非线性优化问题,我们已经知道了x = 0是该方程组的一个特解,为了避免x = 0这种情况(因为在实际的应用中x = 0往往不是我们想要的),我们增加一个约束,比如|| x ||2 = 1,这样,问题就变为:

min(|| Ax ||2) , || x ||2 = 1 或 min(|| Ax ||) , || x || = 1

再次应用(3)式, || Ax || = || UDV' x || = || DV' x||,令y = V'x, 因此,问题变为min(|| Dy ||), || y || = 1。由于D是一个对角矩阵,对角元的元素按递减的顺序排列,因此最优解在y = (0, 0,..., 1)'是取得,又因为x = Vy, 所以最优解就是V的最小奇异值对应的列向量,比如,最小奇异值在第8行8列,那么x = V的第8个列向量。



  • 14
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线性方程组的最小范数,可以使用奇异值分解(Singular Value Decomposition,SVD)方法。下面是线性方程组最小范数的步骤: 1. 将线性方程组表示为矩阵形式:Ax = b,其中A是系数矩阵,x是未知向量,b是常数向量。 2. 对系数矩阵A进行奇异值分解:A = UΣV^T,其中U和V是正交矩阵,Σ是对角矩阵。 3. 将线性方程组表示为奇异值分解的形式:UΣV^Tx = b。 4. 由于U和V是正交矩阵,它们的转置等于它们的逆。因此,可以将方程组重写为:ΣV^Tx' = U^Tb,其中x'是新的未知向量。 5. 由于Σ是对角矩阵,可以通过将对角线上的非零元素取倒数,并将其他元素设为零来计算Σ的伪逆Σ⁺。 6. 计算新的未知向量x':x' = VΣ⁺U^Tb。 这样就得到了线性方程组的最小范数x'。 以下是使用NumPy库来线性方程组最小范数的示例代码: ```python import numpy as np # 定义线性方程组的系数矩阵 A 和常数向量 b A = np.array([[1, 2], [3, 4], [5, 6]]) b = np.array([1, 2, 3]) # 进行奇异值分解 U, S, Vt = np.linalg.svd(A) # 计算伪逆矩阵 S_pseudo_inv = np.zeros((A.shape[1], A.shape[0])) S_pseudo_inv[:A.shape[1], :A.shape[1]] = np.linalg.inv(np.diag(S)) # 计算最小范数 x_prime = Vt.T @ S_pseudo_inv @ U.T @ b # 打印最小范数 print("线性方程组的最小范数为:", x_prime) ``` 在这个示例中,我们使用`np.linalg.svd`函数对系数矩阵A进行奇异值分解,得到正交矩阵U、对角矩阵Σ和正交矩阵V的转置。然后,我们计算Σ的伪逆矩阵S_pseudo_inv,以及最小范数x_prime。最后,我们打印出最小范数。 如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值