クロの制作日記

クロの制作日記

田舎の大学生がUnityとか機械学習関連の制作物をひたすらアップします。ブログで紹介したコード一覧https://github.com/kuroshum/blog_code

pythonでsingular matrixが起きる理由

問題

pythonのnumpyで逆行列を求めようとしたときに

numpy.linalg.linalg.LinAlgError : Singular matrix

といったエラーが出てきました。(実際はもうちょっと長いですが最後だけ切り出してきました)

原因

プログラムが悪いというよりは行列の性質上の問題です。逆行列というのは常に存在するわけではなく、行列によっては存在しない場合もあります。

bellcurve.jp

この記事に書いている通り、行や列同士が線形結合の関係、即ち、ある行(列)に何かをかけたら別の行(列)と等しくなるということ、が成り立つときはランク落ちが起きるので逆行列は存在しません。

ちなみにランク落ちというのは行列式が0になるということです。どこかの行(列)の要素が全て0になると行列式は0になります。

\begin{pmatrix} 1&1&1 \\ 2&2&2 \\ 3&3&3 \end{pmatrix}

2行目 - 1行目 x 2 または 3行目 - 1行目 x 3

の計算をすると2・3列目がゼロになります。




対処方法

先ほど書いたとおり、この問題は行列の性質上の問題なので元の行列を変形するだけでは解決しません。なのでもとの行列にλIを足すことで線形結合の関係を解消させます。

ここで言うλIは
 λ:とても小さい値(スカラー)
 I :単位行列
です。要するに元の行列の対角成分にλを足すことで、ランク落ちを防いています。

\begin{pmatrix} 1.000001&1&1 \\ 2&2.000001&2 \\ 3&3&3.000001 \end{pmatrix}

最終的にはこんな感じになります。

元の行列と値は違いますが、とても小さい差ですのでこの逆行列を計算しても結果にそこまで影響はでません。