【问题标题】:Getting Singular Values of NumPy Data Columns in Order按顺序获取 NumPy 数据列的奇异值
【发布时间】:2019-09-10 15:48:14
【问题描述】:

我想计算矩阵的奇异值分解,奇异值的顺序很重要。默认情况下,numpy.linalg.svd(和scipy.linalg.svd)似乎对奇异值进行排序,这使我无法分辨出哪个列对应于每个奇异值。

例子:

import numpy as np

X = np.array([[-74, 80, 18, -56, -112],
              [14, -69, 21, 52, 104],
              [66, -72, -5, 764, 1528],
              [-12, 66, -30, 4096, 8192],
              [3, 8, -7, -13276, -26552],
              [4, -12, 4, 8421, 16842]])

U, D, V = np.linalg.svd(X)
print(D)

返回:

array([3.63684045e+04, 1.70701331e+02, 6.05331879e+01, 7.60190176e+00,
        1.17158094e-12])

当我需要时:

array([1.70701331e+02, 6.05331879e+01, 7.60190176e+00, 3.63684045e+04, 
        1.17158094e-12])

有没有办法获得未排序的奇异值 (D)?关系 X = UDV^T 也必须保留。

编辑:这里需要一些上下文来澄清我的误解。我试图在this paper 中重现第 2.3 节,方差分解方法。

【问题讨论】:

  • 用户也转发了这个问题stats.stackexchange.com/questions/404288/…
  • 当您说“这让我无法分辨哪一列对应于每个奇异值”时,您在说什么列?酉基 U 和共轭转置 V 的那些?
  • 我已经删除了交叉发布,感谢您提出建设性问题和反馈。

标签: python numpy scipy linear-algebra svd


【解决方案1】:

当你说:

默认情况下,numpy.linalg.svd(和 scipy.linalg.svd)似乎对奇异值进行排序,这使我无法判断哪个列对应于每个奇异值。

我认为你犯了一个错误,“奇异值分解”中的奇异值没有唯一的顺序,重要的是 U、D 和 V 的列向量的顺序是这样的: U * D * V == X

这就是为什么,按照惯例,它们是按降序排列的,但显然酉基 U 和共轭转置 V 的垂直向量也按上述公式成立的顺序设置。

如果你想要一个证明,从 U、D 和 V 中计算出 X,你必须这样做:

from scipy import linalg

#decompose
U, D, V = np.linalg.svd(X)

# get dim of X
M,N = X.shape

# Construct sigma matrix in SVD (it simply adds null row vectors to match the dim of X 
Sig = linalg.diagsvd(D,M,N)

# Now you can get X back:
assert np.sum(np.dot(U, np.dot(Sig, V)) - X) < 0.00001

【讨论】:

  • 我明白了,所以,例如,如果我想计算 variance-decomposition proportions,在用于分析参数估计的方差时,奇异值没有序数意义。重要的是与奇异值的各自关系。
  • 绝对 - 说得好。这就像当你想变形一个物体时,无论是第一次旋转还是缩放,都不会改变最终结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
相关资源
最近更新 更多