余因子と余因子展開

概要

この記事では、行列の基本的な概念である余因子と余因子展開について解説する。これらの概念は、線形代数学や機械学習、特に推薦システムにおいて重要な役割を果たす。具体例を通じて、Pythonによる実装例も示す。

github

  • jupyter notebook形式のファイルはこちら

google colaboratory

  • google colaboratory で実行する場合はこちら

実行環境

OSはmacOSです。LinuxやUnixのコマンドとはオプションが異なりますので注意してください。

!sw_vers
ProductName:		macOS
ProductVersion:		13.5.1
BuildVersion:		22G90
!python -V
Python 3.9.17

pandasのテーブルを見やすいようにHTMLのテーブルにCSSの設定を行います。

基本的なライブラリをインポートし watermark を利用してそのバージョンを確認しておきます。 ついでに乱数のseedの設定をします。

%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import random

import scipy
import numpy as np

import matplotlib
import matplotlib.pyplot as plt

seed = 123
random_state = 123

random.seed(seed)
np.random.seed(seed)


from watermark import watermark

print(watermark(python=True, watermark=True, iversions=True, globals_=globals()))
Python implementation: CPython
Python version       : 3.9.17
IPython version      : 8.17.2

matplotlib: 3.8.1
numpy     : 1.25.2
scipy     : 1.11.2

Watermark: 2.4.3

余因子の定義と性質

余因子(Cofactor)とは、行列の要素に関連するある種の行列式を指す。具体的には、$a_{ij}$を行列$\mathbf{A}$の$(i,j)$成分としたとき、余因子$C_{ij}$は次のように定義される:

$$ C_{ij} = (-1)^{i+j} \det(\mathbf{A}_{ij}) $$

ここで、$\mathbf{A}_{ij}$は$\mathbf{A}$から$i$行と$j$列を取り除いた部分行列である。この定義により、余因子行列$\mathbf{C}$は行列$\mathbf{A}$の各要素の余因子を集めた行列となる。

具体例

例えば、行列$\mathbf{A}$が次のような$3 \times 3$行列であるとする:

$$ \mathbf{A} = \begin{pmatrix} 1 & 2 & 3 \\ 0 & 1 & 4 \\ 5 & 6 & 0 \end{pmatrix} $$

このとき、成分$a_{11}$に対応する余因子$C_{11}$は次のように計算される:

$$ \mathbf{A}_{11} = \begin{pmatrix} 1 & 4 \\ 6 & 0 \end{pmatrix} $$

$$ C_{11} = (-1)^{1+1} \det(\mathbf{A}_{11}) = \det(\begin{pmatrix} 1 & 4 \\ 6 & 0 \end{pmatrix}) = 1 \cdot 0 - 4 \cdot 6 = -24 $$

Pythonによる実装例

import numpy as np


def minor(matrix, i, j):
    minor_matrix = np.delete(matrix, i, axis=0)
    minor_matrix = np.delete(minor_matrix, j, axis=1)
    return minor_matrix


def cofactor(matrix, i, j):
    minor_matrix = minor(matrix, i, j)
    return ((-1) ** (i + j)) * np.linalg.det(minor_matrix)


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

C11 = cofactor(A, 0, 0)
print("C11 =", round(C11, 2))
C11 = -24.0

余因子展開の定義と性質

余因子展開(Cofactor Expansion)とは、行列の行や列に沿って行う行列式の計算方法である。行列$\mathbf{A}$の行列式$\det(\mathbf{A})$は、次のように余因子を用いて展開される:

$$ \det(\mathbf{A}) = \sum_{j=1}^{n} a_{ij} C_{ij} $$

ここで、$i$は固定された行のインデックスであり、$j$はその行の各列のインデックスである。この式は任意の行$i$について成立する。

具体例

再び行列$\mathbf{A}$を用いて、行列式を余因子展開により計算する。$i=1$行に沿って展開すると:

$$ \det(\mathbf{A}) = a_{11}C_{11} + a_{12}C_{12} + a_{13}C_{13} $$

それぞれの余因子は以下の通り計算される:

$$ C_{11} = -24, \quad C_{12} = (-1)^{1+2} \det(\begin{pmatrix} 0 & 4 \\ 5 & 0 \end{pmatrix}) = 20, \quad C_{13} = (-1)^{1+3} \det(\begin{pmatrix} 0 & 1 \\ 5 & 6 \end{pmatrix}) = -5 $$

したがって、

$$ \det(\mathbf{A}) = 1 \cdot (-24) + 2 \cdot 20 + 3 \cdot (-5) = -24 + 40 - 15 = 1 $$

Pythonによる実装例

def determinant(matrix):
    n = len(matrix)
    if n == 1:
        return matrix[0, 0]
    elif n == 2:
        return matrix[0, 0] * matrix[1, 1] - matrix[0, 1] * matrix[1, 0]
    else:
        det = 0
        for j in range(n):
            det += matrix[0, j] * cofactor(matrix, 0, j)
        return det


det_A = determinant(A)
print("det(A) =", round(det_A, 2))
det(A) = 1.0

余因子と余因子展開の応用

余因子と余因子展開は、行列の逆行列の計算にも重要である。特に、行列$\mathbf{A}$の逆行列$\mathbf{A}^{-1}$は、余因子行列$\mathbf{C}$と行列式$\det(\mathbf{A})$を用いて次のように表される:

$$ \mathbf{A}^{-1} = \frac{1}{\det(\mathbf{A})} \mathbf{C}^T $$

この関係は、行列の性質を解析する際に有用である。特に機械学習における線形代数の応用、例えば推薦システムのモデルの構築において重要である。

具体例

行列$\mathbf{A}$の逆行列を求めるために、余因子行列と行列式を利用する。

Pythonによる実装例

def cofactor_matrix(matrix):
    n = len(matrix)
    C = np.zeros(matrix.shape)
    for i in range(n):
        for j in range(n):
            C[i, j] = cofactor(matrix, i, j)
    return C


C = cofactor_matrix(A)
det_A = determinant(A)
A_inv = (1 / det_A) * C.T
print("A^(-1) = \n", A_inv.round(2))
A^(-1) =
 [[-24.  18.   5.]
 [ 20. -15.  -4.]
 [ -5.   4.   1.]]

結論

この記事では、余因子と余因子展開の定義、性質、及び具体的な応用例について説明した。これらの概念は、行列の性質を解析するための強力なツールであり、特に機械学習の分野において重要である。

参考文献