質問

MATLABには、他の誰かが書いた次のコード行があります:

c=a.'/b

Pythonに翻訳する必要があります。 a、b、およびcはすべて配列です。現在コードのテストに使用しているディメンションは次のとおりです。

a:18x1、
b:25x18、

寸法1x25のcが得られます。

配列は正方形ではありませんが、配列が正しければ失敗することは望みません。誰かがこの行が何をしているのか(数学的に)正確に説明でき、Pythonでそれを行う方法はありますか? (つまり、Pythonに存在する場合、MATLABの組み込みmrdivide関数に相当しますか?)

役に立ちましたか?

解決

ライン

c = a.' / b

c の方程式 c b = a T の解を計算します。 Numpyには、これを直接行う演算子はありません。代わりに、 c T b T c T = a を解き、転置する必要があります結果:

c = numpy.linalg.lstsq(b.T, a.T)[0].T

他のヒント

シンボル / は、MATLABの行列右除算演算子で、 mrdivide 関数。ドキュメントから、マトリックスの右除算はマトリックスの左除算に関連しています次の方法:

B/A = (A'\B')'

A が正方行列の場合、 B / A B * inv(A)とほぼ等しくなります(ただし、別の、より堅牢な方法)。それ以外の場合、 x = B / A は、決定が不十分または過剰な連立方程式 x * A = B に対する最小二乗の意味での解です。連立方程式の解法に使用されるアルゴリズムの詳細については、をご覧ください。ここ。通常、 LAPACK または BLAS は内部で使用されます。

NumPyパッケージにはPython lstsq 最小二乗計算連立方程式の解。このルーチンを使用すると、MATLABで mrdivide 関数を使用した場合と同等の結果が得られる可能性がありますが、 exact とは考えられません。各関数で使用される基礎となるアルゴリズムに違いがあると、結果が互いにわずかに異なる可能性があります(つまり、一方が1.0の値を返し、他方が0.999の値を返す場合があります)。このエラーの相対的なサイズは、解く特定の方程式系に大きく依存して、 大きくなる可能性があります。

lstsq を使用するには、問題を少し調整する必要がある場合があります。 cB = a の形式の方程式を解きたいようです。ここで、 B は25行18列、 a は1- 18で、 c は1 x 25です。 トランスポーズを両側に適用すると、方程式 B T c T = a T 。これはより標準的な形式です(つまり、 Ax = b )。 lstsq の引数は、(この順序で) B T (18行25列の配列)および a T (18要素の配列)。 lstsq は25要素の配列( c T )を返す必要があります。

注:NumPyは1行N列またはN行1列の配列を区別しませんが、MATLABは確かに区別し、適切な配列を使用しないと怒鳴ります。

Matlabでは、 A。 'はA行列の転置を意味します。数学的には、コードで達成されるのはA T / Bです。


Python(または任意の言語)で行列除算を実装する方法 (注: A / B の形式の単純な除算を見てみましょう。たとえば、最初にA T を実行し、次にA T / Bを実行する必要があります。Pythonでの転置操作は非常に簡単です| left-as-an -exercise:)|)

行列方程式があります C * B = A(CをA / Bとして検索したい)

右分割(/)は次のとおりです。

C * (B * B T )= A * B T

次に、反転してCを分離します(B * B T

i.e。、

C = A * B T * (B * B T ) '----- [1]

したがって、Python(または任意の言語)で行列除算を実装するには、次の3つのメソッドを取得します。

  • 行列乗算
  • 行列転置
  • 逆行列

[1]のように、分割を達成するために繰り返し適用します。

のみ、A T / Bを実行する必要があるため、3つの基本メソッドを実装した後の最終操作は次のようになります。

A T * B T * (B * B T ) '

注:演算子の優先順位の基本的なルールを忘れないでください:)

[編集] Suveshが指摘したように、私は以前完全に間違っていました。ただし、numpyは、投稿で与えた手順を簡単に実行できます。

A = numpy.matrix(numpy.random.random((18, 1))) # as noted by others, your dimensions are off
B = numpy.matrix(numpy.random.random((25, 18)))
C = A.T * B.T * (B * B.T).I

B の疑似逆を使用してこれにアプローチし、その結果に A を乗算することもできます。 numpy.linalg.pinv <を使用して、これを行列乗算と組み合わせます。 code> numpy.dot

c = numpy.dot(a, numpy.linalg.pinv(b))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top