ホーム>source

ランダムな5 * 5マトリックス x を生成しましたそのようです:

<前>ウィズウィズ

そして、それを使用してそれを分解しましたウィズウィズそのような分解:

<前>ウィズウィズ

>>> x = np.random.randn(5,5) の使用 、 scipy.linalg.ldl そして >>> l, d, p = la.ldl(x) xを返したい。私は次のことができると思いました:

<前>ウィズウィズ

しかし、これは私が期待したように私にゼロを与えません。誰かが私が間違っているところを説明できますか?

私の目的は、下の対角行列 l を取得することですそのような d 行置換行列 p の必要なし 、しかし私はscipyが出力として何を与えているかについて非常に混乱しています。

>>> l[p,:] @ d @ l[p,:].transpose() - x
あなたの答え
  • 解決した方法 # 1

    LDL分解アルゴリズムは、エルミート行列/対称行列にのみ適用されます。対称である可能性が非常に低いランダムな値を持つ行列を渡します。さらに、行列の乗算は、下三角行列に置換行列を適用せずに実行する必要があります。

    非対称行列が 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]] を渡します  実際の対称行列、および期待される結果を取得します。

    <前>ウィズウィズ

    一般的にLDL ^ Tへの分解を探しているなら、順列なしで、これにより行列のフィールドがさらに減少します。マトリックスも正定である必要があります。

    以下は、そのようなマトリックスの例です。

    <前>ウィズウィズ

    ご覧のとおり、置換 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]] です 、および >>> 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

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ c# - WixツールセットでBrowseDlgを入手する方法は?