Note

Click here to download the full example code

# Graph similarity¶

*Technical details are available in the API documentation:* sf.apps.similarity

This page looks at how to use GBS to construct a similarity measure between graphs, known as a graph kernel [51]. Kernels can be applied to graph-based data for machine learning tasks such as classification using a support vector machine.

## Graph data¶

We begin by fixing a dataset of graphs to consider and loading GBS samples from these graphs, which will be needed in the following.

Let’s use the MUTAG dataset of graphs [46][47]. This is a dataset of 188 different graphs that each correspond to the structure of a chemical compound. Our goal is to use GBS samples from these graphs to measure their similarity.

The `data`

module provides pre-calculated GBS samples for selected graphs in the MUTAG
dataset. Each set of samples is generated by encoding the graph into a GBS device, and collecting
photon click events. We’ll start by loading four sets of samples and visualizing the
corresponding graphs.

```
from strawberryfields.apps import data, plot, similarity
m0 = data.Mutag0()
m1 = data.Mutag1()
m2 = data.Mutag2()
m3 = data.Mutag3()
```

These datasets contain both the adjacency matrix of the graph and the samples generated through GBS. We can access the adjacency matrix through:

```
m0_a = m0.adj
m1_a = m1.adj
m2_a = m2.adj
m3_a = m3.adj
```

Samples from these graphs can be accessed by indexing:

```
print(m0[0])
```

Out:

```
[0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
```

We can now plot the four graphs using the `plot`

module. To use this module,
we need to convert the adjacency matrices into NetworkX Graphs:

```
import networkx as nx
import plotly
plot_mutag_0 = plot.graph(nx.Graph(m0_a))
plot_mutag_1 = plot.graph(nx.Graph(m1_a))
plot_mutag_2 = plot.graph(nx.Graph(m2_a))
plot_mutag_3 = plot.graph(nx.Graph(m3_a))
plotly.offline.plot(plot_mutag_0, filename="MUTAG_0.html")
```