sklearn截断奇异值分解无法处理复杂矩阵。

3

我正在尝试使用sklearn的随机版本TruncatedSVD(虽然实际上我在调用内部函数randomized_svd以获取实际的u、s、v矩阵)。虽然对于实数矩阵它能正常工作,但是对于复数矩阵,即使奇异值完全正确,我也无法得到原始矩阵:

>>> import numpy as np
>>> from sklearn.utils.extmath import randomized_svd
>>> N = 3
>>> a = np.random.rand(N, N)*(1 + 1j)
>>> u1, s1, v1 = np.linalg.svd(a)
>>> u2, s2, v2 = randomized_svd(a, n_components=N, n_iter=7)
>>> np.allclose(s1, s2)
True
>>> np.allclose(a, u1.dot(np.diag(s1)).dot(v1))
True
>>> np.allclose(a, u2.dot(np.diag(s2)).dot(v2))
False

您有什么想法是出了什么问题?

1个回答

0

事实证明,这是随机奇异值分解中的一个错误,具体在于这个转换:

B = safe_sparse_dot(Q.T, M)

用这个替换

B = safe_sparse_dot(Q.T.conj(), M)

问题已解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接