tda-networks/facebook.ipynb
2018-06-20 12:48:57 +01:00

532 lines
55 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Facebook Social Network"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"import igraph as ig\n",
"import dionysus as d"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"plt.style.use(\"fivethirtyeight\")\n",
"plt.rcParams[\"figure.figsize\"] = 10, 6"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data import"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"G = ig.read(\"data/facebook/facebook.graphml\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"autoscroll": false,
"collapsed": false,
"ein.tags": "worksheet-0",
"slideshow": {
"slide_type": "-"
}
},
"outputs": [],
"source": [
"G.to_undirected(combine_edges=\"first\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'IGRAPH UN-- 1899 15737 -- \\n+ attr: id (v), name (v), c0 (e), c1 (e), id (e)'"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G.summary()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['c0', 'id', 'c1']"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G.es.attributes()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"G.es['weight'] = np.array(G.es['c0']).astype(int)\n",
"G.es['time'] = np.array(G.es['c1']).astype(float)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"del G.es['c0']\n",
"del G.es['c1']"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['time', 'weight', 'id']"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G.es.attributes()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Weight rank clique filtration and persistent homology"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"from filtration import wrcf"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def get_diagram(graph, weight=\"weight\"):\n",
" filt = wrcf(graph, weight=weight)\n",
" pers = d.homology_persistence(filt)\n",
" return(d.init_diagrams(pers, filt))"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"dgms = get_diagram(G, weight=\"weight\")"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[Diagram with 1899 points,\n",
" Diagram with 414463 points,\n",
" Diagram with 39153 points,\n",
" Diagram with 34 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dgms"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"d.plot.plot_diagram(dgms[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Normalize the time scale"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(0.0, 18679088.0)"
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"time_min = min(G.es[\"time\"])\n",
"time_max = max(G.es[\"time\"])\n",
"time_min, time_max"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"G.es[\"time\"] = (np.array(G.es[\"time\"]) - time_min) / (time_max - time_min)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.hist(G.es[\"time\"], bins=50);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Discretize the time scale using non-overlapping windows"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"N = 16 # Number of windows"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [],
"source": [
"subgs = list(range(N))\n",
"for i in range(N):\n",
" subgs[i] = G.subgraph_edges(G.es(lambda e: (e[\"time\"] < (i+1)/N) & (e[\"time\"] > i/N)))"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'IGRAPH UNW- 1899 15737 -- \\n+ attr: id (v), name (v), id (e), time (e), weight (e)'"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"G.summary()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"IGRAPH UNW- 2 2 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 35 36 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 742 2455 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 988 3928 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 1121 4569 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 917 2017 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 347 361 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 380 515 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 296 339 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 228 268 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 211 229 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 251 281 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 181 172 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 200 244 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 144 152 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n",
"IGRAPH UNW- 177 167 -- \n",
"+ attr: id (v), name (v), id (e), time (e), weight (e)\n"
]
}
],
"source": [
"for g in subgs:\n",
" print(g.summary())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Apply persistent homology to each window"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"from dask.distributed import Client"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"client = Client(processes=False)"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"dgms = client.map(get_diagram, subgs)"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"distributed.comm.inproc - WARNING - Closing dangling queue in <InProc local=inproc://129.67.184.177/21235/7 remote=inproc://129.67.184.177/21235/1>\n"
]
},
{
"data": {
"text/plain": [
"[[Diagram with 2 points],\n",
" [Diagram with 35 points, Diagram with 2 points],\n",
" [Diagram with 742 points,\n",
" Diagram with 41706 points,\n",
" Diagram with 49 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 988 points,\n",
" Diagram with 119949 points,\n",
" Diagram with 109 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 1121 points,\n",
" Diagram with 147710 points,\n",
" Diagram with 214 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 917 points,\n",
" Diagram with 91056 points,\n",
" Diagram with 0 points,\n",
" Diagram with 0 points],\n",
" [Diagram with 347 points, Diagram with 12632 points, Diagram with 0 points],\n",
" [Diagram with 380 points, Diagram with 18081 points, Diagram with 0 points],\n",
" [Diagram with 296 points, Diagram with 7258 points, Diagram with 0 points],\n",
" [Diagram with 228 points, Diagram with 5888 points, Diagram with 0 points],\n",
" [Diagram with 211 points, Diagram with 6965 points, Diagram with 0 points],\n",
" [Diagram with 251 points, Diagram with 7633 points, Diagram with 0 points],\n",
" [Diagram with 181 points, Diagram with 3914 points, Diagram with 0 points],\n",
" [Diagram with 200 points, Diagram with 5267 points, Diagram with 0 points],\n",
" [Diagram with 144 points, Diagram with 2564 points, Diagram with 0 points],\n",
" [Diagram with 177 points, Diagram with 2955 points]]"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dgms = client.gather(dgms)\n",
"dgms"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}