余因子行列は、Pythonで簡単に計算することができます。
本記事では、Pythonを使用した余因子行列の計算方法について、詳しくご説明します。
余因子行列
余因子行列(adjugate matrix)とは、\(\left( i,j\right)\)成分が\(\left( i,j\right)\)余因子である行列の転置行列で、正則行列の逆行列を成分表示するために使用されます。
ここで余因子(cofactor)は、小行列式(minor determinant)を用いて定義されます。
小行列式は、\(n\)次の正方行列\(A\)について、\(i\)行目と\(j\)列目を除いて生成した行列式のことで、\(M_{ij}\)と表現します。
上記小行列式を使用して、余因子A_{ij}は下式で定義されます。
\(A_{ij}=\left( -1\right) ^{i+j}M_{ij}\)
\(i+j\)が偶数の場合、\(\left( -1\right) ^{i+j}=1\)ですので、余因子は小行列式と同じ値になります。
\(i+j\)が奇数の場合、\(\left( -1\right) ^{i+j}=-1\)ですので、余因子は小行列式に\(-1\)を掛けた値となります。
cofactor()関数の実装
NumPyを使用して、余因子と小行列式を計算する、cofactor()関数を実装してみます。
引数mを指定しないと余因子を出力し、mにTrueを指定すると、小行列式を出力するようにします。
また引数iとjには、行列から除く行と列を指定するようにします。
#input
import numpy as np
def cofactor(a, i, j, m = False):
x = np.delete(a, i, axis = 0)
x = np.delete(x, j, axis = 1)
if m == False:
a_ij = (-1)**(i + j) * np.linalg.det(x)
else:
a_ij = np.linalg.det(x)
return a_ij
上記実装した関数を使用してみます。
#input
np.random.seed(7)
a = np.random.randint(0,10,(5,5))
print("行列a:\n{}".format(a))
# 2行目と1列目を取り除いた小行列式
m_ij = cofactor(a, 1, 0, m = True)
# 2行目と1列目を取り除いた余因子
a_ij = cofactor(a, 1, 0)
print("m_ij : {:.1f}".format(m_ij))
print("a_ij : {:.1f}".format(a_ij))
#output
行列a:
[[4 9 6 3 3]
[7 7 9 7 8]
[9 8 7 6 4]
[0 7 0 7 6]
[3 5 8 8 7]]
m_ij : 669.0
a_ij : -669.0
正則行列\(A\)の余因子行列\(\overline{A}\)を使用して、逆行列は下式で算出されます。
\(A^{-1}=\dfrac{1}{\det A}\overline{A}\)
上記実装した関数を使用して、逆行列を計算してみます。
#input
np.random.seed(7)
a = np.random.randint(0,10,(5,5))
print("行列a:\n{}\n".format(a))
a_ij = np.zeros((5, 5))
for i in range(5):
for j in range(5):
a_ij[j, i] = cofactor(a, i, j)
a_inv1 = a_ij / np.linalg.det(a)
a_inv2 = np.linalg.inv(a)
np.set_printoptions(precision=3)
print("aの余因子行列:\n{}\n".format(a_ij))
print("余因子行列による逆行列\n{}\n".format(a_inv1))
print("numpy.linalg.inv()による逆行列\n{}".format(a_inv2))
#output
行列a:
[[4 9 6 3 3]
[7 7 9 7 8]
[9 8 7 6 4]
[0 7 0 7 6]
[3 5 8 8 7]]
aの余因子行列:
[[ 716. -669. -789. 3. 906.]
[ -914. 239. 115. -307. 316.]
[ -616. 385. 315. 777. -1022.]
[ 686. 1897. -1267. -231. -1540.]
[ 266. -2492. 1344. -406. 1428.]]
余因子行列による逆行列
[[-0.115 0.108 0.127 -0. -0.146]
[ 0.147 -0.039 -0.019 0.05 -0.051]
[ 0.099 -0.062 -0.051 -0.125 0.165]
[-0.111 -0.306 0.204 0.037 0.248]
[-0.043 0.402 -0.217 0.065 -0.23 ]]
numpy.linalg.inv()による逆行列
[[-0.115 0.108 0.127 -0. -0.146]
[ 0.147 -0.039 -0.019 0.05 -0.051]
[ 0.099 -0.062 -0.051 -0.125 0.165]
[-0.111 -0.306 0.204 0.037 0.248]
[-0.043 0.402 -0.217 0.065 -0.23 ]]
まとめ
この記事では、Pythonを使用した余因子行列の計算方法について、ご説明しました。
本記事を参考に、ぜひ試してみて下さい。
参考
Python学習用おすすめ教材
Pythonの基本を学びたい方向け
統計学基礎を学びたい方向け
Pythonの統計解析を学びたい方向け
おすすめプログラミングスクール
Pythonをはじめ、プログラミングを学ぶなら、TechAcademy(テックアカデミー)がおすすめです。
私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。
現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。
無料体験ができますので、まずは試してみてください!