固有値アルゴリズム
数学
において 、 べき乗反復法( べき乗法 とも呼ばれる )は 固有値アルゴリズム です。 対角化可能な 行列 が与えられると、このアルゴリズムはの最大(絶対値で) 固有値 である数値 と、 の対応する 固有ベクトル である 非ゼロベクトル (つまり ) を生成します。このアルゴリズムは フォン・ミーゼス 反復法 とも呼ばれます 。 [1]
あ
{\displaystyle A}
λ
{\displaystyle \lambda}
あ
{\displaystyle A}
ヴ
{\displaystyle v}
λ
{\displaystyle \lambda}
あ
ヴ
=
λ
ヴ
{\displaystyle Av=\lambda v}
べき乗反復法は非常に単純なアルゴリズムですが、収束が遅い場合があります。アルゴリズムで最も時間のかかる操作は、 行列とベクトルの乗算であるため、適切に実装すれば、非常に大きな 疎行列 に効果的です。収束の速度は次のようになります(後のセクションを参照)。つまり、収束は、 スペクトル ギャップ を底とする指数関数です 。
あ
{\displaystyle A}
(
λ
1
/
λ
2
)
け
{\displaystyle (\lambda _{1}/\lambda _{2})^{k}}
方法
2x2行列上のべき乗反復アルゴリズムを視覚化したアニメーション。行列は2つの固有ベクトルで表されます。誤差は次のように計算されます。
|
|
近似
−
最大固有ベクトル
|
|
{\displaystyle ||{\text{近似}}-{\text{最大固有ベクトル}}||}
べき乗反復アルゴリズムはベクトルから始まり 、それは支配的な固有ベクトルまたはランダムベクトルの近似値である可能性がある。この方法は 再帰関係によって記述される。
b
0
{\displaystyle b_{0}}
b
け
+
1
=
あ
b
け
‖
あ
b
け
‖
{\displaystyle b_{k+1}={\frac {Ab_{k}}{\|Ab_{k}\|}}}
したがって、反復ごとに、ベクトルは 行列で乗算され 、正規化されます。
b
k
{\displaystyle b_{k}}
A
{\displaystyle A}
が他の固有値よりも絶対値が大きい固有値を持ち、開始ベクトルが 優勢な固有値に関連付けられた固有ベクトルの方向に非ゼロの成分を持つと 仮定すると、部分列は 優勢な固有値に関連付けられた固有ベクトルに収束します。
A
{\displaystyle A}
b
0
{\displaystyle b_{0}}
(
b
k
)
{\displaystyle \left(b_{k}\right)}
上記の2つの仮定がなければ、シーケンスは 必ずしも収束しません。このシーケンスでは、
(
b
k
)
{\displaystyle \left(b_{k}\right)}
b
k
=
e
i
ϕ
k
v
1
+
r
k
{\displaystyle b_{k}=e^{i\phi _{k}}v_{1}+r_{k}}
、
ここで、 は 支配的な固有値に関連付けられた固有ベクトルであり、 である 。 項の存在は、 でない限り が収束しないこと を意味する。 上記の2つの仮定の下で、 によって定義される
シーケンスは、
v
1
{\displaystyle v_{1}}
‖
r
k
‖
→
0
{\displaystyle \|r_{k}\|\rightarrow 0}
e
i
ϕ
k
{\displaystyle e^{i\phi _{k}}}
(
b
k
)
{\displaystyle \left(b_{k}\right)}
e
i
ϕ
k
=
1
{\displaystyle e^{i\phi _{k}}=1}
(
μ
k
)
{\displaystyle \left(\mu _{k}\right)}
μ
k
=
b
k
∗
A
b
k
b
k
∗
b
k
{\displaystyle \mu _{k}={\frac {b_{k}^{*}Ab_{k}}{b_{k}^{*}b_{k}}}}
支配的な固有値( レイリー商 )に収束する。 [ 説明が必要 ]
これは次のアルゴリズムで計算できます (NumPy を使用した Python で表示)。
#!/usr/bin/env python3
numpyを np として インポートする
def power_iteration ( A , num_iterations : int ):
# 理想的にはランダムベクトルを選択します
# ベクトルが
固有ベクトルに直交する可能性を減らすため #
b_k = np . random . rand ( A . shape [ 1 ])
for _ in range ( num_iterations ):
# 行列とベクトルの積を計算する Ab
b_k1 = np . dot ( A , b_k )
# ノルム を 計算 する b_k1_norm = np.linalg.norm ( b_k1 )
# ベクトルを再正規化する
b_k = b_k1 / b_k1_norm
b_kを 返す
べき乗反復 ( np . 配列 ([[ 0.5 , 0.5 ], [ 0.2 , 0.8 ]]), 10 )
ベクトルは 関連する固有ベクトルに収束します。理想的には、 関連する固有値を取得するために
レイリー商を使用する必要があります。
b
k
{\displaystyle b_{k}}
このアルゴリズムは、 Google PageRank を 計算するために使用されます。
この方法は、レイリー商を計算することによって
スペクトル半径 (正方行列の場合、最大の大きさを持つ固有値)を計算するためにも使用できる。
ρ
(
A
)
=
max
{
|
λ
1
|
,
…
,
|
λ
n
|
}
=
b
k
⊤
A
b
k
b
k
⊤
b
k
.
{\displaystyle \rho (A)=\max \left\{|\lambda _{1}|,\dotsc ,|\lambda _{n}|\right\}={\frac {b_{k}^{\top }Ab_{k}}{b_{k}^{\top }b_{k}}}.}
分析
をジョルダン標準形 に分解すると 、 の 最初の列は、 支配的な固有値 に対応する の固有ベクトルです 。 一般に の 支配的な固有値は 一意であるため、 の最初のジョルダン ブロックは、 が A の最大固有値である 行列 です 。 開始ベクトルは、 V の列の線形結合として記述できます 。
A
{\displaystyle A}
A
=
V
J
V
−
1
{\displaystyle A=VJV^{-1}}
V
{\displaystyle V}
A
{\displaystyle A}
λ
1
{\displaystyle \lambda _{1}}
A
{\displaystyle A}
J
{\displaystyle J}
1
×
1
{\displaystyle 1\times 1}
[
λ
1
]
,
{\displaystyle [\lambda _{1}],}
λ
1
{\displaystyle \lambda _{1}}
b
0
{\displaystyle b_{0}}
b
0
=
c
1
v
1
+
c
2
v
2
+
⋯
+
c
n
v
n
.
{\displaystyle b_{0}=c_{1}v_{1}+c_{2}v_{2}+\cdots +c_{n}v_{n}.}
仮定により、 は支配的な固有値の方向に非ゼロの成分を持つため、 となります 。
b
0
{\displaystyle b_{0}}
c
1
≠
0
{\displaystyle c_{1}\neq 0}
の計算上有用な 再帰関係 は 次のように書き直すことができます。
b
k
+
1
{\displaystyle b_{k+1}}
b
k
+
1
=
A
b
k
‖
A
b
k
‖
=
A
k
+
1
b
0
‖
A
k
+
1
b
0
‖
,
{\displaystyle b_{k+1}={\frac {Ab_{k}}{\|Ab_{k}\|}}={\frac {A^{k+1}b_{0}}{\|A^{k+1}b_{0}\|}},}
ここで、表現: は次の分析に適しています。
A
k
+
1
b
0
‖
A
k
+
1
b
0
‖
{\displaystyle {\frac {A^{k+1}b_{0}}{\|A^{k+1}b_{0}\|}}}
b
k
=
A
k
b
0
‖
A
k
b
0
‖
=
(
V
J
V
−
1
)
k
b
0
‖
(
V
J
V
−
1
)
k
b
0
‖
=
V
J
k
V
−
1
b
0
‖
V
J
k
V
−
1
b
0
‖
=
V
J
k
V
−
1
(
c
1
v
1
+
c
2
v
2
+
⋯
+
c
n
v
n
)
‖
V
J
k
V
−
1
(
c
1
v
1
+
c
2
v
2
+
⋯
+
c
n
v
n
)
‖
=
V
J
k
(
c
1
e
1
+
c
2
e
2
+
⋯
+
c
n
e
n
)
‖
V
J
k
(
c
1
e
1
+
c
2
e
2
+
⋯
+
c
n
e
n
)
‖
=
(
λ
1
|
λ
1
|
)
k
c
1
|
c
1
|
v
1
+
1
c
1
V
(
1
λ
1
J
)
k
(
c
2
e
2
+
⋯
+
c
n
e
n
)
‖
v
1
+
1
c
1
V
(
1
λ
1
J
)
k
(
c
2
e
2
+
⋯
+
c
n
e
n
)
‖
{\displaystyle {\begin{aligned}b_{k}&={\frac {A^{k}b_{0}}{\|A^{k}b_{0}\|}}\\&={\frac {\left(VJV^{-1}\right)^{k}b_{0}}{\|\left(VJV^{-1}\right)^{k}b_{0}\|}}\\&={\frac {VJ^{k}V^{-1}b_{0}}{\|VJ^{k}V^{-1}b_{0}\|}}\\&={\frac {VJ^{k}V^{-1}\left(c_{1}v_{1}+c_{2}v_{2}+\cdots +c_{n}v_{n}\right)}{\|VJ^{k}V^{-1}\left(c_{1}v_{1}+c_{2}v_{2}+\cdots +c_{n}v_{n}\right)\|}}\\&={\frac {VJ^{k}\left(c_{1}e_{1}+c_{2}e_{2}+\cdots +c_{n}e_{n}\right)}{\|VJ^{k}\left(c_{1}e_{1}+c_{2}e_{2}+\cdots +c_{n}e_{n}\right)\|}}\\&=\left({\frac {\lambda _{1}}{|\lambda _{1}|}}\right)^{k}{\frac {c_{1}}{|c_{1}|}}{\frac {v_{1}+{\frac {1}{c_{1}}}V\left({\frac {1}{\lambda _{1}}}J\right)^{k}\left(c_{2}e_{2}+\cdots +c_{n}e_{n}\right)}{\left\|v_{1}+{\frac {1}{c_{1}}}V\left({\frac {1}{\lambda _{1}}}J\right)^{k}\left(c_{2}e_{2}+\cdots +c_{n}e_{n}\right)\right\|}}\end{aligned}}}
上記の式は次のように簡略化される。
k
→
∞
{\displaystyle k\to \infty }
(
1
λ
1
J
)
k
=
[
[
1
]
(
1
λ
1
J
2
)
k
⋱
(
1
λ
1
J
m
)
k
]
→
[
1
0
⋱
0
]
as
k
→
∞
.
{\displaystyle \left({\frac {1}{\lambda _{1}}}J\right)^{k}={\begin{bmatrix}[1]&&&&\\&\left({\frac {1}{\lambda _{1}}}J_{2}\right)^{k}&&&\\&&\ddots &\\&&&\left({\frac {1}{\lambda _{1}}}J_{m}\right)^{k}\\\end{bmatrix}}\rightarrow {\begin{bmatrix}1&&&&\\&0&&&\\&&\ddots &\\&&&0\\\end{bmatrix}}\quad {\text{as}}\quad k\to \infty .}
この極限は、の固有値の大きさが1未満である
という事実から導かれるので、
1
λ
1
J
i
{\displaystyle {\frac {1}{\lambda _{1}}}J_{i}}
(
1
λ
1
J
i
)
k
→
0
as
k
→
∞
.
{\displaystyle \left({\frac {1}{\lambda _{1}}}J_{i}\right)^{k}\to 0\quad {\text{as}}\quad k\to \infty .}
結果は次のようになります。
1
c
1
V
(
1
λ
1
J
)
k
(
c
2
e
2
+
⋯
+
c
n
e
n
)
→
0
as
k
→
∞
{\displaystyle {\frac {1}{c_{1}}}V\left({\frac {1}{\lambda _{1}}}J\right)^{k}\left(c_{2}e_{2}+\cdots +c_{n}e_{n}\right)\to 0\quad {\text{as}}\quad k\to \infty }
この事実を利用すると、 k が大きい場合 との関係を強調する形式で記述できます 。
b
k
{\displaystyle b_{k}}
v
1
{\displaystyle v_{1}}
b
k
=
(
λ
1
|
λ
1
|
)
k
c
1
|
c
1
|
v
1
+
1
c
1
V
(
1
λ
1
J
)
k
(
c
2
e
2
+
⋯
+
c
n
e
n
)
‖
v
1
+
1
c
1
V
(
1
λ
1
J
)
k
(
c
2
e
2
+
⋯
+
c
n
e
n
)
‖
=
e
i
ϕ
k
c
1
|
c
1
|
v
1
‖
v
1
‖
+
r
k
{\displaystyle {\begin{aligned}b_{k}&=\left({\frac {\lambda _{1}}{|\lambda _{1}|}}\right)^{k}{\frac {c_{1}}{|c_{1}|}}{\frac {v_{1}+{\frac {1}{c_{1}}}V\left({\frac {1}{\lambda _{1}}}J\right)^{k}\left(c_{2}e_{2}+\cdots +c_{n}e_{n}\right)}{\left\|v_{1}+{\frac {1}{c_{1}}}V\left({\frac {1}{\lambda _{1}}}J\right)^{k}\left(c_{2}e_{2}+\cdots +c_{n}e_{n}\right)\right\|}}\\[6pt]&=e^{i\phi _{k}}{\frac {c_{1}}{|c_{1}|}}{\frac {v_{1}}{\|v_{1}\|}}+r_{k}\end{aligned}}}
どこで 、 どのように
e
i
ϕ
k
=
(
λ
1
/
|
λ
1
|
)
k
{\displaystyle e^{i\phi _{k}}=\left(\lambda _{1}/|\lambda _{1}|\right)^{k}}
‖
r
k
‖
→
0
{\displaystyle \|r_{k}\|\to 0}
k
→
∞
{\displaystyle k\to \infty }
シーケンスは 有界であるため、収束する部分シーケンスが含まれます。優勢な固有値に対応する固有ベクトルはスカラーまでしか一意ではないため、シーケンスが 収束しない場合でも、
k が大きい場合はほぼ A の固有ベクトルになります 。
(
b
k
)
{\displaystyle \left(b_{k}\right)}
(
b
k
)
{\displaystyle \left(b_{k}\right)}
b
k
{\displaystyle b_{k}}
あるいは、 Aが 対角化 可能であれば 、次の証明は同じ結果をもたらす。
λ 1 、λ 2 、...、λ m を Aの m 個の固有値 (重複度付き)とし 、 v 1 、 v 2 、...、 v m を対応する固有ベクトルとします。 が 優勢な固有値であると仮定すると、 に対して となり ます 。
λ
1
{\displaystyle \lambda _{1}}
|
λ
1
|
>
|
λ
j
|
{\displaystyle |\lambda _{1}|>|\lambda _{j}|}
j
>
1
{\displaystyle j>1}
初期ベクトルは次の ように記述できます。
b
0
{\displaystyle b_{0}}
b
0
=
c
1
v
1
+
c
2
v
2
+
⋯
+
c
m
v
m
.
{\displaystyle b_{0}=c_{1}v_{1}+c_{2}v_{2}+\cdots +c_{m}v_{m}.}
がランダムに(一様確率で)選択される場合 、 c 1 ≠ 0 となる 確率は 1 です。
b
0
{\displaystyle b_{0}}
A
k
b
0
=
c
1
A
k
v
1
+
c
2
A
k
v
2
+
⋯
+
c
m
A
k
v
m
=
c
1
λ
1
k
v
1
+
c
2
λ
2
k
v
2
+
⋯
+
c
m
λ
m
k
v
m
=
c
1
λ
1
k
(
v
1
+
c
2
c
1
(
λ
2
λ
1
)
k
v
2
+
⋯
+
c
m
c
1
(
λ
m
λ
1
)
k
v
m
)
→
c
1
λ
1
k
v
1
|
λ
j
λ
1
|
<
1
for
j
>
1
{\displaystyle {\begin{aligned}A^{k}b_{0}&=c_{1}A^{k}v_{1}+c_{2}A^{k}v_{2}+\cdots +c_{m}A^{k}v_{m}\\&=c_{1}\lambda _{1}^{k}v_{1}+c_{2}\lambda _{2}^{k}v_{2}+\cdots +c_{m}\lambda _{m}^{k}v_{m}\\&=c_{1}\lambda _{1}^{k}\left(v_{1}+{\frac {c_{2}}{c_{1}}}\left({\frac {\lambda _{2}}{\lambda _{1}}}\right)^{k}v_{2}+\cdots +{\frac {c_{m}}{c_{1}}}\left({\frac {\lambda _{m}}{\lambda _{1}}}\right)^{k}v_{m}\right)\\&\to c_{1}\lambda _{1}^{k}v_{1}&&\left|{\frac {\lambda _{j}}{\lambda _{1}}}\right|<1{\text{ for }}j>1\end{aligned}}}
一方で:
b
k
=
A
k
b
0
‖
A
k
b
0
‖
.
{\displaystyle b_{k}={\frac {A^{k}b_{0}}{\|A^{k}b_{0}\|}}.}
したがって、 は固有ベクトル (の倍数)に収束します 。収束は 幾何収束 であり、比は
b
k
{\displaystyle b_{k}}
v
1
{\displaystyle v_{1}}
|
λ
2
λ
1
|
,
{\displaystyle \left|{\frac {\lambda _{2}}{\lambda _{1}}}\right|,}
ここで、 は 2 番目の支配的な固有値を表します。したがって、支配的な固有値と大きさが近い固有値がある場合、この方法はゆっくりと収束します。
λ
2
{\displaystyle \lambda _{2}}
アプリケーション
べき乗反復法は行列の 1 つの固有値のみを近似しますが、特定の 計算問題 には依然として有用です。たとえば、 Google は 検索エンジンでドキュメントの PageRank を 計算するために使用しています [2] 。また、 Twitter は フォローすべき人物の推奨をユーザーに表示するために使用しています 。べき乗反復法は、 Web 行列などの 疎行列 に特に適しています。また、係数行列を明示的に保存する必要がなく 、代わりに行列ベクトル積を評価する関数にアクセスできる 行列フリー法としても使用できます。 条件が整えられた 非対称行列の場合、べき乗反復法はより複雑な アーノルディ反復法 よりも優れたパフォーマンスを発揮します 。対称行列の場合、べき乗反復法はめったに使用されません。これは、反復あたりのコストが小さいことを犠牲にすることなく収束速度を簡単に上げることができるためです。たとえば、 Lanczos 反復法 や LOBPCG を 参照してください。
A
{\displaystyle A}
A
x
{\displaystyle Ax}
より高度な固有値アルゴリズムのいくつかは、べき乗反復のバリエーションとして理解することができます。たとえば、 逆反復 法は、行列にべき乗反復を適用します 。他のアルゴリズムは、ベクトルによって生成されたサブスペース全体を調べます 。このサブスペースは クリロフサブスペースとして知られています。これは、 アーノルディ反復法 または ランチョス反復法 によって計算できます 。グラム反復法 [4] は、最大固有値対を計算するための超線形かつ決定論的な方法です。
A
−
1
{\displaystyle A^{-1}}
b
k
{\displaystyle b_{k}}
参照
参考文献
^ Richard von Mises および H. Pollaczek-Geiringer、
Praktische Verfahren der Gleichungsauflösung 、ZAMM - Zeitschrift für Angewandte Mathematik und Mechanik 9、152-164 (1929)。
^ Ipsen, Ilse 、および Rebecca M. Wills (2005 年 5 月 5 ~ 8 日)。「第 7 回 IMACS 国際シンポジウム 科学計算における反復法」 (PDF) 。Fields Institute、トロント、カナダ。 {{cite news}}: CS1 maint: multiple names: authors list (link)
^ Delattre, B.; Barthélemy, Q.; Araujo, A.; Allauzen, A. (2023)、「グラム反復法による畳み込み層の Lipschitz 定数の効率的な境界」、 第 40 回国際機械学習会議の議事録