Juliaと遊ぶ線形代数(7) グラム・シュミット・アルゴリズム

グラム・シュミット・アルゴリズム(Gram-Schmidt Algorithm)は、有限の線形独立なベクトルを取ったとき、これらのベクトルが張る部分空間と同じ部分空間を張るための正規直交系を作り出します。

ワカメさん

この記事は「グラム・シュミット・アルゴリズムについてまとめます。

この記事がカバーする内容
  • 正規直交系とは何か?
  • グラム・シュミット・アルゴリズムはどのようにして正規直交系を作るか?
  • グラム・シュミット・アルゴリズムは何に利用できるか?
スポンサーリンク

正規直交系

ヒトデちゃん

まず「正規直交系」って何ですか?

正規直交系(Orthonormal system)は、以下ふたつの条件を満たすベクトル集合です。

正規直交系のベクトルを\(q_1,…,q_k\)とすると、これらのベクトルは

  1. 全てのベクトルの長さは1: \(|| q_i || =1\)
  2. あらゆるベクトルの内積は0: \(q_{i}^{T} q_{j} = 0 \quad (i\neq j) \)

を満たします。

ワカメさん

正規直交系のベクトルは線形独立であり、基底です。

以下、正規直交系のベクトルが線形独立となる証明です。

証明:正規直交系のベクトルは線形独立

正規直交系のベクトルを\(q_1,…,q_k\)とおくと、線形結合は

$$\beta q_1+…+\beta_k q_k = 0$$

このとき、\(q_i\)とそれぞれのベクトルの内積をとると、\(q_{i} ^{T} q_j = 0\)、\(q_{i}^{T} q_i = 1\)より

$$\begin{aligned}0 &= a_{i} ^{T} (\beta q_1+…+\beta_k q_k)\\
&= \beta_1(q_{i} ^{T} q_1)+…+ \beta_1(q_{i} ^{T} q_1)\\
&= \beta_i
\end{aligned}$$

このとき\(\beta_i = 0\)である。\(\beta_1 q_1+…+\beta_k q_k = 0\)を満たすには、全ての\(\beta_i\)が0でなければいけない。

したがって、正規直交系のベクトルの線形結合は、線形独立である。

ワカメさん

正規直交系のベクトルを正規直交基底(orthonormal basis)とも呼びます。

グラム・シュミット・アルゴリズム

グラム・シュミット・アルゴリズムは「直交化」「線形従属か確認」「正規化」の3ステップを実行し、ベクトル集合\(a_1,…,a_k\)から正規直交基底\(q_1,…q_k\)を作ります。

ここではグラム・シュミット・アルゴリズム(Gram-Schmidt Algorithm)の特徴をまとめます。

プロセス

グラム・シュミット・アルゴリズムは以下のステップを繰り返します。

グラム・シュミット・アルゴリズム

\(a_1,…,a_k\)をn-ベクトルとすると

for \(i = 1,…,k\)において

  1. 直交化:\(\tilde{q_i}=a_i -(q_{1}^{T}a_i)q_1-…-(q_{i-1}^{T}a_i)q_{i-1}\)
  2. 線形従属か確認:\(\tilde{q_i}=0\)であれば、終了
  3. 正規化:\(q_i = \tilde{q_i} / \lVert\tilde{q_i}\lVert\)
ヒトデちゃん

直交化の式は何を意味しているんでしょうか?

ワカメさん

正射影ベクトル(orthogonal projection)の公式です。ここでは、例えば、\(i=j、j<k\)とすると、\(i=j-1\)までに得た\( q_1,…,q_{j-1}\)の正規直交基底に対して直交する\(\tilde{q_j}\)をベクトル\(a_j\)から作ります。

数式だけ追うのではなく、Wikipediaのアニメーションがイメージを掴みやすいです。

数学記号は異なりますが、\(i = 1,2,3\) から順に、互いに直交するベクトルを作っています。

Fig 1: Gram-Schmidt orthonormalization process (1)
ヒトデちゃん

なぜ線形従属であることを確認する必要があるんでしょう?「\(\tilde{q_i}=0\)であれば、終了」ってどういう意味です?

\(k\)本の正規直交基底\(q_1,…q_k\)を作るため、与えられたベクトルが線形独立である必要があるからです。

\(i = j、j<k\)とし、\(\tilde{q_j}\)について考えてみます。

\(\tilde{q_j}=0\)ならば、直交化の式を変換すると

$$a_j = (q_{1}^{T}a_j)q_1 + … + (q_{j-1}^{T}a_j)q_{j-1}$$

となります。

これは\(a_j\)が\(q_1,…,q_{j-1}\)の線形結合であることを示します。

このとき、\(q_1,…,q_{j-1}\)のそれぞれは、\(a_1,…,a_{j-1}\)の線形結合です。

したがって、\(a_j\)は\(a_1,…,a_{j-1}\)の線形結合とも捉えられます。

つまり、\(\tilde{q_j}=0\)ならば、\(a_1,…,a_{j}\)は線形従属と言えます。この結果は、より大きな集合\(a_1,…,a_{k}\)が線形従属であることを意味します。

グラム・シュミット・アルゴリズムは、線形従属であるベクトルを入力すると、\(\tilde{q_i}=0\)となり、アルゴリズムを停止します。

ワカメさん

最後の正規化は、\(\tilde{q_i}\)の長さを1にする操作です。

線形独立・従属判定への利用

グラム・シュミット・アルゴリズムは、単に正規直交基底を作るだけでなく、与えられたベクトル集合の線形独立・従属判定にも利用できます。

\(a_1,…a_k\)のベクトルが与えられ、グラム・シュミット・アルゴリズムを実行したとき、以下2つの結論を導けます。

  1. \(i=k\)までに\(\tilde{q_i} \neq 0\)ならば、入力ベクトルは線形独立。
  2. \(i=k\)までに\(\tilde{q_i}=0\)となれば、入力ベクトルは線形従属。

Juliaで確認

Juliaでグラム・シュミット・アルゴリズムを追ってみます。

簡単な例として、2つのベクトル\(a_1, a_2\)を使って、グラム・シュミット・アルゴリズムを実行してみます。

グラム・シュミット・アルゴリズムから\(q_1, q_2\)が得られ、これらが正規直交系の基底になります。

これら2本のベクトルは互いに直交しています。\(q_{i}^{T} q_{i} = 1, \quad q_{i}^{T} q_j = 0\)ですから、\(Q^{T}Q\)は単位行列\(I\)になります。

スポンサーリンク

まとめ

以下、グラム・シュミット・アルゴリズムについてまとめます。

グラム・シュミット・アルゴリズム
  • 線形独立なベクトル集合から正規直交基底を作る方法
  • アルゴリズムは\(i=k\)となるまでに3stepを繰り返す
    1. 直交化
    2. 線形従属の確認
    3. 正規化
  • 入力ベクトルの線形独立・従属判定にも利用可能
  • \(Q^T Q\)は単位行列
ワカメさん

正直、今のところ実務で見かける機会がないですが、良い復習になりました。

この記事は以上です。最後まで読んで頂きありがとうございました。

参考資料

(1) Wikipedia, Gram–Schmidt process (2022/3/21アクセス)

(2) Science Direct, Orthonormal Set of Vector Theorem 1 An orthonormal set of vectors is linearly independent. From: Matrix Methods (Third Edition), 2009

(3) Boyd, S., & Vandenberghe, L. (2018). Introduction to applied linear algebra: vectors, matrices, and least squares. Cambridge university press.

スポンサーリンク
この記事が気にいったらシェアしてね!
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments