scikit-network 0.28.3__cp39-cp39-macosx_12_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of scikit-network might be problematic. Click here for more details.
- scikit_network-0.28.3.dist-info/AUTHORS.rst +41 -0
- scikit_network-0.28.3.dist-info/LICENSE +34 -0
- scikit_network-0.28.3.dist-info/METADATA +457 -0
- scikit_network-0.28.3.dist-info/RECORD +240 -0
- scikit_network-0.28.3.dist-info/WHEEL +5 -0
- scikit_network-0.28.3.dist-info/top_level.txt +1 -0
- sknetwork/__init__.py +21 -0
- sknetwork/classification/__init__.py +8 -0
- sknetwork/classification/base.py +84 -0
- sknetwork/classification/base_rank.py +143 -0
- sknetwork/classification/diffusion.py +134 -0
- sknetwork/classification/knn.py +162 -0
- sknetwork/classification/metrics.py +205 -0
- sknetwork/classification/pagerank.py +66 -0
- sknetwork/classification/propagation.py +152 -0
- sknetwork/classification/tests/__init__.py +1 -0
- sknetwork/classification/tests/test_API.py +35 -0
- sknetwork/classification/tests/test_diffusion.py +37 -0
- sknetwork/classification/tests/test_knn.py +24 -0
- sknetwork/classification/tests/test_metrics.py +53 -0
- sknetwork/classification/tests/test_pagerank.py +20 -0
- sknetwork/classification/tests/test_propagation.py +24 -0
- sknetwork/classification/vote.cpython-39-darwin.so +0 -0
- sknetwork/classification/vote.pyx +58 -0
- sknetwork/clustering/__init__.py +7 -0
- sknetwork/clustering/base.py +102 -0
- sknetwork/clustering/kmeans.py +142 -0
- sknetwork/clustering/louvain.py +255 -0
- sknetwork/clustering/louvain_core.cpython-39-darwin.so +0 -0
- sknetwork/clustering/louvain_core.pyx +134 -0
- sknetwork/clustering/metrics.py +91 -0
- sknetwork/clustering/postprocess.py +66 -0
- sknetwork/clustering/propagation_clustering.py +108 -0
- sknetwork/clustering/tests/__init__.py +1 -0
- sknetwork/clustering/tests/test_API.py +37 -0
- sknetwork/clustering/tests/test_kmeans.py +47 -0
- sknetwork/clustering/tests/test_louvain.py +104 -0
- sknetwork/clustering/tests/test_metrics.py +50 -0
- sknetwork/clustering/tests/test_post_processing.py +23 -0
- sknetwork/clustering/tests/test_postprocess.py +39 -0
- sknetwork/data/__init__.py +5 -0
- sknetwork/data/load.py +408 -0
- sknetwork/data/models.py +459 -0
- sknetwork/data/parse.py +621 -0
- sknetwork/data/test_graphs.py +84 -0
- sknetwork/data/tests/__init__.py +1 -0
- sknetwork/data/tests/test_API.py +30 -0
- sknetwork/data/tests/test_load.py +95 -0
- sknetwork/data/tests/test_models.py +52 -0
- sknetwork/data/tests/test_parse.py +253 -0
- sknetwork/data/tests/test_test_graphs.py +30 -0
- sknetwork/data/tests/test_toy_graphs.py +68 -0
- sknetwork/data/toy_graphs.py +619 -0
- sknetwork/embedding/__init__.py +10 -0
- sknetwork/embedding/base.py +90 -0
- sknetwork/embedding/force_atlas.py +197 -0
- sknetwork/embedding/louvain_embedding.py +174 -0
- sknetwork/embedding/louvain_hierarchy.py +142 -0
- sknetwork/embedding/metrics.py +66 -0
- sknetwork/embedding/random_projection.py +133 -0
- sknetwork/embedding/spectral.py +214 -0
- sknetwork/embedding/spring.py +198 -0
- sknetwork/embedding/svd.py +363 -0
- sknetwork/embedding/tests/__init__.py +1 -0
- sknetwork/embedding/tests/test_API.py +73 -0
- sknetwork/embedding/tests/test_force_atlas.py +35 -0
- sknetwork/embedding/tests/test_louvain_embedding.py +33 -0
- sknetwork/embedding/tests/test_louvain_hierarchy.py +19 -0
- sknetwork/embedding/tests/test_metrics.py +29 -0
- sknetwork/embedding/tests/test_random_projection.py +28 -0
- sknetwork/embedding/tests/test_spectral.py +84 -0
- sknetwork/embedding/tests/test_spring.py +50 -0
- sknetwork/embedding/tests/test_svd.py +37 -0
- sknetwork/flow/__init__.py +3 -0
- sknetwork/flow/flow.py +73 -0
- sknetwork/flow/tests/__init__.py +1 -0
- sknetwork/flow/tests/test_flow.py +17 -0
- sknetwork/flow/tests/test_utils.py +69 -0
- sknetwork/flow/utils.py +91 -0
- sknetwork/gnn/__init__.py +10 -0
- sknetwork/gnn/activation.py +117 -0
- sknetwork/gnn/base.py +155 -0
- sknetwork/gnn/base_activation.py +89 -0
- sknetwork/gnn/base_layer.py +109 -0
- sknetwork/gnn/gnn_classifier.py +381 -0
- sknetwork/gnn/layer.py +153 -0
- sknetwork/gnn/layers.py +127 -0
- sknetwork/gnn/loss.py +180 -0
- sknetwork/gnn/neighbor_sampler.py +65 -0
- sknetwork/gnn/optimizer.py +163 -0
- sknetwork/gnn/tests/__init__.py +1 -0
- sknetwork/gnn/tests/test_activation.py +56 -0
- sknetwork/gnn/tests/test_base.py +79 -0
- sknetwork/gnn/tests/test_base_layer.py +37 -0
- sknetwork/gnn/tests/test_gnn_classifier.py +192 -0
- sknetwork/gnn/tests/test_layers.py +80 -0
- sknetwork/gnn/tests/test_loss.py +33 -0
- sknetwork/gnn/tests/test_neigh_sampler.py +23 -0
- sknetwork/gnn/tests/test_optimizer.py +43 -0
- sknetwork/gnn/tests/test_utils.py +93 -0
- sknetwork/gnn/utils.py +219 -0
- sknetwork/hierarchy/__init__.py +7 -0
- sknetwork/hierarchy/base.py +69 -0
- sknetwork/hierarchy/louvain_hierarchy.py +264 -0
- sknetwork/hierarchy/metrics.py +234 -0
- sknetwork/hierarchy/paris.cpython-39-darwin.so +0 -0
- sknetwork/hierarchy/paris.pyx +317 -0
- sknetwork/hierarchy/postprocess.py +350 -0
- sknetwork/hierarchy/tests/__init__.py +1 -0
- sknetwork/hierarchy/tests/test_API.py +25 -0
- sknetwork/hierarchy/tests/test_algos.py +29 -0
- sknetwork/hierarchy/tests/test_metrics.py +62 -0
- sknetwork/hierarchy/tests/test_postprocess.py +57 -0
- sknetwork/hierarchy/tests/test_ward.py +25 -0
- sknetwork/hierarchy/ward.py +94 -0
- sknetwork/linalg/__init__.py +9 -0
- sknetwork/linalg/basics.py +37 -0
- sknetwork/linalg/diteration.cpython-39-darwin.so +0 -0
- sknetwork/linalg/diteration.pyx +49 -0
- sknetwork/linalg/eig_solver.py +93 -0
- sknetwork/linalg/laplacian.py +15 -0
- sknetwork/linalg/normalization.py +66 -0
- sknetwork/linalg/operators.py +225 -0
- sknetwork/linalg/polynome.py +76 -0
- sknetwork/linalg/ppr_solver.py +170 -0
- sknetwork/linalg/push.cpython-39-darwin.so +0 -0
- sknetwork/linalg/push.pyx +73 -0
- sknetwork/linalg/sparse_lowrank.py +142 -0
- sknetwork/linalg/svd_solver.py +91 -0
- sknetwork/linalg/tests/__init__.py +1 -0
- sknetwork/linalg/tests/test_eig.py +44 -0
- sknetwork/linalg/tests/test_laplacian.py +18 -0
- sknetwork/linalg/tests/test_normalization.py +38 -0
- sknetwork/linalg/tests/test_operators.py +70 -0
- sknetwork/linalg/tests/test_polynome.py +38 -0
- sknetwork/linalg/tests/test_ppr.py +50 -0
- sknetwork/linalg/tests/test_sparse_lowrank.py +61 -0
- sknetwork/linalg/tests/test_svd.py +38 -0
- sknetwork/linkpred/__init__.py +4 -0
- sknetwork/linkpred/base.py +80 -0
- sknetwork/linkpred/first_order.py +508 -0
- sknetwork/linkpred/first_order_core.cpython-39-darwin.so +0 -0
- sknetwork/linkpred/first_order_core.pyx +315 -0
- sknetwork/linkpred/postprocessing.py +98 -0
- sknetwork/linkpred/tests/__init__.py +1 -0
- sknetwork/linkpred/tests/test_API.py +49 -0
- sknetwork/linkpred/tests/test_postprocessing.py +21 -0
- sknetwork/path/__init__.py +4 -0
- sknetwork/path/metrics.py +148 -0
- sknetwork/path/search.py +65 -0
- sknetwork/path/shortest_path.py +186 -0
- sknetwork/path/tests/__init__.py +1 -0
- sknetwork/path/tests/test_metrics.py +29 -0
- sknetwork/path/tests/test_search.py +25 -0
- sknetwork/path/tests/test_shortest_path.py +45 -0
- sknetwork/ranking/__init__.py +9 -0
- sknetwork/ranking/base.py +56 -0
- sknetwork/ranking/betweenness.cpython-39-darwin.so +0 -0
- sknetwork/ranking/betweenness.pyx +99 -0
- sknetwork/ranking/closeness.py +95 -0
- sknetwork/ranking/harmonic.py +82 -0
- sknetwork/ranking/hits.py +94 -0
- sknetwork/ranking/katz.py +81 -0
- sknetwork/ranking/pagerank.py +107 -0
- sknetwork/ranking/postprocess.py +25 -0
- sknetwork/ranking/tests/__init__.py +1 -0
- sknetwork/ranking/tests/test_API.py +34 -0
- sknetwork/ranking/tests/test_betweenness.py +38 -0
- sknetwork/ranking/tests/test_closeness.py +34 -0
- sknetwork/ranking/tests/test_hits.py +20 -0
- sknetwork/ranking/tests/test_pagerank.py +69 -0
- sknetwork/regression/__init__.py +4 -0
- sknetwork/regression/base.py +56 -0
- sknetwork/regression/diffusion.py +190 -0
- sknetwork/regression/tests/__init__.py +1 -0
- sknetwork/regression/tests/test_API.py +34 -0
- sknetwork/regression/tests/test_diffusion.py +48 -0
- sknetwork/sknetwork.py +3 -0
- sknetwork/topology/__init__.py +9 -0
- sknetwork/topology/dag.py +74 -0
- sknetwork/topology/dag_core.cpython-39-darwin.so +0 -0
- sknetwork/topology/dag_core.pyx +38 -0
- sknetwork/topology/kcliques.cpython-39-darwin.so +0 -0
- sknetwork/topology/kcliques.pyx +193 -0
- sknetwork/topology/kcore.cpython-39-darwin.so +0 -0
- sknetwork/topology/kcore.pyx +120 -0
- sknetwork/topology/structure.py +234 -0
- sknetwork/topology/tests/__init__.py +1 -0
- sknetwork/topology/tests/test_cliques.py +28 -0
- sknetwork/topology/tests/test_cores.py +21 -0
- sknetwork/topology/tests/test_dag.py +26 -0
- sknetwork/topology/tests/test_structure.py +99 -0
- sknetwork/topology/tests/test_triangles.py +42 -0
- sknetwork/topology/tests/test_wl_coloring.py +49 -0
- sknetwork/topology/tests/test_wl_kernel.py +31 -0
- sknetwork/topology/triangles.cpython-39-darwin.so +0 -0
- sknetwork/topology/triangles.pyx +166 -0
- sknetwork/topology/weisfeiler_lehman.py +163 -0
- sknetwork/topology/weisfeiler_lehman_core.cpython-39-darwin.so +0 -0
- sknetwork/topology/weisfeiler_lehman_core.pyx +116 -0
- sknetwork/utils/__init__.py +40 -0
- sknetwork/utils/base.py +35 -0
- sknetwork/utils/check.py +354 -0
- sknetwork/utils/co_neighbor.py +71 -0
- sknetwork/utils/format.py +219 -0
- sknetwork/utils/kmeans.py +89 -0
- sknetwork/utils/knn.py +166 -0
- sknetwork/utils/knn1d.cpython-39-darwin.so +0 -0
- sknetwork/utils/knn1d.pyx +80 -0
- sknetwork/utils/membership.py +82 -0
- sknetwork/utils/minheap.cpython-39-darwin.so +0 -0
- sknetwork/utils/minheap.pxd +22 -0
- sknetwork/utils/minheap.pyx +111 -0
- sknetwork/utils/neighbors.py +115 -0
- sknetwork/utils/seeds.py +75 -0
- sknetwork/utils/simplex.py +140 -0
- sknetwork/utils/tests/__init__.py +1 -0
- sknetwork/utils/tests/test_base.py +28 -0
- sknetwork/utils/tests/test_bunch.py +16 -0
- sknetwork/utils/tests/test_check.py +190 -0
- sknetwork/utils/tests/test_co_neighbor.py +43 -0
- sknetwork/utils/tests/test_format.py +61 -0
- sknetwork/utils/tests/test_kmeans.py +21 -0
- sknetwork/utils/tests/test_knn.py +32 -0
- sknetwork/utils/tests/test_membership.py +24 -0
- sknetwork/utils/tests/test_neighbors.py +41 -0
- sknetwork/utils/tests/test_projection_simplex.py +33 -0
- sknetwork/utils/tests/test_seeds.py +67 -0
- sknetwork/utils/tests/test_verbose.py +15 -0
- sknetwork/utils/tests/test_ward.py +20 -0
- sknetwork/utils/timeout.py +38 -0
- sknetwork/utils/verbose.py +37 -0
- sknetwork/utils/ward.py +60 -0
- sknetwork/visualization/__init__.py +4 -0
- sknetwork/visualization/colors.py +34 -0
- sknetwork/visualization/dendrograms.py +229 -0
- sknetwork/visualization/graphs.py +819 -0
- sknetwork/visualization/tests/__init__.py +1 -0
- sknetwork/visualization/tests/test_dendrograms.py +53 -0
- sknetwork/visualization/tests/test_graphs.py +167 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
sknetwork/__init__.py,sha256=v_CykDTnvy-yIDGXKMouorhIA0EBdDecuSpscOxX-TE,533
|
|
2
|
+
sknetwork/sknetwork.py,sha256=VYoI-gwqwBKPx84cA0KnYDRofrgIXs8xtASD2nu5fE0,44
|
|
3
|
+
sknetwork/classification/__init__.py,sha256=Rs3cyINFdbOxpJ_tjB10_jCFLKxDYWhUgsFTICfCY48,466
|
|
4
|
+
sknetwork/classification/base.py,sha256=cE-s1JsHE3xrXKvPl4QO__vpDbZCjQWuP6tVZQeohD4,2534
|
|
5
|
+
sknetwork/classification/base_rank.py,sha256=-cRUvLnyVO9i63g2cu50K5Hec2VcjD3dxzW8J9Tim7I,4839
|
|
6
|
+
sknetwork/classification/diffusion.py,sha256=NEKnD6JMmGlMO1iUo-YLpsGKt0ah7YiI-o1L0yb5r0U,5308
|
|
7
|
+
sknetwork/classification/knn.py,sha256=hMReHPE3dyLf_W9TysD42fbupsS3RfujrnXoo5uS4LI,6594
|
|
8
|
+
sknetwork/classification/metrics.py,sha256=bzRAySrjOie8-DxMYV6Wyyhg90y9RdjHTZM8kB5aK58,6807
|
|
9
|
+
sknetwork/classification/pagerank.py,sha256=KzubukKCYxKBnUt_IcgpZ3mBj0TxuRmlMz0tHyEcNXE,2544
|
|
10
|
+
sknetwork/classification/propagation.py,sha256=sz7i06Oj-Z-UXlcBatt6REWtoHH1v5tkvpy7GvAeHs0,5695
|
|
11
|
+
sknetwork/classification/vote.cpython-39-darwin.so,sha256=UyJDaKK4GciZAhGQVdq8QfN8BuhTYu4HTfJRvWdOrXA,273062
|
|
12
|
+
sknetwork/classification/vote.pyx,sha256=rWd0oTqo0jliTLtdtUhreo4m-YZ9Us7IWP4iLMkeFrY,1658
|
|
13
|
+
sknetwork/classification/tests/__init__.py,sha256=sy9uRiPhYG2i7uqM3P07-VUf4UcZEHeOoH9BvKCpU3s,31
|
|
14
|
+
sknetwork/classification/tests/test_API.py,sha256=z6hBTzIN0pEkTJDChQftQOCJfj63I9QH-qY3QN1MRyQ,1296
|
|
15
|
+
sknetwork/classification/tests/test_diffusion.py,sha256=GSE8knG3ZWrwZRPIBJVk4cjk3w0PFQLGkz8WTFOaGN4,1307
|
|
16
|
+
sknetwork/classification/tests/test_knn.py,sha256=q3s4riy_fQGj4sBm-95HYf3sCNPdtD40bLs8JiE6vR0,758
|
|
17
|
+
sknetwork/classification/tests/test_metrics.py,sha256=eBs-5uAEz2s8gukMyfhQ07GSFoyvxtsslLuc6VgUxBU,2303
|
|
18
|
+
sknetwork/classification/tests/test_pagerank.py,sha256=ZyMbTcPxtS5ZpGOBqyhpjHzoFZgIylu14v51A6cqclo,607
|
|
19
|
+
sknetwork/classification/tests/test_propagation.py,sha256=02wcd2Y8ZBvpfJqIwQfDgdx_k0q492My04FvCrMmP0E,827
|
|
20
|
+
sknetwork/clustering/__init__.py,sha256=wd3zec36EwHqLrrOJUz4g-6aFsoDVUIEDZzHo3Z2Gtc,384
|
|
21
|
+
sknetwork/clustering/base.py,sha256=sn5xM05eXdVcrx6IdECexbA37kLXxFjoHCB4mfobL0s,4114
|
|
22
|
+
sknetwork/clustering/kmeans.py,sha256=fAPm6AtGRcBrZ5vmVCbyl3-8UnTNQVssSQ29BdjAGVg,5006
|
|
23
|
+
sknetwork/clustering/louvain.py,sha256=mNyuCVVYWPalwqH6HADeFFnCBFLhLSaC2lbl34O0WRo,9864
|
|
24
|
+
sknetwork/clustering/louvain_core.cpython-39-darwin.so,sha256=T3sjASrsZwb-CBRlqmcwg-HFtAU9HuHiTRW7iyefA8E,336382
|
|
25
|
+
sknetwork/clustering/louvain_core.pyx,sha256=6Jg7P3oN4xdVCCy8lQ81_ZM__Athd2c9Y7PZxryg--I,4558
|
|
26
|
+
sknetwork/clustering/metrics.py,sha256=VJPgmB1OvxA0SOaIQIGyJDUP1cgWFElnfdVaQ2krYrg,3060
|
|
27
|
+
sknetwork/clustering/postprocess.py,sha256=YoluaLAJg_c86u_abnRH6V7GHsnsDDL8Z5zHJLHwg7k,2035
|
|
28
|
+
sknetwork/clustering/propagation_clustering.py,sha256=lbmS0gKxQI2M6kMd1XH1gOhCqAwrb-HAYs0wBM4RMXQ,3849
|
|
29
|
+
sknetwork/clustering/tests/__init__.py,sha256=Ta0XKY7pklRvHyUY3Jlow3A2V4REa5geZG74xPz80Tc,27
|
|
30
|
+
sknetwork/clustering/tests/test_API.py,sha256=67lQoP-isJ0fXWlEezwmrV5-RGD6Z_AUsSAfWCBQsgo,1639
|
|
31
|
+
sknetwork/clustering/tests/test_kmeans.py,sha256=L8ZDb2BFLfg1qcAQwNMEVbKdmyiRlGKu2FyOkH8T7Yg,2096
|
|
32
|
+
sknetwork/clustering/tests/test_louvain.py,sha256=AcyfZlHjVMEqIJHHRCm3koGRPVaZr2YRKmvbZI5W02k,3608
|
|
33
|
+
sknetwork/clustering/tests/test_metrics.py,sha256=YQk3mg_ca3EkqWiLRreLREE58UXKfz5qf8ZfYqd3C-M,1820
|
|
34
|
+
sknetwork/clustering/tests/test_post_processing.py,sha256=LM0rZuv1xCGI834qkX8VYO9DSIEKxG-fDpi6OYD5ooU,619
|
|
35
|
+
sknetwork/clustering/tests/test_postprocess.py,sha256=WSmAlqB-6Nw3eoL3NaOyNlpPr7GVnNnllkPVdyE9rXI,1378
|
|
36
|
+
sknetwork/data/__init__.py,sha256=zl8_AD4bx-OqM4RrcYN9eEiJdln2DBqK4oypANMO3M0,305
|
|
37
|
+
sknetwork/data/load.py,sha256=YG5rooMsGFbMPtDAcMlZYKfH0trnmQOS23MT3D6LdHQ,14460
|
|
38
|
+
sknetwork/data/models.py,sha256=AFbjbmxqjZLhe7E00mXwyk5Cc1O606zooYFg-2IWpuk,13122
|
|
39
|
+
sknetwork/data/parse.py,sha256=9XCk2Z4kR618grg3AdIMrpmVe7We-OiX2E7yo-B7rrs,25666
|
|
40
|
+
sknetwork/data/test_graphs.py,sha256=1L6UM7khCdWzat9jw10yABZNut95RNDSf2mGYPbs7BY,2488
|
|
41
|
+
sknetwork/data/toy_graphs.py,sha256=MfJs0EjWREzL36f3BeoQUQeKrrqkcxGZct3n4pRnl0g,24997
|
|
42
|
+
sknetwork/data/tests/__init__.py,sha256=FSfkSYRKjDqIuEiEZ39Otve50qSxi7QObNnNrHHPx5s,19
|
|
43
|
+
sknetwork/data/tests/test_API.py,sha256=UgiSE9LsNLFgX_mAZXm0iFgy1prtGsPgaVYF8nkbcz4,958
|
|
44
|
+
sknetwork/data/tests/test_load.py,sha256=s65wkJDYCyU5BNgi0XwIYhsPcfvYIBD9-R43I22Y760,3551
|
|
45
|
+
sknetwork/data/tests/test_models.py,sha256=oP-X_k0vbSB4CwlV4GQVVBAQ9uI_8frFicde5yhVYAc,1915
|
|
46
|
+
sknetwork/data/tests/test_parse.py,sha256=DeDPaOw8IR0JuABdyUDa4GcOxyNFiKD9933cqyETD98,12753
|
|
47
|
+
sknetwork/data/tests/test_test_graphs.py,sha256=U6mQII2kK1Wuens26XFydJgOF0s2uZ7noT1Iq_Hmw1s,848
|
|
48
|
+
sknetwork/data/tests/test_toy_graphs.py,sha256=kxOb7QpXGi8O7Kb6RmWoRUbAoyllM_-SXCRcYoH8B00,2137
|
|
49
|
+
sknetwork/embedding/__init__.py,sha256=5emzIpzQLcOfeo1rcugpnXF1S5SNhiQQa-3xJrzWl_Q,532
|
|
50
|
+
sknetwork/embedding/base.py,sha256=86LNmaADwGpOC5nLDcx3Fw42AYF32QlGZCUV06LDnx0,2767
|
|
51
|
+
sknetwork/embedding/force_atlas.py,sha256=hGanDDS7G6CbhwN72QB_kBg8zMSbuDZt_Frj_k6txUw,7429
|
|
52
|
+
sknetwork/embedding/louvain_embedding.py,sha256=WWM-teQvGc829ZfCK3-6sciZyhvpAZB1UvPejY0FRgI,6958
|
|
53
|
+
sknetwork/embedding/louvain_hierarchy.py,sha256=b03u4M847PpwI4-Wf7beKCUZ8HwnGDm-uNn5ukmofc8,5708
|
|
54
|
+
sknetwork/embedding/metrics.py,sha256=4WRsuRsFa_z-0ZMDJ5LOoTJO2eMNaK5DUUB9bqWlIj4,1963
|
|
55
|
+
sknetwork/embedding/random_projection.py,sha256=4GFmGgM9apkuZgY15HYQXCmqmbE_CeR-soPB9FHOFdE,4920
|
|
56
|
+
sknetwork/embedding/spectral.py,sha256=2nNw2GISQxFKzjnecFCmgZeM-Z1_GElbkRHeZjPKW5I,8121
|
|
57
|
+
sknetwork/embedding/spring.py,sha256=5fyHQzmIp8gY9DdI-DFvMc37mjMb64bs22ZZZ9YFDXM,7151
|
|
58
|
+
sknetwork/embedding/svd.py,sha256=cwajX5wjVXygPIU3AXRbKwsW4aOjmK8-xF_QJqyr6MU,14664
|
|
59
|
+
sknetwork/embedding/tests/__init__.py,sha256=QkDQtTJReK7Ldp0Y4f5-tbTdcp224r1AF7jU26alSgQ,26
|
|
60
|
+
sknetwork/embedding/tests/test_API.py,sha256=zgUHmIMEliSezL_44VEttuofdUk22WYW1eJDDhLlars,2579
|
|
61
|
+
sknetwork/embedding/tests/test_force_atlas.py,sha256=-YM4HSF5Nvpm8e4SoCHiA2o7yAkm0h_ys7GRaJ1wloI,1120
|
|
62
|
+
sknetwork/embedding/tests/test_louvain_embedding.py,sha256=UA5W8mfO0gqq1hH1MWc6DPHhFUK8ZeoaY9jdYY_TRww,1156
|
|
63
|
+
sknetwork/embedding/tests/test_louvain_hierarchy.py,sha256=DUGC0_yJ4IpWAChy8FCwHSrA_5LmQi_p_h11cZ2tu-w,730
|
|
64
|
+
sknetwork/embedding/tests/test_metrics.py,sha256=JC3xOn8W3sKJEOV4hSH79RluDNPSFm9Lqa6ps2IipYM,952
|
|
65
|
+
sknetwork/embedding/tests/test_random_projection.py,sha256=ESF9DUzxHzBw4yY_vvyiTeeP4qwreqibC_NzKTO1Xyc,1189
|
|
66
|
+
sknetwork/embedding/tests/test_spectral.py,sha256=SwbLEFslhVe_dLGlVBmk_zsNpSuFU-oDVjSi2MMGwaE,4258
|
|
67
|
+
sknetwork/embedding/tests/test_spring.py,sha256=tanArc4vstNZ36CLr7S8uEVdXX0iP2K9UWKQLTcsPsQ,1643
|
|
68
|
+
sknetwork/embedding/tests/test_svd.py,sha256=RbLhTzcy692aMqhtRYUEQp11LaGTOrCGZTLtaAnyoeQ,1175
|
|
69
|
+
sknetwork/flow/__init__.py,sha256=6qA3k3UnHslCW4bkcfP3IdA43L8cDxmxvw3KKec3GZE,154
|
|
70
|
+
sknetwork/flow/flow.py,sha256=yaT6-VEXZK5nmpAI7zgZnDJIW7-DLWh0XhJQgY2EkDA,2756
|
|
71
|
+
sknetwork/flow/utils.py,sha256=rDyz5N_zOIkdeH81CFadOqlJ30ne-Rrh9QOgG4T-ItY,2970
|
|
72
|
+
sknetwork/flow/tests/__init__.py,sha256=K5G3SwuR1yP0HnXzGOC0kYf2ST5IIuXWVD-WMjiFJe4,17
|
|
73
|
+
sknetwork/flow/tests/test_flow.py,sha256=0D3T0LbgVjcKxCJUrc_XKImK06Ggoq7YyiQns74wd0E,626
|
|
74
|
+
sknetwork/flow/tests/test_utils.py,sha256=vwd8rq9vIjz1ibnpwa9BOCXLe2O6DYVXkFtPcSdB0xw,4153
|
|
75
|
+
sknetwork/gnn/__init__.py,sha256=m2lkDJoJZocJ18scpArsUHuzePZ8Q-ue7D3yXQ5H_RM,519
|
|
76
|
+
sknetwork/gnn/activation.py,sha256=D7o4FdbDMrBa2PQrWrvplCf14QOSzZ67d9eWN9bHY-M,3560
|
|
77
|
+
sknetwork/gnn/base.py,sha256=kljF7tIVyNNtY1YkmWQKVgmxRJb3e54GG_4b87_BAZE,4943
|
|
78
|
+
sknetwork/gnn/base_activation.py,sha256=XogZDdhl3QDyADvWJhMTGSnVYsKPI3PDHPu89yPL1VI,2306
|
|
79
|
+
sknetwork/gnn/base_layer.py,sha256=SePTUVKI4Kem6N2Wi8WimIr2zhGAUoMGEw5ZE0JrJ2I,3976
|
|
80
|
+
sknetwork/gnn/gnn_classifier.py,sha256=IsYQyxsyNZX-79QkxHgQrKsbp-dh_HAmwMG71rT34wA,16078
|
|
81
|
+
sknetwork/gnn/layer.py,sha256=GPeprxMyqiuZs1VPZjHsI4VHC9lQxRvtUxZrObaHomc,5532
|
|
82
|
+
sknetwork/gnn/layers.py,sha256=ZPDXM91tSDRtDaMsj2j8iTALmOSIRKMiQoNT3WUZTnY,4524
|
|
83
|
+
sknetwork/gnn/loss.py,sha256=NP1QMqPRTUfN7ROqVCtyEoDaq6tnEhMrB2lwGxM72ss,5162
|
|
84
|
+
sknetwork/gnn/neighbor_sampler.py,sha256=TXdMRFwiT8sOdl6-S-flQZ5Rjrx1hwTzFqqiR_8PHTQ,1864
|
|
85
|
+
sknetwork/gnn/optimizer.py,sha256=ZxaSfdxCyIeyd6YeQe0pFAEg6xzXzC7jorhlacWkatk,5739
|
|
86
|
+
sknetwork/gnn/utils.py,sha256=rytD-zPP5YU8JpksMs2FixDY7eZgfPZh6zidJR2mYjI,8084
|
|
87
|
+
sknetwork/gnn/tests/__init__.py,sha256=SvFOB5nn_yN-JCaYFAtzesL0zU0OihQp0s0dOP1-MKE,20
|
|
88
|
+
sknetwork/gnn/tests/test_activation.py,sha256=HZdBaJ8P8LBJ-3_Typc8Qkvsho9gNSy1-CANEz8rQ-Q,2487
|
|
89
|
+
sknetwork/gnn/tests/test_base.py,sha256=PyAaZxE3cRobBqi7MMP-1Nx8RMwnPZ-J8wkuH8wtycU,3663
|
|
90
|
+
sknetwork/gnn/tests/test_base_layer.py,sha256=X8z7kHbGvbl2FdII41OmuCm3Vm6ySGU1kTITNb-XdB4,1395
|
|
91
|
+
sknetwork/gnn/tests/test_gnn_classifier.py,sha256=7O_sfebA448E55_oj-fRX01D_VtmTikkA-mnRMD0w0c,9673
|
|
92
|
+
sknetwork/gnn/tests/test_layers.py,sha256=TmSMbauR1iFJ0G44y_ecSm_pvOQy1JjLGkEXCxsvQcY,3184
|
|
93
|
+
sknetwork/gnn/tests/test_loss.py,sha256=W5DA6FRd-OppeRKFgj2gtLqNvjkXkCQPmV6lg3ENu-c,1045
|
|
94
|
+
sknetwork/gnn/tests/test_neigh_sampler.py,sha256=zc_6G3JhZvKrFLJAk2UJSOHZwN7sGojC8bXTCbmaUx4,698
|
|
95
|
+
sknetwork/gnn/tests/test_optimizer.py,sha256=4AEsvs8mbn_rWUkw7QKVoQpMWKn7ZiO0oJvyIQXB0kk,1790
|
|
96
|
+
sknetwork/gnn/tests/test_utils.py,sha256=1o5u5J9eVjgYbRwB_fWZW8HXK1ifPReGln4qnP_1_nU,4826
|
|
97
|
+
sknetwork/hierarchy/__init__.py,sha256=tWV5Bll9SheZxwDyd4GsOni6qTlP22mvH40zma9hf9w,454
|
|
98
|
+
sknetwork/hierarchy/base.py,sha256=kukRqgisGOfEHQAXzC97stpBNRzjNHfxy6TSiz2Cz-k,2028
|
|
99
|
+
sknetwork/hierarchy/louvain_hierarchy.py,sha256=m3fwhAimPyC5p0tf71O_Hf2uTJUHenAyLMQWI2Xn828,9109
|
|
100
|
+
sknetwork/hierarchy/metrics.py,sha256=_wYGKx_VDE_sfbg-uUEFMhOjSLFqzC8rFHjJo1hdVL8,8046
|
|
101
|
+
sknetwork/hierarchy/paris.cpython-39-darwin.so,sha256=nVdR6UDhU_rdzScATKFsiMCiBydGRy9LW1p6DivmY_g,381687
|
|
102
|
+
sknetwork/hierarchy/paris.pyx,sha256=2w9LxJAtGo1Sus78y9IIIaeXjHlIrbrGbyiaOE2ITjs,11673
|
|
103
|
+
sknetwork/hierarchy/postprocess.py,sha256=sxl85hW-b6r3ZAidsPn4uHotfiKXKy1GqjwVqAzAK2Q,11962
|
|
104
|
+
sknetwork/hierarchy/ward.py,sha256=MknV5ewCRmgncgk6vXbO3tUjwSztUNus9NmhAxUHfpg,2824
|
|
105
|
+
sknetwork/hierarchy/tests/__init__.py,sha256=l2HHDiDLpoTQlwzh1mtCyp6bS8RxBdJK2DP1FGiQJMY,26
|
|
106
|
+
sknetwork/hierarchy/tests/test_API.py,sha256=Rxi6bI9Qh2vduClnP2UrtJ-rOgRogBWEys2wt8sjsPE,785
|
|
107
|
+
sknetwork/hierarchy/tests/test_algos.py,sha256=VVIO-K7df58RNrlqB6olkwZKdvBwASiEINFmzadkVFg,1143
|
|
108
|
+
sknetwork/hierarchy/tests/test_metrics.py,sha256=66zCyyzbQPGocE35ns_QEDJMbPjYyr3O1w8tiEK158c,3158
|
|
109
|
+
sknetwork/hierarchy/tests/test_postprocess.py,sha256=OSrWE0gT0AcPI4LKmUL-Blfg5ErxnjS3d4rPNnA63_Y,2209
|
|
110
|
+
sknetwork/hierarchy/tests/test_ward.py,sha256=pBgpZTLlTePraX-STs2UJ4rb5Lucunw3IajemVwA4TU,875
|
|
111
|
+
sknetwork/linalg/__init__.py,sha256=HrprvMjB5BL_9M6hPGxpRWmGK9zjNI7e9v3lEjLw14E,511
|
|
112
|
+
sknetwork/linalg/basics.py,sha256=8AFph_1G5SZP_24jrIv6qIWooO0UMglL4jMgx3ZdYIQ,1142
|
|
113
|
+
sknetwork/linalg/diteration.cpython-39-darwin.so,sha256=EjdQfNrDclV6qeiLx_l8qc2hLuWfF-OMs3vtJw3k1fs,252188
|
|
114
|
+
sknetwork/linalg/diteration.pyx,sha256=vd9cOCBWGjz1jArMWl39V1p0kJaLcp04dk4-p0QkNdE,1457
|
|
115
|
+
sknetwork/linalg/eig_solver.py,sha256=WXUYLdqjU3xSImJVhA4hKFge75d4gaKQCPfTLjCOzxc,2706
|
|
116
|
+
sknetwork/linalg/laplacian.py,sha256=_gQr8YLqMUtK_IMNgvJoQX7-uODVlvCVmc-oTsgw7MA,401
|
|
117
|
+
sknetwork/linalg/normalization.py,sha256=Qd0-NHSh75iE_TEUJsmObVoOBJUmVyNFfpt3--Wb-PA,1795
|
|
118
|
+
sknetwork/linalg/operators.py,sha256=9CxnaNHI8R5jdX3oY50dyeHoASeAzdoH2HyFyaPTpUE,7393
|
|
119
|
+
sknetwork/linalg/polynome.py,sha256=1UtYWc9LLn7RXgymjz2NmPUmiZ85cYyn9QKZsn8sjs0,2200
|
|
120
|
+
sknetwork/linalg/ppr_solver.py,sha256=DkGApQHNkCkVIidhxmjidyc58oHT0sgRa_C4IehxjE4,6536
|
|
121
|
+
sknetwork/linalg/push.cpython-39-darwin.so,sha256=_kcGC4RpFr2OU6KNZGkk6JLR37tXZQLAXoqwSflBFOg,290454
|
|
122
|
+
sknetwork/linalg/push.pyx,sha256=oGPoV4X1px5YXj6TUXPS_L8imuX2sPm_6ltc5iqmHkU,2431
|
|
123
|
+
sknetwork/linalg/sparse_lowrank.py,sha256=LUhbqa01p51SYhoIb2Dmx2b9fMc-iOu69CAVHscR2Xs,5028
|
|
124
|
+
sknetwork/linalg/svd_solver.py,sha256=qgtgowPycr1jhPWRSZ7UU1JxOYPCaJF5Ms88LDvEkc8,2687
|
|
125
|
+
sknetwork/linalg/tests/__init__.py,sha256=l6yw2Ls1ndhVVcSYc059kAjQ2-VoDGZXxnBaglFZ4zo,23
|
|
126
|
+
sknetwork/linalg/tests/test_eig.py,sha256=lUAgo4UfWuuSG5DhSk5SIT7ToLDgPG-5JCgmOe_M7Vw,1504
|
|
127
|
+
sknetwork/linalg/tests/test_laplacian.py,sha256=B6UhJOmYUdNlXwNoxLLtb--nv9mx96Orl-W1Vl6PLyM,434
|
|
128
|
+
sknetwork/linalg/tests/test_normalization.py,sha256=VpgE0oSD3SOtvAsOOefrByh1KJ9Y8MK-gJTvpX7_5JA,1104
|
|
129
|
+
sknetwork/linalg/tests/test_operators.py,sha256=Cd71nkaT8-QqcqXebJYxGy7cAZ2JdpCAdMb5QhW48-w,3105
|
|
130
|
+
sknetwork/linalg/tests/test_polynome.py,sha256=VYru9RlUIIN6dKNOiitSElPQqIxWI7mqx3dR5zd9Nv0,977
|
|
131
|
+
sknetwork/linalg/tests/test_ppr.py,sha256=IKxna1-txZm9LntGjDMxTZqslFhNWQXjRY3RjCex6pw,2089
|
|
132
|
+
sknetwork/linalg/tests/test_sparse_lowrank.py,sha256=LEDo6DChembm3xQ-vjeqqZi0ugWx7piucR9_LdDecrI,2276
|
|
133
|
+
sknetwork/linalg/tests/test_svd.py,sha256=eLRmSiHt8uWzknImZtRSZmJC8OX0YDgUt9-8PePc3OA,1285
|
|
134
|
+
sknetwork/linkpred/__init__.py,sha256=UZ3rrbhcu3cYZd3KY8Sa9xaj31la_3mAdtZJlbVgahA,300
|
|
135
|
+
sknetwork/linkpred/base.py,sha256=b7LZBlDaFOYpX-TITQJCkCDAcB_HDke1JLBs9FSPbbM,2725
|
|
136
|
+
sknetwork/linkpred/first_order.py,sha256=VTqDaFOTlII_K2jwwCPl8bMXJIsFmcb9XPp-9Kyf2sE,17173
|
|
137
|
+
sknetwork/linkpred/first_order_core.cpython-39-darwin.so,sha256=eJXXcdghFd2yqLis8_mFUZi3HToXHGQaUO23D8hF4GM,342866
|
|
138
|
+
sknetwork/linkpred/first_order_core.pyx,sha256=NrcaXBuJRr7d-rrtx4yvDBYeXwoH_Ae9niPZxZ3AaXw,10048
|
|
139
|
+
sknetwork/linkpred/postprocessing.py,sha256=KIQI5yU3AyYzFDCSusQDHYK0pNa9RxQaHpMaZN6SfHs,3143
|
|
140
|
+
sknetwork/linkpred/tests/__init__.py,sha256=05sK8Ihh9Gi2_uobPC_ErMVE4KOt0761NzzV_vJh15U,32
|
|
141
|
+
sknetwork/linkpred/tests/test_API.py,sha256=HEnNymReuAqrHXGoMk7iTchcjMdyqjZsDIJHJdrZzYk,1317
|
|
142
|
+
sknetwork/linkpred/tests/test_postprocessing.py,sha256=UM5IlVnWGY74eXQrJAWMVk_vec06EaBPLVXrD4kErwg,508
|
|
143
|
+
sknetwork/path/__init__.py,sha256=zsLaPBgkAqvFFV4GDc-gJPa4filCPpxwGtdarYC5eeU,245
|
|
144
|
+
sknetwork/path/metrics.py,sha256=s3OIri2twtX3lrtb96dadKGzxzBmXncE9AHDd8kxwOg,4867
|
|
145
|
+
sknetwork/path/search.py,sha256=P8rEHQrtHXC46XE86FfKdrNNlDYzQcsyyQrPqOMwzgU,2503
|
|
146
|
+
sknetwork/path/shortest_path.py,sha256=caR6Ro1MqQkvdOhRn92KQEJUrSq5tBh4sGXUm_BaXjs,6725
|
|
147
|
+
sknetwork/path/tests/__init__.py,sha256=_COAjci7RJ_XtBDGwy5aOgZ9dPSQH3j7d6qMlLHs55o,28
|
|
148
|
+
sknetwork/path/tests/test_metrics.py,sha256=X9jMF_4Qclb3oP5fkq29lDaTGHo0HxvKB-hG-XEtwog,839
|
|
149
|
+
sknetwork/path/tests/test_search.py,sha256=LR3I9rnPAtUC1U3ShUEKMLeohkpaA4dAJRX59dxezh0,703
|
|
150
|
+
sknetwork/path/tests/test_shortest_path.py,sha256=AdZJLoteEXXDGZhETyRnp4Dh2IXHGzGNuCZOdeYHZxM,1519
|
|
151
|
+
sknetwork/ranking/__init__.py,sha256=dp_pbsFkS6TY0pZ70xhuII9WdvL5n0pNsc2yRH6nnTo,396
|
|
152
|
+
sknetwork/ranking/base.py,sha256=hp8J30acecyNlMo2F8Rq6jUk3A9fVaLH8IsusZpn8y0,1447
|
|
153
|
+
sknetwork/ranking/betweenness.cpython-39-darwin.so,sha256=Xq8p3EY9lmWPMHwKyB_YhQ8Mb4vl46IdfXWQ4XtoBX8,132061
|
|
154
|
+
sknetwork/ranking/betweenness.pyx,sha256=VlNEah6JjFHuizZ7eXqFlvizB5NzgAW1OK3WOXwcCEw,3160
|
|
155
|
+
sknetwork/ranking/closeness.py,sha256=GEItgxlwpchBseLYJhSxM76OaTnj__-qufIGAcqh2yo,3058
|
|
156
|
+
sknetwork/ranking/harmonic.py,sha256=Bw86exKhHKWx_1T4Z1qUt_rWS6_INlM1Ln5y4m1hRQw,2303
|
|
157
|
+
sknetwork/ranking/hits.py,sha256=L39a9Ze3ITUbikmNhA_Lx-V5s_RQr0XnNkOsIgG8m98,2761
|
|
158
|
+
sknetwork/ranking/katz.py,sha256=_l1SxOFs3HnH6yFZl4ak-9gwE25rWqM4kdoaXzKoEvc,2440
|
|
159
|
+
sknetwork/ranking/pagerank.py,sha256=rO5UypuRxZLKAfQujLLRfzg9as-Fvj-whp_58NPhRCA,4511
|
|
160
|
+
sknetwork/ranking/postprocess.py,sha256=7QCpDVFA0WKcvC97gc-9t00vb5WAe6pVTGpRvJ6cgV8,526
|
|
161
|
+
sknetwork/ranking/tests/__init__.py,sha256=ZVL3kCN-qV5ThJU58iaMvJKSIkZ7ke7liLtLwI4TCHY,24
|
|
162
|
+
sknetwork/ranking/tests/test_API.py,sha256=KsFmUijSjH_YushmTVdIUydVioqQHlO7sgoOSqA-y7w,1160
|
|
163
|
+
sknetwork/ranking/tests/test_betweenness.py,sha256=JJVOwmXtDiXJNV5RMlCFrqCc3L7BySpBbsN-5rITzkY,1133
|
|
164
|
+
sknetwork/ranking/tests/test_closeness.py,sha256=6CVxEVNnDunkvFYgDQ42Mdv8Fm39ULAqaeFhM_v7Umw,1007
|
|
165
|
+
sknetwork/ranking/tests/test_hits.py,sha256=zStzrWZ-pv2Nsd-pB282FgW3KAn1TyKjz_l85tJaPJ0,491
|
|
166
|
+
sknetwork/ranking/tests/test_pagerank.py,sha256=iQc4gpKjsoh4vI2RNC43xM_OUo_UBDRWmFBlTR5KK7o,2521
|
|
167
|
+
sknetwork/regression/__init__.py,sha256=nRlbcR8bA2Lz-OmLPMIPhBzgDCol8oSA19qL3IninXA,141
|
|
168
|
+
sknetwork/regression/base.py,sha256=pMR72RqK5k2SWn01qylJhOIUlBWt_mMosNuREkrBV6k,1433
|
|
169
|
+
sknetwork/regression/diffusion.py,sha256=ffVaIy37JmyKYPmlgCJWi4w7bCiIw0Dobl7gmUq0TJo,6977
|
|
170
|
+
sknetwork/regression/tests/__init__.py,sha256=BT8kCCMN_pv7znhIR5GSQ_XxU5brmrCYDwm4QJNRCV0,27
|
|
171
|
+
sknetwork/regression/tests/test_API.py,sha256=jAGbjnq6eYxSHpX7eGiVZJ7rQPKdVam74ZCWI4k_1NY,1132
|
|
172
|
+
sknetwork/regression/tests/test_diffusion.py,sha256=c9bfgCmLcbFyChcUcvN8F9aYWqIeFPbtH5N0MViTtcY,1687
|
|
173
|
+
sknetwork/topology/__init__.py,sha256=6vEvqXM57rUJvKbCemIsc30X7D2sr114jKP9N9kOJO0,447
|
|
174
|
+
sknetwork/topology/dag.py,sha256=tNC3k1ygO2TrjvxWhfVb2PR_UZTtl9TYkgbWMqRvpPo,2322
|
|
175
|
+
sknetwork/topology/dag_core.cpython-39-darwin.so,sha256=FioTA20fujKBIPV-nGDi1U2JFwUZlZlgIhjgtis5o6k,255386
|
|
176
|
+
sknetwork/topology/dag_core.pyx,sha256=OEaHmLEtXAojywnaE2KtNmKGvSyk9bvxmx2EWSxQNkM,1008
|
|
177
|
+
sknetwork/topology/kcliques.cpython-39-darwin.so,sha256=-kOt9YVB-F2y5VfGk7ENnJwzbSwFFpem4024AYsqiYQ,319402
|
|
178
|
+
sknetwork/topology/kcliques.pyx,sha256=BGfuREPxmg2C9flPtWNmY3YXYYF_UKTVDnQowIi-OWQ,5121
|
|
179
|
+
sknetwork/topology/kcore.cpython-39-darwin.so,sha256=90F3TX8XbcMy5JvbTQEUOp8RLjLxGR1ArePI1iASaDk,296087
|
|
180
|
+
sknetwork/topology/kcore.pyx,sha256=90TUM4Vvp3H6wL2nVbyaGSmUcO27sww4iH2Vo6unJVI,3380
|
|
181
|
+
sknetwork/topology/structure.py,sha256=Asf4z7x2ba9Q_9kD1XRQ_zt67D4GbU68nkBiZ8cMMSI,8622
|
|
182
|
+
sknetwork/topology/triangles.cpython-39-darwin.so,sha256=l6DZOG51-KcqcdO8v3Bj3zoK6pNmXxq7g3e8_mXcWBg,111163
|
|
183
|
+
sknetwork/topology/triangles.pyx,sha256=b88u7bDTdbJOp0Hph3qP8mzgotahus1o0UYEhyJoTV8,4645
|
|
184
|
+
sknetwork/topology/weisfeiler_lehman.py,sha256=TiHsumRTIQRhxNKwooybPmoKcVDgsm2X_GdZ5yJaOhs,5310
|
|
185
|
+
sknetwork/topology/weisfeiler_lehman_core.cpython-39-darwin.so,sha256=k8zmWxcmn-sJuMxC67QE63y3k20tcm7MVODM5pj-T4Q,274840
|
|
186
|
+
sknetwork/topology/weisfeiler_lehman_core.pyx,sha256=e1utd0Ea2y7Z6dUJ53e4UPaWDY_exC4Rv0DDtOwuUlQ,3107
|
|
187
|
+
sknetwork/topology/tests/__init__.py,sha256=9lKrPX4BnSJbK-VlDi9TsmAgDwqF3H423KhJ1u1Uaos,25
|
|
188
|
+
sknetwork/topology/tests/test_cliques.py,sha256=p0xt5s_Vn1wingZnny1_0Yh3HLbRPNaYgEQXYgyFjV4,901
|
|
189
|
+
sknetwork/topology/tests/test_cores.py,sha256=n56EYEmEr-t-JXOw7TBUtmkmJzpFNT11d4pg-pTPk44,607
|
|
190
|
+
sknetwork/topology/tests/test_dag.py,sha256=3jZEApfXZOKNB2mvdaO9qeJjJ852T8V_cAG2FSl9jco,654
|
|
191
|
+
sknetwork/topology/tests/test_structure.py,sha256=SAbgm_XjshTb5Jao1OOxz8STEa8X9WJmcTm4dxcwBCo,4635
|
|
192
|
+
sknetwork/topology/tests/test_triangles.py,sha256=DCBw9g5DruotujNRiqs_l4JZcA6YXbZIoqiC_aCklIE,1342
|
|
193
|
+
sknetwork/topology/tests/test_wl_coloring.py,sha256=W69Yb6x47-66vmFBVXDx0rJ2d3XjwHdSa37D_K_Lwxg,1648
|
|
194
|
+
sknetwork/topology/tests/test_wl_kernel.py,sha256=9Ek3WV8lz8qr5ACdi6fdSBNv2z3mZrPV0eNCzCPY7NI,833
|
|
195
|
+
sknetwork/utils/__init__.py,sha256=xnzqcm6gf-7fqzg9iznmAzqhk0f-5kA-hOWGpnjvT9M,1170
|
|
196
|
+
sknetwork/utils/base.py,sha256=GiX9CMIUzak2ZyUjhpr9ZJQoWoI6YgijNIVNBTFdjwg,1055
|
|
197
|
+
sknetwork/utils/check.py,sha256=ob_5lEHuY4JGJe_Xfe8S8Q0qcKnvz5Qu4CaUvSmpp4U,12835
|
|
198
|
+
sknetwork/utils/co_neighbor.py,sha256=auRqFmkvEN2nTEuGbYYZTyZ-Ho0SqLn7QPfqYPHZSFU,2334
|
|
199
|
+
sknetwork/utils/format.py,sha256=YW0XwxHneSWu1XqAdOzQionWrCpbPtuoQTyfC4Vqkf4,8589
|
|
200
|
+
sknetwork/utils/kmeans.py,sha256=Wkq8WmF3RwShUSRQvf2wXNYIx9HsX9oAltZvdh7sOS4,2949
|
|
201
|
+
sknetwork/utils/knn.py,sha256=pOdLVVTiExkVpKswnjxzQpKnGZnB9rQY_kpN-7PbqwE,5324
|
|
202
|
+
sknetwork/utils/knn1d.cpython-39-darwin.so,sha256=YT4Wel70qyQP-qr54P38cnmMpqCiHbv6fSGjX4BtHIY,274439
|
|
203
|
+
sknetwork/utils/knn1d.pyx,sha256=krTMOcFHT1bSctRUpgjuGq1bY2ORUJJqsWbZNVebrgU,1987
|
|
204
|
+
sknetwork/utils/membership.py,sha256=mV0AGCA5E1JsGvtEeEmRFSpbSACmnjc2aZZfFrAxOlI,2151
|
|
205
|
+
sknetwork/utils/minheap.cpython-39-darwin.so,sha256=cj7oi7jwvWf8wZZVcZ_XkCEkWeLTeD0qahZ3kf5M1c8,255049
|
|
206
|
+
sknetwork/utils/minheap.pxd,sha256=yaGQw4zV69le7USJ1tPyjpKO9fISIfrr1xgpOEJNIqM,639
|
|
207
|
+
sknetwork/utils/minheap.pyx,sha256=6XcygVKqfBezGPXWcGupo2GHx_9LmlYaF6ZNEGA0VUM,3385
|
|
208
|
+
sknetwork/utils/neighbors.py,sha256=XNqwPM_PPpf_x-YhjEMVZJDxmazrVw9Eky3hNv9IGz0,3351
|
|
209
|
+
sknetwork/utils/seeds.py,sha256=Q7_hnoma2YnjrSJ0L_9_t3Ro5PBZ3t5wvirp5wmbGAE,2488
|
|
210
|
+
sknetwork/utils/simplex.py,sha256=qKdpv-veHBBl7-nBICUWIY406YoJy__RbeR0xfThM_s,4244
|
|
211
|
+
sknetwork/utils/timeout.py,sha256=kwHOLZFnOTrRhiEjtcwATYhsXbf5e8zV1OCoEKuG8Zg,1047
|
|
212
|
+
sknetwork/utils/verbose.py,sha256=wNCC05zQlavWLwQuhF0nIP-y3jHtQWiW25uEUjNugFo,951
|
|
213
|
+
sknetwork/utils/ward.py,sha256=nWTRrGaXGNpcvqEXR1IvM3whTxpPzrGjr4a9U1O3hhk,1513
|
|
214
|
+
sknetwork/utils/tests/__init__.py,sha256=y7PVVv2Wiz1msA5jqKOuB5BbB4UzCmDZ-pml9hIQyjo,22
|
|
215
|
+
sknetwork/utils/tests/test_base.py,sha256=cdZhSEAJ1Jm3U1PGqPgIiQJfi2ILxT3dahpabQMtyjE,823
|
|
216
|
+
sknetwork/utils/tests/test_bunch.py,sha256=ZNyfvjZs9F_C2PxD5h3z0ln5_qBXBkrdEXZoDASC0VQ,335
|
|
217
|
+
sknetwork/utils/tests/test_check.py,sha256=xtSbnvCsPOkf0Sh7BP3W08ajbSHgu2yYwBH4QPsnF94,6758
|
|
218
|
+
sknetwork/utils/tests/test_co_neighbor.py,sha256=8C_TGhbteDzM4zHTktwDTn1fJWevE9cVORK7D_mwivY,1415
|
|
219
|
+
sknetwork/utils/tests/test_format.py,sha256=nk5tWpZWgDUH0WYVbXlO4PI2U4A5c7_PMu6eZIllXho,2114
|
|
220
|
+
sknetwork/utils/tests/test_kmeans.py,sha256=XO8aq2OZ8WQ9kEGlvRd1F7OaaHoOnQOfb-zIkuXeoLE,543
|
|
221
|
+
sknetwork/utils/tests/test_knn.py,sha256=9IvAXJvLW87rsCBTPJhp0oS5IgN3_UkCRKExqeuOfMY,879
|
|
222
|
+
sknetwork/utils/tests/test_membership.py,sha256=y4BiaCHUw5c1dJPOSJA6vgkBQlPxQ2bepL7hDV1es5U,748
|
|
223
|
+
sknetwork/utils/tests/test_neighbors.py,sha256=vF697D0cTfx4Limcmbre5JkJcLi1rUX0tS_JviX11Zg,1426
|
|
224
|
+
sknetwork/utils/tests/test_projection_simplex.py,sha256=WFlVis67sf7HOZOsvK9o-9r92QlyyUs9FQC6tI7Q6-0,859
|
|
225
|
+
sknetwork/utils/tests/test_seeds.py,sha256=NN38VKTAG0kgTrPBwpN_eWgcfTyAHqomHw1UpvVs-oQ,2211
|
|
226
|
+
sknetwork/utils/tests/test_verbose.py,sha256=V-TWqKYmPScdbWxK6zQqNCM-f5GDhkNEkKrCAeA8LC8,395
|
|
227
|
+
sknetwork/utils/tests/test_ward.py,sha256=E1_CNcb7VTyzy0-82Dzgf2ZPKJArIE9Jo-YJDxkY04k,448
|
|
228
|
+
sknetwork/visualization/__init__.py,sha256=yH3HnNy_0TVZ1yJVXZUDoB_XOnYY9C0DfLa4EHCk20s,158
|
|
229
|
+
sknetwork/visualization/colors.py,sha256=DjcXt9aMgLan7bRg7TZI8m_8SLWQOZ-g2HoguB1-3qA,2509
|
|
230
|
+
sknetwork/visualization/dendrograms.py,sha256=wIrGGQS37TP8gLmYpwg5p8f2NJrOu6aDR7KZ3wNmQKA,8051
|
|
231
|
+
sknetwork/visualization/graphs.py,sha256=Hjbe3Ero8FwXitviphTHAT1hvuQAwj1lgQy88xf_S_I,31921
|
|
232
|
+
sknetwork/visualization/tests/__init__.py,sha256=yOVrqUD9UuI_HdYuqRP5PS7QhS-pO4RE_Ls5PLiIC_w,30
|
|
233
|
+
sknetwork/visualization/tests/test_dendrograms.py,sha256=LGPYvTFGBFvIw3cohWF3pUHFlftmOB0Ywh9vD1kLFH8,2402
|
|
234
|
+
sknetwork/visualization/tests/test_graphs.py,sha256=vRIiyy5ZtgFCLof8Pbfr5fWE5plJeW_lffEcTeMXurw,8718
|
|
235
|
+
scikit_network-0.28.3.dist-info/AUTHORS.rst,sha256=OnehQzy1o1V6_J_Rv219qhNTxfCMgQQNy1spqXYDi1I,880
|
|
236
|
+
scikit_network-0.28.3.dist-info/LICENSE,sha256=zKbJMpbSKgGEUaNr_fKgvJrvw_3W4gnJs5XdLCK5Sxo,1622
|
|
237
|
+
scikit_network-0.28.3.dist-info/METADATA,sha256=YT62ctWb3dAOY5GlB9jLV06HqbLYg53KCSw7hb-fTQ0,12398
|
|
238
|
+
scikit_network-0.28.3.dist-info/WHEEL,sha256=fLZVE2sWVfBI3pzbwmKR0Q0ugaWRmAjTxXtce6A8qKw,108
|
|
239
|
+
scikit_network-0.28.3.dist-info/top_level.txt,sha256=fkwspWQ9B3csqb5ENEOoVciRY6XftnMuz4MvTDQeSsg,10
|
|
240
|
+
scikit_network-0.28.3.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
sknetwork
|
sknetwork/__init__.py
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""Top-level package for scikit-network"""
|
|
4
|
+
|
|
5
|
+
__author__ = """scikit-network team"""
|
|
6
|
+
__email__ = "thomas.bonald@telecom-paris.fr"
|
|
7
|
+
__version__ = '0.28.3'
|
|
8
|
+
|
|
9
|
+
import sknetwork.topology
|
|
10
|
+
import sknetwork.path
|
|
11
|
+
import sknetwork.classification
|
|
12
|
+
import sknetwork.clustering
|
|
13
|
+
import sknetwork.embedding
|
|
14
|
+
import sknetwork.hierarchy
|
|
15
|
+
import sknetwork.linalg
|
|
16
|
+
import sknetwork.linkpred
|
|
17
|
+
import sknetwork.ranking
|
|
18
|
+
import sknetwork.data
|
|
19
|
+
import sknetwork.utils
|
|
20
|
+
import sknetwork.visualization
|
|
21
|
+
import sknetwork.gnn
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""classification module"""
|
|
2
|
+
from sknetwork.classification.base import BaseClassifier
|
|
3
|
+
from sknetwork.classification.diffusion import DiffusionClassifier
|
|
4
|
+
from sknetwork.classification.knn import KNN
|
|
5
|
+
from sknetwork.classification.metrics import get_accuracy_score, get_confusion_matrix, get_f1_score, get_f1_scores, \
|
|
6
|
+
get_average_f1_score
|
|
7
|
+
from sknetwork.classification.pagerank import PageRankClassifier
|
|
8
|
+
from sknetwork.classification.propagation import Propagation
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Created on November 2019
|
|
5
|
+
@author: Nathan de Lara <nathan.delara@polytechnique.org>
|
|
6
|
+
"""
|
|
7
|
+
from abc import ABC
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
|
|
11
|
+
from sknetwork.utils.base import Algorithm
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BaseClassifier(Algorithm, ABC):
|
|
15
|
+
"""Base class for classifiers.
|
|
16
|
+
|
|
17
|
+
Attributes
|
|
18
|
+
----------
|
|
19
|
+
labels_ : np.ndarray, shape (n_labels,)
|
|
20
|
+
Label of each node.
|
|
21
|
+
membership_ : sparse.csr_matrix, shape (n_row, n_labels)
|
|
22
|
+
Membership matrix (soft classification).
|
|
23
|
+
labels_row_ , labels_col_ : np.ndarray
|
|
24
|
+
Label of rows and columns (for bipartite graphs).
|
|
25
|
+
membership_row_, membership_col_ : sparse.csr_matrix, shapes (n_row, n_labels) and (n_col, n_labels)
|
|
26
|
+
Membership matrices of rows and columns (for bipartite graphs).
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(self):
|
|
30
|
+
self.labels_ = None
|
|
31
|
+
self.membership_ = None
|
|
32
|
+
self.labels_row_ = None
|
|
33
|
+
self.labels_col_ = None
|
|
34
|
+
self.membership_row_ = None
|
|
35
|
+
self.membership_col_ = None
|
|
36
|
+
|
|
37
|
+
def fit_predict(self, *args, **kwargs) -> np.ndarray:
|
|
38
|
+
"""Fit algorithm to the data and return the labels. Same parameters as the ``fit`` method.
|
|
39
|
+
|
|
40
|
+
Returns
|
|
41
|
+
-------
|
|
42
|
+
labels : np.ndarray
|
|
43
|
+
Labels.
|
|
44
|
+
"""
|
|
45
|
+
self.fit(*args, **kwargs)
|
|
46
|
+
return self.labels_
|
|
47
|
+
|
|
48
|
+
def fit_transform(self, *args, **kwargs) -> np.ndarray:
|
|
49
|
+
"""Fit algorithm to the data and return the membership matrix. Same parameters as the ``fit`` method.
|
|
50
|
+
|
|
51
|
+
Returns
|
|
52
|
+
-------
|
|
53
|
+
labels : np.ndarray
|
|
54
|
+
Labels.
|
|
55
|
+
"""
|
|
56
|
+
self.fit(*args, **kwargs)
|
|
57
|
+
return self.membership_
|
|
58
|
+
|
|
59
|
+
def score(self, label: int):
|
|
60
|
+
"""Classification scores for a given label.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
label : int
|
|
65
|
+
The label index of the class.
|
|
66
|
+
|
|
67
|
+
Returns
|
|
68
|
+
-------
|
|
69
|
+
scores : np.ndarray
|
|
70
|
+
Classification scores of shape (number of nodes,).
|
|
71
|
+
"""
|
|
72
|
+
if self.membership_ is None:
|
|
73
|
+
raise ValueError("The fit method should be called first.")
|
|
74
|
+
return self.membership_[:, label].toarray().ravel()
|
|
75
|
+
|
|
76
|
+
def _split_vars(self, shape: tuple):
|
|
77
|
+
n_row = shape[0]
|
|
78
|
+
self.labels_row_ = self.labels_[:n_row]
|
|
79
|
+
self.labels_col_ = self.labels_[n_row:]
|
|
80
|
+
self.labels_ = self.labels_row_
|
|
81
|
+
self.membership_row_ = self.membership_[:n_row]
|
|
82
|
+
self.membership_col_ = self.membership_[n_row:]
|
|
83
|
+
self.membership_ = self.membership_row_
|
|
84
|
+
return self
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Created on March 2020
|
|
5
|
+
@author: Nathan de Lara <nathan.delara@polytechnique.org>
|
|
6
|
+
"""
|
|
7
|
+
from functools import partial
|
|
8
|
+
from multiprocessing import Pool
|
|
9
|
+
from typing import Union, Optional
|
|
10
|
+
|
|
11
|
+
import numpy as np
|
|
12
|
+
from scipy import sparse
|
|
13
|
+
|
|
14
|
+
from sknetwork.classification.base import BaseClassifier
|
|
15
|
+
from sknetwork.linalg.normalization import normalize
|
|
16
|
+
from sknetwork.ranking.base import BaseRanking
|
|
17
|
+
from sknetwork.utils.check import check_labels, check_n_jobs
|
|
18
|
+
from sknetwork.utils.format import get_adjacency_seeds
|
|
19
|
+
from sknetwork.utils.verbose import VerboseMixin
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class RankClassifier(BaseClassifier, VerboseMixin):
|
|
23
|
+
"""Generic class for ranking based classifiers.
|
|
24
|
+
|
|
25
|
+
Parameters
|
|
26
|
+
----------
|
|
27
|
+
algorithm :
|
|
28
|
+
Which ranking algorithm to use.
|
|
29
|
+
n_jobs :
|
|
30
|
+
If positive, number of parallel jobs allowed (-1 means maximum number).
|
|
31
|
+
If ``None``, no parallel computations are made.
|
|
32
|
+
verbose :
|
|
33
|
+
Verbose mode.
|
|
34
|
+
|
|
35
|
+
Attributes
|
|
36
|
+
----------
|
|
37
|
+
labels_ : np.ndarray, shape (n_labels,)
|
|
38
|
+
Label of each node.
|
|
39
|
+
membership_ : sparse.csr_matrix, shape (n_row, n_labels)
|
|
40
|
+
Membership matrix.
|
|
41
|
+
labels_row_ : np.ndarray
|
|
42
|
+
Labels of rows, for bipartite graphs.
|
|
43
|
+
labels_col_ : np.ndarray
|
|
44
|
+
Labels of columns, for bipartite graphs.
|
|
45
|
+
membership_row_ : sparse.csr_matrix, shape (n_row, n_labels)
|
|
46
|
+
Membership matrix of rows, for bipartite graphs.
|
|
47
|
+
membership_col_ : sparse.csr_matrix, shape (n_col, n_labels)
|
|
48
|
+
Membership matrix of columns, for bipartite graphs.
|
|
49
|
+
"""
|
|
50
|
+
def __init__(self, algorithm: BaseRanking, n_jobs: Optional[int] = None, verbose: bool = False):
|
|
51
|
+
super(RankClassifier, self).__init__()
|
|
52
|
+
VerboseMixin.__init__(self, verbose)
|
|
53
|
+
|
|
54
|
+
self.algorithm = algorithm
|
|
55
|
+
self.n_jobs = check_n_jobs(n_jobs)
|
|
56
|
+
self.verbose = verbose
|
|
57
|
+
|
|
58
|
+
@staticmethod
|
|
59
|
+
def _process_seeds(labels_seeds: np.ndarray) -> list:
|
|
60
|
+
"""Make one-vs-all seed labels from seeds.
|
|
61
|
+
|
|
62
|
+
Parameters
|
|
63
|
+
----------
|
|
64
|
+
labels_seeds
|
|
65
|
+
|
|
66
|
+
Returns
|
|
67
|
+
-------
|
|
68
|
+
List of seeds vectors.
|
|
69
|
+
"""
|
|
70
|
+
seeds_all = []
|
|
71
|
+
classes, _ = check_labels(labels_seeds)
|
|
72
|
+
|
|
73
|
+
for label in classes:
|
|
74
|
+
seeds = np.array(labels_seeds == label).astype(int)
|
|
75
|
+
seeds_all.append(seeds)
|
|
76
|
+
|
|
77
|
+
return seeds_all
|
|
78
|
+
|
|
79
|
+
@staticmethod
|
|
80
|
+
def _process_scores(scores: np.ndarray) -> np.ndarray:
|
|
81
|
+
"""Post-processing of the membership matrix.
|
|
82
|
+
|
|
83
|
+
Parameters
|
|
84
|
+
----------
|
|
85
|
+
scores
|
|
86
|
+
Matrix of scores, shape number of nodes x number of labels.
|
|
87
|
+
|
|
88
|
+
Returns
|
|
89
|
+
-------
|
|
90
|
+
scores : np.ndarray
|
|
91
|
+
"""
|
|
92
|
+
return scores
|
|
93
|
+
|
|
94
|
+
def _split_vars(self, shape):
|
|
95
|
+
"""Split the vector of labels and build membership matrix."""
|
|
96
|
+
n_row = shape[0]
|
|
97
|
+
self.labels_row_ = self.labels_[:n_row]
|
|
98
|
+
self.labels_col_ = self.labels_[n_row:]
|
|
99
|
+
self.labels_ = self.labels_row_
|
|
100
|
+
self.membership_row_ = self.membership_[:n_row]
|
|
101
|
+
self.membership_col_ = self.membership_[n_row:]
|
|
102
|
+
self.membership_ = self.membership_row_
|
|
103
|
+
|
|
104
|
+
def fit(self, input_matrix: Union[sparse.csr_matrix, np.ndarray], seeds: Union[np.ndarray, dict] = None,
|
|
105
|
+
seeds_row: Union[np.ndarray, dict] = None, seeds_col: Union[np.ndarray, dict] = None) -> 'RankClassifier':
|
|
106
|
+
"""Fit algorithm to data.
|
|
107
|
+
|
|
108
|
+
Parameters
|
|
109
|
+
----------
|
|
110
|
+
input_matrix :
|
|
111
|
+
Adjacency matrix or biadjacency matrix of the graph.
|
|
112
|
+
seeds :
|
|
113
|
+
Seed nodes (labels as dictionary or array; negative values ignored).
|
|
114
|
+
seeds_row, seeds_col :
|
|
115
|
+
Seed rows and columns (for bipartite graphs).
|
|
116
|
+
Returns
|
|
117
|
+
-------
|
|
118
|
+
self: :class:`RankClassifier`
|
|
119
|
+
"""
|
|
120
|
+
adjacency, seeds_labels, bipartite = get_adjacency_seeds(input_matrix, seeds=seeds, seeds_row=seeds_row,
|
|
121
|
+
seeds_col=seeds_col)
|
|
122
|
+
seeds_labels = seeds_labels.astype(int)
|
|
123
|
+
classes, n_classes = check_labels(seeds_labels)
|
|
124
|
+
seeds_all = self._process_seeds(seeds_labels)
|
|
125
|
+
local_function = partial(self.algorithm.fit_transform, adjacency)
|
|
126
|
+
with Pool(self.n_jobs) as pool:
|
|
127
|
+
scores = np.array(pool.map(local_function, seeds_all))
|
|
128
|
+
scores = scores.T
|
|
129
|
+
|
|
130
|
+
scores = self._process_scores(scores)
|
|
131
|
+
scores = normalize(scores)
|
|
132
|
+
|
|
133
|
+
membership = sparse.coo_matrix(scores)
|
|
134
|
+
membership.col = classes[membership.col]
|
|
135
|
+
|
|
136
|
+
labels = np.argmax(scores, axis=1)
|
|
137
|
+
self.labels_ = classes[labels]
|
|
138
|
+
self.membership_ = sparse.csr_matrix(membership, shape=(adjacency.shape[0], np.max(seeds_labels) + 1))
|
|
139
|
+
|
|
140
|
+
if bipartite:
|
|
141
|
+
self._split_vars(input_matrix.shape)
|
|
142
|
+
|
|
143
|
+
return self
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Created in July 2022
|
|
5
|
+
@author: Thomas Bonald <thomas.bonald@telecom-paris.fr>
|
|
6
|
+
"""
|
|
7
|
+
from typing import Optional, Union
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
from scipy import sparse
|
|
11
|
+
|
|
12
|
+
from sknetwork.classification.base import BaseClassifier
|
|
13
|
+
from sknetwork.linalg.normalization import normalize
|
|
14
|
+
from sknetwork.utils.format import get_adjacency_seeds
|
|
15
|
+
from sknetwork.utils.membership import get_membership
|
|
16
|
+
from sknetwork.utils.neighbors import get_degrees
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DiffusionClassifier(BaseClassifier):
|
|
20
|
+
"""Node classification by heat diffusion.
|
|
21
|
+
|
|
22
|
+
For each label, the temperature of a node corresponds to its probability to have this label.
|
|
23
|
+
|
|
24
|
+
Parameters
|
|
25
|
+
----------
|
|
26
|
+
n_iter : int
|
|
27
|
+
Number of iterations of the diffusion (discrete time).
|
|
28
|
+
centering : bool
|
|
29
|
+
If ``True``, center the temperature of each label to its mean before classification (default).
|
|
30
|
+
threshold : float
|
|
31
|
+
Minimum difference of temperatures between the 2 top labels to classify a node (default = 0).
|
|
32
|
+
If the difference of temperatures does not exceed this threshold, return -1 for this node (no label).
|
|
33
|
+
|
|
34
|
+
Attributes
|
|
35
|
+
----------
|
|
36
|
+
labels_ : np.ndarray, shape (n_labels,)
|
|
37
|
+
Label of each node.
|
|
38
|
+
membership_ : sparse.csr_matrix, shape (n_row, n_labels)
|
|
39
|
+
Membership matrix.
|
|
40
|
+
labels_row_ : np.ndarray
|
|
41
|
+
Labels of rows, for bipartite graphs.
|
|
42
|
+
labels_col_ : np.ndarray
|
|
43
|
+
Labels of columns, for bipartite graphs.
|
|
44
|
+
membership_row_ : sparse.csr_matrix, shape (n_row, n_labels)
|
|
45
|
+
Membership matrix of rows, for bipartite graphs.
|
|
46
|
+
membership_col_ : sparse.csr_matrix, shape (n_col, n_labels)
|
|
47
|
+
Membership matrix of columns, for bipartite graphs.
|
|
48
|
+
|
|
49
|
+
Example
|
|
50
|
+
-------
|
|
51
|
+
>>> from sknetwork.data import karate_club
|
|
52
|
+
>>> diffusion = DiffusionClassifier()
|
|
53
|
+
>>> graph = karate_club(metadata=True)
|
|
54
|
+
>>> adjacency = graph.adjacency
|
|
55
|
+
>>> labels_true = graph.labels
|
|
56
|
+
>>> seeds = {0: labels_true[0], 33: labels_true[33]}
|
|
57
|
+
>>> labels_pred = diffusion.fit_predict(adjacency, seeds)
|
|
58
|
+
>>> np.round(np.mean(labels_pred == labels_true), 2)
|
|
59
|
+
0.97
|
|
60
|
+
|
|
61
|
+
References
|
|
62
|
+
----------
|
|
63
|
+
Zhu, X., Lafferty, J., & Rosenfeld, R. (2005). `Semi-supervised learning with graphs`
|
|
64
|
+
(Doctoral dissertation, Carnegie Mellon University, language technologies institute, school of computer science).
|
|
65
|
+
"""
|
|
66
|
+
def __init__(self, n_iter: int = 10, centering: bool = True, threshold: float = 0):
|
|
67
|
+
super(DiffusionClassifier, self).__init__()
|
|
68
|
+
|
|
69
|
+
if n_iter <= 0:
|
|
70
|
+
raise ValueError('The number of iterations must be positive.')
|
|
71
|
+
else:
|
|
72
|
+
self.n_iter = n_iter
|
|
73
|
+
self.centering = centering
|
|
74
|
+
self.threshold = threshold
|
|
75
|
+
self.bipartite = None
|
|
76
|
+
|
|
77
|
+
def fit(self, input_matrix: Union[sparse.csr_matrix, np.ndarray],
|
|
78
|
+
seeds: Optional[Union[dict, np.ndarray]] = None, seeds_row: Optional[Union[dict, np.ndarray]] = None,
|
|
79
|
+
seeds_col: Optional[Union[dict, np.ndarray]] = None, force_bipartite: bool = False) \
|
|
80
|
+
-> 'DiffusionClassifier':
|
|
81
|
+
"""Compute the solution to the Dirichlet problem (temperatures at equilibrium).
|
|
82
|
+
|
|
83
|
+
Parameters
|
|
84
|
+
----------
|
|
85
|
+
input_matrix :
|
|
86
|
+
Adjacency matrix or biadjacency matrix of the graph.
|
|
87
|
+
seeds :
|
|
88
|
+
Labels of seed nodes (dictionary or vector of int). Negative values ignored.
|
|
89
|
+
seeds_row, seeds_col :
|
|
90
|
+
Labels of rows and columns for bipartite graphs. Negative values ignored.
|
|
91
|
+
force_bipartite :
|
|
92
|
+
If ``True``, consider the input matrix as a biadjacency matrix (default = ``False``).
|
|
93
|
+
|
|
94
|
+
Returns
|
|
95
|
+
-------
|
|
96
|
+
self: :class:`DiffusionClassifier`
|
|
97
|
+
"""
|
|
98
|
+
adjacency, seeds, self.bipartite = get_adjacency_seeds(input_matrix, force_bipartite=force_bipartite,
|
|
99
|
+
seeds=seeds, seeds_row=seeds_row, seeds_col=seeds_col)
|
|
100
|
+
seeds = seeds.astype(int)
|
|
101
|
+
if (seeds < 0).all():
|
|
102
|
+
raise ValueError('At least one node must be given a label in ``seeds``.')
|
|
103
|
+
temperatures = get_membership(seeds).toarray()
|
|
104
|
+
temperatures_seeds = temperatures[seeds >= 0]
|
|
105
|
+
n_labels = temperatures.shape[1]
|
|
106
|
+
temperatures[seeds < 0] = 1 / n_labels
|
|
107
|
+
diffusion = normalize(adjacency)
|
|
108
|
+
for i in range(self.n_iter):
|
|
109
|
+
temperatures = diffusion.dot(temperatures)
|
|
110
|
+
temperatures[seeds >= 0] = temperatures_seeds
|
|
111
|
+
|
|
112
|
+
self.membership_ = sparse.csr_matrix(temperatures)
|
|
113
|
+
|
|
114
|
+
if self.centering:
|
|
115
|
+
temperatures -= temperatures.mean(axis=0)
|
|
116
|
+
|
|
117
|
+
labels = temperatures.argmax(axis=1)
|
|
118
|
+
# set label -1 to nodes without temperature (no diffusion to them)
|
|
119
|
+
labels[get_degrees(self.membership_) == 0] = -1
|
|
120
|
+
|
|
121
|
+
if self.threshold >= 0:
|
|
122
|
+
if n_labels > 2:
|
|
123
|
+
top_temperatures = np.partition(-temperatures, 2, axis=1)[:, :2]
|
|
124
|
+
else:
|
|
125
|
+
top_temperatures = temperatures
|
|
126
|
+
differences = np.abs(top_temperatures[:, 0] - top_temperatures[:, 1])
|
|
127
|
+
labels[differences <= self.threshold] = -1
|
|
128
|
+
|
|
129
|
+
self.labels_ = labels
|
|
130
|
+
|
|
131
|
+
if self.bipartite:
|
|
132
|
+
self._split_vars(input_matrix.shape)
|
|
133
|
+
|
|
134
|
+
return self
|