Vietoris-Rips filtrationのチュートリアル

このチュートリアルでは Vietoris-Rips filtrationを使ってパーシステント図を計算する例です。

Vietoris-Rips filtrationは以下のような利点があります。

一方で以下のような欠点もあります。

まず必要なライブラリを読み込みます

200次元のデータを100個、ランダムに準備します

distance matrix (距離行列) を scipy.spatial.distance_matrix を使って計算します。

distance matrix は 100x100 の行列です

パーシステント図の計算

homcloud.interface.PDList.from_rips_filtration でパーシステント図を計算します。引数の意味は以下の通りです。

計算時間は maxdim をどうするかでかなり変わります。

これらの計算は ripser というプログラムで計算されています。この ripser は Vietoris-Rips filtration による パーシステント図を計算するには(おそらく)最速のプログラムです。

パーシステント図の可視化

以下のようにしてパーシステント図を読み込みます。

1次のパーシステント図を可視化します

2次のパーシステント図も可視化します。

maxvalue の効果

さて、ここで PD を計算するときに maxvalue を指定すると何がおきるかを見ていきましょう。 まず、distance matrixの値がどのように分布しているか、histogramを見てみましょう。

numpy.triu_indicesを使うと距離行列の上半分だけ取り出すことができます。

5〜6.5の間に分布しているようです。

ここでは 5.6 を上限として計算しましょう。

さきほどよりかなり計算時間が早くなったことがわかると思います。 ここで注意しておくと、maxvalueを使う場合には ripser は使われず、diphaが代わりに使われます。 diphaはripserよりかなり遅いので、上限をうまく指定しないと却って遅くなる可能性もあります。

それでは PD をプロットしましょう。

PDの範囲の最大値が5.6になっています。maxvalueを指定しない場合と比較してみましょう。

maxvalueを指定したほうはbirth, deathともに5.6の所で切れていることがわかると思います。5.6よりも下の部分はどちらも同じ ヒストグラムになっています。

ではこれらの切りとられた birth-death pairはどこに行ったのでしょうか? 実はその一部は death time が∞なbirth-death pairとなっています。 そのような birth-death pair の birth time は essential_births というattributeに保持されています。では見てみましょう。

このように、maxvalueを指定しなかった場合にはessential_birthsは空ですが、指定した場合にはいくつかの値が得られます。 birth が 5.6 以下で death が 5.6 以上の birth-death pair がここに移動します。birth, death がともに 5.6以上の場合には それらの birth-death pair は痕跡もなく消されます。

これらの death time が ∞ な birth-death pair を並べてプロットすることもできます。

逆解析について

パーシステント図の上の各点は元データのホモロジー的構造(1次元はリング,2次元は空隙,等々)に対応しています.その構造を取りだすことができればデータ解析に便利でしょう.アルファ複体を使う場合には optimal volume の利用でこれが可能になります.しかし Vietoris-Rips 複体は単体の個数が多いためそのような構造を抽出するのは難しい問題になります.しかし1次元のPDに関してのみはある種の近似により比較的簡単にそういった構造の抽出が可能です.ここではその構造(optimal 1-cycleと呼びます)を抽出する方法について説明しましょう.

optimal 1-cycleを計算するためには,from_rips_filtrationを呼ぶ際にsave_graph=Trueという引数を付ける必要があります.1次元PDしか使わないのでmaxdimも1で計算しましょう.

1次元のPDを読み込んでプロットします.

(5.3, 5.6) に一番近い点を取り出します.

Optimal 1-cycleを計算します.計算時間はそれほどかかりません.

boundary_points というメソッドを呼び出すとリング上の点が得られます.各点は番号で表現され,その番号は最初の点から0, 1, 2, ... と昇順で付けられます.

注意

optimal 1-cycle を計算するときに, Pairs with the same birth time というエラーが発生する場合があります.実は距離行列の対称でない要素が同じ値を持っているとこの機能はうまく動きません.このようなエラーが出場合には距離行列に小さなノイズを加えておくとうまくいくでしょう.対称性を保ったままノイズを加えてください.

以上でこのチュートリアルは終わりです。