Персистентная гомология формально определяется относительно фиксированной метрики, то есть смена метрики меняет фильтрацию и, как следствие, persistence diagram. На синтетике эффект можно показать через такой код:
import gudhi as gd
np.random.seed(0)
n = 200
X = np.random.randn(n, 10)
X[:, 0] *= 100
def persistence_h1(X, metric_matrix):
rips = gd.RipsComplex(distance_matrix=metric_matrix.tolist(),
max_edge_length=np.inf)
st = rips.create_simplex_tree(max_dimension=2)
diag = st.persistence()
return [(b, d) for dim, (b, d) in diag if dim == 1 and d != float('inf')]
from scipy.spatial.distance import squareform, pdist
D_l2 = squareform(pdist(X, metric='euclidean'))
D_l1 = squareform(pdist(X, metric='cityblock'))
D_linf = squareform(pdist(X, metric='chebyshev'))
for name, D in [('L2', D_l2), ('L1', D_l1), ('Linf', D_linf)]:
h1 = persistence_h1(X, D)
total_persistence = sum(d - b for b, d in h1)
Разница особенно ощущается, когда одна из координат имеет существенно больший масштаб: L_2 доминируется этой координатой и теряет структуру в остальных, L_inf полностью её игнорирует на низких значениях эпсилон, L_1 занимает промежуточное положение. На практике это означает, что предварительная нормализация признаков крайне критична, так как persistence diagram, построенная на ненормализованных данных, отражает скорее распределение масштабов координат, чем структуру многообразия(см прошлый пост)
Такие же эффекты можно заметить при применении TDA к специфическим типам данных: для текстов и косинусного расстояния на эмбедингах даёт принципиально другие диаграмы, чем евклидово расстояние; для последовательностей расстояние редактирования выделяет структуры, которые невидимы в координатном представлении, для временных рядов DTW показывет периодичности и режимы, которые попросту теряются при последовательном L_2.
#TDA101