1. Home
  2. プログラマーのための線形代数
  3. 行列の操作
  4. 行列式

行列式

ここでは機械学習でよく行うことになる行列操作の一つである行列式について解説します。

当ページで学ぶこと

  • 行列式とは
  • Pythonで行列式

行列式とは

行列式とは、正方・・行列で空間を線形変換したときの、空間(2次元行列では面積、3次元行列では体積)の拡大縮小率を表すものであり、\(\det(A)\) や \(|A|\) と表記されます。なお行列式は、正方行列のみに存在する値です。これ単体で使うものではありませんが、他の重要な行列演算を行うときに必要な場合があります。

行列式の求め方は 2 つあります。

  • サラスの公式から求める
  • 固有値の積から求める

サラスの公式は 2次正方行列とせいぜい3次正方行列の行列式を求める際に使います。それ以上の大きな行列の場合は固有値の積から求める方が簡単です。固有値については行列の分解の章で解説するので、実務上、行列式を手計算することはほとんどありませんし、当ページの趣旨は計算方法の解説ではないので、ここではサラスの公式について軽く見ておくことにします。

サラスの公式では 2 次正方行列の行列式は次のように計算します。

\[
\mathrm{det}A
=
\left| \begin{array}{cc} a & b \\ c & d \end{array} \right|
=ad-bc
\]

たとえば以下の行列式は、次のように計算します。

\[
\left| \begin{array}{cc} 3 & 2 \\ 0 & 2 \end{array} \right|
=
3\cdot 2-2\cdot 0
=
6
\]

3 次正方行列は次のように計算します。

\[\begin{eqnarray}
\mathrm{det}A
=
\left| \begin{array}{ccc} a & b & c\\ d & e & f \\ g & h & i \end{array} \right|
& = &
a \cdot \left| \begin{array}{cc} e & f \\ h & i \end{array} \right|
-b \cdot \left| \begin{array}{cc} d & f \\ g & i \end{array} \right|
+c \cdot \left| \begin{array}{cc} d & e \\ g & h \end{array} \right| \\
&=&
a(ei-fh)-b(di-fg)+c(dh-eg)
\end{eqnarray}\]

たとえば以下の行列式は、このように計算します。

\[\begin{eqnarray}
\mathrm{det}A
=
\left| \begin{array}{ccc} 3 & 2 & 1\\ 1 & 2 & 1 \\ 2 & 2 & 2 \end{array} \right|
& = &
3 \cdot \left| \begin{array}{cc} 2 & 1 \\ 2 & 2 \end{array} \right|
-2 \cdot \left| \begin{array}{cc} 1 & 1 \\ 2 & 2 \end{array} \right|
+1 \cdot \left| \begin{array}{cc} 1 & 2 \\ 2 & 2 \end{array} \right| \\
&=&
3(2\cdot 2 -1 \cdot 2)-2(1 \cdot 2 -1 \cdot 2)+1(1 \cdot 2 -2 \cdot 2)\\
&=&
3(2)-2(0)+1(-2)\\
&=&4
\end{eqnarray}\]

以上がサラスの公式です。

なお既に述べたように、行列式の値は固有値の積と同じであるということも覚えておきましょう。固有値については、後の行列の因数分解のところで解説します。

Pythonで行列式

Python では NumPy の、linalg.det() 関数を使って、ある行列の行列式の値を求めることができます。

In [1]:
# NumPy のインポート
import numpy as np

# 行列の定義
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(A)
[[1 2 3]
 [4 5 6]
 [7 8 9]]
In [2]:
# トレースの計算
B = np.linalg.det(A)
print(B)
-9.51619735392994e-16