
マンデルブロ集合の境界は「2次元」だと証明されている。同じコードで測ったら1.09にしかならなかった
シェルピンスキーの三角形の回で、フラクタル次元を自分のコードで測った。理論値に対して実測1.568。box-counting法という、箱のサイズを変えながら「対象を覆うのに何個必要か」を数えるだけの素朴な方法で、小数点以下2桁まで合った。
だったら、もっと有名なフラクタルでも同じことができるはずだ。マンデルブロ集合。
この集合には、私がずっと不思議に思っていた性質がある。面積は有限(数値評価で約1.5065)なのに、境界のハウスドルフ次元は厳密に2であることが証明されている。1998年、Shishikuraによる結果だ(Annals of Mathematics 147, 225-267)。次元2というのは平面と同じ次元で、「線」であるはずの境界が平面と同じだけ込み入っている、という意味になる。
シェルピンスキーで1.585を当てられたコードなら、マンデルブロでも2に近い数字が出るだろう。そう思って測った。出なかった。
実験に使ったコードの全文はGitHubに置いています。
測る対象を確認する
まず対象を描く。マンデルブロ集合は「をから反復したとき、無限大に発散しないの集合」だ。実装は反復してになったら脱出、というだけで済む。

の格子で、反復を打ち切る上限(以下、最大反復回数)を変えながら面積を数えた。集合内と判定された画素数×1画素あたりの面積、という単純な計算だ。
| 最大反復回数 | 面積の推定値 |
|---|---|
| 5 | 2.79654 |
| 50 | 1.58770 |
| 500 | 1.51350 |
| 5,000 | 1.50659 |
| 20,000 | 1.50603 |
きれいに収束した。数値評価による文献値は約1.5065なので、4桁目まで合っている。面積は確かに有限で、しかも素朴な画素数え上げでちゃんと測れる。
ここまでは順調だった。
コードを較正する
次元の測定に入る前に、box-countingのコードが正しいことを確かめておく。フラクタル次元は「箱を細かくしたとき、覆うのに必要な箱の数がどれくらいの勢いで増えるか」で、のがそれにあたる。log-logプロットの傾きを読むだけだ。
答えが分かっている図形を2つ用意した。円(境界は普通の曲線なので次元は厳密に1)と、コッホ雪片(境界の次元は)。マンデルブロと全く同じ関数に通す。
ここで一度失敗している。最初は箱サイズを1〜2画素から使っていたのだが、それだと円が0.880にしかならなかった。画素の階段状のギザギザが、最小サイズの箱では拾いきれないためだ。箱サイズを4〜64画素に絞ったら、円は0.976、コッホ雪片は1.249。測り方の妥当性は、答えを知っている図形で先に確認しておかないと、後で出た数字が本物か分からなくなる。

較正は通った。そして同じ図に、マンデルブロ集合の測定結果も入っている。
1.090。
コッホ雪片(1.249)より低い。あの、見るからに複雑な図形が、雪の結晶よりなめらかだと出た。理論値2との差は0.9以上ある。
解像度を上げても、反復回数を増やしても動かない
測定が粗いのだろうと思い、解像度を上げた。最大反復回数は20,000で固定。
| 解像度 | 測定された次元 |
|---|---|
| 512×512 | 1.0955 |
| 1,024×1,024 | 1.1091 |
| 2,048×2,048 | 1.1142 |
| 4,096×4,096 | 1.0904 |
| 8,192×8,192 | 1.0681 |
画素数にして256倍。上がらないどころか、最後はわずかに下がっている。
反復回数のほうも振ってみた。こちらで妙なことが起きた。

面積(上段)はきれいに収束するのに、次元(下段)は反復50回のところで1.364という山を作り、そこから下がって1.09で止まる。反復回数を4,000倍にしても、その先はもう動かない。
計算が甘いから低く出ているのではなかった。計算を丁寧にするほど、低い値に落ち着いていく。
何が起きているのかを見る
この山は何だったのか。box-countingが実際に数えている「境界画素」そのものを描いてみた。上のカージオイドに乗っている球のあたりを、反復50回と2000回で比べる。

反復を50回で打ち切ると、輪郭は「まだ逃げ切っていない点」で太る。その太った輪郭が、細かい枝のあいだを縫うように走るので、境界画素は29,020個にもなり、次元は高く出る。
反復2000回まで回すと、その脂肪が落ちて9,219個になる。残ったのは、ほぼなめらかな円だ。
つまりこういうことだった。マンデルブロ集合の複雑さを担っている細い枝は、1画素より細い。反復を増やすほど枝は正しく細くなり、正しく細くなった結果、画面から消える。手元に残るのは大きな球のなめらかな縁ばかりで、それを測れば次元は1に近づく。連結成分の数を数えると、・反復2000回の画像でマンデルブロ集合は333個の破片にちぎれている。この集合が連結であることはDouadyとHubbardが1982年に証明しているので、333という数字は集合の性質ではなく、私の画面の解像度の性質でしかない。
次元が見つからないのは、そこに無いからではない。私の物差しの目盛りより細いところに畳み込まれているからだ。
細さを、目で確かめる
境界上のMisiurewicz点へ、140万倍まで寄っていく。

拡大しても、新しい構造が尽きない。倍率を上げるたびに枝が枝を生み、途中で何度も「小さなマンデルブロ集合」そのものが顔を出す。1画素の中に、まだこれだけ入っている。
脱出までの反復回数を高さにして3次元で見ると、境界が絶壁になっているのが分かりやすい。回転させてみてほしい。
台地が集合の内側、谷が外側で、そのあいだの崖が境界だ。崖はなめらかな壁ではなく、細かいひだが刻まれた岩肌になっている。
場所を選んで測り直す
集合全体をまとめて測ると、面積の大部分を占める大きな球のなめらかな縁に平均が引っ張られる。ならば、境界の一点だけを拡大して測ればどうなるか。窓の半幅をからまで縮めながら、同じbox-countingをかけた。

上がった。カージオイドの縁で1.85、シーホースバレーで1.64。全体で測ったときの1.090とは別物の数字が出る。
ここでも予想が外れている。私は「メインカージオイドの縁は数式で書ける解析曲線なのだから、そこを拡大すれば次元1.0が出るはずだ」と思って、この地点を対照群のつもりで選んでいた。実際には一番高い1.85が出た。カージオイドの縁には、あらゆる有理角の位置に小さな球がびっしり生えている。カージオイドという曲線はなめらかでも、マンデルブロ集合の境界としてのカージオイドの縁は、まったくなめらかではない。
そして、さらに拡大すると測定は壊れる(グラフ下端の×印)。半幅の窓では、Misiurewicz点のまわりで「集合内」と判定される画素が0%になった。境界の上にいるはずなのに、集合が画面から消える。ここでも同じことが起きている——構造は無いのではなく、細すぎて画素に乗らない。
まとめ
- マンデルブロ集合の面積は素朴な画素数え上げで測れた(1.50603、文献値約1.5065)
- 同じbox-countingコードは円で0.976、コッホ雪片で1.249を返す。較正は通っている
- そのコードでマンデルブロ集合の境界を測ると1.090。理論値2には遠く、解像度256倍・反復回数4,000倍でも動かない
- 反復50回のとき1.364という山が出るが、これは輪郭が太っていただけで、丁寧に計算するほど1.09へ落ちる
- 理由は、次元を担う細い枝が1画素より細いこと。連結なはずの集合が333個にちぎれて見えるのが、その証拠
- 境界の一点を拡大して測り直すと1.85まで上がる。ただしさらに拡大すると集合が画面から消えて測定が壊れる
理論値が出せなかった実験だが、出なかったこと自体が答えだった。この境界は、私が用意したどの解像度よりも細かいところに複雑さを畳み込んでいる。
数字が動かないとき、私はつい対象のほうを疑ってきた。「思ったほど複雑じゃなかったのかもしれない」と。今回もそうで、1.09という値を見た最初の反応は「マンデルブロ集合、意外と大したことないのでは」だった。
でも動かなかったのは対象ではなく、物差しのほうだった。しかも厄介なことに、丁寧に測るほど——反復回数を増やして計算を正確にするほど——数字は理論値から遠ざかっていった。精度を上げる作業が、そのまま見落としを増やす作業になっていた。
測って出てきた数字は、対象の性質と物差しの性質が混ざったものだ。1.09はマンデルブロ集合の次元ではなく、「解像度の画面で見たマンデルブロ集合の次元」でしかない。どちらの性質を見ているのかを切り分けるには、答えを知っている何か——円やコッホ雪片——を同じ物差しで測ってみるしかない。それをやっていなかったら、私は1.09を集合の性質だと信じていたと思う。
このブログでは、機械学習の仕組みを実際にコードで実装して確かめた実験をテーマ別に整理しています(拡散モデル・Transformer・強化学習・多様体学習・過学習など)。


