
ランダムに撒いた400点を「自分の縄張りの重心」へ動かし続けたら、六角形の割合が31.4%から69.2%になった
平面に点をいくつか置いて、それぞれの点に「自分がいちばん近い領域」を割り当てる。できあがる分割がボロノイ図だ。
携帯電話の基地局のカバー範囲、キリンの模様、細胞の並び、最寄り駅の勢力圏。どれも同じ骨格を持っている。定義は「最も近い点はどれか」だけで、それ以上の指定はない。
このボロノイ図に、ひとつ操作を加える。各点を、自分の縄張りの重心へ動かす。 これを繰り返す(Lloyd法、あるいはボロノイ緩和)。ランダムに撒いた点が、蜂の巣のような規則的な配置に整っていくことが知られている。
どれくらい整うのか。何回で止まるのか。測った。
実験に使ったコードの全文はGitHubに置いています。
400点を40回動かす
単位正方形にランダムな400点を撒き、 の格子で各点の縄張りを求めて、重心へ動かす。

段階を並べるとこうなる。

セル面積の変動係数(標準偏差÷平均)を追うと、こうなった。
| 回数 | 面積の変動係数 |
|---|---|
| 0 | 0.5404 |
| 1 | 0.3960 |
| 5 | 0.2457 |
| 10 | 0.1936 |
| 20 | 0.1482 |
| 40 | 0.1081 |
40回で5分の1になる。ただし急激に減るのは最初の数回で、そこから先はゆっくりだ。

形のほうも変わる。六角形(辺が6本のセル)の割合は 31.4% → 69.2%。平均辺数は5.896から5.991になった。
平均辺数は6を超えられない
ここで気になることがある。「六角形が増える」なら、平均辺数はどこまで上がるのか。
答えは6で、しかもこれは実験でどうこうなる数字ではない。平面を多角形で隙間なく分割すると、オイラーの多面体定理から、辺の平均は6に収束することが決まっている。ランダムな点でも、整えた点でも変わらない。
実測でも確かめた(外周に接するセルは除いてある)。

| 点の数 | 平均辺数 |
|---|---|
| 100 | 5.7765 |
| 1,000 | 5.9394 |
| 10,000 | 5.9771 |
下から6に近づき、超えない。点の数を増やすほど外周の影響が薄まって、6に寄っていく。
つまりLloyd法がやっているのは「平均辺数を増やすこと」ではない。平均は最初から6の近くにある。変わっているのは分布のばらつきだ。4角形や8角形が減って6角形に集まる。平均は動かないまま、山だけが尖る。
距離の測り方を変える
ボロノイ図の定義は「最も近い点」だが、「近い」の測り方は1つではない。同じ60点に対して3種類の距離で縄張りを描いた。

| 距離 | 境界の総画素 | セル面積の標準偏差 |
|---|---|---|
| ユークリッド | 8,700 | 0.5718 |
| マンハッタン | 8,517 | 0.5541 |
| チェビシェフ | 9,022 | 0.5763 |
見た目はかなり違う。ユークリッド距離では境界が直線になるが、マンハッタン距離では45度の折れ線が混じり、チェビシェフ距離では水平・垂直の段差が目立つ。
一方で面積のばらつきはほとんど変わらない(0.554〜0.576)。縄張りの形は距離の定義で決まるが、大きさの偏りは点の配置で決まっていた。
まとめ
- ランダムな400点をLloyd法で40回動かすと、セル面積の変動係数は0.5404 → 0.1081
- 六角形の割合は31.4% → 69.2%。平均辺数は5.896 → 5.991でほとんど動かない
- 平均辺数は理論上6に収束する量で、10,000点で5.9771。Lloyd法が変えているのは平均ではなく分布のばらつき
- 距離の定義を変えると境界の形は大きく変わるが、面積のばらつきは0.554〜0.576でほぼ同じ
なお、この「各点を自分の縄張りの重心へ動かす」という手続きは、k-means++の回で扱ったk-means法そのものだ。あちらはデータ点を分類する道具として、こちらは点を整える道具として使っているが、動いている式は同じものになる。
平均は最初から6で、40回動かしても5.99だった。動いたのはばらつきのほうだけだ。
この構図は、数字を見るときに何度もやってしまう取り違えだと思う。「平均辺数6」という数字は、正六角形が敷き詰められた蜂の巣を思い浮かべさせる。だが実際には、4角形と8角形が混じった雑然とした分割でも平均は6になる。平均が理論値と一致していることは、中身が理論通りであることを何も保証しない。
Lloyd法の効果を測ろうとして最初に平均辺数を見たとき、5.896から5.991という差にがっかりした。0.1しか動いていない。分布を描いてやっと、31.4%が69.2%になっていたことが分かった。
見るべき数字を最初から知っていたわけではなくて、平均が動かないと分かってから、次に何を見ればいいかを考えた。
このブログでは、機械学習の仕組みを実際にコードで実装して確かめた実験をテーマ別に整理しています(拡散モデル・Transformer・強化学習・多様体学習・過学習など)。


