【Python入門】余因子行列|cofactor()関数を学ぶ

余因子行列|cofactor()関数を学ぶ_アイキャッチ プログラミング

※ 当サイトはアフィリエイト広告を利用しています。

levtech-ad
スポンサーリンク

余因子行列は、Pythonで簡単に計算することができます。

本記事では、Pythonを使用した余因子行列の計算方法について、詳しくご説明します。

こんな人に読んでほしい
  • Python初心者の人
  • Pythonを使用した余因子行列の確認方法について学びたい人
levtech-ad

余因子行列

余因子行列(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(テックアカデミー)がおすすめです。

私も入っていますが、好きな時間に気軽にオンラインで学べますので、何より楽しいです。

現役エンジニアからマンツーマンで学べるので、一人では中々続かない人にも、向いていると思います。

無料体験ができますので、まずは試してみてください!

\まずは無料体験!/
スポンサーリンク
タイトルとURLをコピーしました