線形代数学 I / 基礎 / II - 第25回 総合演習
1. 講義情報と予習ガイド
講義回: 第25回
テーマ: 行列式に関する総合演習
関連項目: 行列式の定義、基本変形と行列式、還元定理、余因子展開
予習内容: 第21回〜第24回の内容(行列式の基本性質、計算方法、余因子展開など)を復習しておくこと
2. 学習目標
- 行列式の基本的な性質を理解し、適切に応用できる
- 基本変形を用いた行列式の計算方法を習得する
- 還元定理と余因子展開を使って様々な行列式を効率的に計算できる
- 行列式と逆行列の関係性を理解し、活用できる
- 行列式の幾何学的意味を理解し、データ分析への応用の基礎を身につける
3. 基本概念の復習
3.1 行列式の定義と基本性質
定義: 次正方行列 の行列式は以下のように定義される:
ここで は 個の要素の置換全体の集合、 は置換 の符号を表す。
主な性質:
- 単位行列の行列式:
- 多重線形性: 行列の1つの行(または列)にスカラー をかけると、行列式は 倍になる
- 交代性: 2つの行(または列)を入れ替えると、行列式の符号が反転する
- 加法性: ある行(または列)が2つのベクトルの和である場合、行列式は2つの行列式の和に分解できる
- 行列の積の行列式:
- 転置行列の行列式:
- 逆行列と行列式: が正則ならば
3.2 行列式の幾何学的意味
次元空間における 個のベクトルが張る平行体の「符号付き体積」を表す。特に:
- 2次元: 2つのベクトルが張る平行四辺形の面積
- 3次元: 3つのベクトルが張る平行六面体の体積
この幾何学的解釈は、データ分析において変数間の関係性や変換の特性を理解する上で重要である。
4. 行列式の計算方法
4.1 直接計算法(小さな行列の場合)
2×2行列の場合: \(\)
3×3行列の場合: \(\)
または、サラスの公式を用いる: \(\)
4.2 基本変形を用いた行列式の計算
基本変形を行列式に適用する際の変化:
- 行(または列)の交換: 行列式の符号が反転する
- 行(または列)にスカラー をかける: 行列式が 倍になる
- ある行に別の行の 倍を加える: 行列式の値は変わらない
例: 以下の行列の行列式を基本変形で計算 \(\)
解法: 第3行から第2行の2倍を引く: \(\)
第3行は第1行の倍となっているため、行列のランクは2以下となり、
4.3 還元定理を用いた行列式の計算
還元定理: 行列の中に零行または零列がある場合、その行列式は0である。また、ある行(または列)の全ての要素に共通の因子 がある場合、その因子を行列式の外に出すことができる。
例: 以下の行列の行列式を還元定理で計算 \(\)
解法: 第1行から共通因子3を取り出す: \(\)
第1列から第3列の3倍を引く: \(\)
第3列について余因子展開: \(\)
ここで は余因子を表す。
4.4 余因子展開による行列式の計算
余因子展開: 次行列 の行列式は、任意の行または列に関して、各要素とその余因子の積の和として計算できる:
ここで であり、 は 要素を除いた小行列の行列式である。
例: 以下の行列の行列式を余因子展開で計算 \(\)
解法: 第2列(0が多い列)に関して余因子展開: \(\)
5. Pythonによる実装と可視化
5.1 NumPyを用いた行列式の計算
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 行列の定義
A = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
B = np.array([[3, 6, 9],
[2, 5, 8],
[1, 4, 7]])
C = np.array([[2, 0, 1],
[3, 1, 2],
[1, 0, 3]])
# 行列式の計算
det_A = np.linalg.det(A)
det_B = np.linalg.det(B)
det_C = np.linalg.det(C)
print(f"det(A) = {det_A}")
print(f"det(B) = {det_B}")
print(f"det(C) = {det_C}")
# 数値誤差を考慮すると0に近い値は0として扱う
print(f"det(A) ≈ {0 if abs(det_A) < 1e-10 else det_A}")
print(f"det(B) ≈ {0 if abs(det_B) < 1e-10 else det_B}")
print(f"det(C) ≈ {0 if abs(det_C) < 1e-10 else det_C}")
5.2 行列式の幾何学的意味の可視化(2次元)
# 2次元ベクトルのペアを定義
v1 = np.array([3, 1])
v2 = np.array([1, 2])
# 行列式の計算
det_2d = np.linalg.det(np.column_stack([v1, v2]))
# 平行四辺形の可視化
plt.figure(figsize=(8, 6))
plt.grid(True)
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
# 原点から始まるベクトル
plt.arrow(0, 0, v1[0], v1[1], head_width=0.2, head_length=0.3, fc='blue', ec='blue', label='v1')
plt.arrow(0, 0, v2[0], v2[1], head_width=0.2, head_length=0.3, fc='red', ec='red', label='v2')
# 平行四辺形を完成させる
plt.arrow(v2[0], v2[1], v1[0], v1[1], head_width=0.2, head_length=0.3, fc='blue', ec='blue', alpha=0.5)
plt.arrow(v1[0], v1[1], v2[0], v2[1], head_width=0.2, head_length=0.3, fc='red', ec='red', alpha=0.5)
# 平行四辺形を塗りつぶす
plt.fill([0, v1[0], v1[0]+v2[0], v2[0]], [0, v1[1], v1[1]+v2[1], v2[1]], 'gray', alpha=0.2)
plt.title(f'2次元ベクトルの行列式 = {det_2d:.2f}\n(平行四辺形の面積)', fontsize=12)
plt.xlabel('x', fontsize=12)
plt.ylabel('y', fontsize=12)
plt.legend()
plt.axis('equal')
plt.xlim(-1, 5)
plt.ylim(-1, 4)
plt.show()
5.3 行列式の幾何学的意味の可視化(3次元)
# 3次元ベクトルのトリプルを定義
v1 = np.array([1, 0, 0])
v2 = np.array([0, 2, 0])
v3 = np.array([0, 0, 3])
# 行列式の計算
det_3d = np.linalg.det(np.column_stack([v1, v2, v3]))
# 3次元平行六面体の可視化
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 原点
origin = np.array([0, 0, 0])
# 平行六面体の8つの頂点
vertices = [
origin,
origin + v1,
origin + v2,
origin + v3,
origin + v1 + v2,
origin + v1 + v3,
origin + v2 + v3,
origin + v1 + v2 + v3
]
# 各頂点の座標を抽出
x = [v[0] for v in vertices]
y = [v[1] for v in vertices]
z = [v[2] for v in vertices]
# 頂点をプロット
ax.scatter(x, y, z, c='r', s=50)
# ベクトルを描画
ax.quiver(0, 0, 0, v1[0], v1[1], v1[2], color='b', arrow_length_ratio=0.1, label='v1')
ax.quiver(0, 0, 0, v2[0], v2[1], v2[2], color='g', arrow_length_ratio=0.1, label='v2')
ax.quiver(0, 0, 0, v3[0], v3[1], v3[2], color='r', arrow_length_ratio=0.1, label='v3')
# 平行六面体の辺を描画
for i, j in [(0, 1), (0, 2), (0, 3), (1, 4), (1, 5), (2, 4), (2, 6), (3, 5), (3, 6), (4, 7), (5, 7), (6, 7)]:
ax.plot([vertices[i][0], vertices[j][0]],
[vertices[i][1], vertices[j][1]],
[vertices[i][2], vertices[j][2]], 'k-', alpha=0.6)
ax.set_title(f'3次元ベクトルの行列式 = {det_3d:.2f}\n(平行六面体の体積)', fontsize=12)
ax.set_xlabel('x', fontsize=12)
ax.set_ylabel('y', fontsize=12)
ax.set_zlabel('z', fontsize=12)
ax.legend()
plt.show()
5.4 基本変形による行列式の変化のデモンストレーション
# オリジナルの行列
D = np.array([[2, 1, 3],
[1, 2, 1],
[3, 2, 1]])
det_D = np.linalg.det(D)
print(f"Original det(D) = {det_D}")
# 基本変形1: 行の交換
D1 = D.copy()
D1[[0, 1]] = D1[[1, 0]] # 第1行と第2行を交換
det_D1 = np.linalg.det(D1)
print(f"Row swap det(D1) = {det_D1}")
print(f"Relation: det(D1) ≈ -det(D) ? {np.isclose(det_D1, -det_D)}")
# 基本変形2: 行のスカラー倍
D2 = D.copy()
D2[0] = D2[0] * 2 # 第1行を2倍
det_D2 = np.linalg.det(D2)
print(f"Row scaling det(D2) = {det_D2}")
print(f"Relation: det(D2) ≈ 2*det(D) ? {np.isclose(det_D2, 2*det_D)}")
# 基本変形3: 行の加算
D3 = D.copy()
D3[2] = D3[2] + 3 * D3[0] # 第3行に第1行の3倍を加える
det_D3 = np.linalg.det(D3)
print(f"Row addition det(D3) = {det_D3}")
print(f"Relation: det(D3) ≈ det(D) ? {np.isclose(det_D3, det_D)}")
5.5 データサイエンスにおける行列式の応用例
# ヘルスデータの共分散行列(例: 心拍数、血圧、血糖値の測定値)
health_data = np.array([
[72, 120, 95], # 心拍数, 収縮期血圧, 血糖値
[68, 118, 92],
[70, 125, 98],
[75, 130, 105],
[65, 115, 90]
])
# 各変数の平均
means = np.mean(health_data, axis=0)
# 中心化したデータ
centered_data = health_data - means
# 共分散行列の計算
cov_matrix = np.cov(centered_data, rowvar=False)
print("共分散行列:")
print(cov_matrix)
# 共分散行列の行列式
cov_det = np.linalg.det(cov_matrix)
print(f"\n共分散行列の行列式: {cov_det:.2f}")
# 行列式の解釈
print("\n解釈:")
if cov_det > 0:
print("- 共分散行列は正定値です(すべての固有値が正)")
print("- データ分布は正則で、3次元空間内で適切に広がっています")
print("- 変数間に線形依存関係はありません")
elif np.isclose(cov_det, 0):
print("- 共分散行列はランク落ちしています(少なくとも1つの固有値が0)")
print("- 変数間に線形依存関係が存在します")
print("- 次元削減(例:主成分分析)が適切かもしれません")
else:
print("- 共分散行列は不正または数値計算上の問題があります")
# 多変量正規分布の確率密度関数を使用する場合の係数
pdf_coef = 1.0 / (np.sqrt((2 * np.pi) ** 3 * cov_det))
print(f"\n多変量正規分布のPDF係数: {pdf_coef:.6f}")
6. 演習問題
6.1 基本問題
-
次の行列の行列式を計算せよ。 \(\)
-
次の行列の行列式を計算せよ。 \(\)
-
次の行列の行列式を基本変形を用いて計算せよ。 \(\)
-
次の行列の行列式を余因子展開を用いて計算せよ。 \(\)
-
次の行列の行列式を計算し、逆行列が存在するかどうかを判定せよ。 \(\)
-
行列 に対して、 であることを証明せよ。
6.2 応用問題
-
次の行列の行列式を計算せよ。 \(\)
-
次の行列の行列式を計算せよ。 \(\)
-
次の正方行列 と に対して、 であることを証明せよ。
-
ヘルスデータサイエンス応用問題:
ある疾患のリスク予測モデルで、3つの生体指標(血圧、コレステロール値、血糖値)を用いています。これらの測定値の共分散行列 が以下のようになっています:
\(\)
(a) この共分散行列の行列式を計算せよ。
(b) 行列式の値から、3つの生体指標間の関係性について何が言えるか説明せよ。
(c) もし行列式が0に近い値だった場合、多変量解析においてどのような問題が生じるか説明せよ。
(d) 主成分分析を適用する場合、固有値と行列式の関係を説明せよ。
7. よくある質問と解答
Q1: 行列式が0になるのはどのような場合ですか?
A: 行列式が0になるのは、行列がランク落ちしている場合、つまり行または列ベクトルが線形従属である場合です。具体的には: - 行列のある行(または列)がゼロベクトルである - 2つ以上の行(または列)が平行(一方が他方の定数倍)である - ある行(または列)が他の行(または列)の線形結合で表せる
行列式が0の行列は、可逆ではないため逆行列を持ちません。
Q2: 行列式の計算で最も効率的な方法はどれですか?
A: 行列のサイズと構造によって最適な方法は異なります: - 小さな行列(2×2, 3×3): 直接計算公式 - 三角行列または対角行列: 対角成分の積 - 多くのゼロ要素を持つ行列: 余因子展開(ゼロの多い行または列で展開) - 一般的な大きな行列: 基本変形で上三角行列に変換し、対角成分の積を計算
計算効率上は、基本変形を用いてガウス消去法で上三角行列に変換する方法が一般に効率的です。
Q3: 行列式が負の値になることの幾何学的意味は何ですか?
A: 行列式が負の値になるのは、行列が表す線形変換が「向きを反転させる」場合です。例えば: - 2次元では、2つのベクトルの向きが反時計回りから時計回りに変わる - 3次元では、3つのベクトルが作る座標系の向きが変わる(右手系から左手系、またはその逆)
行列式の絶対値は平行体の体積を表し、符号はその向きを表します。
Q4: 行列式は統計学やデータサイエンスでどのように使われますか?
A: 統計学やデータサイエンスでの行列式の主な用途は: - 多変量正規分布の確率密度関数の計算 - 共分散行列の行列式は変数の「一般化分散」を表す - 主成分分析(PCA)での説明変数間の関係性の評価 - 多変量回帰モデルでの多重共線性の検出 - カルマンフィルタなどの時系列データ処理アルゴリズム
特に、共分散行列の行列式が0に近いと、データに強い相関関係があり、次元削減(PCAなど)が有効かもしれません。
Q5: 高次元の行列に対する行列式の計算における注意点は?
A: 高次元行列の行列式計算における注意点:
- 数値計算上の丸め誤差が蓄積する可能性がある
- 計算量は一般的にO(n³)以上になるため、非常に大きな行列では計算効率に注意
- LU分解などの数値的に安定した方法を使うべき
- Python/NumPyでは np.linalg.det()
が最適化されている
- 特に大きな行列では、行列式の代わりに行列のランクや条件数を考慮する方が有用な場合も多い
8. 解答例(基本問題)
問題1の解答
問題2の解答
は上三角行列なので、対角成分の積が行列式となる: \(\)
問題3の解答
基本変形で計算する: 1. 第1行を2で割る(行列式は1/2倍になる): \(\)
-
第2行から第1行を引く、第3行から第1行の7倍を引く: \(\)
-
第3行に第2行の6倍を足す: \(\)
行列に零行が含まれるため、
問題4の解答
第3列(0を含む列)に関して余因子展開: \(\)
問題5の解答
基本変形で計算: 1. 第2行から第1行の4倍を引く、第3行から第1行の7倍を引く: \(\)
- 第3行から第2行の2倍を引く: \(\)
上三角行列なので対角成分の積: \(\)
行列式が0でないため、行列は逆行列を持ちます。
問題6の解答
なので、行列の積の行列式の性質から: \(\)
証明終了。
9. まとめ
この総合演習では、行列式の基本的な性質から計算手法、応用例までを包括的に復習しました。主要なポイントは以下の通りです:
-
行列式の基本性質:多重線形性、交代性、単位行列の行列式が1になるなどの性質を理解し活用することが重要です。
-
効率的な計算方法:行列のサイズや形状に応じて、直接計算、基本変形、還元定理、余因子展開など適切な方法を選択できるようになることが重要です。
-
幾何学的解釈:行列式は線形変換による平行体の体積変化率を表し、符号は向きの変化を表しています。この解釈は直感的な理解に役立ちます。
-
データサイエンスでの応用:行列式は多変量統計や機械学習において、変数間の関係性の評価や変換の特性を解析するために用いられます。
今回の演習でマスターした行列式の知識は、今後学ぶ固有値・固有ベクトル、対角化、主成分分析などの理解にも直接つながります。特に線形回帰や主成分分析などのデータサイエンス手法の理論的理解に必須の概念です。
最後に、課題で出た計算を実際にPythonで実行し、結果を確認することで理解を深めましょう。計算プロセスそのものを理解することは重要ですが、実際のデータ分析ではコンピュータを効果的に活用していきます。