tda-networks/sociopatterns.ipynb
2018-08-01 11:43:21 +01:00

426 lines
9.4 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# SocioPatterns"
]
},
{
"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": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data import"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"g = ig.read(\"data/sociopatterns/infectious/infectious.graphml\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'IGRAPH UN-- 10972 415912 -- \\n+ attr: id (v), name (v), id (e), time (e)'"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"g.summary()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"76944"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(np.unique(g.es[\"time\"]))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"cliques = []\n",
"for t in np.unique(g.es[\"time\"]):\n",
" edges = g.es.select(time_eq=t)\n",
" cliques.append(g.subgraph_edges(edges).maximal_cliques())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"maxcliques = g.maximal_cliques()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def filt_subgraph(t):\n",
" edges = g.es.select(time_eq=t)\n",
" cliques = g.subgraph_edges(edges).maximal_cliques()\n",
" return d.Filtration(cliques)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"times = np.sort(np.unique(g.es[\"time\"]))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import multiprocessing"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())\n",
"cliques = pool.map(clique_subgraph, times)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"pool.terminate()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"maxcliques = g.subgraph_edges(g.es.select(time_lt=times[30])).maximal_cliques()\n",
"filts = [filt_subgraph(t) for t in times[1:30]]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"maxfilt = d.Filtration(maxcliques)\n",
"for s in maxfilt:\n",
" print(s)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"presences = [[s in filt for filt in filts] for s in maxfilt]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"presences[-1]"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"[np.argwhere(np.array(p)[1:] ^ np.array(p)[:-1]).flatten().tolist() for p in presences]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cut into sliding windows"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"duration = 0.1 * (times.max() - times.min())\n",
"duration * np.arange(10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### TODO overlap"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"def sliding_windows(g, res=0.1, overlap=0):\n",
" times = np.array(g.es[\"time\"])\n",
" duration = res * (times.max() - times.min())\n",
" windows = []\n",
" for i in range(int(1/res)-1):\n",
" edges = g.es.select(time_gt=times.min() + duration*i, time_lt=times.min() + duration*(i+1))\n",
" windows.append(g.subgraph_edges(edges))\n",
" return windows"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"wins = sliding_windows(g, 0.1)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1241607579.0\n",
"1242302279.0\n",
"1242996839.0\n",
"1243691539.0\n",
"1244386179.0\n",
"1244995999.0\n",
"1245775339.0\n",
"1246468459.0\n",
"1247162039.0\n"
]
}
],
"source": [
"for i in wins:\n",
" print(max(i.es[\"time\"]))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zigzag persistence"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Compute the maximal simplicial complex"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"def max_simplicial_complex(g):\n",
" return d.Filtration(g.maximal_cliques())"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"def presence_times(g):\n",
" max_simplicial_complex = d.Filtration(g.cliques())\n",
" filts = []\n",
" for t in np.sort(np.unique(g.es[\"time\"])):\n",
" edges = g.es.select(time_eq=t)\n",
" cliques = g.subgraph_edges(edges).cliques()\n",
" filts.append(d.Filtration(cliques))\n",
" presences = [[s in filt for filt in filts] for s in max_simplicial_complex]\n",
" presences = [np.argwhere(np.array(p)[1:] ^ np.array(p)[:-1]).flatten().tolist() for p in presences]\n",
" return (max_simplicial_complex, presences)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"(f, t) = presence_times(wins[2])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"zz, dgms, cells = d.zigzag_homology_persistence(f, t)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'd' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-1-b3746bc0fac5>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0ms\u001b[0m \u001b[0;32min\u001b[0m \u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mFiltration\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0md\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSimplex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ms\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mNameError\u001b[0m: name 'd' is not defined"
]
}
],
"source": [
"for s in d.Filtration([d.Simplex((0,1,2))]):\n",
" print(s)"
]
},
{
"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
}