点群データの相対パーシステントホモロジー解析¶

このチュートリアルでは、点群データの相対パーシステントホモロジー解析ついて解説します。

この機能はまだ試験的なので、インターフェースが変わったり機能自体がなくなる可能性があります。

ライブラリのインポート¶

まずは、解析に必要な Python ライブラリをインポートします。

In [1]:
import homcloud.interface as hc
import numpy as np
import matplotlib.pyplot as plt

点群データの準備¶

ここではランダムな2次元点群を用います。3次元でも計算は可能です。 点群 X は円周状、Y は円盤内の一様分布です。

In [2]:
t = np.linspace(0, 2 * np.pi, 20)
X = np.vstack([np.sin(t), np.cos(t)]).transpose() + np.random.uniform(-0.1, 0.1, size=(20, 2))
Y = np.random.uniform(-1, 1, size=(50, 2))
mask = np.linalg.norm(Y, axis=1) < 0.93
Y = Y[mask, :]
In [3]:
# 点群のプロット
fig, ax = plt.subplots()
ax.scatter(X[:, 0], X[:, 1])
ax.scatter(Y[:, 0], Y[:, 1])
ax.set_aspect("equal")
No description has been provided for this image

相対PDの計算¶

$B_r(X) = \cup_{x \in X} B_r(x)$という記法の下、$(H_*(B_r(X \cup Y), B_r(X)))_{r \geq 0}$という相対ホモロジー群のパーシステントホモロジーを考えます。

以下のセルで計算します。

In [4]:
pdlist = hc.PDList.from_coupled_alpha_relative_filtration(X, Y)

相対PDの可視化¶

可視化は通常のPDと同じです。

In [5]:
fig, axes = plt.subplots(1, 3, figsize=(12, 5))
ranges = [(-0.01, 0.05), (0, 0.1), (0, 1)]

for d in range(3):
    pdlist[d].histogram(ranges[d], 64).plot(ax=axes[d])

plt.tight_layout()
No description has been provided for this image

通常の2次元点群では2次元PDは生成消滅対を持ちませんが、相対ホモロジーを考えると2次元PDにも対が現われます。

$X \cup Y$からアルファ複体を使ってPDを計算して、比較してみましょう。

In [6]:
pdlist = hc.PDList.from_alpha_filtration(np.vstack([X, Y]))
fig, axes = plt.subplots(1, 3, figsize=(12, 5))
ranges = [(-0.01, 0.05), (0, 0.1), (0, 1)]
for d in range(3):
    pdlist[d].histogram(ranges[d], 64).plot(ax=axes[d])

plt.tight_layout()
No description has been provided for this image