it

線形代数のdiagとは?意味と使い方を解説!(対角行列・対角化・固有値・線形変換・行列計算など)

当サイトでは記事内に広告を含みます

線形代数やプログラミングの文脈で登場する「diag」という表現。

「diagって何の略?」「対角行列と何が違うの?」「NumPyでどう使うの?」と疑問に感じる方も多いでしょう。

本記事では、diagの意味・対角行列との関係・対角化の概念から、固有値との関係・NumPyでの使い方まで、わかりやすく解説していきます。

プログラミングと数学の両面から解説しますので、ぜひ最後までご覧ください。

diagとは?線形代数における意味と基本

それではまず、線形代数における「diag」の意味と基本について解説していきます。

diag は「diagonal(対角線の)」の略語であり、線形代数・プログラミングの文脈で「対角行列を作る」または「行列の対角成分を取り出す」という操作を表します。

「対角行列」とは、対角成分(左上から右下への成分)以外がすべて0の正方行列のことです。

【対角行列の例(3×3)】

diag(a, b, c) = [[a, 0, 0],

[0, b, 0],

[0, 0, c]]

対角行列は計算が非常に簡単という特徴を持ちます。

たとえば対角行列の積は、対応する対角成分同士を掛け算するだけです。

対角行列の計算の簡便さが、線形代数で対角化が重要視される理由のひとつです。

対角行列の性質

対角行列にはいくつかの重要な性質があります。

性質 内容
diag(a₁,…,aₙ) × diag(b₁,…,bₙ) = diag(a₁b₁,…,aₙbₙ)
累乗 diag(a₁,…,aₙ)ᵏ = diag(a₁ᵏ,…,aₙᵏ)
逆行列 diag(a₁,…,aₙ)⁻¹ = diag(1/a₁,…,1/aₙ)(各aᵢ≠0のとき)
行列式 det(diag(a₁,…,aₙ)) = a₁ × a₂ × … × aₙ
固有値 対角成分がそのまま固有値になる

特に累乗の計算が非常に簡単であることは、対角化の大きなメリットです。

一般の行列の累乗は計算が複雑ですが、対角行列であれば各対角成分のk乗をとるだけです。

NumPy(Python)でのdiag関数の使い方

Pythonの数値計算ライブラリNumPyでは、diag関数が提供されています。

【NumPy diag関数の使い方】

import numpy as np

# ベクトルから対角行列を作成

v = [1, 2, 3]

D = np.diag(v)

# → [[1, 0, 0], [0, 2, 0], [0, 0, 3]]

# 行列から対角成分を取り出す

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

d = np.diag(A)

# → [1, 5, 9]

NumPyのdiag関数は「1次元配列を入力すると対角行列を出力」し、「2次元配列を入力すると対角成分のベクトルを出力」するという二つの機能を持ちます。

また、np.diag(v, k=1) のように k パラメータを指定すると、主対角から上下にずれた「超対角・下対角」を指定できます。

diagvec・diagflatとの違い

NumPyにはdiagと似た関数として diagflat もあります。

np.diag と np.diagflat の主な違いは、np.diagflat が多次元配列を受け取って平坦化してから対角行列を作る点です。

通常の使用では np.diag で十分ですが、入力が多次元の場合は np.diagflat の方が適切な場合があります。

対角化とは何か?意味と手順

続いては、diagの概念と深く関わる「対角化」について確認していきます。

行列の対角化とは、正方行列 A を対角行列 D に変換する操作のことです。

具体的には、正則行列 P が存在して P⁻¹AP = D(対角行列)となるとき、A は対角化可能と言います。

固有値と対角化の関係

対角化と固有値は密接に結びついています。

行列 A が対角化可能なとき、対角行列 D の対角成分はちょうど A の固有値になります。

また、変換行列 P の各列は対応する固有ベクトルです。

【対角化の式】

P⁻¹AP = D = diag(λ₁, λ₂, …, λₙ)

P = [v₁ | v₂ | … | vₙ](固有ベクトルを列に並べた行列)

λ₁, …, λₙ:対応する固有値

対称行列(A = Aᵀ)は常に直交対角化可能であり、固有ベクトルが互いに直交するという重要な性質があります。

対称行列の対角化は主成分分析(PCA)の数学的基礎となっています。

対角化の応用:行列の累乗

対角化の最も重要な応用のひとつが「行列の累乗の計算」です。

A = PDP⁻¹ と対角化できたとき、A のk乗は次のように計算できます。

【対角化を使った行列の累乗】

Aᵏ = (PDP⁻¹)ᵏ = PDᵏP⁻¹

Dᵏ = diag(λ₁ᵏ, λ₂ᵏ, …, λₙᵏ)

一般の行列の累乗は計算が複雑ですが、対角化を使えば各固有値のk乗をとるだけになります。

マルコフ連鎖の長期的挙動・差分方程式の解・行列の指数関数など、多くの問題が対角化によって解けます。

対角化できない場合:ジョルダン標準形

すべての行列が対角化できるわけではありません。

対角化不可能な行列(固有ベクトルが足りない場合)でも、「ジョルダン標準形(Jordan Normal Form)」と呼ばれる準対角形に変換できます。

ジョルダン標準形は対角化の一般化であり、微分方程式の解法・制御理論などで重要な役割を持ちます。

diagを使った実践的な計算例

続いては、diagを使った実践的な計算例を確認していきます。

共分散行列と対角化(PCA)

データサイエンスで重要な主成分分析(PCA)は、共分散行列の対角化(固有値分解)として実装されます。

共分散行列は対称行列であるため、常に直交対角化可能です。

NumPyでは np.linalg.eig や np.linalg.eigh(対称行列専用)を使って固有値分解を実行できます。

得られた固有ベクトルが主成分方向を表し、固有値が各主成分の分散(重要度)を表します。

対角行列を使った線形変換の可視化

対角行列による線形変換は幾何学的に理解しやすい形をしています。

diag(2, 3) という行列は「x方向に2倍、y方向に3倍」の拡大変換を表します。

diag(1, -1) は「y軸に関する反射(x軸対称)」、diag(-1, 1) は「x軸に関する反射(y軸対称)」を表します。

対角行列の線形変換は座標軸方向の独立した拡大・縮小として理解できます。

スパース行列と対角行列の活用

大規模な数値計算では、行列の多くの成分がゼロであるスパース行列(疎行列)を効率的に扱うことが重要です。

対角行列はスパース行列の特殊なケースとして、メモリの節約と計算の高速化に大きく貢献します。

NumPyの scipy.sparse.diags 関数を使えば、大規模な対角行列・三重対角行列などを効率的に生成・演算できます。

有限要素法・数値微分方程式の解法など、科学技術計算では対角行列・三重対角行列が非常に頻繁に登場します。

まとめ

本記事では、diagの意味・対角行列の性質・NumPyでの使い方・対角化の手順・固有値との関係・実践的な応用例まで幅広く解説しました。

diagとは「diagonal(対角線)」の略で、対角行列の生成や行列の対角成分の抽出を指します。

対角行列は計算が非常に簡単であり、対角化によって一般の行列の累乗計算や固有値解析が容易になります。

diagと対角化の概念は、数値計算・データサイエンス・機械学習で非常に頻繁に活用される重要なスキルです。

NumPyを使って実際に対角行列の操作を試してみることで、理解がより深まるでしょう。