2026-07-17 状態 — 技術解説・入門 ● Generative Geometry unlisted

格子判定に失敗して、
TDAにたどり着いた話

——点がつながる順番を見る、0次持続ホモロジー入門。
二値判定に失敗した記録であり、H₀だけに絞った入門である。

00この記事は逆から行く

TDAの解説は、たいてい穴とバーコードとフィルトレーションから始まる。道具の説明としては正しいが、なぜその道具が必要になるのかが抜けやすい。

この記事は逆から行く。Three.jsで作品を作っていたら判定問題に行き詰まり、行き詰まりの正体を突き詰めたら、それがH₀持続ホモロジーと呼ばれているものだった——という順番の話。

だからこれはTDA全般の紹介ではない。H₀(連結成分)の併合過程という、TDAの中でいちばん素朴で、ホモロジーの機械を一切知らなくても理解できる一枚だけを紹介する。

01Three.jsで作品を作ろうとした

発端は生成アートだった。結晶格子に8,000粒子を置き、異常を5%注入する作品を作ったあと、「格子を外したら重なりはどうなる?」という一行の問いが残った。

ランダム配置(ポアソン気体)では重なりが勝手に湧く——注入しなくても異常が創発する。じゃあ格子でもランダムでもない配置は? ということで、同心の多面体殻を積む構成を試した。八面体をk倍に拡大しながら積み、各面を三角格子で細分する。晶癖だけあって格子がない、はずの構造。

4つの点群の比較:八面体殻、立方体殻、黄金比分割、ポアソン気体
4つの点群。八面体殻(m=k)、立方体殻(m=k)、黄金比分割の立方体殻(m=round(kφ))、ポアソン気体。このうち2つは(極限で)格子に一致し、1つはどちらでもない何かで、1つはただの乱数だ——が、目視でそれを言い当てるのは難しい。この「言い当てられなさ」が03以降の主題になる。

02立方体・八面体は整列し、二十面体は妙な構造になった

八面体殻(殻数K=18、スケール刻みΔs=1.4、8,472点)を積んだら、点同士の距離を数えた瞬間に様子がおかしかった。カットオフ2.6未満の全ペア距離を小数第3位で丸めて集計すると、相異なる値が3種類しかない。1.400が23,358対、1.980が46,716対、2.425が29,776対——比にすると 1 : √2 : √3。これは単純立方格子の距離系列そのものだ。

代数で確認すると、八面体殻の点は Δs·(±i, ±j, ±l)(i+j+l=k)と書ける。すべての殻を無限に重ねた極限では、この和集合は Δs·ℤ³(原点を除く)——単純立方格子——に一致し、今回の有限点群はそのL¹球 |x|+|y|+|z| ≤ KΔs による切り出しになっている。つまり格子を避けたつもりの構成は、単純立方格子をL¹ノルムの等高面で層化しただけだった。

立方体殻(K=15、Δh=1.0、7,470点。カットオフ2.5、丸めは同じ)も様子は同じで、相異なる距離は1.732と2.000の2種類。こちらは極限でBCC格子に一致する(偶数番の殻が全偶数座標、奇数番が全奇数座標を担当する)構成の、L球による切り出しだ。

なら頂点座標に黄金比φが入っている二十面体ならどうか。今度こそ格子には閉じないはず——と思ったら、これも相異なる距離が2種類(1.902と2.000。カットオフ2.3、丸め10⁻⁵)で頭打ちになった。殻数をK=4から12まで増やしても2種類のまま。より遠い窓 [3.0, 4.2) で数えても6種類で、やはりKに依らず不変。ただし単一の格子ではなく、20個の結晶粒を中心から放射状に貼り合わせた構造で、あとで調べたらこの種の物体には古い名前があった——Mackay型の多重双晶に相当する(Mackay, 1962)。

03「格子か、そうでないか」を判定しようとして行き詰まった

ここで判定問題が発生する。目の前に点群がある。これは格子なのか、そうでないのか。

八面体殻のときは距離を数えて気づけたが、それは運がよかっただけで、一般の点群に対して「格子である/ない」を機械的に判定する手続きが欲しい。作ってみると、これが素直に書けない。

04有限点群に対して、その問いが一意ではない理由

行き詰まりの正体は、問いの立て方にあった。

「与えられた格子Lの部分集合になっているか」という代数的な問いなら、有限点群に対しても定義できる。書けないのはその先だ。観測された有限個の点が、無限に広がる周期構造から切り出された断片として生成されたのか——これは有限サンプルだけからは一意に決まらない。同じ有限点群が、ある格子の断片とも、格子でない無限集合の断片とも整合しうるからだ。

座標の側にも同じ非対称がある。任意の実座標の点群が何かの格子に厳密に埋め込めるわけではない。一方で、許容誤差を与えれば十分細かい格子でいくらでも近似できてしまう。だからノイズを含む現実の点群に対する「格子か否か」の判定は、延長の仮定と許容誤差の選び方に依存する。二値の答えはデータだけからは出てこない。

では、有限点群だけから、仮定なしに well-defined に決まる量は何か。点同士の距離だ。どのペアがどのスケールで「触れる」か——これは延長の仮定を置かずに、いま手元にある点だけから決まる。二値の問いをいったん手放して、この距離の集まりのを見る、というのが方針転換になる。

05半径を少しずつ広げ、点がつながる順番を見る

具体的にはこうする。各点を中心に半径 d/2 の球を置き、d を0からゆっくり大きくしていく。球同士が触れたら、その2点は「つながった」とみなす。最初は全点がバラバラ(クラスター数=点数N)。dが大きくなるにつれてクラスターが併合されていき、最後は全体がひとつになる。

記録すべきは、併合が起きたdの値のリストだ。併合は全部でちょうどN−1回起きる(同じdで複数の併合が同時に起きることもあり、そのときは重複込みで数える)ので、重複を含むN−1個の数のリスト——多重集合——が得られる。これをヒストグラムにしたものを、この記事では併合スペクトルと呼ぶことにする。

球の成長・クラスター併合・MST・H₀バーコードの対応図
7点の玩具例。上段:半径d/2の球を育てると、d=0.45で7成分、d=1.11で3成分(2クラスター+外れ点)、d=1.81で1成分に併合されていく。下段左:同じ点群の最小全域木(MST)。N−1=6本の辺に長さを付した。下段右:H₀バーコード。有限の6本のバーの死亡時刻が、MSTの辺長 {0.53, 0.54, 0.59, 0.60, 1.61, 1.66} と色ごとに一致する(最後の1本は不滅)。破線が死亡時刻、縦の細線は上段の3つのdの位置。

06それがH₀持続ホモロジーだった——MSTとの対応

この「半径を掃引しながら連結成分の併合を追う」操作には、既に名前がついている。Vietoris–Ripsフィルトレーションの0次持続ホモロジー(H₀ persistence)。各点(の属する成分)は d=0 で「誕生」し、より大きなクラスターに吸収されるスケールで「死亡」する。誕生と死亡の区間を横棒で描いたものがバーコードで、併合スペクトルとはH₀の死亡時刻の多重集合のことだ。

もうひとつ、古典的な対応がある。標準的な距離パラメータのもとで、H₀の死亡時刻の多重集合は、点群の最小全域木(MST)の辺長の多重集合と一致する。これはsingle-linkage階層クラスタリングの併合スケールと同じものでもある。だから、H₀が見ているのは全ペア距離の分布ではない。N(N−1)/2本の距離のうち、MSTに選ばれた「全体を連結するために必要な」N−1本のスケール——その重複度と分布だ。

つまりH₀持続ホモロジーは、道具立てとしては「MSTを作って辺長を眺める」以上のことをしていない。ホモロジー・単体複体・境界作用素、どれも知らなくてよい。必要なのはUnion-Findだけ。TDAの入口としてH₀を推す理由はここにある——完全に初等的でありながら、フィルトレーションという中心概念の本物の実例になっている。

07点状・帯状・連続状——併合スペクトルはどう違うか

さて、この計器で冒頭の点群たちを測り直す。主に見るのは死亡時刻の経験分布、つまり重複度込みのヒストグラムだ。「相異なる値の個数」は、丸め精度を決めた上での粗い要約量として添える(浮動小数点の等値判定に依存するし、点数を増やせばポアソンの個数は増える類の量なので、単独では診断に使わない)。

構成点数相異なる死亡時刻範囲
八面体殻 m=k(K=12, Δs=1.4)2,6241{1.400}点状
立方体殻 m=k(K=10, Δh=1.0)2,3301{1.732}点状
立方体殻 m=round(kφ)(K=8, Δh=1.5)3,18456[1.500, 1.846]帯状
ポアソン気体(ρ=0.125)3,0001,401[0.127, 2.561]連続状

死亡時刻の同一視は小数第3位への丸めによる。計算はRips閾値2.6のsparseフィルトレーション。02の距離集計とは殻数の異なる縮小構成(計算量の都合)を使っており、数値はその構成に対するもの。

β₀曲線と併合スペクトルの比較:崖・階段・坂、点状・帯状・連続状
左:クラスター数β₀(d)。格子に閉じた構成は一段の崖、黄金比分割は階段、ポアソンはなだらかな坂。右:併合スペクトル。1本線/密な線束/一様な霞。

格子に閉じた構成では、2,000超の併合がすべて同じスケールで一斉に起きる。スペクトルは1本の線だ。ポアソン気体では併合スケールがほぼすべて異なり、連続分布に近い経験スペクトルになる(有限点群の死亡時刻は必ず有限個なので、正確には「連続状」「広帯域」と呼ぶべきものだ)。そして黄金比で細分を乱した構成は、その中間——有限だが多数の値が帯状に分布する。

「格子か否か」という壊れた二値の問いは、こうして「併合スペクトルの形はどれか」という有限データからwell-definedな問いに置き換わった。点状・帯状・連続状。ただし断っておくと、この三分類は一般に確立された相分類ではなく、この実験で現れた三つの形につけた記述的なラベルである。それでも、二値では書けなかった「あいだ」が、測れる量として姿を現したのは確かだ。

08この計器で判定できないこと

誠実さのために、限界を先に書いておく。併合スペクトルが測っているのは連結に必要なスケールの重複度と分布であって、並進対称性そのものではない。

だからこれは格子判定器ではない。連結スケールの分布を見る一次診断だ。限界の列挙は弱点の告白ではなくて、計器の測定対象を限定する作業だと思っている。

何を測り、何を測っていないかを言えることが、計器を持つということだ。

09余談——φを入れたらフィボナッチが出てきた

帯状スペクトルを作った「黄金比分割」について少しだけ。立方体殻の細分数を m=round(kφ) にすると、殻ごとの面内間隔が 1.5, 2.0, 1.8, 2.0, 1.875, … と揺れて、殻同士の位相合わせが二度と同じにならない。そしてフィボナッチ番号の殻 k=2, 3, 5, 8 で、細分数がちょうど次のフィボナッチ数 3, 5, 8, 13 になる——φの連分数近似が、そのまま構成の中に埋まっている。

さらに1次のバーコード(H₁、ループの誕生)を調べると、生成則 m=round(kφ) の痕跡までバーコードに現れた。この話は次稿に譲る。