Diffusion

This notebook illustrates the classification of the nodes of a graph by diffusion, based on the labels of a few nodes.

[1]:
from IPython.display import SVG
[2]:
import numpy as np
[3]:
from sknetwork.data import karate_club, painters, movie_actor
from sknetwork.classification import DiffusionClassifier
from sknetwork.visualization import svg_graph, svg_digraph, svg_bigraph

Graphs

[4]:
graph = karate_club(metadata=True)
adjacency = graph.adjacency
position = graph.position
labels_true = graph.labels
[5]:
seeds = {i: labels_true[i] for i in [0, 33]}
[6]:
diffusion = DiffusionClassifier()
labels_pred = diffusion.fit_transform(adjacency, seeds)
[7]:
precision = np.round(np.mean(labels_pred == labels_true), 2)
precision
[7]:
0.94
[8]:
image = svg_graph(adjacency, position, labels=labels_pred, seeds=seeds)
SVG(image)
[8]:
../../_images/tutorials_classification_diffusion_10_0.svg
[9]:
# soft classification (here probability of label 1)
scores = diffusion.score(label=1)
[10]:
image = svg_graph(adjacency, position, scores=scores, seeds=seeds)
SVG(image)
[10]:
../../_images/tutorials_classification_diffusion_12_0.svg

Directed graphs

[11]:
graph = painters(metadata=True)
adjacency = graph.adjacency
position = graph.position
names = graph.names
[12]:
rembrandt = 5
cezanne = 11
seeds = {cezanne: 0, rembrandt: 1}
[13]:
diffusion = DiffusionClassifier()
labels = diffusion.fit_transform(adjacency, seeds)
[14]:
image = svg_digraph(adjacency, position, names, labels=labels, seeds=seeds)
SVG(image)
[14]:
../../_images/tutorials_classification_diffusion_17_0.svg
[15]:
# soft classification (here probability of label 0)
scores = diffusion.score(label=0)
[16]:
image = svg_digraph(adjacency, position, names=names, scores=scores, seeds=[cezanne])
SVG(image)
[16]:
../../_images/tutorials_classification_diffusion_19_0.svg

Bipartite graphs

[17]:
graph = movie_actor(metadata=True)
biadjacency = graph.biadjacency
names_row = graph.names_row
names_col = graph.names_col
[18]:
inception = 0
drive = 3
[19]:
seeds_row = {inception: 0, drive: 1}
[20]:
diffusion = DiffusionClassifier()
diffusion.fit(biadjacency, seeds_row)
labels_row = diffusion.labels_row_
labels_col = diffusion.labels_col_
[21]:
image = svg_bigraph(biadjacency, names_row, names_col, labels_row, labels_col, seeds_row=seeds_row)
SVG(image)
[21]:
../../_images/tutorials_classification_diffusion_25_0.svg
[22]:
# soft classification
membership_row = diffusion.membership_row_
membership_col = diffusion.membership_col_
[23]:
# probability of label 1
scores_row = membership_row[:,1].toarray().ravel()
scores_col = membership_col[:,1].toarray().ravel()
[24]:
image = svg_bigraph(biadjacency, names_row, names_col, scores_row=scores_row, scores_col=scores_col,
                    seeds_row=seeds_row)
SVG(image)
[24]:
../../_images/tutorials_classification_diffusion_28_0.svg