Python 用于计算紧凑型svd的输出不正确

Python 用于计算紧凑型svd的输出不正确,python,Python,我试图计算给定矩阵的截断奇异值分解。我已经编写了代码,但当我测试时,它的输出不正确。我不确定我会错在哪里。我想我可能计算的位置不正确,但我似乎找不到问题所在,有人能给我一些指导吗 这是我的密码: def compact_svd(A, tol=1e-6): """Compute the truncated SVD of A. Parameters: A ((m,n) ndarray): The matrix (of rank r) to factor.

我试图计算给定矩阵的截断奇异值分解。我已经编写了代码,但当我测试时,它的输出不正确。我不确定我会错在哪里。我想我可能计算的位置不正确,但我似乎找不到问题所在,有人能给我一些指导吗

这是我的密码:

def compact_svd(A, tol=1e-6):
"""Compute the truncated SVD of A.

Parameters:
    A ((m,n) ndarray): The matrix (of rank r) to factor.
    tol (float): The tolerance for excluding singular values.

Returns:
    ((m,r) ndarray): The orthonormal matrix U in the SVD.
    ((r,) ndarray): The singular values of A as a 1-D array.
    ((r,n) ndarray): The orthonormal matrix V^H in the SVD.
"""
lambda_, v = sp.linalg.eig((A.conj().T @ A))
lambda_ = lambda_.real
sigma = np.sqrt(lambda_)
indices = np.argsort(sigma)[::-1]
v = v[:, indices]
r = 0
for i in range(len(sigma)):
    if sigma[i] > tol:
        r = r + 1
pos_sigma = sigma[:r]
pos_v = v[:,:r]
U = (A @ pos_v) / pos_sigma
return U, pos_sigma, pos_v.conj().T
这是我的测试矩阵:

A = np.array([[9,9,9,3,2,9,3,7,7,8],
[4,4,7,4,2,4,8,7,1,8],
[1,4,7,4,5,6,8,4,1,6],
[5,5,1,8,9,4,9,4,2,7],
[7,7,7,9,4,7,4,3,7,1]],dtype = float)

print(compact_svd(A))
正确的输出:

    (array([[ 0.54036027+0.j,  0.58805563+0.j, -0.29423603+0.j,
     -0.4346745 +0.j, -0.29442248+0.j],
    [ 0.41227593+0.j, -0.21929894+0.j, -0.51747179+0.j,
      0.08375491+0.j,  0.71214086+0.j],
    [ 0.38514303+0.j, -0.32015959+0.j, -0.24745912+0.j,
      0.60060756+0.j, -0.57201156+0.j],
    [ 0.43356274+0.j, -0.61204283+0.j,  0.41057641+0.j,
     -0.51216171+0.j, -0.080897  +0.j],
    [ 0.44914089+0.j,  0.35916564+0.j,  0.64485588+0.j,
      0.42544582+0.j,  0.26912684+0.j]]),
    array([39.03360665, 11.91940614,  9.3387396 ,  5.38285176,  3.33439025]),
    array([[ 0.31278916-0.j,  0.34239004-0.j,  0.35924746-0.j,
      0.31566457-0.j,  0.24413875-0.j,  0.35101654-0.j,
      0.35095554-0.j,  0.28925585-0.j,  0.22009374-0.j,
      0.34370454-0.j],
    [ 0.29775734-0.j,  0.21717625-0.j,  0.28679345-0.j,
     -0.17261926-0.j, -0.41403132-0.j,  0.21480395-0.j,
     -0.5556673 -0.j, -0.00587411-0.j,  0.40832611-0.j,
     -0.24296833-0.j],
    [ 0.17147953-0.j,  0.09198514-0.j, -0.32960263-0.j,
      0.55102537-0.j,  0.36556324-0.j, -0.00497598-0.j,
     -0.07790604-0.j, -0.33140639-0.j,  0.26883294-0.j,
     -0.47752981-0.j],
    [-0.47542292-0.j, -0.14068908-0.j,  0.62131114-0.j,
      0.21645498-0.j, -0.11266769-0.j,  0.17761373-0.j,
      0.23467192-0.j, -0.15350902-0.j, -0.07515751-0.j,
     -0.43906049-0.j],
    [ 0.33174054-0.j, -0.18290668-0.j,  0.04021533-0.j,
      0.43552649-0.j, -0.50269662-0.j, -0.50174342-0.j,
      0.17580464-0.j,  0.33582599-0.j, -0.05960136-0.j,
     -0.1162055 -0.j]])

我发现了很好,如果你发现了,请加上一个答案你是怎么发现的。这将对以后的用户更有帮助