已知以下两个值:
注:A 为矩阵,A^T 为 A 的转制
求:A
提示:SVD 奇异值分解
实在摸不到头脑,求大佬讲解,甚至关键词都可以。
这是最新的代码。
然而注释掉的 A 可以算出正确的答案。 未注释的却不行。
import numpy as np
# A = np.array([[2, 4], [1, 3], [0, 0], [0, 0]])
A = np.array([[641, 28], [256, 621], [625, 800]])
# A = np.random.randint(0, 999, size=[3, 2])
AT = np.transpose(A)
SDu = np.dot(A, AT) # alpha
SDv = np.dot(AT, A) # beta
Uu, Sigmau, Vu = np.linalg.svd(SDu)
Uv, Sigmav, Vv = np.linalg.svd(SDv)
size_u, = Sigmau.shape
size_v, = Sigmav.shape
if(size_v > size_u):
Sigma = np.hstack(
(np.diag(np.sqrt(Sigmau)), np.zeros((size_v, size_v - size_u))))
else:
Sigma = np.vstack(
(np.diag(np.sqrt(Sigmav)), np.zeros((size_u - size_v, size_v))))
res_A = np.dot(np.dot(Uu, Sigma), Vv)
print('A:\n%s\nAnswer:\n%s' % (A, res_A))
1
xml123 2019-03-11 23:06:47 +08:00
不是有提示了吗……就是奇异值分解的过程啊,你找本矩阵论的书看一下奇异值分解的计算过程就知道了。
|
2
oIMOo OP 我找到了这篇文章:
https://liam.page/2017/11/22/SVD-for-Human-Beings/ 其中 “如何计算 SVD ” *可能*与我的问题相关。 理想情况是: 针对 A 可以分解成 UΣV。 根据上述理想情况: - A * A^T 可以分别分解成 UΣV * VΣU. - A^T * A 可以分别分解成 VΣU * UΣV. 所以,还是不知道怎么求 A 啊…… 相关代码: import numpy as np A = np.array([[2, 4],[1,3],[0,0],[0,0]]) AT = np.transpose(A) SDu = np.matmul(A, AT) #alpha SDv = np.matmul(AT, A) #beta UA, ZA, VA = np.linalg.svd(A) UAT, ZAT, VAT = np.linalg.svd(AT) Uu, Zu, Zu = np.linalg.svd(SDu) Uv, Zv, Zv = np.linalg.svd(SDv) ------- 另外有一篇论文。 说到: - A * A^T = (U Σ V^T) * (V Σ^T U^T) = U Z Z^T U^T - A^T * A = (V Σ^T U^T) * (U Σ V^T) = V Z^T Z V^T 同样使用上面的代码,可以验证这个式子。 但是,我怎么求 A ??? 也就是说,让我只有两个乘积( alpha、beta )的前提下,我怎么把他们拆开??? |
3
geelaw 2019-03-11 23:49:03 +08:00 via iPhone
这个问题不完整,你显然是不可能知道 A 具体是谁的——比如 A 等于正负 1 时你拿到的两个矩阵相同。
但想要求一个 A 并不困难,你可以选 UDV',其中 U、V 分别正交相似对角化两个你知道的矩阵,D 是奇异值。 |
4
oIMOo OP @geelaw 谢谢您的回复。
您能具体说一下么? 对 alpha 求出对应的三个值,Uu,Zu (也就是 sigma ),Vu 对 beta 求出对应的三个值,Uv,Zv (也就是 sigma ),Vv 然后具体怎么计算 A 呢? 我卡在这个逻辑点了…… 谢谢 |
5
oIMOo OP 上面代码错了
import numpy as np A = np.array([[2, 4],[1,3],[0,0],[0,0]]) AT = np.transpose(A) SDu = np.matmul(A, AT) #alpha SDv = np.matmul(AT, A) #beta UA, ZA, VA = np.linalg.svd(A) UAT, ZAT, VAT = np.linalg.svd(AT) Uu, Zu, Vu = np.linalg.svd(SDu) Uv, Zv, Vv = np.linalg.svd(SDv) |
6
lovestudykid 2019-03-12 03:09:53 +08:00
对 alpha 和 beta 分别正交对角化,然后特征值矩阵平方,特征向量矩阵分别作为奇异值分解的左右奇异向量就完事了。对角化的过程用 svd 或者 eig 都行
|
7
oIMOo OP |