scikit-network 0.33.3__cp313-cp313-win_amd64.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.33.3.dist-info/METADATA +122 -0
- scikit_network-0.33.3.dist-info/RECORD +228 -0
- scikit_network-0.33.3.dist-info/WHEEL +5 -0
- scikit_network-0.33.3.dist-info/licenses/AUTHORS.rst +43 -0
- scikit_network-0.33.3.dist-info/licenses/LICENSE +34 -0
- scikit_network-0.33.3.dist-info/top_level.txt +1 -0
- sknetwork/__init__.py +21 -0
- sknetwork/base.py +67 -0
- sknetwork/classification/__init__.py +8 -0
- sknetwork/classification/base.py +142 -0
- sknetwork/classification/base_rank.py +133 -0
- sknetwork/classification/diffusion.py +134 -0
- sknetwork/classification/knn.py +139 -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 +30 -0
- sknetwork/classification/tests/test_diffusion.py +77 -0
- sknetwork/classification/tests/test_knn.py +23 -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.cp313-win_amd64.pyd +0 -0
- sknetwork/classification/vote.cpp +27584 -0
- sknetwork/classification/vote.pyx +56 -0
- sknetwork/clustering/__init__.py +8 -0
- sknetwork/clustering/base.py +172 -0
- sknetwork/clustering/kcenters.py +253 -0
- sknetwork/clustering/leiden.py +242 -0
- sknetwork/clustering/leiden_core.cp313-win_amd64.pyd +0 -0
- sknetwork/clustering/leiden_core.cpp +31575 -0
- sknetwork/clustering/leiden_core.pyx +124 -0
- sknetwork/clustering/louvain.py +286 -0
- sknetwork/clustering/louvain_core.cp313-win_amd64.pyd +0 -0
- sknetwork/clustering/louvain_core.cpp +31220 -0
- sknetwork/clustering/louvain_core.pyx +124 -0
- sknetwork/clustering/metrics.py +91 -0
- sknetwork/clustering/postprocess.py +66 -0
- sknetwork/clustering/propagation_clustering.py +104 -0
- sknetwork/clustering/tests/__init__.py +1 -0
- sknetwork/clustering/tests/test_API.py +38 -0
- sknetwork/clustering/tests/test_kcenters.py +60 -0
- sknetwork/clustering/tests/test_leiden.py +34 -0
- sknetwork/clustering/tests/test_louvain.py +135 -0
- sknetwork/clustering/tests/test_metrics.py +50 -0
- sknetwork/clustering/tests/test_postprocess.py +39 -0
- sknetwork/data/__init__.py +6 -0
- sknetwork/data/base.py +33 -0
- sknetwork/data/load.py +406 -0
- sknetwork/data/models.py +459 -0
- sknetwork/data/parse.py +644 -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_base.py +14 -0
- sknetwork/data/tests/test_load.py +95 -0
- sknetwork/data/tests/test_models.py +52 -0
- sknetwork/data/tests/test_parse.py +250 -0
- sknetwork/data/tests/test_test_graphs.py +29 -0
- sknetwork/data/tests/test_toy_graphs.py +68 -0
- sknetwork/data/timeout.py +38 -0
- sknetwork/data/toy_graphs.py +611 -0
- sknetwork/embedding/__init__.py +8 -0
- sknetwork/embedding/base.py +94 -0
- sknetwork/embedding/force_atlas.py +198 -0
- sknetwork/embedding/louvain_embedding.py +148 -0
- sknetwork/embedding/random_projection.py +135 -0
- sknetwork/embedding/spectral.py +141 -0
- sknetwork/embedding/spring.py +198 -0
- sknetwork/embedding/svd.py +359 -0
- sknetwork/embedding/tests/__init__.py +1 -0
- sknetwork/embedding/tests/test_API.py +49 -0
- sknetwork/embedding/tests/test_force_atlas.py +35 -0
- sknetwork/embedding/tests/test_louvain_embedding.py +33 -0
- sknetwork/embedding/tests/test_random_projection.py +28 -0
- sknetwork/embedding/tests/test_spectral.py +81 -0
- sknetwork/embedding/tests/test_spring.py +50 -0
- sknetwork/embedding/tests/test_svd.py +43 -0
- sknetwork/gnn/__init__.py +10 -0
- sknetwork/gnn/activation.py +117 -0
- sknetwork/gnn/base.py +181 -0
- sknetwork/gnn/base_activation.py +90 -0
- sknetwork/gnn/base_layer.py +109 -0
- sknetwork/gnn/gnn_classifier.py +305 -0
- sknetwork/gnn/layer.py +153 -0
- sknetwork/gnn/loss.py +180 -0
- sknetwork/gnn/neighbor_sampler.py +65 -0
- sknetwork/gnn/optimizer.py +164 -0
- sknetwork/gnn/tests/__init__.py +1 -0
- sknetwork/gnn/tests/test_activation.py +56 -0
- sknetwork/gnn/tests/test_base.py +75 -0
- sknetwork/gnn/tests/test_base_layer.py +37 -0
- sknetwork/gnn/tests/test_gnn_classifier.py +130 -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 +41 -0
- sknetwork/gnn/utils.py +127 -0
- sknetwork/hierarchy/__init__.py +6 -0
- sknetwork/hierarchy/base.py +96 -0
- sknetwork/hierarchy/louvain_hierarchy.py +272 -0
- sknetwork/hierarchy/metrics.py +234 -0
- sknetwork/hierarchy/paris.cp313-win_amd64.pyd +0 -0
- sknetwork/hierarchy/paris.cpp +37868 -0
- sknetwork/hierarchy/paris.pyx +316 -0
- sknetwork/hierarchy/postprocess.py +350 -0
- sknetwork/hierarchy/tests/__init__.py +1 -0
- sknetwork/hierarchy/tests/test_API.py +24 -0
- sknetwork/hierarchy/tests/test_algos.py +34 -0
- sknetwork/hierarchy/tests/test_metrics.py +62 -0
- sknetwork/hierarchy/tests/test_postprocess.py +57 -0
- sknetwork/linalg/__init__.py +9 -0
- sknetwork/linalg/basics.py +37 -0
- sknetwork/linalg/diteration.cp313-win_amd64.pyd +0 -0
- sknetwork/linalg/diteration.cpp +27400 -0
- sknetwork/linalg/diteration.pyx +47 -0
- sknetwork/linalg/eig_solver.py +93 -0
- sknetwork/linalg/laplacian.py +15 -0
- sknetwork/linalg/normalizer.py +86 -0
- sknetwork/linalg/operators.py +225 -0
- sknetwork/linalg/polynome.py +76 -0
- sknetwork/linalg/ppr_solver.py +170 -0
- sknetwork/linalg/push.cp313-win_amd64.pyd +0 -0
- sknetwork/linalg/push.cpp +31072 -0
- sknetwork/linalg/push.pyx +71 -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 +34 -0
- sknetwork/linalg/tests/test_operators.py +66 -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 +2 -0
- sknetwork/linkpred/base.py +46 -0
- sknetwork/linkpred/nn.py +126 -0
- sknetwork/linkpred/tests/__init__.py +1 -0
- sknetwork/linkpred/tests/test_nn.py +27 -0
- sknetwork/log.py +19 -0
- sknetwork/path/__init__.py +5 -0
- sknetwork/path/dag.py +54 -0
- sknetwork/path/distances.py +98 -0
- sknetwork/path/search.py +31 -0
- sknetwork/path/shortest_path.py +61 -0
- sknetwork/path/tests/__init__.py +1 -0
- sknetwork/path/tests/test_dag.py +37 -0
- sknetwork/path/tests/test_distances.py +62 -0
- sknetwork/path/tests/test_search.py +40 -0
- sknetwork/path/tests/test_shortest_path.py +40 -0
- sknetwork/ranking/__init__.py +8 -0
- sknetwork/ranking/base.py +61 -0
- sknetwork/ranking/betweenness.cp313-win_amd64.pyd +0 -0
- sknetwork/ranking/betweenness.cpp +9707 -0
- sknetwork/ranking/betweenness.pyx +97 -0
- sknetwork/ranking/closeness.py +92 -0
- sknetwork/ranking/hits.py +94 -0
- sknetwork/ranking/katz.py +83 -0
- sknetwork/ranking/pagerank.py +110 -0
- sknetwork/ranking/postprocess.py +37 -0
- sknetwork/ranking/tests/__init__.py +1 -0
- sknetwork/ranking/tests/test_API.py +32 -0
- sknetwork/ranking/tests/test_betweenness.py +38 -0
- sknetwork/ranking/tests/test_closeness.py +30 -0
- sknetwork/ranking/tests/test_hits.py +20 -0
- sknetwork/ranking/tests/test_pagerank.py +62 -0
- sknetwork/ranking/tests/test_postprocess.py +26 -0
- sknetwork/regression/__init__.py +4 -0
- sknetwork/regression/base.py +61 -0
- sknetwork/regression/diffusion.py +210 -0
- sknetwork/regression/tests/__init__.py +1 -0
- sknetwork/regression/tests/test_API.py +32 -0
- sknetwork/regression/tests/test_diffusion.py +56 -0
- sknetwork/sknetwork.py +3 -0
- sknetwork/test_base.py +35 -0
- sknetwork/test_log.py +15 -0
- sknetwork/topology/__init__.py +8 -0
- sknetwork/topology/cliques.cp313-win_amd64.pyd +0 -0
- sknetwork/topology/cliques.cpp +32565 -0
- sknetwork/topology/cliques.pyx +149 -0
- sknetwork/topology/core.cp313-win_amd64.pyd +0 -0
- sknetwork/topology/core.cpp +30651 -0
- sknetwork/topology/core.pyx +90 -0
- sknetwork/topology/cycles.py +243 -0
- sknetwork/topology/minheap.cp313-win_amd64.pyd +0 -0
- sknetwork/topology/minheap.cpp +27332 -0
- sknetwork/topology/minheap.pxd +20 -0
- sknetwork/topology/minheap.pyx +109 -0
- sknetwork/topology/structure.py +194 -0
- sknetwork/topology/tests/__init__.py +1 -0
- sknetwork/topology/tests/test_cliques.py +28 -0
- sknetwork/topology/tests/test_core.py +19 -0
- sknetwork/topology/tests/test_cycles.py +65 -0
- sknetwork/topology/tests/test_structure.py +85 -0
- sknetwork/topology/tests/test_triangles.py +38 -0
- sknetwork/topology/tests/test_wl.py +72 -0
- sknetwork/topology/triangles.cp313-win_amd64.pyd +0 -0
- sknetwork/topology/triangles.cpp +8894 -0
- sknetwork/topology/triangles.pyx +151 -0
- sknetwork/topology/weisfeiler_lehman.py +133 -0
- sknetwork/topology/weisfeiler_lehman_core.cp313-win_amd64.pyd +0 -0
- sknetwork/topology/weisfeiler_lehman_core.cpp +27635 -0
- sknetwork/topology/weisfeiler_lehman_core.pyx +114 -0
- sknetwork/utils/__init__.py +7 -0
- sknetwork/utils/check.py +355 -0
- sknetwork/utils/format.py +221 -0
- sknetwork/utils/membership.py +82 -0
- sknetwork/utils/neighbors.py +115 -0
- sknetwork/utils/tests/__init__.py +1 -0
- sknetwork/utils/tests/test_check.py +190 -0
- sknetwork/utils/tests/test_format.py +63 -0
- sknetwork/utils/tests/test_membership.py +24 -0
- sknetwork/utils/tests/test_neighbors.py +41 -0
- sknetwork/utils/tests/test_tfidf.py +18 -0
- sknetwork/utils/tests/test_values.py +66 -0
- sknetwork/utils/tfidf.py +37 -0
- sknetwork/utils/values.py +76 -0
- sknetwork/visualization/__init__.py +4 -0
- sknetwork/visualization/colors.py +34 -0
- sknetwork/visualization/dendrograms.py +277 -0
- sknetwork/visualization/graphs.py +1039 -0
- sknetwork/visualization/tests/__init__.py +1 -0
- sknetwork/visualization/tests/test_dendrograms.py +53 -0
- sknetwork/visualization/tests/test_graphs.py +176 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
Created on Apr 2020
|
|
5
|
+
@author: Nathan de Lara <nathan.delara@polytechnique.org>
|
|
6
|
+
"""
|
|
7
|
+
from typing import Union
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
from scipy import sparse
|
|
11
|
+
from scipy.sparse.linalg import eigs, LinearOperator, bicgstab
|
|
12
|
+
|
|
13
|
+
from sknetwork.linalg.diteration import diffusion
|
|
14
|
+
from sknetwork.linalg.push import push_pagerank
|
|
15
|
+
from sknetwork.linalg.normalizer import normalize
|
|
16
|
+
from sknetwork.linalg.polynome import Polynome
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class RandomSurferOperator(LinearOperator):
|
|
20
|
+
"""Random surfer as a LinearOperator
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
adjacency :
|
|
25
|
+
Adjacency matrix of the graph as a CSR or a LinearOperator.
|
|
26
|
+
damping_factor : float
|
|
27
|
+
Probability to continue the random walk.
|
|
28
|
+
seeds :
|
|
29
|
+
Probability vector for seeds.
|
|
30
|
+
|
|
31
|
+
Attributes
|
|
32
|
+
----------
|
|
33
|
+
a : sparse.csr_matrix
|
|
34
|
+
Scaled transposed transition matrix.
|
|
35
|
+
b : np.ndarray
|
|
36
|
+
Scaled restart probability vector.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, adjacency: Union[sparse.csr_matrix, LinearOperator], seeds: np.ndarray, damping_factor):
|
|
40
|
+
super(RandomSurferOperator, self).__init__(shape=adjacency.shape, dtype=float)
|
|
41
|
+
|
|
42
|
+
n = adjacency.shape[0]
|
|
43
|
+
out_degrees = adjacency.dot(np.ones(n)).astype(bool)
|
|
44
|
+
|
|
45
|
+
if hasattr(adjacency, 'left_sparse_dot'):
|
|
46
|
+
self.a = damping_factor * normalize(adjacency).T
|
|
47
|
+
else:
|
|
48
|
+
self.a = (damping_factor * normalize(adjacency)).T.tocsr()
|
|
49
|
+
self.b = (np.ones(n) - damping_factor * out_degrees) * seeds
|
|
50
|
+
|
|
51
|
+
def _matvec(self, x: np.ndarray):
|
|
52
|
+
return self.a.dot(x) + self.b * x.sum()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get_pagerank(adjacency: Union[sparse.csr_matrix, LinearOperator], seeds: np.ndarray, damping_factor: float,
|
|
56
|
+
n_iter: int, tol: float = 1e-6, solver: str = 'piteration') -> np.ndarray:
|
|
57
|
+
"""Solve the Pagerank problem. Formally,
|
|
58
|
+
|
|
59
|
+
:math:`x = \\alpha Px + (1-\\alpha)y`,
|
|
60
|
+
|
|
61
|
+
where :math:`P = (D^{-1}A)^T` is the transition matrix and :math:`y` is the personalization probability vector.
|
|
62
|
+
|
|
63
|
+
Parameters
|
|
64
|
+
----------
|
|
65
|
+
adjacency : sparse.csr_matrix
|
|
66
|
+
Adjacency matrix of the graph.
|
|
67
|
+
seeds : np.ndarray
|
|
68
|
+
Personalization array. Must be a valid probability vector.
|
|
69
|
+
damping_factor : float
|
|
70
|
+
Probability to continue the random walk.
|
|
71
|
+
n_iter : int
|
|
72
|
+
Number of iterations for some of the solvers such as ``'piteration'`` or ``'diteration'``.
|
|
73
|
+
tol : float
|
|
74
|
+
Tolerance for the convergence of some solvers such as ``'bicgstab'`` or ``'lanczos'`` or ``'push'``.
|
|
75
|
+
solver : :obj:`str`
|
|
76
|
+
Which solver to use: ``'piteration'``, ``'diteration'``, ``'bicgstab'``, ``'lanczos'``, ``̀'RH'``, ``'push'``.
|
|
77
|
+
|
|
78
|
+
Returns
|
|
79
|
+
-------
|
|
80
|
+
pagerank : np.ndarray
|
|
81
|
+
Probability vector.
|
|
82
|
+
|
|
83
|
+
Examples
|
|
84
|
+
--------
|
|
85
|
+
>>> from sknetwork.data import house
|
|
86
|
+
>>> adjacency = house()
|
|
87
|
+
>>> seeds = np.array([1, 0, 0, 0, 0])
|
|
88
|
+
>>> scores = get_pagerank(adjacency, seeds, damping_factor=0.85, n_iter=10)
|
|
89
|
+
>>> np.round(scores, 2)
|
|
90
|
+
array([0.29, 0.24, 0.12, 0.12, 0.24])
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
References
|
|
94
|
+
----------
|
|
95
|
+
* Hong, D. (2012). `Optimized on-line computation of pagerank algorithm.
|
|
96
|
+
<https://arxiv.org/pdf/1202.6158.pdf>`_
|
|
97
|
+
arXiv preprint arXiv:1202.6158.
|
|
98
|
+
* Van der Vorst, H. A. (1992). `Bi-CGSTAB:
|
|
99
|
+
<https://en.wikipedia.org/wiki/Biconjugate_gradient_stabilized_method>`_
|
|
100
|
+
A fast and smoothly converging variant of Bi-CG for the solution of nonsymmetric linear systems.
|
|
101
|
+
SIAM Journal on scientific and Statistical Computing, 13(2), 631-644.
|
|
102
|
+
* Lanczos, C. (1950).
|
|
103
|
+
`An iteration method for the solution of the eigenvalue problem of linear differential and integral operators.
|
|
104
|
+
<http://www.cs.umd.edu/~oleary/lanczos1950.pdf>`_
|
|
105
|
+
Los Angeles, CA: United States Governm. Press Office.
|
|
106
|
+
* Whang, J. , Lenharth, A. , Dhillon, I. , & Pingali, K. . (2015).
|
|
107
|
+
`Scalable Data-Driven PageRank: Algorithms, System Issues, and Lessons Learned`. 9233, 438-450.
|
|
108
|
+
<https://www.cs.utexas.edu/users/inderjit/public_papers/scalable_pagerank_europar15.pdf>
|
|
109
|
+
"""
|
|
110
|
+
n = adjacency.shape[0]
|
|
111
|
+
|
|
112
|
+
if solver == 'diteration':
|
|
113
|
+
if not isinstance(adjacency, sparse.csr_matrix):
|
|
114
|
+
raise ValueError('D-iteration is not compatible with linear operators.')
|
|
115
|
+
adjacency = normalize(adjacency, p=1)
|
|
116
|
+
indptr = adjacency.indptr.astype(np.int32)
|
|
117
|
+
indices = adjacency.indices.astype(np.int32)
|
|
118
|
+
data = adjacency.data.astype(np.float32)
|
|
119
|
+
damping_factor = np.float32(damping_factor)
|
|
120
|
+
n_iter = np.int32(n_iter)
|
|
121
|
+
tol = np.float32(tol)
|
|
122
|
+
|
|
123
|
+
scores = np.zeros(n, dtype=np.float32)
|
|
124
|
+
fluid = (1 - damping_factor) * seeds.astype(np.float32)
|
|
125
|
+
diffusion(indptr, indices, data, scores, fluid, damping_factor, n_iter, tol)
|
|
126
|
+
|
|
127
|
+
elif solver == 'push':
|
|
128
|
+
n = adjacency.shape[0]
|
|
129
|
+
damping_factor = np.float32(damping_factor)
|
|
130
|
+
tol = np.float32(tol)
|
|
131
|
+
degrees = adjacency.dot(np.ones(n)).astype(np.int32)
|
|
132
|
+
rev_adjacency = adjacency.transpose().tocsr()
|
|
133
|
+
|
|
134
|
+
indptr = adjacency.indptr.astype(np.int32)
|
|
135
|
+
indices = adjacency.indices.astype(np.int32)
|
|
136
|
+
rev_indptr = rev_adjacency.indptr.astype(np.int32)
|
|
137
|
+
rev_indices = rev_adjacency.indices.astype(np.int32)
|
|
138
|
+
|
|
139
|
+
scores = push_pagerank(n, degrees, indptr, indices,
|
|
140
|
+
rev_indptr, rev_indices,
|
|
141
|
+
seeds.astype(np.float32),
|
|
142
|
+
damping_factor, tol)
|
|
143
|
+
|
|
144
|
+
elif solver == 'RH':
|
|
145
|
+
coeffs = np.ones(n_iter + 1)
|
|
146
|
+
polynome = Polynome(damping_factor * normalize(adjacency, p=1).T.tocsr(), coeffs)
|
|
147
|
+
scores = polynome.dot(seeds)
|
|
148
|
+
|
|
149
|
+
else:
|
|
150
|
+
rso = RandomSurferOperator(adjacency, seeds, damping_factor)
|
|
151
|
+
v0 = rso.b
|
|
152
|
+
if solver == 'bicgstab':
|
|
153
|
+
scores, info = bicgstab(sparse.eye(n, format='csr') - rso.a, rso.b, atol=tol, x0=v0)
|
|
154
|
+
elif solver == 'lanczos':
|
|
155
|
+
# noinspection PyTypeChecker
|
|
156
|
+
_, scores = sparse.linalg.eigs(rso, k=1, tol=tol, v0=v0)
|
|
157
|
+
scores = abs(scores.flatten().real)
|
|
158
|
+
elif solver == 'piteration':
|
|
159
|
+
scores = v0
|
|
160
|
+
for i in range(n_iter):
|
|
161
|
+
scores_ = rso.dot(scores)
|
|
162
|
+
scores_ /= scores_.sum()
|
|
163
|
+
if np.linalg.norm(scores - scores_, ord=1) < tol:
|
|
164
|
+
break
|
|
165
|
+
else:
|
|
166
|
+
scores = scores_
|
|
167
|
+
else:
|
|
168
|
+
raise ValueError('Unknown solver.')
|
|
169
|
+
|
|
170
|
+
return scores / scores.sum()
|
|
Binary file
|