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,508 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Created in May 2020
|
|
5
|
+
@author: Nathan de Lara <nathan.delara@polytechnique.org>
|
|
6
|
+
"""
|
|
7
|
+
from abc import ABC
|
|
8
|
+
from typing import Union, Iterable
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
from scipy import sparse
|
|
12
|
+
from sknetwork.linkpred.first_order_core import common_neighbors_node_core, jaccard_node_core, salton_node_core, \
|
|
13
|
+
sorensen_node_core, hub_promoted_node_core, hub_depressed_node_core, adamic_adar_node_core, \
|
|
14
|
+
resource_allocation_node_core, \
|
|
15
|
+
common_neighbors_edges_core, jaccard_edges_core, salton_edges_core, sorensen_edges_core, hub_promoted_edges_core, \
|
|
16
|
+
hub_depressed_edges_core, adamic_adar_edges_core, resource_allocation_edges_core
|
|
17
|
+
|
|
18
|
+
from sknetwork.linkpred.base import BaseLinkPred
|
|
19
|
+
from sknetwork.utils.check import check_format
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FirstOrder(BaseLinkPred, ABC):
|
|
23
|
+
"""Base class for first order algorithms."""
|
|
24
|
+
|
|
25
|
+
def __init__(self):
|
|
26
|
+
super(FirstOrder, self).__init__()
|
|
27
|
+
self.indptr_ = None
|
|
28
|
+
self.indices_ = None
|
|
29
|
+
|
|
30
|
+
def fit(self, adjacency: Union[sparse.csr_matrix, np.ndarray]):
|
|
31
|
+
"""Fit algorithm to the data.
|
|
32
|
+
|
|
33
|
+
Parameters
|
|
34
|
+
----------
|
|
35
|
+
adjacency :
|
|
36
|
+
Adjacency matrix of the graph
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
self : :class:`FirstOrder`
|
|
41
|
+
"""
|
|
42
|
+
adjacency = check_format(adjacency)
|
|
43
|
+
adjacency.sort_indices()
|
|
44
|
+
self.indptr_ = adjacency.indptr.astype(np.int32)
|
|
45
|
+
self.indices_ = adjacency.indices.astype(np.int32)
|
|
46
|
+
|
|
47
|
+
return self
|
|
48
|
+
|
|
49
|
+
def _predict_node(self, source: int):
|
|
50
|
+
"""Prediction for a single node."""
|
|
51
|
+
n = self.indptr_.shape[0] - 1
|
|
52
|
+
return self._predict_base(source, np.arange(n))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class CommonNeighbors(FirstOrder):
|
|
56
|
+
"""Link prediction by common neighbors:
|
|
57
|
+
|
|
58
|
+
:math:`s(i, j) = |\\Gamma_i \\cap \\Gamma_j|`.
|
|
59
|
+
|
|
60
|
+
Attributes
|
|
61
|
+
----------
|
|
62
|
+
indptr_ : np.ndarray
|
|
63
|
+
Pointer index for neighbors.
|
|
64
|
+
indices_ : np.ndarray
|
|
65
|
+
Concatenation of neighbors.
|
|
66
|
+
|
|
67
|
+
Examples
|
|
68
|
+
--------
|
|
69
|
+
>>> from sknetwork.data import house
|
|
70
|
+
>>> adjacency = house()
|
|
71
|
+
>>> cn = CommonNeighbors()
|
|
72
|
+
>>> similarities = cn.fit_predict(adjacency, 0)
|
|
73
|
+
>>> similarities
|
|
74
|
+
array([2, 1, 1, 1, 1])
|
|
75
|
+
>>> similarities = cn.predict([0, 1])
|
|
76
|
+
>>> similarities
|
|
77
|
+
array([[2, 1, 1, 1, 1],
|
|
78
|
+
[1, 3, 0, 2, 1]])
|
|
79
|
+
>>> similarities = cn.predict((0, 1))
|
|
80
|
+
>>> similarities
|
|
81
|
+
1
|
|
82
|
+
>>> similarities = cn.predict([(0, 1), (1, 2)])
|
|
83
|
+
>>> similarities
|
|
84
|
+
array([1, 0])
|
|
85
|
+
"""
|
|
86
|
+
def __init__(self):
|
|
87
|
+
super(CommonNeighbors, self).__init__()
|
|
88
|
+
|
|
89
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
90
|
+
"""Prediction for a single node."""
|
|
91
|
+
return np.asarray(common_neighbors_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
92
|
+
np.array(targets, dtype=np.int32))).astype(int)
|
|
93
|
+
|
|
94
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
95
|
+
"""Prediction for multiple edges."""
|
|
96
|
+
return np.asarray(common_neighbors_edges_core(self.indptr_, self.indices_, edges.astype(np.int32))).astype(int)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class JaccardIndex(FirstOrder):
|
|
100
|
+
"""Link prediction by Jaccard Index:
|
|
101
|
+
|
|
102
|
+
:math:`s(i, j) = \\dfrac{|\\Gamma_i \\cap \\Gamma_j|}{|\\Gamma_i \\cup \\Gamma_j|}`.
|
|
103
|
+
|
|
104
|
+
Attributes
|
|
105
|
+
----------
|
|
106
|
+
indptr_ : np.ndarray
|
|
107
|
+
Pointer index for neighbors.
|
|
108
|
+
indices_ : np.ndarray
|
|
109
|
+
Concatenation of neighbors.
|
|
110
|
+
|
|
111
|
+
Examples
|
|
112
|
+
--------
|
|
113
|
+
>>> from sknetwork.data import house
|
|
114
|
+
>>> adjacency = house()
|
|
115
|
+
>>> jaccard = JaccardIndex()
|
|
116
|
+
>>> similarities = jaccard.fit_predict(adjacency, 0)
|
|
117
|
+
>>> similarities.round(2)
|
|
118
|
+
array([1. , 0.25, 0.33, 0.33, 0.25])
|
|
119
|
+
>>> similarities = jaccard.predict([0, 1])
|
|
120
|
+
>>> similarities.round(2)
|
|
121
|
+
array([[1. , 0.25, 0.33, 0.33, 0.25],
|
|
122
|
+
[0.25, 1. , 0. , 0.67, 0.2 ]])
|
|
123
|
+
>>> similarities = jaccard.predict((0, 1))
|
|
124
|
+
>>> similarities.round(2)
|
|
125
|
+
0.25
|
|
126
|
+
>>> similarities = jaccard.predict([(0, 1), (1, 2)])
|
|
127
|
+
>>> similarities.round(2)
|
|
128
|
+
array([0.25, 0. ])
|
|
129
|
+
|
|
130
|
+
References
|
|
131
|
+
----------
|
|
132
|
+
Levandowsky, M., & Winter, D. (1971). Distance between sets. Nature, 234(5323), 34-35.
|
|
133
|
+
"""
|
|
134
|
+
def __init__(self):
|
|
135
|
+
super(JaccardIndex, self).__init__()
|
|
136
|
+
|
|
137
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
138
|
+
"""Prediction for a single node."""
|
|
139
|
+
return np.asarray(jaccard_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
140
|
+
np.array(targets, dtype=np.int32)))
|
|
141
|
+
|
|
142
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
143
|
+
"""Prediction for multiple edges."""
|
|
144
|
+
return np.asarray(jaccard_edges_core(self.indptr_, self.indices_, edges.astype(np.int32)))
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class SaltonIndex(FirstOrder):
|
|
148
|
+
"""Link prediction by Salton Index:
|
|
149
|
+
|
|
150
|
+
:math:`s(i, j) = \\dfrac{|\\Gamma_i \\cap \\Gamma_j|}{\\sqrt{|\\Gamma_i|.|\\Gamma_j|}}`.
|
|
151
|
+
|
|
152
|
+
Attributes
|
|
153
|
+
----------
|
|
154
|
+
indptr_ : np.ndarray
|
|
155
|
+
Pointer index for neighbors.
|
|
156
|
+
indices_ : np.ndarray
|
|
157
|
+
Concatenation of neighbors.
|
|
158
|
+
|
|
159
|
+
Examples
|
|
160
|
+
--------
|
|
161
|
+
>>> from sknetwork.data import house
|
|
162
|
+
>>> adjacency = house()
|
|
163
|
+
>>> salton = SaltonIndex()
|
|
164
|
+
>>> similarities = salton.fit_predict(adjacency, 0)
|
|
165
|
+
>>> similarities.round(2)
|
|
166
|
+
array([1. , 0.41, 0.5 , 0.5 , 0.41])
|
|
167
|
+
>>> similarities = salton.predict([0, 1])
|
|
168
|
+
>>> similarities.round(2)
|
|
169
|
+
array([[1. , 0.41, 0.5 , 0.5 , 0.41],
|
|
170
|
+
[0.41, 1. , 0. , 0.82, 0.33]])
|
|
171
|
+
>>> similarities = salton.predict((0, 1))
|
|
172
|
+
>>> similarities.round(2)
|
|
173
|
+
0.41
|
|
174
|
+
>>> similarities = salton.predict([(0, 1), (1, 2)])
|
|
175
|
+
>>> similarities.round(2)
|
|
176
|
+
array([0.41, 0. ])
|
|
177
|
+
|
|
178
|
+
References
|
|
179
|
+
----------
|
|
180
|
+
Martínez, V., Berzal, F., & Cubero, J. C. (2016).
|
|
181
|
+
`A survey of link prediction in complex networks.
|
|
182
|
+
<https://dl.acm.org/doi/pdf/10.1145/3012704>`_
|
|
183
|
+
ACM computing surveys (CSUR), 49(4), 1-33.
|
|
184
|
+
"""
|
|
185
|
+
def __init__(self):
|
|
186
|
+
super(SaltonIndex, self).__init__()
|
|
187
|
+
|
|
188
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
189
|
+
"""Prediction for a single node."""
|
|
190
|
+
return np.asarray(salton_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
191
|
+
np.array(targets, dtype=np.int32)))
|
|
192
|
+
|
|
193
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
194
|
+
"""Prediction for multiple edges."""
|
|
195
|
+
return np.asarray(salton_edges_core(self.indptr_, self.indices_, edges.astype(np.int32)))
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
class SorensenIndex(FirstOrder):
|
|
199
|
+
"""Link prediction by Sorensen Index:
|
|
200
|
+
|
|
201
|
+
:math:`s(i, j) = \\dfrac{2|\\Gamma_i \\cap \\Gamma_j|}{|\\Gamma_i|+|\\Gamma_j|}`.
|
|
202
|
+
|
|
203
|
+
Attributes
|
|
204
|
+
----------
|
|
205
|
+
indptr_ : np.ndarray
|
|
206
|
+
Pointer index for neighbors.
|
|
207
|
+
indices_ : np.ndarray
|
|
208
|
+
Concatenation of neighbors.
|
|
209
|
+
|
|
210
|
+
Examples
|
|
211
|
+
--------
|
|
212
|
+
>>> from sknetwork.data import house
|
|
213
|
+
>>> adjacency = house()
|
|
214
|
+
>>> sorensen = SorensenIndex()
|
|
215
|
+
>>> similarities = sorensen.fit_predict(adjacency, 0)
|
|
216
|
+
>>> similarities.round(2)
|
|
217
|
+
array([1. , 0.4, 0.5, 0.5, 0.4])
|
|
218
|
+
>>> similarities = sorensen.predict([0, 1])
|
|
219
|
+
>>> similarities.round(2)
|
|
220
|
+
array([[1. , 0.4 , 0.5 , 0.5 , 0.4 ],
|
|
221
|
+
[0.4 , 1. , 0. , 0.8 , 0.33]])
|
|
222
|
+
>>> similarities = sorensen.predict((0, 1))
|
|
223
|
+
>>> similarities.round(2)
|
|
224
|
+
0.4
|
|
225
|
+
>>> similarities = sorensen.predict([(0, 1), (1, 2)])
|
|
226
|
+
>>> similarities.round(2)
|
|
227
|
+
array([0.4, 0. ])
|
|
228
|
+
|
|
229
|
+
References
|
|
230
|
+
----------
|
|
231
|
+
|
|
232
|
+
* Sørensen, T. J. (1948). A method of establishing groups of equal amplitude in plant sociology
|
|
233
|
+
based on similarity of species content and its application to analyses of the vegetation on Danish commons.
|
|
234
|
+
I kommission hos E. Munksgaard.
|
|
235
|
+
* Martínez, V., Berzal, F., & Cubero, J. C. (2016).
|
|
236
|
+
`A survey of link prediction in complex networks.
|
|
237
|
+
<https://dl.acm.org/doi/pdf/10.1145/3012704>`_
|
|
238
|
+
ACM computing surveys (CSUR), 49(4), 1-33.
|
|
239
|
+
|
|
240
|
+
"""
|
|
241
|
+
def __init__(self):
|
|
242
|
+
super(SorensenIndex, self).__init__()
|
|
243
|
+
|
|
244
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
245
|
+
"""Prediction for a single node."""
|
|
246
|
+
return np.asarray(sorensen_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
247
|
+
np.array(targets, dtype=np.int32)))
|
|
248
|
+
|
|
249
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
250
|
+
"""Prediction for multiple edges."""
|
|
251
|
+
return np.asarray(sorensen_edges_core(self.indptr_, self.indices_, edges.astype(np.int32)))
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
class HubPromotedIndex(FirstOrder):
|
|
255
|
+
"""Link prediction by Hub Promoted Index:
|
|
256
|
+
|
|
257
|
+
:math:`s(i, j) = \\dfrac{2|\\Gamma_i \\cap \\Gamma_j|}{min(|\\Gamma_i|,|\\Gamma_j|)}`.
|
|
258
|
+
|
|
259
|
+
Attributes
|
|
260
|
+
----------
|
|
261
|
+
indptr_ : np.ndarray
|
|
262
|
+
Pointer index for neighbors.
|
|
263
|
+
indices_ : np.ndarray
|
|
264
|
+
Concatenation of neighbors.
|
|
265
|
+
|
|
266
|
+
Examples
|
|
267
|
+
--------
|
|
268
|
+
>>> from sknetwork.data import house
|
|
269
|
+
>>> adjacency = house()
|
|
270
|
+
>>> hpi = HubPromotedIndex()
|
|
271
|
+
>>> similarities = hpi.fit_predict(adjacency, 0)
|
|
272
|
+
>>> similarities.round(2)
|
|
273
|
+
array([1. , 0.5, 0.5, 0.5, 0.5])
|
|
274
|
+
>>> similarities = hpi.predict([0, 1])
|
|
275
|
+
>>> similarities.round(2)
|
|
276
|
+
array([[1. , 0.5 , 0.5 , 0.5 , 0.5 ],
|
|
277
|
+
[0.5 , 1. , 0. , 1. , 0.33]])
|
|
278
|
+
>>> similarities = hpi.predict((0, 1))
|
|
279
|
+
>>> similarities.round(2)
|
|
280
|
+
0.5
|
|
281
|
+
>>> similarities = hpi.predict([(0, 1), (1, 2)])
|
|
282
|
+
>>> similarities.round(2)
|
|
283
|
+
array([0.5, 0. ])
|
|
284
|
+
|
|
285
|
+
References
|
|
286
|
+
----------
|
|
287
|
+
Ravasz, E., Somera, A. L., Mongru, D. A., Oltvai, Z. N., & Barabási, A. L. (2002).
|
|
288
|
+
`Hierarchical organization of modularity in metabolic networks.
|
|
289
|
+
<https://arxiv.org/pdf/cond-mat/0209244.pdf>`_
|
|
290
|
+
science, 297(5586), 1551-1555.
|
|
291
|
+
"""
|
|
292
|
+
def __init__(self):
|
|
293
|
+
super(HubPromotedIndex, self).__init__()
|
|
294
|
+
|
|
295
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
296
|
+
"""Prediction for a single node."""
|
|
297
|
+
return np.asarray(hub_promoted_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
298
|
+
np.array(targets, dtype=np.int32)))
|
|
299
|
+
|
|
300
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
301
|
+
"""Prediction for multiple edges."""
|
|
302
|
+
return np.asarray(hub_promoted_edges_core(self.indptr_, self.indices_, edges.astype(np.int32)))
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
class HubDepressedIndex(FirstOrder):
|
|
306
|
+
"""Link prediction by Hub Depressed Index:
|
|
307
|
+
|
|
308
|
+
:math:`s(i, j) = \\dfrac{2|\\Gamma_i \\cap \\Gamma_j|}{max(|\\Gamma_i|,|\\Gamma_j|)}`.
|
|
309
|
+
|
|
310
|
+
Attributes
|
|
311
|
+
----------
|
|
312
|
+
indptr_ : np.ndarray
|
|
313
|
+
Pointer index for neighbors.
|
|
314
|
+
indices_ : np.ndarray
|
|
315
|
+
Concatenation of neighbors.
|
|
316
|
+
|
|
317
|
+
Examples
|
|
318
|
+
--------
|
|
319
|
+
>>> from sknetwork.data import house
|
|
320
|
+
>>> adjacency = house()
|
|
321
|
+
>>> hdi = HubDepressedIndex()
|
|
322
|
+
>>> similarities = hdi.fit_predict(adjacency, 0)
|
|
323
|
+
>>> similarities.round(2)
|
|
324
|
+
array([1. , 0.33, 0.5 , 0.5 , 0.33])
|
|
325
|
+
>>> similarities = hdi.predict([0, 1])
|
|
326
|
+
>>> similarities.round(2)
|
|
327
|
+
array([[1. , 0.33, 0.5 , 0.5 , 0.33],
|
|
328
|
+
[0.33, 1. , 0. , 0.67, 0.33]])
|
|
329
|
+
>>> similarities = hdi.predict((0, 1))
|
|
330
|
+
>>> similarities.round(2)
|
|
331
|
+
0.33
|
|
332
|
+
>>> similarities = hdi.predict([(0, 1), (1, 2)])
|
|
333
|
+
>>> similarities.round(2)
|
|
334
|
+
array([0.33, 0. ])
|
|
335
|
+
|
|
336
|
+
References
|
|
337
|
+
----------
|
|
338
|
+
Ravasz, E., Somera, A. L., Mongru, D. A., Oltvai, Z. N., & Barabási, A. L. (2002).
|
|
339
|
+
`Hierarchical organization of modularity in metabolic networks.
|
|
340
|
+
<https://arxiv.org/pdf/cond-mat/0209244.pdf>`_
|
|
341
|
+
science, 297(5586), 1551-1555.
|
|
342
|
+
"""
|
|
343
|
+
def __init__(self):
|
|
344
|
+
super(HubDepressedIndex, self).__init__()
|
|
345
|
+
|
|
346
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
347
|
+
"""Prediction for a single node."""
|
|
348
|
+
return np.asarray(hub_depressed_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
349
|
+
np.array(targets, dtype=np.int32)))
|
|
350
|
+
|
|
351
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
352
|
+
"""Prediction for multiple edges."""
|
|
353
|
+
return np.asarray(hub_depressed_edges_core(self.indptr_, self.indices_, edges.astype(np.int32)))
|
|
354
|
+
|
|
355
|
+
|
|
356
|
+
class AdamicAdar(FirstOrder):
|
|
357
|
+
"""Link prediction by Adamic-Adar index:
|
|
358
|
+
|
|
359
|
+
:math:`s(i, j) = \\underset{z \\in \\Gamma_i \\cap \\Gamma_j}{\\sum} \\dfrac{1}{\\log |\\Gamma_z|}`.
|
|
360
|
+
|
|
361
|
+
Attributes
|
|
362
|
+
----------
|
|
363
|
+
indptr_ : np.ndarray
|
|
364
|
+
Pointer index for neighbors.
|
|
365
|
+
indices_ : np.ndarray
|
|
366
|
+
Concatenation of neighbors.
|
|
367
|
+
|
|
368
|
+
Examples
|
|
369
|
+
--------
|
|
370
|
+
>>> from sknetwork.data import house
|
|
371
|
+
>>> adjacency = house()
|
|
372
|
+
>>> aa = AdamicAdar()
|
|
373
|
+
>>> similarities = aa.fit_predict(adjacency, 0)
|
|
374
|
+
>>> similarities.round(2)
|
|
375
|
+
array([1.82, 0.91, 0.91, 0.91, 0.91])
|
|
376
|
+
>>> similarities = aa.predict([0, 1])
|
|
377
|
+
>>> similarities.round(2)
|
|
378
|
+
array([[1.82, 0.91, 0.91, 0.91, 0.91],
|
|
379
|
+
[0.91, 3.8 , 0. , 2.35, 1.44]])
|
|
380
|
+
>>> similarities = aa.predict((0, 1))
|
|
381
|
+
>>> similarities.round(2)
|
|
382
|
+
0.91
|
|
383
|
+
>>> similarities = aa.predict([(0, 1), (1, 2)])
|
|
384
|
+
>>> similarities.round(2)
|
|
385
|
+
array([0.91, 0. ])
|
|
386
|
+
|
|
387
|
+
References
|
|
388
|
+
----------
|
|
389
|
+
Adamic, L. A., & Adar, E. (2003). `Friends and neighbors on the web.
|
|
390
|
+
<https://www.sciencedirect.com/science/article/pii/S0378873303000091>`_
|
|
391
|
+
Social networks, 25(3), 211-230.
|
|
392
|
+
"""
|
|
393
|
+
def __init__(self):
|
|
394
|
+
super(AdamicAdar, self).__init__()
|
|
395
|
+
|
|
396
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
397
|
+
"""Prediction for a single node."""
|
|
398
|
+
return np.asarray(adamic_adar_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
399
|
+
np.array(targets, dtype=np.int32)))
|
|
400
|
+
|
|
401
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
402
|
+
"""Prediction for multiple edges."""
|
|
403
|
+
return np.asarray(adamic_adar_edges_core(self.indptr_, self.indices_, edges.astype(np.int32)))
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
class ResourceAllocation(FirstOrder):
|
|
407
|
+
"""Link prediction by Resource Allocation index:
|
|
408
|
+
|
|
409
|
+
:math:`s(i, j) = \\underset{z \\in \\Gamma_i \\cap \\Gamma_j}{\\sum} \\dfrac{1}{|\\Gamma_z|}`.
|
|
410
|
+
|
|
411
|
+
Attributes
|
|
412
|
+
----------
|
|
413
|
+
indptr_ : np.ndarray
|
|
414
|
+
Pointer index for neighbors.
|
|
415
|
+
indices_ : np.ndarray
|
|
416
|
+
Concatenation of neighbors.
|
|
417
|
+
|
|
418
|
+
Examples
|
|
419
|
+
--------
|
|
420
|
+
>>> from sknetwork.data import house
|
|
421
|
+
>>> adjacency = house()
|
|
422
|
+
>>> ra = ResourceAllocation()
|
|
423
|
+
>>> similarities = ra.fit_predict(adjacency, 0)
|
|
424
|
+
>>> similarities.round(2)
|
|
425
|
+
array([0.67, 0.33, 0.33, 0.33, 0.33])
|
|
426
|
+
>>> similarities = ra.predict([0, 1])
|
|
427
|
+
>>> similarities.round(2)
|
|
428
|
+
array([[0.67, 0.33, 0.33, 0.33, 0.33],
|
|
429
|
+
[0.33, 1.33, 0. , 0.83, 0.5 ]])
|
|
430
|
+
>>> similarities = ra.predict((0, 1))
|
|
431
|
+
>>> similarities.round(2)
|
|
432
|
+
0.33
|
|
433
|
+
>>> similarities = ra.predict([(0, 1), (1, 2)])
|
|
434
|
+
>>> similarities.round(2)
|
|
435
|
+
array([0.33, 0. ])
|
|
436
|
+
|
|
437
|
+
References
|
|
438
|
+
----------
|
|
439
|
+
Zhou, T., Lü, L., & Zhang, Y. C. (2009).
|
|
440
|
+
`Predicting missing links via local information.
|
|
441
|
+
<https://link.springer.com/content/pdf/10.1140/epjb/e2009-00335-8.pdf>`_
|
|
442
|
+
The European Physical Journal B, 71(4), 623-630.
|
|
443
|
+
"""
|
|
444
|
+
def __init__(self):
|
|
445
|
+
super(ResourceAllocation, self).__init__()
|
|
446
|
+
|
|
447
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
448
|
+
"""Prediction for a single node."""
|
|
449
|
+
return np.asarray(resource_allocation_node_core(self.indptr_, self.indices_, np.int32(source),
|
|
450
|
+
np.array(targets, dtype=np.int32)))
|
|
451
|
+
|
|
452
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
453
|
+
"""Prediction for multiple edges."""
|
|
454
|
+
return np.asarray(resource_allocation_edges_core(self.indptr_, self.indices_, edges.astype(np.int32)))
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
class PreferentialAttachment(FirstOrder):
|
|
458
|
+
"""Link prediction by Preferential Attachment index:
|
|
459
|
+
|
|
460
|
+
:math:`s(i, j) = |\\Gamma_i||\\Gamma_j|`.
|
|
461
|
+
|
|
462
|
+
Attributes
|
|
463
|
+
----------
|
|
464
|
+
indptr_ : np.ndarray
|
|
465
|
+
Pointer index for neighbors.
|
|
466
|
+
indices_ : np.ndarray
|
|
467
|
+
Concatenation of neighbors.
|
|
468
|
+
|
|
469
|
+
Examples
|
|
470
|
+
--------
|
|
471
|
+
>>> from sknetwork.data import house
|
|
472
|
+
>>> adjacency = house()
|
|
473
|
+
>>> pa = PreferentialAttachment()
|
|
474
|
+
>>> similarities = pa.fit_predict(adjacency, 0)
|
|
475
|
+
>>> similarities
|
|
476
|
+
array([4, 6, 4, 4, 6], dtype=int32)
|
|
477
|
+
>>> similarities = pa.predict([0, 1])
|
|
478
|
+
>>> similarities
|
|
479
|
+
array([[4, 6, 4, 4, 6],
|
|
480
|
+
[6, 9, 6, 6, 9]], dtype=int32)
|
|
481
|
+
>>> similarities = pa.predict((0, 1))
|
|
482
|
+
>>> similarities
|
|
483
|
+
6
|
|
484
|
+
>>> similarities = pa.predict([(0, 1), (1, 2)])
|
|
485
|
+
>>> similarities
|
|
486
|
+
array([6, 6], dtype=int32)
|
|
487
|
+
|
|
488
|
+
References
|
|
489
|
+
----------
|
|
490
|
+
Albert, R., Barabási, L. (2002). `Statistical mechanics of complex networks
|
|
491
|
+
<https://journals.aps.org/rmp/abstract/10.1103/RevModPhys.74.47>`_
|
|
492
|
+
Reviews of Modern Physics.
|
|
493
|
+
"""
|
|
494
|
+
def __init__(self):
|
|
495
|
+
super(PreferentialAttachment, self).__init__()
|
|
496
|
+
|
|
497
|
+
def _predict_base(self, source: int, targets: Iterable):
|
|
498
|
+
"""Prediction for a single node."""
|
|
499
|
+
deg_src = self.indptr_[source+1] - self.indptr_[source]
|
|
500
|
+
tgt = np.array(targets)
|
|
501
|
+
deg_tgt = self.indptr_[tgt+1] - self.indptr_[tgt]
|
|
502
|
+
return deg_src * deg_tgt
|
|
503
|
+
|
|
504
|
+
def _predict_edges(self, edges: np.ndarray):
|
|
505
|
+
"""Prediction for multiple edges."""
|
|
506
|
+
deg_src = self.indptr_[edges[:, 0] + 1] - self.indptr_[edges[:, 0]]
|
|
507
|
+
deg_tgt = self.indptr_[edges[:, 1] + 1] - self.indptr_[edges[:, 1]]
|
|
508
|
+
return deg_src * deg_tgt
|
|
Binary file
|