点群データの相対パーシステントホモロジー解析¶
このチュートリアルでは、点群データの相対パーシステントホモロジー解析ついて解説します。
この機能はまだ試験的なので、インターフェースが変わったり機能自体がなくなる可能性があります。
ライブラリのインポート¶
まずは、解析に必要な 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")
相対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()
通常の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()