Skip to content

Instantly share code, notes, and snippets.

@alexlenail
Created January 21, 2019 01:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save alexlenail/48372b1edd1dd9c7689f6da22c21aa58 to your computer and use it in GitHub Desktop.
Save alexlenail/48372b1edd1dd9c7689f6da22c21aa58 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test NetReg\n",
"\n",
"Docs https://dirmeier.github.io/netReg/articles/netReg_commandline.html"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import numpy as np\n",
"import pandas as pd\n",
"import networkx as nx\n",
"\n",
"def flatten(list_of_lists): return [item for sublist in list_of_lists for item in sublist]\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## I. Generate synthetic \"easy\" graph and graph signals"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"num_nodes = 15\n",
"p_edge = 0.3\n",
"g1 = nx.fast_gnp_random_graph(num_nodes, p_edge)\n",
"g2 = nx.fast_gnp_random_graph(num_nodes, p_edge)\n",
"\n",
"nx.relabel_nodes(g2, {number: number + 15 for number in g2.nodes}, copy=False)\n",
"\n",
"g = nx.compose(g1, g2)\n",
"\n",
"g.add_edge(1, 25)\n",
"g.add_edge(2, 20)\n",
"g.add_edge(3, 15)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"nx.draw_spring(g)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"nx.to_pandas_adjacency(g).to_csv('./GX.tsv', sep='\\t', header=False, index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### True signal comes from 0 and its neighbors"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[0, 4, 8, 10]"
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"signal_nodes = [0]+[n for n in g.neighbors(0)]\n",
"signal_nodes"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### First half is class 1, second half is class 0"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
" 1., 1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0.])"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"NUM_POSITIVES = 20\n",
"NUM_NEGATIVES = 20\n",
"y = np.concatenate((np.ones(NUM_POSITIVES), np.zeros(NUM_NEGATIVES)))\n",
"y"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [],
"source": [
"pd.Series(y).to_csv('./Y.tsv', sep='\\t', index=False, header=False)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <th>7</th>\n",
" <th>8</th>\n",
" <th>9</th>\n",
" <th>...</th>\n",
" <th>20</th>\n",
" <th>21</th>\n",
" <th>22</th>\n",
" <th>23</th>\n",
" <th>24</th>\n",
" <th>25</th>\n",
" <th>26</th>\n",
" <th>27</th>\n",
" <th>28</th>\n",
" <th>29</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1.0</td>\n",
" <td>0.903347</td>\n",
" <td>-0.128162</td>\n",
" <td>0.572380</td>\n",
" <td>1.0</td>\n",
" <td>-0.004519</td>\n",
" <td>1.079736</td>\n",
" <td>0.916224</td>\n",
" <td>1.0</td>\n",
" <td>-1.626318</td>\n",
" <td>...</td>\n",
" <td>-0.600198</td>\n",
" <td>-0.668972</td>\n",
" <td>0.092678</td>\n",
" <td>-0.109018</td>\n",
" <td>0.431590</td>\n",
" <td>-0.084260</td>\n",
" <td>-0.846324</td>\n",
" <td>0.015333</td>\n",
" <td>-1.210628</td>\n",
" <td>0.856874</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1.0</td>\n",
" <td>-1.279885</td>\n",
" <td>0.960301</td>\n",
" <td>0.437157</td>\n",
" <td>1.0</td>\n",
" <td>-0.757789</td>\n",
" <td>-2.151379</td>\n",
" <td>-0.051448</td>\n",
" <td>1.0</td>\n",
" <td>-0.421560</td>\n",
" <td>...</td>\n",
" <td>0.057303</td>\n",
" <td>1.291067</td>\n",
" <td>0.233242</td>\n",
" <td>-0.864555</td>\n",
" <td>-0.285750</td>\n",
" <td>-0.951169</td>\n",
" <td>-0.417615</td>\n",
" <td>0.020936</td>\n",
" <td>-1.046191</td>\n",
" <td>-1.069503</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.0</td>\n",
" <td>0.558501</td>\n",
" <td>0.151264</td>\n",
" <td>-0.699504</td>\n",
" <td>1.0</td>\n",
" <td>0.951491</td>\n",
" <td>-0.795638</td>\n",
" <td>-0.041552</td>\n",
" <td>1.0</td>\n",
" <td>1.216233</td>\n",
" <td>...</td>\n",
" <td>1.365128</td>\n",
" <td>0.939043</td>\n",
" <td>2.041606</td>\n",
" <td>-0.602816</td>\n",
" <td>1.387625</td>\n",
" <td>-0.365063</td>\n",
" <td>1.530591</td>\n",
" <td>-0.837005</td>\n",
" <td>-0.007999</td>\n",
" <td>-2.269240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1.0</td>\n",
" <td>-0.712538</td>\n",
" <td>-0.531382</td>\n",
" <td>-1.876617</td>\n",
" <td>1.0</td>\n",
" <td>0.403563</td>\n",
" <td>0.017788</td>\n",
" <td>-0.299936</td>\n",
" <td>1.0</td>\n",
" <td>0.286593</td>\n",
" <td>...</td>\n",
" <td>0.509495</td>\n",
" <td>0.559179</td>\n",
" <td>-1.068002</td>\n",
" <td>-0.285172</td>\n",
" <td>1.233343</td>\n",
" <td>0.707240</td>\n",
" <td>-0.746940</td>\n",
" <td>1.218185</td>\n",
" <td>0.290775</td>\n",
" <td>2.017524</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1.0</td>\n",
" <td>-1.044032</td>\n",
" <td>-0.885235</td>\n",
" <td>-0.557718</td>\n",
" <td>1.0</td>\n",
" <td>0.330755</td>\n",
" <td>-2.405410</td>\n",
" <td>-1.879886</td>\n",
" <td>1.0</td>\n",
" <td>-1.099572</td>\n",
" <td>...</td>\n",
" <td>-0.098214</td>\n",
" <td>-0.684259</td>\n",
" <td>0.779088</td>\n",
" <td>0.219892</td>\n",
" <td>1.359714</td>\n",
" <td>-0.692724</td>\n",
" <td>-0.570500</td>\n",
" <td>-0.449152</td>\n",
" <td>0.210697</td>\n",
" <td>1.039060</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 30 columns</p>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3 4 5 6 7 8 \\\n",
"0 1.0 0.903347 -0.128162 0.572380 1.0 -0.004519 1.079736 0.916224 1.0 \n",
"1 1.0 -1.279885 0.960301 0.437157 1.0 -0.757789 -2.151379 -0.051448 1.0 \n",
"2 1.0 0.558501 0.151264 -0.699504 1.0 0.951491 -0.795638 -0.041552 1.0 \n",
"3 1.0 -0.712538 -0.531382 -1.876617 1.0 0.403563 0.017788 -0.299936 1.0 \n",
"4 1.0 -1.044032 -0.885235 -0.557718 1.0 0.330755 -2.405410 -1.879886 1.0 \n",
"\n",
" 9 ... 20 21 22 23 24 \\\n",
"0 -1.626318 ... -0.600198 -0.668972 0.092678 -0.109018 0.431590 \n",
"1 -0.421560 ... 0.057303 1.291067 0.233242 -0.864555 -0.285750 \n",
"2 1.216233 ... 1.365128 0.939043 2.041606 -0.602816 1.387625 \n",
"3 0.286593 ... 0.509495 0.559179 -1.068002 -0.285172 1.233343 \n",
"4 -1.099572 ... -0.098214 -0.684259 0.779088 0.219892 1.359714 \n",
"\n",
" 25 26 27 28 29 \n",
"0 -0.084260 -0.846324 0.015333 -1.210628 0.856874 \n",
"1 -0.951169 -0.417615 0.020936 -1.046191 -1.069503 \n",
"2 -0.365063 1.530591 -0.837005 -0.007999 -2.269240 \n",
"3 0.707240 -0.746940 1.218185 0.290775 2.017524 \n",
"4 -0.692724 -0.570500 -0.449152 0.210697 1.039060 \n",
"\n",
"[5 rows x 30 columns]"
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = pd.DataFrame(np.random.normal(size=(NUM_POSITIVES+NUM_NEGATIVES,30)))\n",
"data.loc[0:NUM_POSITIVES, signal_nodes] = 1\n",
"data.loc[NUM_POSITIVES:NUM_POSITIVES+NUM_NEGATIVES, signal_nodes] = -1\n",
"\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <th>7</th>\n",
" <th>8</th>\n",
" <th>9</th>\n",
" <th>...</th>\n",
" <th>20</th>\n",
" <th>21</th>\n",
" <th>22</th>\n",
" <th>23</th>\n",
" <th>24</th>\n",
" <th>25</th>\n",
" <th>26</th>\n",
" <th>27</th>\n",
" <th>28</th>\n",
" <th>29</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>35</th>\n",
" <td>-1.0</td>\n",
" <td>0.400117</td>\n",
" <td>0.699755</td>\n",
" <td>-0.747789</td>\n",
" <td>-1.0</td>\n",
" <td>1.131007</td>\n",
" <td>-0.040273</td>\n",
" <td>1.204940</td>\n",
" <td>-1.0</td>\n",
" <td>-0.350392</td>\n",
" <td>...</td>\n",
" <td>-0.864574</td>\n",
" <td>-0.484737</td>\n",
" <td>0.842224</td>\n",
" <td>-0.019289</td>\n",
" <td>0.418997</td>\n",
" <td>-0.308423</td>\n",
" <td>-0.211950</td>\n",
" <td>0.097453</td>\n",
" <td>0.087887</td>\n",
" <td>1.085850</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36</th>\n",
" <td>-1.0</td>\n",
" <td>-1.426152</td>\n",
" <td>-0.528884</td>\n",
" <td>0.135399</td>\n",
" <td>-1.0</td>\n",
" <td>0.719906</td>\n",
" <td>0.242300</td>\n",
" <td>-0.220248</td>\n",
" <td>-1.0</td>\n",
" <td>-0.402100</td>\n",
" <td>...</td>\n",
" <td>-1.755135</td>\n",
" <td>0.623342</td>\n",
" <td>-0.853497</td>\n",
" <td>-0.943191</td>\n",
" <td>-0.588174</td>\n",
" <td>-0.849837</td>\n",
" <td>0.314306</td>\n",
" <td>-0.314638</td>\n",
" <td>0.637343</td>\n",
" <td>1.751768</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37</th>\n",
" <td>-1.0</td>\n",
" <td>-0.712975</td>\n",
" <td>0.342902</td>\n",
" <td>-1.780513</td>\n",
" <td>-1.0</td>\n",
" <td>1.025383</td>\n",
" <td>0.550930</td>\n",
" <td>0.078756</td>\n",
" <td>-1.0</td>\n",
" <td>-0.077454</td>\n",
" <td>...</td>\n",
" <td>0.623931</td>\n",
" <td>-0.329903</td>\n",
" <td>0.652825</td>\n",
" <td>-1.296676</td>\n",
" <td>0.548088</td>\n",
" <td>0.421803</td>\n",
" <td>-1.523543</td>\n",
" <td>-0.790050</td>\n",
" <td>-0.106530</td>\n",
" <td>-0.698059</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>-1.0</td>\n",
" <td>0.741554</td>\n",
" <td>0.044848</td>\n",
" <td>0.291540</td>\n",
" <td>-1.0</td>\n",
" <td>0.089251</td>\n",
" <td>-0.325427</td>\n",
" <td>1.417877</td>\n",
" <td>-1.0</td>\n",
" <td>3.348531</td>\n",
" <td>...</td>\n",
" <td>0.726098</td>\n",
" <td>0.265082</td>\n",
" <td>0.913017</td>\n",
" <td>-1.552725</td>\n",
" <td>0.408055</td>\n",
" <td>0.363023</td>\n",
" <td>0.052344</td>\n",
" <td>-0.728154</td>\n",
" <td>1.344748</td>\n",
" <td>0.124876</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>-1.0</td>\n",
" <td>-2.054809</td>\n",
" <td>0.509471</td>\n",
" <td>-0.080326</td>\n",
" <td>-1.0</td>\n",
" <td>-0.916427</td>\n",
" <td>0.698094</td>\n",
" <td>-1.461984</td>\n",
" <td>-1.0</td>\n",
" <td>-0.958942</td>\n",
" <td>...</td>\n",
" <td>0.310732</td>\n",
" <td>-1.470281</td>\n",
" <td>-0.440905</td>\n",
" <td>-0.345298</td>\n",
" <td>0.924052</td>\n",
" <td>1.603482</td>\n",
" <td>0.255118</td>\n",
" <td>0.420428</td>\n",
" <td>-0.255117</td>\n",
" <td>0.941498</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 30 columns</p>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3 4 5 6 7 8 \\\n",
"35 -1.0 0.400117 0.699755 -0.747789 -1.0 1.131007 -0.040273 1.204940 -1.0 \n",
"36 -1.0 -1.426152 -0.528884 0.135399 -1.0 0.719906 0.242300 -0.220248 -1.0 \n",
"37 -1.0 -0.712975 0.342902 -1.780513 -1.0 1.025383 0.550930 0.078756 -1.0 \n",
"38 -1.0 0.741554 0.044848 0.291540 -1.0 0.089251 -0.325427 1.417877 -1.0 \n",
"39 -1.0 -2.054809 0.509471 -0.080326 -1.0 -0.916427 0.698094 -1.461984 -1.0 \n",
"\n",
" 9 ... 20 21 22 23 24 \\\n",
"35 -0.350392 ... -0.864574 -0.484737 0.842224 -0.019289 0.418997 \n",
"36 -0.402100 ... -1.755135 0.623342 -0.853497 -0.943191 -0.588174 \n",
"37 -0.077454 ... 0.623931 -0.329903 0.652825 -1.296676 0.548088 \n",
"38 3.348531 ... 0.726098 0.265082 0.913017 -1.552725 0.408055 \n",
"39 -0.958942 ... 0.310732 -1.470281 -0.440905 -0.345298 0.924052 \n",
"\n",
" 25 26 27 28 29 \n",
"35 -0.308423 -0.211950 0.097453 0.087887 1.085850 \n",
"36 -0.849837 0.314306 -0.314638 0.637343 1.751768 \n",
"37 0.421803 -1.523543 -0.790050 -0.106530 -0.698059 \n",
"38 0.363023 0.052344 -0.728154 1.344748 0.124876 \n",
"39 1.603482 0.255118 0.420428 -0.255117 0.941498 \n",
"\n",
"[5 rows x 30 columns]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.tail()"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"data.to_csv('./X.tsv', sep='\\t', header=False, index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"CLI: \n",
"\n",
"`netReg -d X.tsv -r Y.tsv -u GX.tsv -l 10 -x 1 --maxit 1000 --threshold 0.0001 -o outfile.tsv`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## II. Evaluate results"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"coefs = pd.read_csv('./outfile_coefficients.tsv', header=None).values"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [],
"source": [
"intercept = pd.read_csv('./outfile_intercepts.tsv', header=None).values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### First half should be `1`, second half should be `0`"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[0.48736403],\n",
" [0.47926488],\n",
" [0.47119545],\n",
" [0.23539492],\n",
" [0.35371555],\n",
" [0.49234293],\n",
" [0.40171248],\n",
" [0.45141993],\n",
" [0.4617121 ],\n",
" [0.37109439],\n",
" [0.42282059],\n",
" [0.52438357],\n",
" [0.39533622],\n",
" [0.52885164],\n",
" [0.39110291],\n",
" [0.45996463],\n",
" [0.41831423],\n",
" [0.47832352],\n",
" [0.43788251],\n",
" [0.48298009],\n",
" [0.37001015],\n",
" [0.52665516],\n",
" [0.42549788],\n",
" [0.54948846],\n",
" [0.41606247],\n",
" [0.40362595],\n",
" [0.46746456],\n",
" [0.38099377],\n",
" [0.52168367],\n",
" [0.37981589],\n",
" [0.4409982 ],\n",
" [0.5075481 ],\n",
" [0.46194563],\n",
" [0.30500498],\n",
" [0.40507901],\n",
" [0.31624432],\n",
" [0.34330683],\n",
" [0.44936012],\n",
" [0.45985584],\n",
" [0.42089784]])"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.dot(data, coefs) + intercept"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"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.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment