【问题标题】:Scipy LDL decomposition returning unexpected resultScipy LDL分解返回意外结果
【发布时间】:2020-05-27 02:04:36
【问题描述】:

我生成了一个随机的 5*5 矩阵x,如下所示:

>>> x = np.random.randn(5,5)

并使用scipy.linalg.ldl 分解将其分解,如下所示:

>>> l, d, p = la.ldl(x)

使用 ldp 我想返回 x。我认为我可以做到以下几点:

>>> l[p,:] @ d @ l[p,:].transpose() - x

但这并没有像我预期的那样给我零。谁能解释我哪里出错了?

我的目标是获得下对角矩阵L 使得x = LDL^T 不需要行置换矩阵p,但我对 scipy 给出的输出感到非常困惑。

【问题讨论】:

  • 正如其他人所指出的,您需要提供一个对称的正定矩阵。要创建一个示例,您只需要“平方”一个通用矩阵(可能在对角线上添加一些东西以确保特征值都是非零的)。例如。 X = <some matrix>; XX = transpose(X) . X; XX1 = XX + identity 之类的东西(用虚构的符号。我不知道 Numpy/Scipy 中的这些操作是什么)然后你 XX1 是对称的和 p.d.,所以你可以继续。

标签: python numpy math scipy linear-algebra


【解决方案1】:

LDL 分解算法仅适用于 Hermitian/对称矩阵。您正在向它传递一个具有随机值的矩阵,该矩阵不太可能是对称的。此外,矩阵乘法应该在不将置换矩阵应用于下三角矩阵的情况下进行。

将非对称矩阵传递给scipy.linalg.ldl 时,仅引用矩阵的下三角部分或上三角部分,具体取决于lower 关键字参数的值,默认为True。我们可以通过np.isclose()看到这个效果:

>>> x = np.random.randn(5,5)
>>> l, d, p = la.ldl(x)
>>> np.isclose(l.dot(d).dot(l.T) - x, 0)
[[ True False False False False]
 [ True  True False False False]
 [ True  True  True False False]
 [ True  True  True  True False]
 [ True  True  True  True  True]]

这里我们看到矩阵的上三角部分被假定为对称的,因此算法返回的值在这种情况下是正确的。

下面,我们传递la.ldl一个实际的对称矩阵,得到预期的结果。

>>> x = np.array([[1, 2, 3],
                  [2, 4, 5],
                  [3, 5, 6]])
>>> l, d, p = la.ldl(x)
>>> print(np.isclose(l.dot(d).dot(l.T) - x, 0))
[[ True  True  True]
 [ True  True  True]
 [ True  True  True]]

如果您正在寻找一般的 LDL^T 分解,没有排列,这会进一步减少矩阵域。你的矩阵也需要是positive definite

这是一个这样的矩阵的例子:

>>> x = np.array([[2, -1, 0],
                  [-1, 3, -1],
                  [0, -1, 4]])
>>> l, d, p = la.ldl(x)
>>> l
array([[ 1. ,  0. ,  0. ],
       [-0.5,  1. ,  0. ],
       [ 0. , -0.4,  1. ]])
>>> d
array([[2. , 0. , 0. ],
       [0. , 2.5, 0. ],
       [0. , 0. , 3.6]])
>>> p
array([0, 1, 2], dtype=int64)

如您所见,排列p 就是[0, 1, 2],而l 已经是下三角了。

【讨论】:

  • 只是补充一点,即使对于正定矩阵,有时排列数组也可能会重新排序。我注意到这通常是当离轴值很大(接近对角线值)时。这可能是由于算法最小化浮点错误的方式,根据:stackoverflow.com/questions/23208640/…
猜你喜欢
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多