容量次元 w/ calc_dimension_capacity

2022-03-07

容量次元についてです。

エノン写像

例として、以下の方程式より得られるエノン写像(Henon map)を使用します。

$$$ \begin{array}{l} x_{t+1}=y_t +1-ax_t^2 \\ y_{t+1}=bx_t \end{array} $$$

今回は$a=1.4,~b=0.3$とし、得られた5,000,000点のデータを使用します。 (4段4次のルンゲクッタにより数値積分しています。刻み幅は0.01です。)

計算した結果を示します。

Henon map (5,000,000 step)

得られた2次元の時系列データは三日月型のアトラクタを有していることが確認できます。

このアトラクタに対して容量次元を計算していきます。

容量次元

エノン写像の容量次元を計算していきます。

(容量次元はフラクタル次元、ボックスカウント次元とも呼ばれています。)


$n$次元時系列データに対する容量次元$D_0$は以下の式より求められます。

$$$ D_0=\lim_{\epsilon \to 0}~\Biggl( \frac{\ln N(\epsilon)}{\ln \frac{1}{\epsilon}}\Biggr) $$$

ただし、$N(\epsilon)$はデータ(アトラクタ)を長さ$\epsilon$のグリッドで分割した際に、データを含むセル数のことです。

エノン写像を$\epsilon=0.1$のグリッドで分割し、データを含むセルに色をつけると以下のようになり、$N(0.1)=83$となります。

エノン写像とグリッド

長さ$\epsilon$を徐々に小さくしていった際の変化をアニメーションにしてみます。

$\epsilon$に対するセル

抽象的な状態から上記で示したアトラクタ(Fig.1)に近い状態に推移していく様子を確認することができます。

この時$\ln 1 / \epsilon$ (=ep)に対する$\ln N(\epsilon)$ (=N)の変化を確認します。

epに対するNの変化

横軸(ep)の左側ではグリッドサイズが大きいためギザギザしている一方で、右側では直線的(相関係数が1に近い)になっています。


この結果から$D_0$を求めるにはいくつかの方法が検討できます。

最小二乗法を用いて1次近似した際の傾きを採用する。または、特定の条件下における$\frac{\ln N(\epsilon)}{\ln \frac{1}{\epsilon}}$の平均値を採用するなどです。


hundunで採用した計算方法は、

epにおける区間(バッチサイズ)ごとに直線の相関係数を計算し、最も相関係数が高かった区間における$\frac{\ln N(\epsilon)}{\ln \frac{1}{\epsilon}}$の平均値を計算する手法です。

上記結果(Fig.4)においてバッチサイズを10とした時の採用される区間と実際の$D_0$ (=Ave(N/ep))を示します。

epに対するNの変化 - 採用区間/値

最終的に容量次元は$D_0=1.29450$と求まります。

hundun.exploration.calc_dimension_capacity

hundunでは$D_0$の計算に際して得られた情報をプロットすることで値の妥当性を確認できるようにしています。

calc_dimension_capacity | hundun | GitHub

実際の使用例を確認します。

from hundun.equations import Henon
from hundun.exploration import calc_dimension_capacity

while True:
    henon = Henon.on_attractor()
    if not henon.inf:
        break

_, u_seq = henon.solve_n_times(5000000)

D_0 = calc_dimension_capacity(u_seq)

print(D_0)
1.294497548368281

calc_dimension_capacityによる結果

$D_0$を決定するには、まず(e)より相関係数が一定値以上(デフォルトでは0.999)である区間が存在することを確認します。

次に、(c)における青色のプロットがしっかりと収束しているかを確認する必要があります。


グラフについて

左側3つのグラフが全ての$\epsilon$に対する結果で、右側3つのグラフは採用した区間付近における結果を示しています。

(a), (b)

上記(Fig.4, Fig.5)で示した図と同様で、$\ln \frac{1}{\epsilon}$に対する$\ln N(\epsilon)$のプロットです。

青色は実際のプロットで、オレンジ色のプロットは採用した点です。

オレンジ色の直線は最終的な値$D_0$を重ねて表示した結果です。

(c), (d)

$\ln \frac{1}{\epsilon}$に対する$D_0$のプロットです。

青色のプロットは各区間における$\frac{\ln N(\epsilon)}{\ln \frac{1}{\epsilon}}$の平均値を示しています。

緑色のプロットは参考として、各区間における最小二乗法を用いて1次近似した際の傾きを示しています。

オレンジ色の点線が最終的な値$D_0$を表しています。

(e), (f)

$\ln \frac{1}{\epsilon}$に対する相関係数のプロットです。

オレンジ色の点が最大の相関係数を示します。

参考文献

Annotations

グラフ内に矢印を書くために参考にしました。

Annotations | matplotlib

Connection styles for annotations | matplotlib