12

次の MATLAB コード行があります。

a/b

私はこれらの入力を使用しています:

a = [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]   
b = ones(25, 18)

これが結果です (1x25 行列):

[5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

MATLAB は何をしているのですか? この動作を Python で再現しようとしていmrdivideますが、MATLAB のドキュメントは役に立ちませんでした。5 はどこから来て、残りの値はなぜ 0 なのですか?

他の入力でこれを試してみたところ、同様の結果が得られました。通常は、最初の要素が異なり、行列の残りがゼロで埋められています。Python で を使用するlinalg.lstsq(b.T,a.T)と、返される最初の行列のすべての値 (つまり、特異な行列ではない) は 0.2 です。私はすでにPythonで正しい除算を試みましたが、間違った次元で何かが完全に外れています。

最小二乗近似とは何かを理解しています。何mrdivideが行われているかを知る必要があるだけです。

関連している:

4

4 に答える 4

1

a/b は線形連立方程式 bx = a の最小二乗解を求めます

b が可逆の場合、これは a*inv(b) ですが、そうでない場合は、norm(bx-a) を最小化するのは x です。

ウィキペディアで最小二乗法について詳しく読むことができます。

matlab のドキュメントによると、mrdivide は最大で k 個のゼロ以外の値を返します。ここで、k は b の計算されたランクです。私の推測では、あなたの場合、matlab は b を b(:1) (同じランクを持つ) に置き換えることによって与えられる最小二乗問題を解決します。この場合、ムーア・ペンローズの逆数b2 = b(1,:); inv(b2*b2')*b2*a'が定義され、同じ答えが得られます。

于 2009-06-17T14:40:02.733 に答える
1

matlab ユーザー向けの numpy のこの便利な「チート シート」によるlinalg.lstsq(b,a)と、 --linalgはnumpy.linalg.linalgであり、フルの軽量バージョンです。scipy.linalg

于 2009-06-17T14:49:28.703 に答える