migrate to ghactions for ci/cd
1 |
"""
|
|
2 |
Implementation of the "multiscale heat kernel" (CVPR 2015),
|
|
3 |
|
|
4 |
Author: Chris Tralie
|
|
5 |
|
|
6 |
"""
|
|
7 |
|
|
8 | 3 |
import numpy as np |
9 |
|
|
10 | 3 |
__all__ = ["heat"] |
11 |
|
|
12 | 3 |
def evalHeatKernel(dgm1, dgm2, sigma): |
13 |
"""
|
|
14 |
Evaluate the continuous heat-based kernel between dgm1 and dgm2 (more correct than L2 on the discretized version above but may be slower because can't exploit fast matrix multiplication when evaluating many, many kernels)
|
|
15 |
"""
|
|
16 | 3 |
kSigma = 0 |
17 | 3 |
I1 = np.array(dgm1) |
18 | 3 |
I2 = np.array(dgm2) |
19 |
for i in range(I1.shape[0]): |
|
20 | 3 |
p = I1[i, 0:2] |
21 |
for j in range(I2.shape[0]): |
|
22 | 3 |
q = I2[j, 0:2] |
23 | 3 |
qc = I2[j, 1::-1] |
24 | 3 |
kSigma += np.exp(-(np.sum((p - q) ** 2)) / (8 * sigma)) - np.exp( |
25 |
-(np.sum((p - qc) ** 2)) / (8 * sigma) |
|
26 |
)
|
|
27 | 3 |
return kSigma / (8 * np.pi * sigma) |
28 |
|
|
29 |
|
|
30 | 3 |
def heat(dgm1, dgm2, sigma=0.4): |
31 |
"""
|
|
32 |
Return the pseudo-metric between two diagrams based on the continuous
|
|
33 |
heat kernel as described in "A Stable Multi-Scale Kernel for Topological Machine Learning" by Jan Reininghaus, Stefan Huber, Ulrich Bauer, and Roland Kwitt (CVPR 2015)
|
|
34 |
|
|
35 |
Parameters
|
|
36 |
-----------
|
|
37 |
|
|
38 |
dgm1: np.array (m,2)
|
|
39 |
A persistence diagram
|
|
40 |
dgm2: np.array (n,2)
|
|
41 |
A persistence diagram
|
|
42 |
sigma: float
|
|
43 |
Heat diffusion parameter (larger sigma makes blurrier)
|
|
44 |
Returns
|
|
45 |
--------
|
|
46 |
|
|
47 |
dist: float
|
|
48 |
heat kernel distance between dgm1 and dgm2
|
|
49 |
|
|
50 |
"""
|
|
51 | 3 |
return np.sqrt( |
52 |
evalHeatKernel(dgm1, dgm1, sigma) |
|
53 |
+ evalHeatKernel(dgm2, dgm2, sigma) |
|
54 |
- 2 * evalHeatKernel(dgm1, dgm2, sigma) |
|
55 |
)
|
Read our documentation on viewing source code .