From b2d81dd8ee2ed7e1269eb16816f9af6794305046 Mon Sep 17 00:00:00 2001 From: Marc Glisse Date: Fri, 15 Nov 2019 22:23:21 +0100 Subject: Run example as a test, without graphics --- src/python/CMakeLists.txt | 5 + .../diagram_vectorizations_distances_kernels.py | 133 +++++++++++++++++++++ src/python/example/ex_diagrams.py | 133 --------------------- src/python/test/test_representations.py | 11 ++ 4 files changed, 149 insertions(+), 133 deletions(-) create mode 100755 src/python/example/diagram_vectorizations_distances_kernels.py delete mode 100755 src/python/example/ex_diagrams.py create mode 100755 src/python/test/test_representations.py (limited to 'src/python') diff --git a/src/python/CMakeLists.txt b/src/python/CMakeLists.txt index 5e2207f0..d131b920 100644 --- a/src/python/CMakeLists.txt +++ b/src/python/CMakeLists.txt @@ -387,6 +387,11 @@ if(PYTHONINTERP_FOUND) add_gudhi_py_test(test_wasserstein_distance) endif(OT_FOUND) + # Representations + if(SKLEARN_FOUND) + add_gudhi_py_test(test_representations) + endif(SKLEARN_FOUND) + # Documentation generation is available through sphinx - requires all modules if(SPHINX_PATH) if(MATPLOTLIB_FOUND) diff --git a/src/python/example/diagram_vectorizations_distances_kernels.py b/src/python/example/diagram_vectorizations_distances_kernels.py new file mode 100755 index 00000000..a6a36b7c --- /dev/null +++ b/src/python/example/diagram_vectorizations_distances_kernels.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python + +import matplotlib.pyplot as plt +import numpy as np +from sklearn.kernel_approximation import RBFSampler +from sklearn.preprocessing import MinMaxScaler + +from gudhi.sktda import DiagramSelector, Clamping, Landscape, Silhouette, BettiCurve, ComplexPolynomial,\ + TopologicalVector, DiagramScaler, BirthPersistenceTransform,\ + PersistenceImage, PersistenceWeightedGaussianKernel, Entropy, \ + PersistenceScaleSpaceKernel, SlicedWassersteinDistance,\ + SlicedWassersteinKernel, BottleneckDistance, PersistenceFisherKernel + +D = np.array([[0.,4.],[1.,2.],[3.,8.],[6.,8.], [0., np.inf], [5., np.inf]]) +diags = [D] + +diags = DiagramSelector(use=True, point_type="finite").fit_transform(diags) +diags = DiagramScaler(use=True, scalers=[([0,1], MinMaxScaler())]).fit_transform(diags) +diags = DiagramScaler(use=True, scalers=[([1], Clamping(limit=.9))]).fit_transform(diags) + +D = diags[0] +plt.scatter(D[:,0],D[:,1]) +plt.plot([0.,1.],[0.,1.]) +plt.title("Test Persistence Diagram for vector methods") +plt.show() + +LS = Landscape(resolution=1000) +L = LS.fit_transform(diags) +plt.plot(L[0][:1000]) +plt.plot(L[0][1000:2000]) +plt.plot(L[0][2000:3000]) +plt.title("Landscape") +plt.show() + +def pow(n): + return lambda x: np.power(x[1]-x[0],n) + +SH = Silhouette(resolution=1000, weight=pow(2)) +sh = SH.fit_transform(diags) +plt.plot(sh[0]) +plt.title("Silhouette") +plt.show() + +BC = BettiCurve(resolution=1000) +bc = BC.fit_transform(diags) +plt.plot(bc[0]) +plt.title("Betti Curve") +plt.show() + +CP = ComplexPolynomial(threshold=-1, polynomial_type="T") +cp = CP.fit_transform(diags) +print("Complex polynomial is " + str(cp[0,:])) + +TV = TopologicalVector(threshold=-1) +tv = TV.fit_transform(diags) +print("Topological vector is " + str(tv[0,:])) + +PI = PersistenceImage(bandwidth=.1, weight=lambda x: x[1], im_range=[0,1,0,1], resolution=[100,100]) +pi = PI.fit_transform(diags) +plt.imshow(np.flip(np.reshape(pi[0], [100,100]), 0)) +plt.title("Persistence Image") +plt.show() + +ET = Entropy(mode="scalar") +et = ET.fit_transform(diags) +print("Entropy statistic is " + str(et[0,:])) + +ET = Entropy(mode="vector", normalized=False) +et = ET.fit_transform(diags) +plt.plot(et[0]) +plt.title("Entropy function") +plt.show() + +D = np.array([[1.,5.],[3.,6.],[2.,7.]]) +diags2 = [D] + +diags2 = DiagramScaler(use=True, scalers=[([0,1], MinMaxScaler())]).fit_transform(diags2) + +D = diags[0] +plt.scatter(D[:,0],D[:,1]) +D = diags2[0] +plt.scatter(D[:,0],D[:,1]) +plt.plot([0.,1.],[0.,1.]) +plt.title("Test Persistence Diagrams for kernel methods") +plt.show() + +def arctan(C,p): + return lambda x: C*np.arctan(np.power(x[1], p)) + +PWG = PersistenceWeightedGaussianKernel(bandwidth=1., kernel_approx=None, weight=arctan(1.,1.)) +X = PWG.fit(diags) +Y = PWG.transform(diags2) +print("PWG kernel is " + str(Y[0][0])) + +PWG = PersistenceWeightedGaussianKernel(kernel_approx=RBFSampler(gamma=1./2, n_components=100000).fit(np.ones([1,2])), weight=arctan(1.,1.)) +X = PWG.fit(diags) +Y = PWG.transform(diags2) +print("Approximate PWG kernel is " + str(Y[0][0])) + +PSS = PersistenceScaleSpaceKernel(bandwidth=1.) +X = PSS.fit(diags) +Y = PSS.transform(diags2) +print("PSS kernel is " + str(Y[0][0])) + +PSS = PersistenceScaleSpaceKernel(kernel_approx=RBFSampler(gamma=1./2, n_components=100000).fit(np.ones([1,2]))) +X = PSS.fit(diags) +Y = PSS.transform(diags2) +print("Approximate PSS kernel is " + str(Y[0][0])) + +sW = SlicedWassersteinDistance(num_directions=100) +X = sW.fit(diags) +Y = sW.transform(diags2) +print("SW distance is " + str(Y[0][0])) + +SW = SlicedWassersteinKernel(num_directions=100, bandwidth=1.) +X = SW.fit(diags) +Y = SW.transform(diags2) +print("SW kernel is " + str(Y[0][0])) + +W = BottleneckDistance(epsilon=.001) +X = W.fit(diags) +Y = W.transform(diags2) +print("Bottleneck distance is " + str(Y[0][0])) + +PF = PersistenceFisherKernel(bandwidth_fisher=1., bandwidth=1.) +X = PF.fit(diags) +Y = PF.transform(diags2) +print("PF kernel is " + str(Y[0][0])) + +PF = PersistenceFisherKernel(bandwidth_fisher=1., bandwidth=1., kernel_approx=RBFSampler(gamma=1./2, n_components=100000).fit(np.ones([1,2]))) +X = PF.fit(diags) +Y = PF.transform(diags2) +print("Approximate PF kernel is " + str(Y[0][0])) diff --git a/src/python/example/ex_diagrams.py b/src/python/example/ex_diagrams.py deleted file mode 100755 index a6a36b7c..00000000 --- a/src/python/example/ex_diagrams.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python - -import matplotlib.pyplot as plt -import numpy as np -from sklearn.kernel_approximation import RBFSampler -from sklearn.preprocessing import MinMaxScaler - -from gudhi.sktda import DiagramSelector, Clamping, Landscape, Silhouette, BettiCurve, ComplexPolynomial,\ - TopologicalVector, DiagramScaler, BirthPersistenceTransform,\ - PersistenceImage, PersistenceWeightedGaussianKernel, Entropy, \ - PersistenceScaleSpaceKernel, SlicedWassersteinDistance,\ - SlicedWassersteinKernel, BottleneckDistance, PersistenceFisherKernel - -D = np.array([[0.,4.],[1.,2.],[3.,8.],[6.,8.], [0., np.inf], [5., np.inf]]) -diags = [D] - -diags = DiagramSelector(use=True, point_type="finite").fit_transform(diags) -diags = DiagramScaler(use=True, scalers=[([0,1], MinMaxScaler())]).fit_transform(diags) -diags = DiagramScaler(use=True, scalers=[([1], Clamping(limit=.9))]).fit_transform(diags) - -D = diags[0] -plt.scatter(D[:,0],D[:,1]) -plt.plot([0.,1.],[0.,1.]) -plt.title("Test Persistence Diagram for vector methods") -plt.show() - -LS = Landscape(resolution=1000) -L = LS.fit_transform(diags) -plt.plot(L[0][:1000]) -plt.plot(L[0][1000:2000]) -plt.plot(L[0][2000:3000]) -plt.title("Landscape") -plt.show() - -def pow(n): - return lambda x: np.power(x[1]-x[0],n) - -SH = Silhouette(resolution=1000, weight=pow(2)) -sh = SH.fit_transform(diags) -plt.plot(sh[0]) -plt.title("Silhouette") -plt.show() - -BC = BettiCurve(resolution=1000) -bc = BC.fit_transform(diags) -plt.plot(bc[0]) -plt.title("Betti Curve") -plt.show() - -CP = ComplexPolynomial(threshold=-1, polynomial_type="T") -cp = CP.fit_transform(diags) -print("Complex polynomial is " + str(cp[0,:])) - -TV = TopologicalVector(threshold=-1) -tv = TV.fit_transform(diags) -print("Topological vector is " + str(tv[0,:])) - -PI = PersistenceImage(bandwidth=.1, weight=lambda x: x[1], im_range=[0,1,0,1], resolution=[100,100]) -pi = PI.fit_transform(diags) -plt.imshow(np.flip(np.reshape(pi[0], [100,100]), 0)) -plt.title("Persistence Image") -plt.show() - -ET = Entropy(mode="scalar") -et = ET.fit_transform(diags) -print("Entropy statistic is " + str(et[0,:])) - -ET = Entropy(mode="vector", normalized=False) -et = ET.fit_transform(diags) -plt.plot(et[0]) -plt.title("Entropy function") -plt.show() - -D = np.array([[1.,5.],[3.,6.],[2.,7.]]) -diags2 = [D] - -diags2 = DiagramScaler(use=True, scalers=[([0,1], MinMaxScaler())]).fit_transform(diags2) - -D = diags[0] -plt.scatter(D[:,0],D[:,1]) -D = diags2[0] -plt.scatter(D[:,0],D[:,1]) -plt.plot([0.,1.],[0.,1.]) -plt.title("Test Persistence Diagrams for kernel methods") -plt.show() - -def arctan(C,p): - return lambda x: C*np.arctan(np.power(x[1], p)) - -PWG = PersistenceWeightedGaussianKernel(bandwidth=1., kernel_approx=None, weight=arctan(1.,1.)) -X = PWG.fit(diags) -Y = PWG.transform(diags2) -print("PWG kernel is " + str(Y[0][0])) - -PWG = PersistenceWeightedGaussianKernel(kernel_approx=RBFSampler(gamma=1./2, n_components=100000).fit(np.ones([1,2])), weight=arctan(1.,1.)) -X = PWG.fit(diags) -Y = PWG.transform(diags2) -print("Approximate PWG kernel is " + str(Y[0][0])) - -PSS = PersistenceScaleSpaceKernel(bandwidth=1.) -X = PSS.fit(diags) -Y = PSS.transform(diags2) -print("PSS kernel is " + str(Y[0][0])) - -PSS = PersistenceScaleSpaceKernel(kernel_approx=RBFSampler(gamma=1./2, n_components=100000).fit(np.ones([1,2]))) -X = PSS.fit(diags) -Y = PSS.transform(diags2) -print("Approximate PSS kernel is " + str(Y[0][0])) - -sW = SlicedWassersteinDistance(num_directions=100) -X = sW.fit(diags) -Y = sW.transform(diags2) -print("SW distance is " + str(Y[0][0])) - -SW = SlicedWassersteinKernel(num_directions=100, bandwidth=1.) -X = SW.fit(diags) -Y = SW.transform(diags2) -print("SW kernel is " + str(Y[0][0])) - -W = BottleneckDistance(epsilon=.001) -X = W.fit(diags) -Y = W.transform(diags2) -print("Bottleneck distance is " + str(Y[0][0])) - -PF = PersistenceFisherKernel(bandwidth_fisher=1., bandwidth=1.) -X = PF.fit(diags) -Y = PF.transform(diags2) -print("PF kernel is " + str(Y[0][0])) - -PF = PersistenceFisherKernel(bandwidth_fisher=1., bandwidth=1., kernel_approx=RBFSampler(gamma=1./2, n_components=100000).fit(np.ones([1,2]))) -X = PF.fit(diags) -Y = PF.transform(diags2) -print("Approximate PF kernel is " + str(Y[0][0])) diff --git a/src/python/test/test_representations.py b/src/python/test/test_representations.py new file mode 100755 index 00000000..4ff65f98 --- /dev/null +++ b/src/python/test/test_representations.py @@ -0,0 +1,11 @@ +import os +import sys +import matplotlib.pyplot as plt +# Disable graphics for testing purposes +plt.show = lambda:None +here = os.path.dirname(os.path.realpath(__file__)) +sys.path.append(here + "/../example") +import diagram_vectorizations_distances_kernels +# pytest is unhappy if there are 0 tests +def test_nothing(): + return None -- cgit v1.2.3