
マンデルブロ集合の次元は2なのに、画像で測ると1.09になるのはなぜ?
シェルピンスキーの三角形の回で、フラクタル次元を自分のコードで測った。理論値に対して実測1.568。box-counting法という、箱のサイズを変えながら「対象を覆うのに何個必要か」を数えるだけの素朴な方法で、小数点以下2桁まで合った。
だったら、もっと有名なフラクタルでも同じことができるはずだ。マンデルブロ集合。
この集合には、私がずっと不思議に思っていた性質がある。集合の面積は有限で、境界のハウスドルフ次元は厳密に2であることが証明されている。Shishikuraによる1998年の論文だ(Annals of Mathematics)。面積と次元は違う量で、次元2だからといって境界が平面全体を埋める、あるいは面積が正であると決まるわけではない。
シェルピンスキーで1.585を当てられたコードなら、マンデルブロでも2に近い数字が出るだろう。そう思って測った。出なかった。
実験に使ったコードの全文はGitHubに置いています。
先に整理:今回の「1.09」は何の数字か
数学上の境界の次元を1.09に訂正したわけではない。 有限の画像から境界を取り出し、限られた箱サイズで測った傾きが1.09だった、という結果だ。
| 比較しているもの | 何を測るか | この実験で分かること |
|---|---|---|
| ハウスドルフ次元 | 理想的な集合を、任意に細かな尺度で覆うときの性質 | 2であることは数学的に証明済み |
| ボックスカウント次元 | 箱の幅を0へ近づけたときの箱数の増え方 | 有限枚の画像だけで極限は確認できない |
| 今回の回帰の傾き | ラスター画像を有限の箱サイズで覆った数 | 解像度・反復上限・窓の位置に依存する推定値 |
たとえば箱を半分の幅にすると、普通の線なら必要な箱はおよそ2倍、塗りつぶした正方形ならおよそ4倍になる。その増え方を調べるのがボックスカウントだ。ただし、画素より細かな構造は画像から復元できない。
測る対象を確認する
まず対象を描く。マンデルブロ集合は「をから反復したとき、無限大に発散しないの集合」だ。実装は反復してになったら脱出、というだけで済む。

の格子で、反復を打ち切る上限(以下、最大反復回数)を変えながら面積を数えた。集合内と判定された画素数×1画素あたりの面積、という単純な計算だ。
| 最大反復回数 | 面積の推定値 |
|---|---|
| 5 | 2.79654 |
| 50 | 1.58770 |
| 500 | 1.51350 |
| 5,000 | 1.50659 |
| 20,000 | 1.50603 |
推定値は1.506付近へ落ち着いた。ただし、これは格子と反復上限を固定した数値近似で、誤差を保証した面積評価ではない。未脱出の点を集合内と扱う誤差と、画素で数える誤差が残る。
ここまでは順調だった。
コードを較正する
次元の測定に入る前に、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倍にしても、その先はもう動かない。
少なくとも、反復上限だけを増やせば2に近づく、という挙動ではなかった。一方の計算条件を改善しても、別の誤差が残ることが見えてきた。
何が起きているのかを見る
この山は何だったのか。box-countingが実際に数えている「境界画素」そのものを描いてみた。上のカージオイドに乗っている球のあたりを、反復50回と2000回で比べる。

反復を50回で打ち切ると、輪郭は「まだ逃げ切っていない点」で太る。その太った輪郭が、細かい枝のあいだを縫うように走るので、境界画素は29,020個にもなり、次元は高く出る。
反復2000回まで回すと、その脂肪が落ちて9,219個になる。残ったのは、ほぼなめらかな円だ。
この画像では、細い構造が画素に乗らず、大きな球のなめらかな縁が残る影響が考えられる。連結成分を数えると、・反復2000回の画像で333個の破片に分かれた。数学上の集合は連結なので、画像が細い接続を保持できていないことは分かる。ただし、それだけで1.09という傾きの原因をすべて特定したわけではない。 箱サイズの選択や境界抽出の仕方も関わる。
次元が見つからないのは、そこに無いからではない。私の物差しの目盛りより細いところに畳み込まれているからだ。
細さを、目で確かめる
境界上のMisiurewicz点へ、140万倍まで寄っていく。

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

上がった。カージオイドの縁で1.85、シーホースバレーで1.64。全体で測ったときの1.090とは別物の数字が出る。
ここでも予想が外れている。私は「メインカージオイドの縁は数式で書ける解析曲線なのだから、そこを拡大すれば次元1.0が出るはずだ」と思って、この地点を対照群のつもりで選んでいた。実際には一番高い1.85が出た。カージオイドの縁には、あらゆる有理角の位置に小さな球がびっしり生えている。カージオイドという曲線はなめらかでも、マンデルブロ集合の境界としてのカージオイドの縁は、まったくなめらかではない。
さらに拡大すると測定不能になった(グラフ下端の×印)。半幅の窓では、「集合内」と判定された画素が0%になった。ただし、表示した中心座標は丸めた近似値だ。深い拡大では中心のずれや反復上限も確認しないと、「細すぎて見えない」とだけ結論できない。
自分で測るとき、先に確認したい4つのこと
- 円を同じ方法で測る。 次元1から大きく外れるなら、対象より先に画素化・境界抽出・箱サイズを見直す。
- 当てはめる範囲を変える。 箱1〜2画素と数十画素では見ているものが違う。log-logの線が直線に見えても、傾きの安定性を確認する。
- 解像度と反復上限を別々に変える。 両方を一度に変えると、どちらが効いたか分からない。
- 窓の位置と物理的な箱幅を記録する。 同じ「4画素」でも、拡大率が違えば複素平面上の長さは違う。
マンデルブロ集合の探索ツールでは、全体像から枝の付近へ寄り、反復上限を変えて輪郭を比べられる。次元を測る準備として、画像が計算条件で変わることを先に見てほしい。既知の次元で測り方を練習するなら、シェルピンスキーの実験につながる。
まとめ
- マンデルブロ集合の面積は画素数え上げで1.50603と推定された。ただし格子と反復上限による誤差は残る
- 同じbox-countingコードは円で0.976、コッホ雪片で1.249を返す。較正は通っている
- そのコードでマンデルブロ集合の境界を測ると1.090。理論値2には遠く、解像度256倍・反復回数4,000倍でも動かない
- 反復50回のとき1.364という山が出るが、これは輪郭が太っていただけで、丁寧に計算するほど1.09へ落ちる
- 連結な集合が画像では333個に分かれており、細い接続を取りこぼしている。箱サイズや中心座標など、ほかの測定条件も影響する
- 境界の一点を拡大して測り直すと1.85まで上がる。ただしさらに拡大すると集合が画面から消えて測定が壊れる
理論値が出せなかった実験だが、出なかったこと自体が答えだった。この境界は、私が用意したどの解像度よりも細かいところに複雑さを畳み込んでいる。
数字が動かないとき、私はつい対象のほうを疑ってきた。「思ったほど複雑じゃなかったのかもしれない」と。今回もそうで、1.09という値を見た最初の反応は「マンデルブロ集合、意外と大したことないのでは」だった。
でも動かなかったのは対象ではなく、物差しのほうだった。しかも厄介なことに、丁寧に測るほど——反復回数を増やして計算を正確にするほど——数字は理論値から遠ざかっていった。精度を上げる作業が、そのまま見落としを増やす作業になっていた。
測って出てきた数字は、対象の性質と物差しの性質が混ざったものだ。1.0904はの画像を今回の方法で測った傾きであり、では1.0681だった。円やコッホ雪片での較正は大切だが、それだけで別の集合の極限を正しく測れる保証にはならない。数字と一緒に、どの尺度で何を数えたかを残す必要がある。
このブログでは、機械学習の仕組みを実際にコードで実装して確かめた実験をテーマ別に整理しています(拡散モデル・Transformer・強化学習・多様体学習・過学習など)。


