2017-04-20 1 views

答えて

3

B逆を取るためには不十分ランクのものです。少なくとも一貫した結果を得るには、疑似逆の場合はnp.linalg.pinvを使用します。

np.linalg.matrix_rank(B) 
# we want 3 

# we got 2 
2 

A = np.array([[1,2,3],[4,5,6]]) 

B = np.array([[1,2,3],[4,5,6],[7,8,9]]) 

print(A.dot(np.linalg.pinv(B)).dot(A.T)) 

print(A.dot(np.linalg.pinv(B).dot(A.T))) 

[[ 1. 4.] 
[ 2. 5.]] 
[[ 1. 4.] 
[ 2. 5.]] 
3

浮動小数点算術演算は、を連想されていません。通常、行列A*(B*C)(A*B)*Cの数値の差は小さいため、これに気づかないでください。

[[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15] 
[ -6.30503948e+15 1.26100790e+16 -6.30503948e+15] 
[ 3.15251974e+15 -6.30503948e+15 3.15251974e+15]] 

これらの数字の大きさは大きさのエラー〜1であるようなものである。しかし、この場合には、あなたは、いくつかの不合理な結果を得て、numpyのは、実際に行おうと非可逆行列Bを、反転しようとしています倍精度レベル(約16桁の正確な数字が得られます)で予想されます。 AとA.Tによる乗算は、多くの取り消しのためにマトリックスのエンティティを小さなものに戻します。しかし、非常に大きな数字が互いに打ち消しあうと、相対的な誤差は大きくなります。結果はかなり無意味に終わる。

+0

非常によく言った! – piRSquared

関連する問題