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.

Files changed (240) hide show
  1. scikit_network-0.28.3.dist-info/AUTHORS.rst +41 -0
  2. scikit_network-0.28.3.dist-info/LICENSE +34 -0
  3. scikit_network-0.28.3.dist-info/METADATA +457 -0
  4. scikit_network-0.28.3.dist-info/RECORD +240 -0
  5. scikit_network-0.28.3.dist-info/WHEEL +5 -0
  6. scikit_network-0.28.3.dist-info/top_level.txt +1 -0
  7. sknetwork/__init__.py +21 -0
  8. sknetwork/classification/__init__.py +8 -0
  9. sknetwork/classification/base.py +84 -0
  10. sknetwork/classification/base_rank.py +143 -0
  11. sknetwork/classification/diffusion.py +134 -0
  12. sknetwork/classification/knn.py +162 -0
  13. sknetwork/classification/metrics.py +205 -0
  14. sknetwork/classification/pagerank.py +66 -0
  15. sknetwork/classification/propagation.py +152 -0
  16. sknetwork/classification/tests/__init__.py +1 -0
  17. sknetwork/classification/tests/test_API.py +35 -0
  18. sknetwork/classification/tests/test_diffusion.py +37 -0
  19. sknetwork/classification/tests/test_knn.py +24 -0
  20. sknetwork/classification/tests/test_metrics.py +53 -0
  21. sknetwork/classification/tests/test_pagerank.py +20 -0
  22. sknetwork/classification/tests/test_propagation.py +24 -0
  23. sknetwork/classification/vote.cpython-39-darwin.so +0 -0
  24. sknetwork/classification/vote.pyx +58 -0
  25. sknetwork/clustering/__init__.py +7 -0
  26. sknetwork/clustering/base.py +102 -0
  27. sknetwork/clustering/kmeans.py +142 -0
  28. sknetwork/clustering/louvain.py +255 -0
  29. sknetwork/clustering/louvain_core.cpython-39-darwin.so +0 -0
  30. sknetwork/clustering/louvain_core.pyx +134 -0
  31. sknetwork/clustering/metrics.py +91 -0
  32. sknetwork/clustering/postprocess.py +66 -0
  33. sknetwork/clustering/propagation_clustering.py +108 -0
  34. sknetwork/clustering/tests/__init__.py +1 -0
  35. sknetwork/clustering/tests/test_API.py +37 -0
  36. sknetwork/clustering/tests/test_kmeans.py +47 -0
  37. sknetwork/clustering/tests/test_louvain.py +104 -0
  38. sknetwork/clustering/tests/test_metrics.py +50 -0
  39. sknetwork/clustering/tests/test_post_processing.py +23 -0
  40. sknetwork/clustering/tests/test_postprocess.py +39 -0
  41. sknetwork/data/__init__.py +5 -0
  42. sknetwork/data/load.py +408 -0
  43. sknetwork/data/models.py +459 -0
  44. sknetwork/data/parse.py +621 -0
  45. sknetwork/data/test_graphs.py +84 -0
  46. sknetwork/data/tests/__init__.py +1 -0
  47. sknetwork/data/tests/test_API.py +30 -0
  48. sknetwork/data/tests/test_load.py +95 -0
  49. sknetwork/data/tests/test_models.py +52 -0
  50. sknetwork/data/tests/test_parse.py +253 -0
  51. sknetwork/data/tests/test_test_graphs.py +30 -0
  52. sknetwork/data/tests/test_toy_graphs.py +68 -0
  53. sknetwork/data/toy_graphs.py +619 -0
  54. sknetwork/embedding/__init__.py +10 -0
  55. sknetwork/embedding/base.py +90 -0
  56. sknetwork/embedding/force_atlas.py +197 -0
  57. sknetwork/embedding/louvain_embedding.py +174 -0
  58. sknetwork/embedding/louvain_hierarchy.py +142 -0
  59. sknetwork/embedding/metrics.py +66 -0
  60. sknetwork/embedding/random_projection.py +133 -0
  61. sknetwork/embedding/spectral.py +214 -0
  62. sknetwork/embedding/spring.py +198 -0
  63. sknetwork/embedding/svd.py +363 -0
  64. sknetwork/embedding/tests/__init__.py +1 -0
  65. sknetwork/embedding/tests/test_API.py +73 -0
  66. sknetwork/embedding/tests/test_force_atlas.py +35 -0
  67. sknetwork/embedding/tests/test_louvain_embedding.py +33 -0
  68. sknetwork/embedding/tests/test_louvain_hierarchy.py +19 -0
  69. sknetwork/embedding/tests/test_metrics.py +29 -0
  70. sknetwork/embedding/tests/test_random_projection.py +28 -0
  71. sknetwork/embedding/tests/test_spectral.py +84 -0
  72. sknetwork/embedding/tests/test_spring.py +50 -0
  73. sknetwork/embedding/tests/test_svd.py +37 -0
  74. sknetwork/flow/__init__.py +3 -0
  75. sknetwork/flow/flow.py +73 -0
  76. sknetwork/flow/tests/__init__.py +1 -0
  77. sknetwork/flow/tests/test_flow.py +17 -0
  78. sknetwork/flow/tests/test_utils.py +69 -0
  79. sknetwork/flow/utils.py +91 -0
  80. sknetwork/gnn/__init__.py +10 -0
  81. sknetwork/gnn/activation.py +117 -0
  82. sknetwork/gnn/base.py +155 -0
  83. sknetwork/gnn/base_activation.py +89 -0
  84. sknetwork/gnn/base_layer.py +109 -0
  85. sknetwork/gnn/gnn_classifier.py +381 -0
  86. sknetwork/gnn/layer.py +153 -0
  87. sknetwork/gnn/layers.py +127 -0
  88. sknetwork/gnn/loss.py +180 -0
  89. sknetwork/gnn/neighbor_sampler.py +65 -0
  90. sknetwork/gnn/optimizer.py +163 -0
  91. sknetwork/gnn/tests/__init__.py +1 -0
  92. sknetwork/gnn/tests/test_activation.py +56 -0
  93. sknetwork/gnn/tests/test_base.py +79 -0
  94. sknetwork/gnn/tests/test_base_layer.py +37 -0
  95. sknetwork/gnn/tests/test_gnn_classifier.py +192 -0
  96. sknetwork/gnn/tests/test_layers.py +80 -0
  97. sknetwork/gnn/tests/test_loss.py +33 -0
  98. sknetwork/gnn/tests/test_neigh_sampler.py +23 -0
  99. sknetwork/gnn/tests/test_optimizer.py +43 -0
  100. sknetwork/gnn/tests/test_utils.py +93 -0
  101. sknetwork/gnn/utils.py +219 -0
  102. sknetwork/hierarchy/__init__.py +7 -0
  103. sknetwork/hierarchy/base.py +69 -0
  104. sknetwork/hierarchy/louvain_hierarchy.py +264 -0
  105. sknetwork/hierarchy/metrics.py +234 -0
  106. sknetwork/hierarchy/paris.cpython-39-darwin.so +0 -0
  107. sknetwork/hierarchy/paris.pyx +317 -0
  108. sknetwork/hierarchy/postprocess.py +350 -0
  109. sknetwork/hierarchy/tests/__init__.py +1 -0
  110. sknetwork/hierarchy/tests/test_API.py +25 -0
  111. sknetwork/hierarchy/tests/test_algos.py +29 -0
  112. sknetwork/hierarchy/tests/test_metrics.py +62 -0
  113. sknetwork/hierarchy/tests/test_postprocess.py +57 -0
  114. sknetwork/hierarchy/tests/test_ward.py +25 -0
  115. sknetwork/hierarchy/ward.py +94 -0
  116. sknetwork/linalg/__init__.py +9 -0
  117. sknetwork/linalg/basics.py +37 -0
  118. sknetwork/linalg/diteration.cpython-39-darwin.so +0 -0
  119. sknetwork/linalg/diteration.pyx +49 -0
  120. sknetwork/linalg/eig_solver.py +93 -0
  121. sknetwork/linalg/laplacian.py +15 -0
  122. sknetwork/linalg/normalization.py +66 -0
  123. sknetwork/linalg/operators.py +225 -0
  124. sknetwork/linalg/polynome.py +76 -0
  125. sknetwork/linalg/ppr_solver.py +170 -0
  126. sknetwork/linalg/push.cpython-39-darwin.so +0 -0
  127. sknetwork/linalg/push.pyx +73 -0
  128. sknetwork/linalg/sparse_lowrank.py +142 -0
  129. sknetwork/linalg/svd_solver.py +91 -0
  130. sknetwork/linalg/tests/__init__.py +1 -0
  131. sknetwork/linalg/tests/test_eig.py +44 -0
  132. sknetwork/linalg/tests/test_laplacian.py +18 -0
  133. sknetwork/linalg/tests/test_normalization.py +38 -0
  134. sknetwork/linalg/tests/test_operators.py +70 -0
  135. sknetwork/linalg/tests/test_polynome.py +38 -0
  136. sknetwork/linalg/tests/test_ppr.py +50 -0
  137. sknetwork/linalg/tests/test_sparse_lowrank.py +61 -0
  138. sknetwork/linalg/tests/test_svd.py +38 -0
  139. sknetwork/linkpred/__init__.py +4 -0
  140. sknetwork/linkpred/base.py +80 -0
  141. sknetwork/linkpred/first_order.py +508 -0
  142. sknetwork/linkpred/first_order_core.cpython-39-darwin.so +0 -0
  143. sknetwork/linkpred/first_order_core.pyx +315 -0
  144. sknetwork/linkpred/postprocessing.py +98 -0
  145. sknetwork/linkpred/tests/__init__.py +1 -0
  146. sknetwork/linkpred/tests/test_API.py +49 -0
  147. sknetwork/linkpred/tests/test_postprocessing.py +21 -0
  148. sknetwork/path/__init__.py +4 -0
  149. sknetwork/path/metrics.py +148 -0
  150. sknetwork/path/search.py +65 -0
  151. sknetwork/path/shortest_path.py +186 -0
  152. sknetwork/path/tests/__init__.py +1 -0
  153. sknetwork/path/tests/test_metrics.py +29 -0
  154. sknetwork/path/tests/test_search.py +25 -0
  155. sknetwork/path/tests/test_shortest_path.py +45 -0
  156. sknetwork/ranking/__init__.py +9 -0
  157. sknetwork/ranking/base.py +56 -0
  158. sknetwork/ranking/betweenness.cpython-39-darwin.so +0 -0
  159. sknetwork/ranking/betweenness.pyx +99 -0
  160. sknetwork/ranking/closeness.py +95 -0
  161. sknetwork/ranking/harmonic.py +82 -0
  162. sknetwork/ranking/hits.py +94 -0
  163. sknetwork/ranking/katz.py +81 -0
  164. sknetwork/ranking/pagerank.py +107 -0
  165. sknetwork/ranking/postprocess.py +25 -0
  166. sknetwork/ranking/tests/__init__.py +1 -0
  167. sknetwork/ranking/tests/test_API.py +34 -0
  168. sknetwork/ranking/tests/test_betweenness.py +38 -0
  169. sknetwork/ranking/tests/test_closeness.py +34 -0
  170. sknetwork/ranking/tests/test_hits.py +20 -0
  171. sknetwork/ranking/tests/test_pagerank.py +69 -0
  172. sknetwork/regression/__init__.py +4 -0
  173. sknetwork/regression/base.py +56 -0
  174. sknetwork/regression/diffusion.py +190 -0
  175. sknetwork/regression/tests/__init__.py +1 -0
  176. sknetwork/regression/tests/test_API.py +34 -0
  177. sknetwork/regression/tests/test_diffusion.py +48 -0
  178. sknetwork/sknetwork.py +3 -0
  179. sknetwork/topology/__init__.py +9 -0
  180. sknetwork/topology/dag.py +74 -0
  181. sknetwork/topology/dag_core.cpython-39-darwin.so +0 -0
  182. sknetwork/topology/dag_core.pyx +38 -0
  183. sknetwork/topology/kcliques.cpython-39-darwin.so +0 -0
  184. sknetwork/topology/kcliques.pyx +193 -0
  185. sknetwork/topology/kcore.cpython-39-darwin.so +0 -0
  186. sknetwork/topology/kcore.pyx +120 -0
  187. sknetwork/topology/structure.py +234 -0
  188. sknetwork/topology/tests/__init__.py +1 -0
  189. sknetwork/topology/tests/test_cliques.py +28 -0
  190. sknetwork/topology/tests/test_cores.py +21 -0
  191. sknetwork/topology/tests/test_dag.py +26 -0
  192. sknetwork/topology/tests/test_structure.py +99 -0
  193. sknetwork/topology/tests/test_triangles.py +42 -0
  194. sknetwork/topology/tests/test_wl_coloring.py +49 -0
  195. sknetwork/topology/tests/test_wl_kernel.py +31 -0
  196. sknetwork/topology/triangles.cpython-39-darwin.so +0 -0
  197. sknetwork/topology/triangles.pyx +166 -0
  198. sknetwork/topology/weisfeiler_lehman.py +163 -0
  199. sknetwork/topology/weisfeiler_lehman_core.cpython-39-darwin.so +0 -0
  200. sknetwork/topology/weisfeiler_lehman_core.pyx +116 -0
  201. sknetwork/utils/__init__.py +40 -0
  202. sknetwork/utils/base.py +35 -0
  203. sknetwork/utils/check.py +354 -0
  204. sknetwork/utils/co_neighbor.py +71 -0
  205. sknetwork/utils/format.py +219 -0
  206. sknetwork/utils/kmeans.py +89 -0
  207. sknetwork/utils/knn.py +166 -0
  208. sknetwork/utils/knn1d.cpython-39-darwin.so +0 -0
  209. sknetwork/utils/knn1d.pyx +80 -0
  210. sknetwork/utils/membership.py +82 -0
  211. sknetwork/utils/minheap.cpython-39-darwin.so +0 -0
  212. sknetwork/utils/minheap.pxd +22 -0
  213. sknetwork/utils/minheap.pyx +111 -0
  214. sknetwork/utils/neighbors.py +115 -0
  215. sknetwork/utils/seeds.py +75 -0
  216. sknetwork/utils/simplex.py +140 -0
  217. sknetwork/utils/tests/__init__.py +1 -0
  218. sknetwork/utils/tests/test_base.py +28 -0
  219. sknetwork/utils/tests/test_bunch.py +16 -0
  220. sknetwork/utils/tests/test_check.py +190 -0
  221. sknetwork/utils/tests/test_co_neighbor.py +43 -0
  222. sknetwork/utils/tests/test_format.py +61 -0
  223. sknetwork/utils/tests/test_kmeans.py +21 -0
  224. sknetwork/utils/tests/test_knn.py +32 -0
  225. sknetwork/utils/tests/test_membership.py +24 -0
  226. sknetwork/utils/tests/test_neighbors.py +41 -0
  227. sknetwork/utils/tests/test_projection_simplex.py +33 -0
  228. sknetwork/utils/tests/test_seeds.py +67 -0
  229. sknetwork/utils/tests/test_verbose.py +15 -0
  230. sknetwork/utils/tests/test_ward.py +20 -0
  231. sknetwork/utils/timeout.py +38 -0
  232. sknetwork/utils/verbose.py +37 -0
  233. sknetwork/utils/ward.py +60 -0
  234. sknetwork/visualization/__init__.py +4 -0
  235. sknetwork/visualization/colors.py +34 -0
  236. sknetwork/visualization/dendrograms.py +229 -0
  237. sknetwork/visualization/graphs.py +819 -0
  238. sknetwork/visualization/tests/__init__.py +1 -0
  239. sknetwork/visualization/tests/test_dendrograms.py +53 -0
  240. 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