レイリー商の概要

グラフ理論や線形代数でしばしば現れるレイリー商について簡単にまとめる。

レイリー商 $R$ は $R:\mathbb{R}^n \setminus \lbrace 0 \rbrace \rightarrow \mathbb{R}$ は対称行列$\mathbf{A}$とノルムが0ではない$n$次元ベクトル$\mathbf{x}$を用いて以下のように定義される。

$$ R(\mathbf{x}) = \frac{\mathbf{x}^T \mathbf{A} \mathbf{x}}{\mathbf{x}^T \mathbf{x}} $$

本記事では、レイリー商の性質について説明する。またPythonでの実装例も示す。以下のgithubにもソースコードを置いているので必要ならば参考にしてほしい。

ソースコード

github

  • jupyter notebook形式のファイルはこちら

google colaboratory

  • google colaboratory で実行する場合はこちら

実行環境

OSはmacOSで、LinuxやUnixのコマンドとはオプションが異なりますので注意。

!sw_vers
ProductName:		macOS
ProductVersion:		13.5.1
BuildVersion:		22G90
!python -V
Python 3.9.17

基本的なライブラリをインポートし watermark を利用してそのバージョンを確認してする。 ついでに乱数のseedの設定を行う。

import random

import numpy as np

seed = 123
random_state = 123

random.seed(seed)
np.random.seed(seed)


from watermark import watermark

print(watermark(python=True, watermark=True, iversions=True, globals_=globals()))
Python implementation: CPython
Python version       : 3.9.17
IPython version      : 8.17.2

numpy: 1.25.2

Watermark: 2.4.3

レイリー商の性質

対称行列$\mathbf{A}$は実数の固有値を持つ。その固有値を$\lambda_i$、固有ベクトルを$\mathbf{v}_i$とする。このとき、レイリー商は以下のように表される。

$$ R\left(\mathbf{x}\right)=\frac{\mathbf{x}^T \mathbf{A} \mathbf{x}}{\mathbf{x}^T \mathbf{x}} = \frac{\left(\sum_{i=1}^{n} \alpha_i \mathbf{v}_i\right)^T \mathbf{A} \left(\sum_{j=1}^{n} \alpha_j \mathbf{v}_j\right)}{\left(\sum_{k=1}^{n} \alpha_k \mathbf{v}_k\right)^T \left(\sum_{l=1}^{n} \alpha_l \mathbf{v}_l\right)} = \frac{\sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j \mathbf{v}_i^T \mathbf{A} \mathbf{v}_j}{\sum_{k=1}^{n} \sum_{l=1}^{n} \alpha_k \alpha_l \mathbf{v}_k^T \mathbf{v}_l} $$

対称行列の場合、固有ベクトルは直交するため、$ \mathbf{v}_i^T \mathbf{v}_j = 0 $ ($ i \neq j $ の場合)であり、$ \mathbf{v}_i^T \mathbf{v}_i = 1 $ を満たす。

したがって、

$$ R\left(\mathbf{x}\right)=\frac{\sum_{i=1}^{n} \alpha_i^2 \lambda_i}{\sum_{k=1}^{n} \alpha_k^2} $$

これが行列 $ \mathbf{A} $ の固有値 $ \lambda_i $ の重み付き平均であることがわかる。そして、$ \mathbf{x} $ を、たとえば、最大固有値に対応する固有ベクトルとすれば、$ R\left(\mathbf{x}\right) $ の最大値は最大固有値となる。一方、最小固有値に対応する固有ベクトルを選べば、最小固有値が得られる。

ラグランジュの未定乗数法を利用した解法

wikipeadia を参考にラグランジュの未定乗数法を利用したレイリー商の最大値や最小値の証明をメモっておく。

まず、上記と同様に、行列 $ \mathbf{A} $ のレイリー商を $ R(\mathbf{x}) $ とする。

$$ R(\mathbf{x}) = \frac{\mathbf{x}^T \mathbf{A} \mathbf{x}}{\mathbf{x}^T \mathbf{x}} $$

また、$ \lambda $ を行列 $ \mathbf{A} $ の固有値とし、$ \mathbf{v} $ をそれに対応する固有ベクトルとすると以下が成立する。

$$ \mathbf{A} \mathbf{v} = \lambda \mathbf{v} $$

ラグランジュの未定乗数法では、目的関数 $ f(\mathbf{x}) $ を最大化または最小化する際に、制約条件 $ g(\mathbf{x}) = 0 $ の下で最適解を見つける。未定乗数法では、ラグランジュ関数 $ L(\mathbf{x}, \lambda) $ を導入するのが一般的な表記である。

$$ L(\mathbf{x}, \lambda) = f(\mathbf{x}) - \lambda g(\mathbf{x}) $$

ここで、$ \lambda $ はラグランジュの乗数である。 レイリー商の場合、目的関数 $ f(\mathbf{x}) $ は $ \mathbf{x}^T \mathbf{A} \mathbf{x} $ であり、制約条件 $ g(\mathbf{x}) $ は $ \mathbf{x}^T \mathbf{x} - 1 = 0 $ となる。$\mathbf{x}$に対してそのノルムが1である条件をf制約条件として設定することで、$\mathbf{x}$が単位ベクトルであることを保証する。

ラグランジュ関数を次のように設定する。

$$ L(\mathbf{x}, \lambda) = \mathbf{x}^T \mathbf{A} \mathbf{x} - \lambda (\mathbf{x}^T \mathbf{x} - 1) $$

このラグランジュ関数を最大化する $ \mathbf{x} $ を見つけるために、勾配がゼロとなる条件を考える。

$$ \nabla_{\mathbf{x}} L(\mathbf{x}, \lambda) = 0 $$

これを解くと、以下のようになる。

$$ 2 \mathbf{A} \mathbf{x} - 2 \lambda \mathbf{x} = 0 $$

$$ \mathbf{A} \mathbf{x} = \lambda \mathbf{x} $$

これは、行列 $ \mathbf{A} $ の固有値 $ \lambda $ と対応する固有ベクトル $ \mathbf{x} $ の関係を表しており、レイリー商の最大値は $ \mathbf{A} $ の最大固有値に等しくなることがわかる。

Pythonによる実装例

簡単ではあるが、以下にPythonによる実装例を示す。

import numpy as np

# ランダムな対称行列Aとベクトルxを生成
A = np.random.rand(3, 3)
A = (A + A.T) / 2

# 適当なベクトルを用意する
x = np.random.rand(3)

# レイリー商
R = np.dot(x.T, np.dot(A, x)) / np.dot(x.T, x)

print("レイリー商:", R.round(2))
レイリー商: 1.47

結論

本記事では、レイリー商の性質について説明した。

また、ラグランジュの未定乗数法を利用したレイリー商の最大値や最小値の証明を示した。

最後に簡単ではあるが、Pythonによる実装例を示した。