矩阵必知必会: 十一 生成空间 优秀的LS与SVD过程对比
11 承上一节
这里我们主要查看LS与SVD两个方式对于求解问题的能力,并简单对比。
完全的对比的问题太大,只简单举个例子。
11.1 一点尾声: SVD值与LS解的对比
许多物理问题都可以转换为对线性方程 Ax = b的求解问题。
如果A可逆,那么它为方阵,行列式(determinant)就不是0,
现在需要获取以下A矩阵的分解 和 对 A*->x = ->b 的解.
11.1.1 方法一 R3空间LS解
设有R3空间A,并且
A = (4 11 14
8 7 -2
0 0 5 )
我们期望获得 b 到该空间的解
->b = (2
1
4)
又有 A^tA->x = A^t*->b (方程2)
已知:
A^t*A = A^t*(4 11 14 = (80 100 40
8 7 -2 100 170 140
0 0 5) 40 140 225 )
A^t*->b = (4 8 0 * (2 = (16
11 7 0 1 29
14 -2 5 4) 46 )
因此方程2为
V
A^t*A*->x = (80 100 40 * (x = (16
100 170 140 y 29
40 140 225) z) 46 )
获取V矩阵的增广矩阵最简形
(80 100 40 16
100 170 140 29
40 140 225 46)
将上式交换行,倍乘倍减后得到
R(V) = [[-134.16, -228.08 , -195.28, -44.87],
[ 0. , -80.50, -183.36, -33.99],
[ 0. , 0. , 8.34, 6.67]]
因此有
(-134.17, -228.08 , -195.29, * (x = ( -44.88
0. , -80.50, -183.36, y -33.99
0. , 0. , 8.34, z) 6.67)
得到方程组
-134.16x - 228.1y - 195.3z = -44.9
-80.5y - 183.4z = -33.99
8.4z = 6.7
得到向量的解
x ≈ 1.551
y ≈ -1.396
z ≈ 0.798
得到 ->x 的解
->x = (1.551
-1.396
0.798)
其于A空间的距离为
||A*-x - b || = (4 11 14 * ( 1.551 - (2 = ||( 2.02 || ≈ 2.27
8 7 -2 -1.396 1 1.04
0 0 5 ) 0.798) 4) -0.01)
11.1.2 方法二 R3空间SVD解
相同的空间,相同的问题。
设有R3空间A,并且
A = (4 11 14
8 7 -2
0 0 5 )
我们期望获得 b 到该空间的解
->b = (2
1
4)
使用奇异分解方法。此法允许使用者大规模生成矩阵的解。
在欠定矩阵(n < m)中,under determined
由于需要获取的答案->b 中,没有足够的测量去唯一地确定单个唯一解决方案。
也就是:方程数量少于未知数。
因此可能有无穷的解。
A x = b
______ __ __
| | | | | |
| | | | | |
------ | | ---
| |
---
在超定矩阵(n > m)中,over determined
也就是:方程数量多于未知数。
超定系统总是不一致的,只在某些场景有解,例如方程在系统出现多次。或者某些方程式其他方程的线性组合。
非正定或超定矩阵,可以使用约束计数描述。每个未知数都可以看作是限制一个自由度的约束。因此,当方程的数量和自由变量的数量相同,将出现临界点。
对于每个给出自由度的变量,都存在相应的约束。超定的场景发生在系统被过度约束时,也就是:当方程的数量超过未知时。
此时通常无解,或只在某些场景有解。
A x = b
______ __ __
| | | | | |
| | --- | |
| | | |
------ ---
公式
A = UΣV^t
其逆形式为
由于 U 和 V 是正交的(这意味着 U^TU=I 和 V^TV=I)我们可以将 A 的逆写为(有关技巧 ,请参阅使用 QR 分解解决超定系统)
A^-1 = V*Σ^-1*U^t
设 需要获取以下A矩阵的分解,并解决到 ->b 的解。
步骤1 因此有
A^t*A
A^t*A - λI_3
λ1 ,λ2 , λ3
因此 Σ = ( λ1 0 0
0 λ2 0
0 0 0 )
步骤2 找到A^t*A的特征值λ
v1 = ? v2 = ? v3 = ?
V为以上正交基为列的矩阵
V = (v1, v2 ,v3)
步骤3 矩阵U
U的第一列是
σ1*Av1
U的第二列是
σ2*Av2
U的第三列是
σ3*Av3
我们值得U是3 x 3 矩阵,因此:
U = (σ1*Av1 σ2*Av2 σ3*Av3)
可以验证
A = (4 11 14 = UΣV^t
8 7 -2
0 0 5)
使用以上方程:
A*->x = b
给定目标解为:
->b = (2
1
4)
可得:
x = ( 1.55
-1.4
0.8 )
向量b其到A空间的距离为:
||A*-x - b || = (4 11 14 * ( 1.55 - (2 = ||( 1.7 || ≈ 2.1
8 7 -2 -1.4 1 -1.3
0 0 5 ) 0.8) 4) 0)
三个方法可以计算得未知向量 ->x:
先计算 SVD 分解,然后再反向求解
-
1 使用matlab
[U S V]=svd(A); matlab: x = V*(diag(diag(S).^-1)*(U.'*b))
-
2 使用推导的人工公式
Σ^2*V^t*->x = Σ*U^t*b 或者 UΣV^t*->x = b V^t*->x = w
-
3 使用numpy
1, 因式分解和逆
2,使用逆来求解 Ax=b
3,公式比如 A = [[4, 11, 14], [8, 7, -2], [0, 0, 5]] b = [[3], [1], [5]] # 分解 U,Σ,V = np.linalg.svd(a) # 求逆 pav = np.linalg.pav(a) pav_svd = np.dot(np.dot(V.T,np.linalg.inv(np.diag(s))),U.T) # 使用solve 求解x,这个必须是方阵 x = np.linalg.solve(a,b)
3.3.3 对比 LS 解 和 SVD 解
因此可见,LS 解 和 SVD 解 不同 但只有些许差别。
LS 最小二乘解
->x = (1.551
-1.396
0.798)
与真实解距离约为 ≈ 2.27
SVD奇异值方法
x = ( 1.55
-1.4
0.8 )
与真实解距离约为 ≈ 2.1
对于方阵,除去误差几乎可以相等。如下图:
问题是: 截断的 SVD 解决方案如何才能更准确?
使用SVD求逆,然后获取未知量 ->x 的过程,这是非常复杂的问题。
使用 SVD 计算 Ax = b 的解的全部意义在于,实际中有一个不完整矩阵甚至非满秩矩阵——这意味着最小的奇异值非常小或为零。
这些类型的矩阵在实践中一直出现(例如, 使用numpy模拟 rand(100,100) 而不是 rand(4,4))。
在这些情况下,可以截断那些小的奇异值(以及 U 和 V 的相应列),然后 SVD 可以计算伪逆。
小结
感谢能看到现在的朋友,也许只有自己。 实际问题可能需要更多的计算工具。
而实际上也有很多方法等待发现。 下一节有些书单,有兴趣的朋友可以参考。
一个好的计算机软件和好的计算方法,确实可以节省了大量计算时间,特别是避免计算错误问题。
这个系列先到此为止。 希望将来有机会再续前缘。 谢谢。
- 点赞
- 收藏
- 关注作者
评论(0)