Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jeanpat/aac681d6b56932941281 to your computer and use it in GitHub Desktop.
Save jeanpat/aac681d6b56932941281 to your computer and use it in GitHub Desktop.
A python notebook proposing a way to compare two graphs with a distance computed from the response of the graphs to the pruning of their leaves
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Prune iteratively the leaves of a graph with graph -tool:\n",
"## A measure of the similarity of two weighted multigraphs?\n",
"\n",
"To compare shapes, typically obtained after image segmentation, it has been shown that their skeleton could be used.\n",
"\n",
"A weighted graph can represents naturally the skeleton of a shape, assuming that the size of the branches of the skeleton, linking the end-points and the branched points together, can be represented by the weights of the edges in a graph. \n",
"\n",
"Previously, pruning of skeletons was performed by removing pixels, one after an other, from the end-points of the skeleton. A response curve of a skeleton to pruning, can be defined by counting the end-points of the skeleton as pruning is iterated. It was observed that the responses from similar shapes were similar. So, such response curves may be used to compute some similarity measures, or distances, between shapes.\n",
"\n",
"Since the time necessary to prune a skeleton depends on the number of pixels of the skeleton, it may be worth to convert a skeleton into a graph which can be then pruned in a way independent from the weight of its edges.\n",
"\n",
"The response of a graph to iterative pruning was performed with graph-tool (and additionnal python librairies : mahotas, numpy,scipy, matplotlib). This response yields a curve \"**R**esponse to ***P**runing **C**urve or RPC\". Then a distance was defined between two RPCs to compute a similarity index between two graphs."
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import timeit\n",
"import os\n",
"import mahotas as mh\n",
"import graph_tool.all as gt\n",
"import numpy as np\n",
"from scipy.spatial.distance import cdist\n",
"from collections import defaultdict\n",
"from matplotlib import pyplot as plt\n",
"import matplotlib.gridspec as gridspec\n",
"from graph_tool import topology as top\n",
"#from graph_tool import search"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.11 (commit b6b2152c, Mon Oct 26 10:31:30 2015 +0100)\n"
]
}
],
"source": [
"print gt.__version__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Rough algorithm:\n",
" Make an undirectional weighted multigraph\n",
" Show it properly\n",
" Try to iteratively prune the graph:\n",
" Need to get vertices of degree 1 and to count them\n",
" Read the weight of edges linked to degree 1 vertices\n",
" Get the edge of smallest weight:\n",
" Remove the corresponding edge.\n",
" Decrease the weight of all other edges by this minimal value.\n",
" Do it again until there's no more vertices of degree 1 remaining in the graph."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Make an undirectional weighted graph\n",
"By default in graph-tool, the graphs are multigraphs and that's what we need. The edges of the graph must be weighted. An edge weight corresponds to the size of a branch in a skeleton (the number of pixels). The weight of an edge is a property that has to be created:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def make_toy_graph():\n",
" T = gt.Graph(directed = False)\n",
" edge_weights = T.new_edge_property('double')\n",
" T.properties[(\"e\",\"weight\")] = edge_weights\n",
"\n",
" T.add_vertex(n=4)\n",
"\n",
" e_1 = T.add_edge(0,1)\n",
" e_2 = T.add_edge(1,2)\n",
" e_3 = T.add_edge(0,0)\n",
" e_4 = T.add_edge(1,3)\n",
"\n",
" edge_weights[e_1]= 8\n",
" edge_weights[e_2]= 15\n",
" edge_weights[e_3]= 7\n",
" edge_weights[e_4]= 20\n",
" return T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Let's have a look to the graph properties:\n",
"The weight is here!"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{('e', 'weight'): <PropertyMap object with key type 'Edge' and value type 'double', for Graph 0xb639770c, at 0xb6397b8c>}\n"
]
}
],
"source": [
"T = make_toy_graph()\n",
"print T.properties"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A special case of graph will be useful:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def make_2vertices_1edge_graph():\n",
" T = gt.Graph(directed = False)\n",
" edge_weights = T.new_edge_property('double')\n",
" T.properties[(\"e\",\"weight\")] = edge_weights\n",
"\n",
" T.add_vertex(n=2)\n",
" e_1 = T.add_edge(0,1)\n",
" edge_weights[e_1]= 8\n",
" return T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Now we need to define several functions:\n",
"The algorithm will rely on finding vertices of degree 1"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def vertices_of_degree(Graph, degree):\n",
" '''returns the index of vertices of a given degree in the Graph\n",
" '''\n",
" k = Graph.degree_property_map('out')\n",
" if degree == 1:\n",
" return np.where(k.a == np.ones(k.a.shape, dtype=np.int))\n",
" if degree == 0:\n",
" return np.where(k.a == np.zeros(k.a.shape, dtype=np.int))\n",
" if degree > 1:\n",
" mask = np.ones(k.a.shape, dtype=np.int)\n",
" mask[:] = degree\n",
" return np.where(k.a == mask) "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def number_of_degree1_vertices(graph):\n",
" ''' returns the number of degree 1 vertices of the graph\n",
" '''\n",
" degprop = graph.degree_property_map('out')\n",
" #print \"count deg 1\", degprop.a\n",
" return np.sum(degprop.a == np.ones(degprop.a.shape,dtype=np.int))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def vertex_degree1_edge_weight(graph):\n",
" ''' Yields the weight (this property of edges is supposed to exist) \n",
" of an edge bound to a vertex of degree 1, as two dictionaries where :\n",
" FIRST:\n",
" vertex = keys and weight= values\n",
" SECOND:\n",
" weight= keys and vertex = values\n",
" DEPENDS ON:\n",
" vertices_of_degree()\n",
" ''' \n",
" #TO DO : Have a look to Graphview to filter vertices of degree 1 !!\n",
" vertex_edge_weight = defaultdict(list)\n",
" edge_weight_vertex = defaultdict(list)\n",
" \n",
" for v1_index in vertices_of_degree(graph, 1)[0]:\n",
" vertex = graph.vertex(v1_index)\n",
" #This is weird to make a loop to get the sole element\n",
" #of the iterartor vertex.out_edges(), but ...\n",
" edge = [e for e in vertex.out_edges()]\n",
" weight = graph.ep.weight[e]#edge_weights[e]\n",
" vertex_edge_weight[vertex].append(weight)\n",
" edge_weight_vertex[weight].append(vertex)\n",
" \n",
" return vertex_edge_weight, edge_weight_vertex"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Make a Graph, draw it and check the previous functions"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"T = make_toy_graph()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nKIoyEfx/81uzo1Dd2mkAAAAASUVORK5CYII=\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<PropertyMap object with key type 'Vertex' and value type 'vector<double>', for Graph 0xb639bc0c, at 0x9c652f8c>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gt.graph_draw(T,\n",
" vertex_text=T.vertex_index,\n",
" edge_pen_width=T.ep.weight,\n",
" inline=True,\n",
" output_size=(200, 200))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Check $$ vertices\\_of\\_degree() $$"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2 3]\n",
"2 vertices of degree 1\n"
]
}
],
"source": [
"print vertices_of_degree(T,1)[0]\n",
"print number_of_degree1_vertices(T),' vertices of degree 1'"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Check $$ vertex\\_degree1\\_edge\\_weight(graph)$$"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"defaultdict(<type 'list'>, {<Vertex object with index '2' at 0x9cbe23ac>: [15.0], <Vertex object with index '3' at 0x9cbe276c>: [20.0]})\n",
"\n",
"defaultdict(<type 'list'>, {20.0: [<Vertex object with index '3' at 0x9cbe276c>], 15.0: [<Vertex object with index '2' at 0x9cbe23ac>]})\n"
]
}
],
"source": [
"v_e_w, e_w_v = vertex_degree1_edge_weight(T)\n",
"print v_e_w\n",
"print\n",
"print e_w_v"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Try to write a function taking a graph and pruning it once inplace"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before pruning, it's necessary to check if it remains at most two vertices of degree 1 (and one edge)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def at_least_one_vertex_of_degree_above_one(graph):\n",
" ''' check if there's at least one vertex of degree above 1 in the graph.\n",
" '''\n",
" graph = gt.GraphView(graph, vfilt= lambda v : v.out_degree() > 1)\n",
" try:\n",
" first = next(graph.vertices())\n",
" except StopIteration:\n",
" return False\n",
" return True\n",
"\n",
"def is_VeV(graph):\n",
" ''' True if the graph contain only two vertices of degree 1 and possibly vertex of deg=0\n",
" '''\n",
" return (number_of_degree1_vertices(graph) == 2) and \\\n",
" (not(at_least_one_vertex_of_degree_above_one(graph)))"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"False\n"
]
}
],
"source": [
"print at_least_one_vertex_of_degree_above_one(T)\n",
"print is_VeV(T)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Now decrease the weight of all edges1 by $edges1_{min}$ . For each vertex of degree 1 (v1):\n",
" 1. get the bound edge : v1.out-edge (The graph is undirected)\n",
" 2. decrease the weights :\n",
"$$weight(v1-v')_{new} = weight(v1-v')_{old}-edge1_{min}$$"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def prune_VeV(graph):\n",
" '''prune a graph with two vertices of degree 1 (V1) and one weighted edge\n",
" return the the weight of the edge and 0, the number of V1 (0).\n",
" '''\n",
" index_degree1_vertices = vertices_of_degree(graph, 1)[0]\n",
" v1_index = index_degree1_vertices[0]\n",
" vertex = graph.vertex(v1_index)\n",
" bound_edge = vertex.out_edges()\n",
" BE = [be for be in bound_edge][0]\n",
" weight = graph.ep.weight[BE]\n",
" graph.remove_edge(BE)\n",
" assert(number_of_degree1_vertices(graph) == 0)\n",
" return weight, number_of_degree1_vertices(graph)\n",
"\n",
"def prune_graph_once(graph):\n",
" '''Prune \"graph\" once and inplace and return the:\n",
" number of vertex of degree 1\n",
" the weight of the shortest\n",
" '''\n",
" #print number_of_degree1_vertices(graph)\n",
" test_degree = is_VeV(graph)\n",
" if test_degree == False:\n",
" v1_ew, ew_v1 = vertex_degree1_edge_weight(graph)\n",
"\n",
" min_weights = np.min(v1_ew.values())\n",
" #print 'min weight of v1:', min_weights\n",
"\n",
" # Decrease all edges weight by the smallest weight\n",
" index_degree1_vertices = vertices_of_degree(graph, 1)[0]\n",
" #print index_degree1_vertices\n",
" for v1_index in index_degree1_vertices:\n",
" vertex = graph.vertex(v1_index)\n",
" bound_edge = vertex.out_edges()\n",
" BE = [be for be in bound_edge][0]\n",
" graph.ep.weight[BE] = graph.ep.weight[BE]-min_weights\n",
" #print graph.ep.weight[BE]\n",
" \n",
" if graph.ep.weight[BE] == 0.0:\n",
" graph.remove_edge(BE)\n",
" return min_weights, number_of_degree1_vertices(graph)\n",
" \n",
" elif test_degree == true:\n",
" # Get the two bound vertices of degree 1 Vertex_edge_Vertex\n",
" return prune_VeV(graph)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10 loops, best of 3: 94.5 ms per loop\n"
]
}
],
"source": [
"%timeit prune_graph_once(make_toy_graph())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### A better pruning function?\n",
"\n",
"The previous function succeeds in pruning a graph, but it probably not use the full possibility of the graph-tool library. \n",
"It is possible to extract the vertices of degree 1 directly with the function GraphView() as follow:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"(8.0, 0)"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def prune_once_faster(graph):\n",
" \n",
" #filter the vertices of degree 1\n",
" subg = gt.GraphView(graph, vfilt= lambda v : v.out_degree() == 1)\n",
" weight_vertex_edge = defaultdict(list)\n",
" \n",
" test_degree = is_VeV(graph)\n",
" if test_degree == False:\n",
" for v in subg.vertices():\n",
" #print type(v)\n",
" #print graph.vertex(v)\n",
" #GET THE ONLY EDGE BOUND TO THE VERTEX (SINCE DEGREE=1)\n",
" edge = next(graph.vertex(v).out_edges())\n",
" weight = graph.ep.weight[edge]\n",
" #print'edge', edge\n",
" #print edge, ' weight ',weight\n",
" weight_vertex_edge[weight].append((v, edge))\n",
"\n",
" shortest_edge = min(weight_vertex_edge.keys())\n",
" #print 'shortest', shortest_edge\n",
" #print 'decrease weight'\n",
" #loop = 1\n",
" for v in subg.vertices():\n",
" vertex = graph.vertex(v)\n",
" bound_edge = vertex.out_edges()\n",
" BE = next(bound_edge)\n",
" #BE = [be for be in bound_edge][0]\n",
" #print vertex, BE, graph.ep.weight[BE]\n",
" graph.ep.weight[BE] = graph.ep.weight[BE]-shortest_edge\n",
" #print 'after', graph.ep.weight[BE]\n",
" if graph.ep.weight[BE] == 0.0:\n",
" graph.remove_edge(BE)\n",
" return shortest_edge,number_of_degree1_vertices(graph) \n",
" elif test_degree == True:\n",
" # Get the two bound vertices of degree 1 Vertex_edge_Vertex\n",
" #V_e_V = gt.GraphView(graph, vfilt= lambda v : v.out_degree() == 1)\n",
" #edge_of_VEV = next(V_e_V.edges()) # ONLY ONE EDGE\n",
" #weight = graph.ep.weight[edge_of_VEV]\n",
" #graph.remove_edge(edge_of_VEV)\n",
" return prune_VeV(graph) \n",
"\n",
"TT = make_toy_graph()\n",
"prune_once_faster(TT)\n",
"prune_once_faster(TT)\n",
"prune_once_faster(TT)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The slowest run took 12.66 times longer than the fastest. This could mean that an intermediate result is being cached \n",
"1000000 loops, best of 3: 226 ns per loop\n",
"10 loops, best of 3: 33 ms per loop\n",
"10 loops, best of 3: 73.8 ms per loop\n"
]
}
],
"source": [
"#print 'vertex', h.vertex(2), 'edges:', \\next(h.vertex(2).out_edges()),\\'weight ', h.ep.weight[next(h.vertex(2).out_edges())]\n",
"#print #h.ep.weight[]\n",
"%timeit make_toy_graph\n",
"%timeit number_of_degree1_vertices(make_toy_graph()) \n",
"%timeit prune_once_faster(make_toy_graph())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Graph Response to Pruning\n",
"%timeit shows clearly that the second version is faster.\n",
"Now, it remains to define a function which count the number of vertices of degree 1 as the graph is pruned iteratively"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1 loops, best of 3: 228 ms per loop\n"
]
}
],
"source": [
"def total_length_graph(graph):\n",
" v_ew, _ =vertex_degree1_edge_weight(T)\n",
" return np.sum(v_ew.values()) \n",
" \n",
"def response_to_iterative_pruning(graph):\n",
" '''return the number of vertices of degree 1 as a function of the number of pruning\n",
" '''\n",
" response = []\n",
" response.append((0,number_of_degree1_vertices(graph)))\n",
" #print number_of_degree1_vertices(graph)\n",
" while number_of_degree1_vertices(graph)>0:\n",
" #response.append(prune_graph_once(graph))\n",
" response.append(prune_once_faster(graph))\n",
" #print number_of_degree1_vertices(graph)\n",
" data = np.array(response)\n",
" #print data\n",
" x = np.cumsum(data[:,0])\n",
" y = data[:,1]\n",
" return x, y\n",
"\n",
"#%timeit \n",
"%timeit response_to_iterative_pruning(make_toy_graph())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Check some things again:\n",
"The number of edges should be decreased by one after pruning. One cas see that the pruning algorithm is destructive:"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<Graph object, undirected, with 4 vertices and 4 edges at 0xb639bc0c>\n",
"<Graph object, undirected, with 4 vertices and 3 edges at 0xb639b88c>\n"
]
}
],
"source": [
"g = T.copy()\n",
"prune_graph_once(g)\n",
"print T\n",
"print g"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check if a graph made of two linked vertices is recognized (**V**ertex-**E**dge-**V**ertex)"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"True\n",
"False\n",
"<Graph object, undirected, with 2 vertices and 1 edge at 0x9c65ceec>\n",
"(8.0, 0)\n",
"<Graph object, undirected, with 2 vertices and 0 edges at 0x9c65ceec>\n"
]
}
],
"source": [
"t = make_2vertices_1edge_graph()\n",
"#t=T\n",
"print is_VeV(t)\n",
"print is_VeV(T)\n",
"print t\n",
"print prune_VeV(t)\n",
"print t"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##### Check iterative pruning by hand"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(15.0, 1)\n",
"(5.0, 1)\n",
"(8.0, 0)\n",
"<Graph object, undirected, with 4 vertices and 4 edges at 0x9c65c1ac> 2\n",
"<Graph object, undirected, with 4 vertices and 3 edges at 0x9c65cc2c> 1\n",
"<Graph object, undirected, with 4 vertices and 2 edges at 0x9c654dec> 1\n",
"<Graph object, undirected, with 4 vertices and 1 edge at 0x9c65424c> 0\n"
]
}
],
"source": [
"G0 = make_toy_graph()\n",
"g0 = G0.copy()\n",
"print prune_graph_once(g0)\n",
"g1 = g0.copy()\n",
"print prune_graph_once(g0)\n",
"g2 = g0.copy()\n",
"print prune_graph_once(g0)\n",
"g3 = g0.copy()\n",
"\n",
"print G0, number_of_degree1_vertices(G0)\n",
"print g1, number_of_degree1_vertices(g1)\n",
"print g2, number_of_degree1_vertices(g2)\n",
"print g3, number_of_degree1_vertices(g3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## With a graphic, it's better:\n",
"I still don't get how to include graphic representation of graph with the function **gt.graphdraw()** in a subplot. So the graphic will be saved on disk and reloaded after."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n5Aq9oOEAAAAASUVORK5CYII=\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nhvY2g0WjFulORl6PapcUu0WOXyOnsxM87kZC/BUC/HjNmjUDfv0zWMO+H6uqqupfWThyGz9yzOV4\n+lenzy3nuo4zHvhmXsaUiY7YmTbLkZ2ldBx8O/rexspWsj85fk/c+GeF1pzZJDK8OyoqKu4YtpsY\nBZ544omM3t7euxHxNjStD7Yb2bYKJBRAtIlxCzQ1RpoWQcZ2CyEeW7169aHhim/YEysUCk0CIZ5m\n7R2TtRdebFXeOtg9mHasyZPcxrKlxSLHXwucBwKBwK6hjnUsqK6udpimeZkQYj4iFpw9/hUGgDZE\nfNc0zVfWrFnTPNxxjcgO0srKyvuYZd/NOtrH689sb+DHj1/QjM4uLHQkbls2XuTlNoLD8T+BQODB\ndMUqDc6IbJvx+/3rQVN3iMzMxsSyG4vNy+Zl9zUA/Thr1iUZieW3jRc5/jOk629GIpGH0hyuNAgj\ntuc9FAq5AOARMMzrsaeniLe2Ed+9t109dix83jYaVUW7rNRtzr/UbxcVqeDLaCRNq+Gc/91InPKV\n+jeihymCwSArKCj4OiJ+DaLRQhaLZ1IiofP2jgRGoxaRAHK5FMrO1snhMMGhd4Hb3SoAnm5ubn4s\nGAwaIxm/lNqoOKVz9kDF14joiyhEAZjmJw9TKEqCOG9jjL1smmb15+kgxVg1KhLrQ8FgkOXm5k7l\nnJednd0oiHiGiOqbm5vfTveiniRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiRJkiQN\nyv8DnIayR9CbXtEAAAAASUVORK5CYII=\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"#plt.subplot(121)\n",
"graphs = [G0,g1,g2,g3]\n",
"name =['G0','g1','g2','g3']\n",
"for g,n in zip(graphs, name):\n",
" gt.graph_draw(g, vertex_text=g.vertex_index, edge_pen_width=T.ep.weight,inline=True,\n",
" output_size=(150, 150), output= n+'.png')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Generate the response curve of the graph to iterative pruning\n",
"Let's count the number of vertices of degree 1 as the graph is submitted to pruning.\n",
"The toy graph used to check its response to pruning has two vertices of degree 3 and two vertices of degree 1 (vertices 2 an 3).\n",
"The initial values of the weight of the edges bound to vertices 2 and 3, are:\n",
"\n",
" 15, 20\n",
"The smallest weight is 15 So after one pruning, the weights becomes:\n",
"\n",
" 15-15 = 0, 20-15 = 5\n",
"The edge 1-2 of weight 0 is removed (vertex 2 is now of degree 0). The edge 1-3 has the smallest weight (5). So after a second round of pruning, the edge 1-3 is removed.\n",
"\n",
"The vertex 1 was of degree 2, now it is of 1. The weight of the edge 0-1 is 8.\n",
"\n",
"A third pruning removes the last edge 0-1 of weight equal to 8.\n",
"\n",
"The degree of vertex 0 is 2 (there's a loop), so the edge 0-0 can't be pruned.\n",
"\n",
"The different weights are cumulated as follow:\n",
"\n",
" 0, 15, 15+5, 20+8\n",
"Applied to a skeleton made of pixels, this would mean that:\n",
"\n",
" 15 prunings of 1 pixel would remove one branche of size 15\n",
" 20 prunings would remove the two branches of size 15 and 20\n",
" 28 prunings would remove the three branches of sizes 15, 20 and 8 (initially between two vertices of degree 3).\n",
" \n",
"The weights are store in a vector **X** and the corresponding counts of degree 1 vertices are store in a vector **Y**, both returned by the function **response_to_iterative_pruning()**"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"T = make_toy_graph()\n",
"TL = total_length_graph(T)\n",
"X, Y= response_to_iterative_pruning(T.copy())"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
" %matplotlib inline\n",
"\n",
"path = os.getcwd()\n",
"im0 = mh.imread(path+'/'+'G0.png')\n",
"im1 = mh.imread(path+'/'+'G1.png')\n",
"im2 = mh.imread(path+'/'+'G2.png')\n",
"im3 = mh.imread(path+'/'+'G3.png')"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n/wO+GIdYV81feQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9b84ed0c>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"gs = gridspec.GridSpec(3, 4)\n",
"\n",
"fig = plt.figure(figsize=(12,10))\n",
"\n",
"ax1 = plt.subplot(gs[0,0])\n",
"ax1.set_xticks([])\n",
"ax1.set_yticks([])\n",
"ax1.imshow(im0)\n",
"\n",
"ax2 = plt.subplot(gs[0,1])\n",
"ax2.set_xticks([])\n",
"ax2.set_yticks([])\n",
"ax2.imshow(im1)\n",
"\n",
"ax3 = plt.subplot(gs[0,2])\n",
"ax3.set_xticks([])\n",
"ax3.set_yticks([])\n",
"ax3.imshow(im2)\n",
"\n",
"ax4 = plt.subplot(gs[0,3])\n",
"ax4.set_xticks([])\n",
"ax4.set_yticks([])\n",
"ax4.imshow(im3)\n",
"\n",
"ax5 = plt.subplot(gs[1,:])\n",
"ax5.set_ylabel('number of degree 1 vertices')\n",
"ax5.set_xlabel('pruning size')\n",
"#print np.arange(0,35,5)\n",
"ax5.set_xticks(np.arange(0, 45,5))\n",
"ax5.set_ylim(-0.1,3.1)\n",
"ax5.set_yticks([0, 1, 2, 3])\n",
"ax5.step(X, Y, lw = 3)\n",
"ax5.set_title('Response to iterative pruning of a weighted graph')\n",
"ax5.scatter(X,Y,s=80,c='red')\n",
"\n",
"ax6 = plt.subplot(gs[2,:])\n",
"ax6.set_ylabel('number of degree 1 vertices')\n",
"ax6.set_xlabel('pruning size (%size total weight)')\n",
"#print np.arange(0,35,5)\n",
"ax6.set_xticks(np.arange(0, 100,5))\n",
"ax6.set_ylim(-0.1,3.1)\n",
"ax6.set_yticks([0, 1, 2, 3])\n",
"ax6.step(100*X/TL, Y, lw = 3)\n",
"ax6.scatter(100*X/TL,Y,s=80,c='red')\n",
"\n",
"\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Make a feature vector from the pruning curve?\n",
"Is it possible to make a feature vector fom the step curve in order to compute a similarity index between two curves?"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's make three different graphs and generate their respective pruning curve"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def make_toy_graph2():\n",
" T = gt.Graph(directed = False)\n",
" edge_weights = T.new_edge_property('double')\n",
" T.properties[(\"e\",\"weight\")] = edge_weights\n",
"\n",
" T.add_vertex(n=4)\n",
"\n",
" e_1 = T.add_edge(0,1)\n",
" e_2 = T.add_edge(1,2)\n",
" e_3 = T.add_edge(0,0)\n",
" e_4 = T.add_edge(1,3)\n",
"\n",
" edge_weights[e_1]= 5\n",
" edge_weights[e_2]= 11\n",
" edge_weights[e_3]= 9\n",
" edge_weights[e_4]= 7\n",
" return T\n",
"\n",
"def make_toy_graph3():\n",
" T = gt.Graph(directed = False)\n",
" edge_weights = T.new_edge_property('double')\n",
" T.properties[(\"e\",\"weight\")] = edge_weights\n",
"\n",
" T.add_vertex(n=5)\n",
"\n",
" e_1 = T.add_edge(0,1)\n",
" e_2 = T.add_edge(1,2)\n",
" #e_3 = T.add_edge(0,0)\n",
" e_4 = T.add_edge(1,3)\n",
" e_5 = T.add_edge(3,4)\n",
"\n",
" edge_weights[e_1]= 6\n",
" edge_weights[e_2]= 13\n",
" #edge_weights[e_3]= 7\n",
" edge_weights[e_4]= 8\n",
" edge_weights[e_5]= 2\n",
" return T\n",
"def make_toy_graph4():\n",
" T = gt.Graph(directed = False)\n",
" edge_weights = T.new_edge_property('double')\n",
" T.properties[(\"e\",\"weight\")] = edge_weights\n",
"\n",
" T.add_vertex(n=5)\n",
"\n",
" e_1 = T.add_edge(0,1)\n",
" e_2 = T.add_edge(1,2)\n",
" e_3 = T.add_edge(1,3)\n",
" e_4 = T.add_edge(1,3)\n",
" e_5 = T.add_edge(3,4)\n",
"\n",
" edge_weights[e_1]= 6\n",
" edge_weights[e_2]= 13\n",
" edge_weights[e_3]= 7\n",
" edge_weights[e_4]= 8\n",
" edge_weights[e_5]= 2\n",
" return T"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\nCAQCgUAQn/8PjU5IavBEpH0AAAAASUVORK5CYII=\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\nJgv/H2tXBzx6sCqpAAAAAElFTkSuQmCC\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<IPython.core.display.Image object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": [
"<PropertyMap object with key type 'Vertex' and value type 'vector<double>', for Graph 0x9b993f4c, at 0x9b81f78c>"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"T1 = make_toy_graph()\n",
"T2 = make_toy_graph2()\n",
"T3 = make_toy_graph3()\n",
"T4 = make_toy_graph4()\n",
"\n",
"gt.graph_draw(T1, vertex_text=T1.vertex_index, edge_pen_width=T1.ep.weight,inline=True,\n",
" output_size=(150, 150))\n",
"gt.graph_draw(T2, vertex_text=T2.vertex_index, edge_pen_width=T2.ep.weight,inline=True,\n",
" output_size=(150, 150))\n",
"gt.graph_draw(T3, vertex_text=T3.vertex_index, edge_pen_width=T3.ep.weight,inline=True,\n",
" output_size=(150, 150))\n",
"gt.graph_draw(T4, vertex_text=T4.vertex_index, edge_pen_width=T4.ep.weight,inline=True,\n",
" output_size=(150, 150))"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0. 7. 11. 16.] [ 2. 1. 1. 0.]\n"
]
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x988d8e6c>]"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9b8d2eac>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"X1, Y1= response_to_iterative_pruning(T2.copy())\n",
"X2, Y2= response_to_iterative_pruning(T3.copy())\n",
"X3, Y3= response_to_iterative_pruning(T4.copy())\n",
"print X1, Y1\n",
"plt.figure(figsize=(12,3))\n",
"plt.subplot(141)\n",
"plt.scatter(X,Y)\n",
"plt.step(X,Y)\n",
"plt.subplot(142)\n",
"plt.scatter(X1,Y1, c='r')\n",
"plt.step(X1,Y1)\n",
"plt.subplot(143)\n",
"plt.scatter(X2,Y2, c='pink', s=50)\n",
"plt.step(X2,Y2,c='pink')\n",
"\n",
"plt.subplot(144)\n",
"plt.scatter(X1,Y1)\n",
"plt.step(X1,Y1)\n",
"plt.scatter(X2,Y2, c='pink', s=50)\n",
"plt.step(X2,Y2,c='pink')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"graph-tool provides a similarity measure, but it doesn't seem to take the weight of the edges into account"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Similarity between the four graphs\n",
"0.8\n",
"0.75 0.6\n",
"1.0 1.0 0.75 0.6\n"
]
}
],
"source": [
"print \"Similarity between the four graphs\"\n",
"\n",
"print top.similarity(T4, T3)\n",
"print top.similarity(T2, T3), ' ',top.similarity(T4, T2)\n",
"print top.similarity(T1,T1), ' ',\\\n",
" top.similarity(T1,T2), ' ',\\\n",
" top.similarity(T1, T3), ' ',top.similarity(T1, T4)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Distance between two pruning curves:\n",
"\n",
" We could try to compute the area between two step curves. For two identical curves the area would be null, as the curves differe the area may increase. Fine! However, since the curves are just defined from discrete data, it may not be so easy to define.\n",
" \n",
" Let's forget the curves and just look at the points from the scatter plot.When looking at two pruning curves obtained from toy-graphs 2 and 3, we could just compute the distances matrix between the points from the two curves. The more the curves are different, the more the distances should increase ... why not, give it a try:\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### scipy provides just what we need!\n",
"\n",
"The response curve is given as X, Y:\n",
"\n",
" X : The pruning values\n",
" Y : the corresponding number of leaf in the graph (vertices of degree 1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The X and Y arrays have to zipped so that we have couples of\n",
"\n",
" (pruning size, number of leafs)\n",
"\n",
"First compute the distances between the points of the same curve:"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0. 15. 20. 28.] [ 2. 1. 1. 0.]\n",
"[(0.0, 2.0), (15.0, 1.0), (20.0, 1.0), (28.0, 0.0)]\n"
]
}
],
"source": [
"T=make_toy_graph()\n",
"#print T.edge_properties\n",
"X, Y = response_to_iterative_pruning(T.copy())\n",
"#TL = total_length_graph(T)\n",
"print X, Y\n",
"pruning_curve = zip(X,Y)\n",
"print pruning_curve"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compute the distances between the points of the same curve (toy graph 1). The matrix is symetric, let's just see the upper elements of the matrix:"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 0. 15.03329638 20.02498439 28.0713377 ]\n",
" [ 15.03329638 0. 5. 13.03840481]\n",
" [ 20.02498439 5. 0. 8.06225775]\n",
" [ 28.0713377 13.03840481 8.06225775 0. ]]\n",
"\n",
"[[ 0. 15.03329638 20.02498439 28.0713377 ]\n",
" [ 0. 0. 5. 13.03840481]\n",
" [ 0. 0. 0. 8.06225775]\n",
" [ 0. 0. 0. 0. ]]\n",
"sum of distances : 89.2302810268\n"
]
}
],
"source": [
"D = cdist( pruning_curve, pruning_curve)\n",
"print D\n",
"\n",
"print np.triu(D)\n",
"print 'sum of distances : ', np.sum(np.triu(D))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This triangular matrix can be displayed as an image:"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x9b99350c>"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAO0AAADtCAYAAABTTfKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAA1BJREFUeJzt2bGNE1EUhlE/5E5ogR5owiluY00bkG4V2wu1XAJS29Ii\nhrefdE44N/mTTzPSrJk5AR2fdg8A3ke0ECNaiBEtxIgWYkQLMednx7WW/0Gwycyse8+fRvvHy7/e\n8mH8mF+7Jxzq29vr7gmHun3dveA435/cfB5DjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAj\nWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsx\nooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQ\nI1qIES3EnHcP2Om6Pu+ecKjrl9k94VCX+bl7wnHW9eHJmxZiRAsxooUY0UKMaCFGtBAjWogRLcSI\nFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKM\naCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3E\niBZiRAsxooUY0UKMaCFGtBAjWohZM/P4uNacTi//cQ68w+tt94LjXNZpZta9kzctxIgWYkQLMaKF\nGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNa\niBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGi\nhRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQc949AP7a5bZ7wRbetBAjWogRLcSIFmJE\nCzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFG\ntBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZi\nRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQsyamcfHtR4fgUPNzLr3/Gm0wMfj8xhiRAsx\nooUY0UKMaCHmN8MRJy9gzhAgAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9b99318c>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.subplot(111, xticks=[],yticks=[])\n",
"plt.imshow(np.triu(D),interpolation='nearest')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Similarity between two graphs:\n",
"#### compute the distances between the points of their response to pruning curves \n",
"\n",
"For each of the three graphs $T, T_1, T_2$ , one can define $\\frac{3^2-3}{2}+3={6}$ matrices of distances.\n",
"\n",
"Those matrices are elements of another matrix (a matrix of matrices). The elements of the diagonal are squared matrices corresponding to \"intra-distances\" (distances between the points of the same response curve). The elements outside the diagonal correspond to \"inter-distances\" matrices (distances computed from points belonging to two different response curves), the \"interdistance matrices\", here, are rectangular since the corresponding pairs of graphs do not have the same number of vertices. \n",
"\n",
"#### computing the matrix of distances between two response curves\n",
"\n",
"Response curves of a graph to pruning, **prc**, are generated. Then the matrix of distances between the two response curves, is generated (Pruning Curve Matrix or **PCM**).\n",
" \n",
" PCM_00, PCM_11, PCM_22 are are matrices of 'intra-distances'\n",
" Other matrices are 'inter-distances' matrices"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def distance_matrix(prc_a, prc_b):\n",
" #print len(prc_a) == len(prc_b)\n",
" return cdist(prc_a, prc_b)\n",
" #return np.triu(D)\n",
"\n",
"prc0 = pruning_curve\n",
"prc1 = zip(X1,Y1)\n",
"prc2 = zip(X2,Y2)\n",
"prc3 = zip(X3,Y3)\n",
"\n",
"PCM_00=distance_matrix(prc0, prc0)\n",
"PCM_01=distance_matrix(prc0, prc1)\n",
"PCM_02=distance_matrix(prc0, prc2)\n",
"PCM_03=distance_matrix(prc0, prc3)\n",
"\n",
"PCM_11=distance_matrix(prc1, prc1)\n",
"PCM_12=distance_matrix(prc1, prc2)\n",
"PCM_13=distance_matrix(prc1, prc3)\n",
"\n",
"PCM_22=distance_matrix(prc2, prc2)\n",
"PCM_23=distance_matrix(prc3, prc2)\n",
"\n",
"PCM_33=distance_matrix(prc3, prc3)\n",
"#distance total\n",
"dt00 = np.sum(PCM_00)\n",
"dt01 = np.sum(PCM_01)\n",
"dt02 = np.sum(PCM_02)\n",
"\n",
"dt11 = np.sum(PCM_11)\n",
"dt12 = np.sum(PCM_12)\n",
"\n",
"dt22 = np.sum(PCM_22)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Plotting matrices of distances"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x98ef750c>"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9ba104cc>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"gs = gridspec.GridSpec(3, 3)\n",
"\n",
"fig = plt.figure(figsize=(4,4))\n",
"\n",
"ax00 = plt.subplot(gs[0,0])\n",
"ax00.set_xticks([])\n",
"ax00.set_yticks([])\n",
"ax00.imshow(PCM_00, interpolation='nearest')\n",
"\n",
"ax01 = plt.subplot(gs[0,1])\n",
"ax01.set_xticks([])\n",
"ax01.set_yticks([])\n",
"ax01.imshow(PCM_01, interpolation='nearest')\n",
"\n",
"ax02 = plt.subplot(gs[0,2])\n",
"ax02.set_xticks([])\n",
"ax02.set_yticks([])\n",
"ax02.imshow(PCM_02, interpolation='nearest')\n",
"\n",
"ax11 = plt.subplot(gs[1,1])\n",
"ax11.set_xticks([])\n",
"ax11.set_yticks([])\n",
"ax11.imshow(PCM_11, interpolation='nearest')\n",
"\n",
"ax12 = plt.subplot(gs[1,2])\n",
"ax12.set_xticks([])\n",
"ax12.set_yticks([])\n",
"ax12.imshow(PCM_12, interpolation='nearest')\n",
"\n",
"ax22 = plt.subplot(gs[2,2])\n",
"ax22.set_xticks([])\n",
"ax22.set_yticks([])\n",
"ax22.imshow(PCM_22, interpolation='nearest')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Distance between two graphs:\n",
"For each pair of graphs, there is a matrix of distance**s**. So for such **a** matrix, a distanc**e**, a total distance (**dt**) can be computed as the sum of all distances.\n",
"\n",
"So, for three graphs, we have 6 different total distances $dt_{00}, dt_{01},..., dt_{22}$ since :\n",
"\n",
"$$distance(graph_1, graph_2) = distance(graph_2, graph_1)$$\n",
"\n",
"Those distances can be arranged in 3x3 symetric square matrix. The matrix of total distances (**DTM**):"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"DTM = np.zeros((3,3))\n",
"DTM[0,0]=dt00\n",
"DTM[0,1]=dt01\n",
"DTM[0,2]=dt02\n",
"DTM[1,1]=dt11\n",
"DTM[1,2]=dt12\n",
"DTM[2,2]=dt22"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Plotting DTM\n",
"We can see that some upper element of **DTM** are smaller than elements of the diagonal. This isn't too good, a kind of normalization should be done to fix this issue."
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 178. 187. 256.]\n",
" [ 0. 105. 135.]\n",
" [ 0. 0. 140.]]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAO0AAADtCAYAAABTTfKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAzlJREFUeJzt2TFNBFEYRtF5ZAXghBYJKKBHCWCDBhtIoMUCCnDwMLA7\nhAR43M055fxbfM3NTLJjzrkBHRerBwDfI1qIES3EiBZiRAsxooWYw95xjOH/IFhkzjmOPd+Ndtu2\nbb7+/Jiz8756QMfD7eoFDY87N5/HECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsx\nooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQ\nI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQL\nMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIebw\n1Q/G9f1f7Ei7mjerJ2TczefVExrG08mTNy3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGi\nhRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAj\nWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsx\nooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQ\nI1qIES3EHFYPOAdv42X1hIzL+bF6Qp43LcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKF\nGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNa\niBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGi\nhRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAj\nWogRLcSIFmLGnPP0cYzTR+BXzTnHsee70QL/j89jiBEtxIgWYkQLMaKFmE/s0h8orI8JaQAAAABJ\nRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x9897fd6c>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.subplot(111,xticks=[], yticks=[])\n",
"plt.imshow(DTM, interpolation='nearest')\n",
"print np.round(DTM)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Defining a normalized distance between two graphs\n",
"The total inter distances is normalized by the sum of total intra-distances. The total inter distances is multiplied by two in order to have a normalised distance $nD$ $$ nD(response curve_i, response curve_i) =1$$ when conputed against the pair of same response curve. Finally $nD$ is computed as follow:\n",
"\n",
"$$nD(r_i,r_j)=\\frac{1}{\\frac{2distance(r_i,r_j)}{r_i+r_j}}=\\frac{r_i+r_j}{2distance(r_i,r_j)} $$ such that $$nD(r_i,r_j)<=1$$"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def normalized_total_distance(response1, response2):\n",
" intra_distances_1 = cdist(response1, response1)\n",
" intra_distances_2 = cdist(response2, response2)\n",
" inter_distances = cdist(response1, response2)\n",
" total_intra_1 = np.sum(intra_distances_1)\n",
" total_intra_2 = np.sum(intra_distances_2)\n",
" total_inter = np.sum(inter_distances)\n",
" ntd = 2.0*total_inter/(total_intra_1+total_intra_2)\n",
" return 1/ntd"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"ntd_00 = normalized_total_distance(prc0, prc0)\n",
"ntd_01 = normalized_total_distance(prc0, prc1)\n",
"ntd_02 = normalized_total_distance(prc0, prc2)\n",
"ntd_11 = normalized_total_distance(prc1, prc1)\n",
"ntd_12 = normalized_total_distance(prc1, prc2)\n",
"ntd_22 = normalized_total_distance(prc2, prc2)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Similarity of three graphs\n"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1. 0.75751403 0.62186779]\n",
" [ 0. 1. 0.90636131]\n",
" [ 0. 0. 1. ]]\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAO0AAADtCAYAAABTTfKPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAAzhJREFUeJzt2bFtG0EURdEZQS0YcKj2FKkEmh24Rccu4qsBkoAAyeMr\nnBPuT15ysQvsnpkFdDydHgB8jGghRrQQI1qIES3EiBZinh8d997+B8EhM7NvPX8Y7VprXT5/y7fz\n6/fpBR1/3n6cnpDwsv/evfk8hhjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3E\niBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFC\njGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEt\nxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzF7Zu4f\n9561Lv9wTtNlXU9PyHg9PSDi51prZvatmzctxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsx\nooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQ\nI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQL\nMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0\nECNaiBEtxDyfHvAdXNfl9ISQ6+kBed60ECNaiBEtxIgWYkQLMaKFGNFCjGghRrQQI1qIES3EiBZi\nRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgWYkQLMaKFGNFCjGgh\nRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxoIUa0ECNaiBEtxIgW\nYkQLMaKFGNFCjGghRrQQI1qIES3EiBZiRAsxooUY0UKMaCFGtBAjWogRLcSIFmJECzGihRjRQoxo\nIUa0ECNaiNkzc/+49/0j8KVmZt96/jBa4P/j8xhiRAsxooUY0UKMaCHmHVhhIVIcLfHCAAAAAElF\nTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x98e0220c>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nDTM = np.zeros((3,3))\n",
"nDTM[0,0]=ntd_00\n",
"nDTM[0,1]=ntd_01\n",
"nDTM[0,2]=ntd_02\n",
"nDTM[1,1]=ntd_11\n",
"nDTM[1,2]=ntd_12\n",
"nDTM[2,2]=ntd_22\n",
"\n",
"plt.subplot(111,xticks=[], yticks=[])\n",
"plt.imshow(nDTM, interpolation='nearest')\n",
"print (nDTM)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment