行列入門:定義・基本演算から数値計算、SVD・固有値・実装と最適化まで

行列とは — 概要と定義

行列(ぎょうれつ、matrix)は、数や関数、記号などを長方形状に並べた二次元の配列で、線形代数の基本対象です。行(row)と列(column)から構成され、m行n列の行列は「m×n行列」と表記されます。行列は線形写像を表現したり、連立一次方程式の係数をまとめたり、データや画像、グラフ構造などをコンパクトに扱う道具として、IT分野で広く利用されます。

基本記法と例

行列は通常大文字(A, B, M など)で表し、個々の要素は下付きの添字で表します。例えば A = [aij] は i 行 j 列の要素が aij である行列を意味します。例:

A = [[1, 2, 3],[4, 5, 6]] は 2×3 行列。

行列の基本演算

  • 加算・スカラー倍:同じサイズの行列同士は要素ごとに加減算できます。スカラー倍は各要素に同じ数を掛ける操作です。
  • 転置(AT):行と列を入れ替えます。m×n 行列の転置は n×m 行列になります。
  • 乗算:A(m×p)と B(p×n)の積 AB は m×n 行列で、(AB)ij = Σk=1..p Aik Bkj。注意:乗算は一般に可換ではありません(AB ≠ BA)。実例:

例:A = [[1,2,3],[4,5,6]](2×3) と B = [[7,8],[9,10],[11,12]](3×2)の積は

AB = [[58,64],[139,154]](2×2)

行列の特性量

  • 行列式(det):正方行列に対して定義されるスカラーで、逆行列の存在判定や体積変換の尺度になります。2×2 の場合 det([[a,b],[c,d]]) = ad−bc。
  • 逆行列:正方行列 A に対して A−1 が存在すれば AA−1 = I(単位行列)。逆行列は det(A) ≠ 0 のときにのみ存在します。
  • 階数(rank):行列の線形独立な行(または列)の最大数。連立方程式の解の有無や自由度に関係します。
  • 固有値・固有ベクトル:Ax = λx を満たすスカラー λ と非ゼロベクトル x。行列の振る舞い(伸縮・回転)を記述します。
  • 特異値分解(SVD):任意の m×n 行列 A を A = U Σ VT と分解する手法で、次元圧縮や安定な数値計算に有用です。PCA(主成分分析)は SVD を用いることが多いです。
  • 条件数:κ(A) = ||A||·||A−1|| は線形系の感度を表し、大きいほど数値誤差に対して不安定です。

線形方程式の解法とアルゴリズム

  • 直接解法:ガウス消去法、LU 分解、QR 分解など。計算量は一般に O(n³)(n は行列の次元)で、数値安定性が重要。
  • 特異値分解(SVD):特に病的な(近位特異)行列に対する安定な解析や次元削減に使いますが計算コストは高い。
  • 反復法(イテレーティブ):大規模で疎な系に対しては共役勾配法(CG)、GMRES、BICGSTAB などを用い、前処理(preconditioning)により収束を速めます。
  • 高速アルゴリズム:Strassen 法などのサブキュービック法は理論的に高速ですが、実装や数値誤差の観点から実用性は用途依存です。現実的には高性能 BLAS(GEMM)や GPU 並列化が有効です。

数値計算上の注意点

  • 浮動小数点誤差:丸め誤差や桁落ちに注意。条件数が大きい行列では解が不安定になります。
  • 精度選択:速度を取るか精度を取るか(単精度 vs 倍精度)。機械学習で単精度が一般的なのは性能とメモリのトレードオフが理由です。
  • スパース性の活用:多くの実問題は疎行列なので、疎フォーマット(CSR、CSC、COO)を使ってメモリと計算を節約するのが重要です。

IT分野での代表的な応用

  • コンピュータグラフィックス:3D 変換は 4×4 同次座標行列で表現。回転・拡大縮小・並進を行列で合成できます。
  • 機械学習・統計:データ行列、重み行列、カーネル行列。線形回帰、ニューラルネットワークの重み更新、PCA による次元削減など。
  • コンピュータビジョン:画像は行列(ピクセル値)の集合。フィルタ処理や特徴抽出は行列演算で表現されます。
  • ネットワーク・グラフ:隣接行列やラプラシアン行列を用いてグラフアルゴリズムやスペクトラル解析を行います。
  • レコメンデーション:行列分解(例:行列因子分解)を使って潜在因子を学習し、推薦を行います。
  • 暗号・符号理論:Hill 暗号など行列を用いる例、誤り訂正符号の生成行列・検査行列も行列で表現されます。

実装とライブラリ

  • Python: NumPy(基礎)、SciPy(疎行列、数値アルゴリズム)、scikit-learn(ML 向け)
  • C/C++: BLAS/LAPACK(高性能基礎演算)、Eigen(テンプレートベース)、Armadillo
  • GPU: cuBLAS、cuSOLVER、MAGMA(GPU 向け高速線形代数)
  • 分散処理: Apache Spark の MLlib(大規模行列・行列分解)

性能・スケーラビリティの考慮

  • 行列乗算は多くのアプリケーションでボトルネック。GEMM(行列積)を効率的に実装したライブラリの利用が基本。
  • メモリ帯域幅とキャッシュ最適化、ブロッキング(タイル化)、ベクトル化(SIMD)などが性能に大きく影響します。
  • 分散環境や GPU を活用する際は、データ転送コストと計算コストのバランスを考慮する必要があります。

実務上のベストプラクティス

  • 問題に応じて密行列と疎行列を使い分ける(不要に密行列に変換しない)。
  • 既存の最適化済みライブラリ(BLAS/LAPACK、cuBLAS、Eigen 等)を使う。
  • 数値安定性を意識し、必要なら正規化や正則化(Tikhonov / Ridge)を行う。
  • 大規模データでは、直接解法ではなく反復法または確率的手法(ミニバッチ、近似分解)を検討する。

まとめ

行列は単なる数の表ではなく、線形変換、データ表現、計算アルゴリズムの基礎となる強力な概念です。IT の現場ではアルゴリズム選択、数値的性質、計算資源(CPU/GPU/分散)のトレードオフを理解した上で適切に扱うことが重要です。基礎理論(行列式、固有値、SVD、条件数)と実装面(疎性、アルゴリズム、ライブラリ)を両輪で学ぶと、現実の問題に強い設計と実装ができるようになります。

参考文献