やわらかい幾何学3

初めに

この記事はプログラミングラボ部アドベントカレンダーおかわり部門 8日目の記事として書かれています。

adventar.org

8記事も書くのきつすぎ。

「やわらかい幾何学2」の続きです。

前回の復習

はしませんが、前回計算した境界作用素やその他もろもろを貼っておきます。

図形のKさん
f:id:Unit112358:20191205010628p:plain

図形のKさん(向き付けあり)
f:id:Unit112358:20191205010632p:plain

境界作用素の方々

\partial_2 = \begin{pmatrix} 0 \\ 0 \\ 1 \\ -1 \\ 1 \\ 0 \\ 0 \end{pmatrix}

\partial_1 = \begin{pmatrix} -1 & 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0  & -1 & -1 & 0 & 0 & 0 \\ 0 & -1 & 1 & 0 & -1 & -1 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 & -1 \\ 0 & 0 & 0 & 1 
& 1 & 0 & 1 \end{pmatrix}

\partial_0 = \begin{pmatrix} 0 & 0 & 0 & 0 & 0 \end{pmatrix}

サイクル

前回の記事で境界作用素を定義することができました。これを使って、穴の個数を数えてみましょう。

穴はどのような特徴を持っているでしょうか?Kを見ながら考えてみましょう。Kには、e_1e_2e_3で作られる穴と、e_5e_6e_7で作られる穴の2つの穴があります。これらの穴はどちらも辺に囲まれています。穴であるためには、辺にぐるっと一周囲まれている必要があるようですね。さて、この性質に似たようなことを、前にもどこかで聞いたことがありませんか?前回の記事、「やわらかい幾何学2」の境界の説明のところで、「それぞれの1単体をつなげると、ある方向にぐるっと一周するわっかになる場合、その境界は打ち消しあって0になります」という説明をしました。先ほどの穴も、囲んでいる辺に符号をつけて向きを適切にそろえれば、ぐるっと一周するわっかを作ることができます。

f:id:Unit112358:20191207230515p:plain

さて、ぐるっと一周するわっかの境界は0になるのでした。逆に言えば、\partial_1によって0に移るようなベクトルは、すべてわっかを表現しているといえます。そのようなベクトルの集合はまさに\partial_1の核、すなわち\ker \partial_1です。つまり、穴になるようなベクトルの集合は\ker \partial_1の要素であるといえるわけです。これは\partial_1以外の境界作用素でも考えることができ、\ker \partial_kのことをkサイクルといい、Z_k(K)で表します。

では、先ほど作った\partial_1から、\ker\partial_1を求めてみましょう。計算は省きますが、以下のようになります。

\ker\partial_1 = \biggl<\begin{pmatrix}1 \\ 1 \\ 1 \\ 0 \\ 0 \\ 0 \\ 0 \end{pmatrix},\begin{pmatrix}0 \\ 0 \\ 1 \\ -1 \\ 1 \\ 0 \\ 0 \end{pmatrix},\begin{pmatrix}0 \\ 0 \\ 0 \\ 0 \\ 1 \\ 1 \\ -1 \end{pmatrix} \biggr>

この3つのベクトルの線形結合であらわされるベクトルはすべて穴となるのですが、このままだと少し問題があります。以下の2つの例を見てみましょう。

まずは1つ目の例です。

\begin{pmatrix}1 \\ 1 \\ 1 \\ 0 \\ 0 \\ 0 \\ 0 \end{pmatrix} - \begin{pmatrix}0 \\ 0 \\ 1 \\ -1 \\ 1 \\ 0 \\ 0 \end{pmatrix} +  \begin{pmatrix}0 \\ 0 \\ 0 \\ 0 \\ 1 \\ 1 \\ -1 \end{pmatrix} = \begin{pmatrix}1 \\ 1 \\ 0 \\ 1 \\ 0 \\ 1 \\ -1 \end{pmatrix}

これを図で見てみると以下のようになります。

f:id:Unit112358:20191207231211p:plain

これは穴といえるのでしょうか?確かに境界は0になりますが、二つの穴を含んでしまっています。穴の個数を数えるときに、これを1つの穴とみなしたりはしませんね。複数の穴を足し合わせて作られた穴は、穴としてみなすべきではないようです。では、どのように穴を数えればいいのでしょうか?いくつかの穴をつなげたものが穴ではないのなら、ほかの穴をつなげても作ることができない穴こそが、本当の穴といえるでしょう。このような穴の個数は、\ker\partial_1の基底の数と一致します。穴の個数を調べるには、かわりに基底の個数を調べればいいことになります。

しかしこれでも問題は残ります。\ker \partial_1の基底の個数は3個でした。上の考えによると、穴の個数は3個のはずです。これに対して、Kには二つしか穴がありません。これはなぜなのでしょうか?2つ目の例を見てみましょう。

\begin{pmatrix}0 \\ 0 \\ 1 \\ -1 \\ 1 \\ 0 \\ 0 \end{pmatrix}

2つ目の基底を単独で取り出した場合です。図で見てみると以下のようになります。

f:id:Unit112358:20191207231334p:plain

確かにぐるっと一周しているようですが、f_1にふさがれていて穴が消えてしまっていますね。これは穴として数えるべきではないでしょう。このようなものをどうやって数えないようにすればいいのでしょうか?その方法は次のバウンダリーで説明しましょう。

バウンダリー

f_1にふさがれている穴はを囲んでいる辺たちはどのような性質を持っているでしょうか?f_1にふさがれている穴を囲んでいるということは、別の言い方をすればそれらの辺はf_1を囲んでいるといえます。これもどこかで聞いたことがある性質ですね。「やわらかい幾何学2」の境界の説明のところで、「ある鎖群の要素を囲んでいる単体に、適切に+か−をつけて足し合わせて作られる鎖群を、元の鎖群の境界という」という説明をしたと思います。つまり、f_1にふさがれている穴を囲んでいる辺たちは、f_1の境界であるといえます。

f:id:Unit112358:20191207232141p:plain

Kには面がf_1の一つしかありませんが、もっとたくさんの面を持つ図形の場合、それぞれの面から計算できる境界が囲んでいる穴は、すべて面によってふさがれています。そのようなベクトルの集合はまさに\partial_2の像、すなわち\text{Im}\partial_2です。つまり\text{Im}\partial_2の要素はすべて、面によってふさがれている穴を囲んでいるといえるわけです。サイクルの時と同様に、これは\partial_2以外の境界作用素でも考えることができ、\text{Im} \partial_{k+1}のことをkバウンダリーといい、B_k(K)で表します。

サイクルの時と同様に、\partial_2から\text{Im}\partial_1を求めてみましょう。\partial_2は1次元なので、\text{Im}\partial_2\partial_2は一致します。

\text{Im}\partial_2 = \partial_2 = \begin{pmatrix} 0 \\ 0 \\ 1 \\ -1 \\ 1 \\ 0 \\ 0 \end{pmatrix}

バウンダリーを計算することで、ふさがれている穴を知ることができました。これを先ほどのサイクルから除いたベクトル空間の基底が穴の個数と一致するはずです。

ホモロジー

ベクトル空間Vから、あるベクトル空間Wの基底を除くことで得られるベクトル空間を商空間といい、V/Wで表します。先ほど説明した通り、穴の個数はサイクルからバウンダリーを除いた空間の基底の個数と一致するので、求めたいのはZ_1/B_1 の次元となります。これを他の次元以外にも拡張して、ある図形Kに対するZ_k(K)/B_k(K)kホモロジーといい、H_k(K)と表します。穴の数はH_1(K)の次元と一致するということですね。

商空間の次元について、

\text{dim}(V/W) = \text{dim}(V) - \text{dim}(W)

という関係が成り立ちます。1ホモロジー群の定義は

H_1(K) = Z_1(K)/B_1(K)

なので、求めたいH_1(K)の次元は。

\text{dim}H_1(K) = \text{dim}Z_1(K) - \text{dim}B_1(K)

となります。\text{dim}Z_1(K)\text{dim}B_1(K)の次元は掃き出し法の要領で求めることができるので、H_1(K)の次元、つまり穴の個数を求めることができます。長い道のりでしたが、やっと穴の個数を求める方法が分かりました。

というわけで、これまで長い道のりを一緒に歩んできてくれたKの穴の個数を計算してみましょう。次元の個数は既定の個数と一致するので、サイクルとバウンダリーの次元はすでに計算されています。

\text{dim}Z_1(K) = 3

\text{dim}B_1(K) = 1

\text{dim}H_1(K) = \text{dim}Z_1(K) - \text{dim}B_1(K) = 2

よってKには穴が2個存在することが確かめられました。

ついでに連結成分の個数も数えてみましょう。今まで穴の個数を数えるためにH_1(K)の次元が穴の個数と一致することを説明してきました。同じように、H_0(K)が連結成分の個数を、H_2(K)が空洞の個数を表しています。よって、連結成分の個数を数えるためには、H_0(K)の次元を計算すればいいことになります。

1単体の境界は存在しないことから、

\text{dim}Z_0(K) = 5

次元定理より、

\text{dim}B_0(K) = 7 - \text{dim}Z_1(K) = 4

よって

\text{dim}H_0(K) = \text{dim}Z_0(K) - \text{dim}B_0(K) = 1

よって連結成分の個数が1個であることが分かりました。

パーシステント図

「やわらかい幾何学1」で「この記事のゴールは、「位相的データ解析」という新しい解析手法にトポロジーがどのように使われているかを知ることです」と言っていました。穴の個数を計算する方法が、どのように応用されているのでしょうか。

点集合が与えられてたとしましょう。最初、各点の半径は0です。これらの点の半径を、時間とともにちょっとづつ大きくしていくことを考えます。すると、あるタイミングでいくつかの点の領域が重なって穴を作る場合があります。同様に、領域が大きくなりすぎて穴が消滅してしまうこともあるでしょう。このように、各点を少しづつ大きくしていくことで、「どのタイミングで穴ができたか」「どのタイミングで穴が消失したか」という情報が得られます。

f:id:Unit112358:20191207234540p:plain

この二つのデータを座標としてグラフにプロットすると、どのくらいの穴があり、それぞれの穴がどのタイミングで出現し、どのタイミングで消滅したかがわかるグラフを作ることができます。このグラフのことをパーシステント図といいます。

f:id:Unit112358:20191207234601p:plain

この図は、点の分布によってさまざまな性質を示します。例えば、ガラスと液体の分子の分布は、人間の見た目では判断しにくいのですが、パーシステント図にすると顕著な違いが現れます。ここでは詳しくは言わないので、気になる人は以下のスライドを見てみてください。

https://www.sci.shizuoka.ac.jp/sciencecafe/news/20160128_02.pdf


他にもパーシステント図を用いた様々な解析方法があります。最近では、機械学習の入力データをトポロジーで生成しようという試みも出てきています。まだまだ発展途上の分野ですが、非常に興味深い分野でもあります。

おわりに

ここまで読んでくださった方、読みにくい文章だったと思いますが、読んでくれてありがとうございました。「やわらかい幾何学1」はともかく、2と3は結構説明が雑になってしまい、申し訳ないと感じています。細かいことを知りたい人はぜひ専門書を読んでみてください。おすすめの専門書を貼っておきます。

www.kyoritsu-pub.co.jp

ちなみに

8記事中4記事を書き終わりました。あと半分です。