原田史子・島川博光:線形代数学に基づくデータ分析法

2026-02-16

概要

「はしがき」から引用する。

本書は,上記に挙げた多変量解析法その他のデータ分析手法の原理を線形代数学的な観点から理解することを目的とする。

感想

スペクトル分解

本書の p.162 には、「12.3.3 スペクトル分解」という小項がある。通常スペクトル分解といえば関数解析の用語であるが、線形代数でも使われる用語だ。では本書から抜き書きしよう。

`n` 次対称行列 `A` の対角化を利用して `A` をスペクトル分解できる。 スペクトル分解とは,行列 `A` を適当な行列 `P_1, ldots, P_n` の 1 次結合に分解することを言う。

`A = lambda_1 P_1 + lambda_2 P_2 + cdots + lambda_n P_n`

行列 `A` はたかだか `n` 個の行列の線形結合で分解できるのだろうか。`A` の独立成分は `n^2` 個あるのではないだろうか。いや、`A` は対称行列だからいいのだろうか。進めてみよう。

対称行列のスペクトル分解の手法について述べる。`n` 次対称行列 `A` の重複を含めた固有値を `lambda_1, lambda_2, ldots, lambda_n`, 正規直交系をなすそれぞれの固有ベクトルを `vec v_1, vec v_2, ldots, vec v_n` とおく。`P = (vec v_1 quad vec v_2 quad cdots quad vec v_n) ` とおくと `P` により `A` を対角化できる。

`P^t A P = "diag"(lambda_1, lambda_2, ldots, lambda_n) := D`

行列 `P^t` は行列 `P` の転置行列のことだな(本書 p.83)。`D = "diag"(lambda_1, lambda_2, ldots, lambda_n)` は対角行列だろう。`P` により `A` を対角化できることは、 前の小項「12.3.2 対称行列の対角化」に書かれている。

上式の両辺に左から `P` ,右から `P^t` をかけると

`P(P^t A P)P^t = A = PDP`
となる。

さて、なぜ `P(P^t A P)P^t = A` となるかということだが、`P(P^t A P)P^t = (PP^t) A (PP^t)` だから `P^(-1) = P^t` がいえればいいが、これについてもやはり同じく前の小項で説明されている。では進めるが、 以下は本文から多少離れていて自分なりの記法としている。

ここで,`vec v_i = ((v_(1i)), (v_(2i)), (vdots), (v_(ni)))` とおくと、`P= ((v_(11), v_(12), cdots, v_(1n)), (v_(21), v_(22), cdots, v_(2n)),(vdots, vdots, ddots, vdots),(v_(n1), v_(n2), cdots, v_(n n)))` であるから、
`A = PDP^t `
`= ((v_(11), v_(12), cdots, v_(1n)), (v_(21), v_(22), cdots, v_(2n)),(vdots, vdots, ddots, vdots),(v_(n1), v_(n2), cdots, v_(n n))) ((lambda_1, 0, cdots, 0), (0, lambda_2, cdots, 0),(vdots, vdots, ddots, vdots),(0, 0, cdots, lambda_n)) ((v_(11), v_(21), cdots, v_(n1)), (v_(12), v_(22), cdots, v_(n2)),(vdots, vdots, ddots, vdots),(v_(1n), v_(2n), cdots, v_(n n)))`
`= ((lambda_1 v_(11), lambda_2 v_(12), cdots, lambda_n v_(1n)), (lambda_1v_(21), lambda_2v_(22), cdots, lambda_n v_(2n)),(vdots, vdots, ddots, vdots),(lambda_1 v_(n1), lambda_2v_(n2), cdots, lambda_nv_(n n))) ((v_(11), v_(21), cdots, v_(n1)), (v_(12), v_(22), cdots, v_(n2)),(vdots, vdots, ddots, vdots),(v_(1n), v_(2n), cdots, v_(n n)))`
`= ((lambda_i v_(1i)v_(1i), lambda_i v_(1i)v_(2i), cdots, lambda_i v_(1i)v_(ni)), (lambda_i v_(2i)v_(1i), lambda_i v_(2i)v_(2i), cdots, lambda_i v_(2i)v_(ni)), (vdots, vdots, ddots, vdots), (lambda_i v_(n1)v_(1i), lambda_i v_(ni)v_(2i), cdots, lambda_i v_(ni)v_(ni)))`

ここで、`lambda_i v_(1i)v_(1i)`は`sum_(i=1)^n v_(1i)v_(1i)` の略記法である(アインシュタインの規約)。さらに進める。

`A = sum_(i=1)^n lambda_i ((v_(1i)v_(1i), v_(1i)v_(2i), cdots, v_(1i)v_(ni)), (v_(2i)v_(1i), v_(2i)v_(2i), cdots, v_(2i)v_(ni)), (vdots, vdots, ddots, vdots), (v_(n1)v_(1i), v_(ni)v_(2i), cdots, v_(ni)v_(ni)))`
`= sum_(i=1)^n lambda_i ((v_(1i)), (v_(2i)) ,(vdots), (v_(ni))) (v_(1i) \quad v_(2i) \quad cdots \quad v_(ni))`
`= sum_(i=1)^n lambda_i vec v_i vec v_i^t`

ここで、`P_i = vec v_i vec v_i^t` とおくと、

`A = sum_i^n lambda_i P_i`

となる。これが `A` のスペクトル分解の式である。

なお、p.162 の (12.54) 式の最上段は、本書では次のようになっている。

`A = PDP^t = (vec v_1 \quad vec v_2 \quad cdots \quad vec v_n) "diag"(lambda_1, lambda_2, ldots, lambda_n) ((vec v_1), (vec v_2), (vdots), (vec v_n))`

しかし、正しくは次の式だと思う。

`A = PDP^t = (vec v_1 \quad vec v_2 \quad cdots \quad vec v_n) "diag"(lambda_1, lambda_2, ldots, lambda_n) ((vec v_1^t), (vec v_2^t), (vdots), (vec v_n^t))`

本書でスペクトル分解は、行列の最大固有値を求める数値計算法である累乗法の基礎として扱われている。本書では、累乗法は対称行列に対して適用されるとしているが、 実際には非対称行列であっても適用可能である。なお、累乗法はベキ乗法とも呼ばれる。 累乗法については、奥村晴彦:C 言語による標準アルゴリズム事典などで解説されている。

スペクトル分解については、次の書籍でも言及されている。

数式の表現

ASCIIMathML 記法を用いている。

書誌情報

書名線形代数学に基づくデータ分析法
著者原田史子・島川博光
発行日2016 年 9 月10日 (初版1刷)
発行元共立出版
定価3000 円
サイズ
ISBN978-4-320-11145-5
NDC417, 350.1, 411.3
その他川口市立図書館