研究室の後輩向けにpythonを用いた機械学習の講習を行っていたときに上記のエラーが起きたので、対処方法をエラー原因ごとに紹介します。
逆行列を計算しようとした場合
大抵の場合はこちらです。
これはnp.linalg.inv()を用いたときに起きるエラーで、対象の行列が正方行列でないのが原因です。
以下のコードは正方行列なので実行できますが
import numpy array = np.array([[1,2],[2,3]]) array_inv = np.linalg.inv(array) print(array_inv)
以下のコードは正方行列でないので実行できません。
import numpy array = np.array([[1,2,3],[2,3,4]]) array_inv = np.linalg.inv(array) print(array_inv)
解決方法
こういう時は、一般逆行列を計算するnp.linalg.pinv()を使用しましょう
import numpy array = np.array([[1,2,3],[2,3,4]]) array_inv = np.linalg.pinv(array) print(array_inv)
疑似逆行列ともいうようですが、これを計算すれば正方行列じゃない場合やランク落ちしてしまう場合でも逆行列(実際はもっともらしい値)を求めることができます。
また、もう少し簡単な方法で、小さな値を掛けた単位行列を足すという手法もあります。詳しい説明は以下の記事を参考にしてください。
kurora-shumpei.hatenablog.com
「pow()」や「**」で乗数を計算しようとした場合
逆行列を計算していない場合でも上記のエラーが出る場合もあります。
私の後輩はこのパターンで、ある行列の2乗を計算しようとしたときに、このエラーが出てきて混乱しました。
import numpy array = np.matrix([[1,2,3],[2,3,4]]) array = pow(array,2) print(array)
これは行列のデータ型が「numpy.ndarray」ではなく「numpy.matrix」になっているのが原因です。
なぜ、ndarrayなら大丈夫でmatrixならダメなのかはよくわかりませんが、内部で何かしらの仕様があるのでしょう
解決方法
こういうときは、np.ndarrayに変換するかnp.power()を使用しましょう。
import numpy array = np.matrix([[1,2,3],[2,3,4]]) array = np.array(array) array = pow(array,2) print(array)
import numpy array = np.array([[1,2,3],[2,3,4]]) array = np.power(array,2) print(array)
基本的にnumpy.arrayを使えば差し支えすることはないので、numpy.ndarrayに変換するのが良いかと思います。