Created
January 30, 2019 22:04
-
-
Save alexlenail/6c615b59ae54902e23d42cc0822456b6 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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": 1, | |
"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": 2, | |
"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": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stderr", | |
"output_type": "stream", | |
"text": [ | |
"/Users/alex/miniconda3/lib/python3.7/site-packages/networkx/drawing/nx_pylab.py:611: MatplotlibDeprecationWarning: isinstance(..., numbers.Number)\n", | |
" if cb.is_numlike(alpha):\n" | |
] | |
}, | |
{ | |
"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": 4, | |
"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": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"[0, 2, 12]" | |
] | |
}, | |
"execution_count": 5, | |
"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": 6, | |
"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": 6, | |
"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": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"pd.Series(y).to_csv('./Y.tsv', sep='\\t', index=False, header=False)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"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.274590</td>\n", | |
" <td>1.0</td>\n", | |
" <td>-0.698990</td>\n", | |
" <td>-0.532659</td>\n", | |
" <td>0.999482</td>\n", | |
" <td>-0.411094</td>\n", | |
" <td>-0.563570</td>\n", | |
" <td>-0.043498</td>\n", | |
" <td>-2.263392</td>\n", | |
" <td>...</td>\n", | |
" <td>-0.061094</td>\n", | |
" <td>-0.468636</td>\n", | |
" <td>0.341698</td>\n", | |
" <td>-1.644608</td>\n", | |
" <td>-0.567301</td>\n", | |
" <td>2.173033</td>\n", | |
" <td>-0.003954</td>\n", | |
" <td>1.367049</td>\n", | |
" <td>1.643030</td>\n", | |
" <td>0.868062</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>1</th>\n", | |
" <td>1.0</td>\n", | |
" <td>-0.253479</td>\n", | |
" <td>1.0</td>\n", | |
" <td>-1.102518</td>\n", | |
" <td>0.474526</td>\n", | |
" <td>-1.388415</td>\n", | |
" <td>-0.008398</td>\n", | |
" <td>-0.269027</td>\n", | |
" <td>-0.614436</td>\n", | |
" <td>0.872053</td>\n", | |
" <td>...</td>\n", | |
" <td>1.542386</td>\n", | |
" <td>-1.063486</td>\n", | |
" <td>0.876720</td>\n", | |
" <td>-0.497992</td>\n", | |
" <td>1.195970</td>\n", | |
" <td>-2.769484</td>\n", | |
" <td>0.174465</td>\n", | |
" <td>-1.681907</td>\n", | |
" <td>-0.611340</td>\n", | |
" <td>0.148668</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2</th>\n", | |
" <td>1.0</td>\n", | |
" <td>-0.575801</td>\n", | |
" <td>1.0</td>\n", | |
" <td>0.273675</td>\n", | |
" <td>-1.340976</td>\n", | |
" <td>-2.558076</td>\n", | |
" <td>-0.925458</td>\n", | |
" <td>-0.966284</td>\n", | |
" <td>3.190889</td>\n", | |
" <td>1.780207</td>\n", | |
" <td>...</td>\n", | |
" <td>-1.490816</td>\n", | |
" <td>0.983925</td>\n", | |
" <td>0.172936</td>\n", | |
" <td>-1.513569</td>\n", | |
" <td>-0.464894</td>\n", | |
" <td>0.511576</td>\n", | |
" <td>-1.289118</td>\n", | |
" <td>0.245467</td>\n", | |
" <td>1.249853</td>\n", | |
" <td>-0.281507</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>3</th>\n", | |
" <td>1.0</td>\n", | |
" <td>0.095011</td>\n", | |
" <td>1.0</td>\n", | |
" <td>-0.795701</td>\n", | |
" <td>-1.693577</td>\n", | |
" <td>0.892013</td>\n", | |
" <td>-1.708229</td>\n", | |
" <td>0.326411</td>\n", | |
" <td>0.529921</td>\n", | |
" <td>2.030062</td>\n", | |
" <td>...</td>\n", | |
" <td>0.765306</td>\n", | |
" <td>-2.105844</td>\n", | |
" <td>-2.259628</td>\n", | |
" <td>-1.553139</td>\n", | |
" <td>1.486627</td>\n", | |
" <td>-1.677455</td>\n", | |
" <td>1.259744</td>\n", | |
" <td>-0.356439</td>\n", | |
" <td>-0.599071</td>\n", | |
" <td>0.493754</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>4</th>\n", | |
" <td>1.0</td>\n", | |
" <td>0.221044</td>\n", | |
" <td>1.0</td>\n", | |
" <td>0.297137</td>\n", | |
" <td>-0.433145</td>\n", | |
" <td>1.157598</td>\n", | |
" <td>0.300974</td>\n", | |
" <td>0.639305</td>\n", | |
" <td>-0.404848</td>\n", | |
" <td>0.647740</td>\n", | |
" <td>...</td>\n", | |
" <td>-0.295733</td>\n", | |
" <td>-2.633194</td>\n", | |
" <td>-2.290419</td>\n", | |
" <td>-0.747353</td>\n", | |
" <td>1.080292</td>\n", | |
" <td>-0.609874</td>\n", | |
" <td>-0.289881</td>\n", | |
" <td>1.047457</td>\n", | |
" <td>-1.274673</td>\n", | |
" <td>-0.481361</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 \\\n", | |
"0 1.0 -0.274590 1.0 -0.698990 -0.532659 0.999482 -0.411094 -0.563570 \n", | |
"1 1.0 -0.253479 1.0 -1.102518 0.474526 -1.388415 -0.008398 -0.269027 \n", | |
"2 1.0 -0.575801 1.0 0.273675 -1.340976 -2.558076 -0.925458 -0.966284 \n", | |
"3 1.0 0.095011 1.0 -0.795701 -1.693577 0.892013 -1.708229 0.326411 \n", | |
"4 1.0 0.221044 1.0 0.297137 -0.433145 1.157598 0.300974 0.639305 \n", | |
"\n", | |
" 8 9 ... 20 21 22 23 \\\n", | |
"0 -0.043498 -2.263392 ... -0.061094 -0.468636 0.341698 -1.644608 \n", | |
"1 -0.614436 0.872053 ... 1.542386 -1.063486 0.876720 -0.497992 \n", | |
"2 3.190889 1.780207 ... -1.490816 0.983925 0.172936 -1.513569 \n", | |
"3 0.529921 2.030062 ... 0.765306 -2.105844 -2.259628 -1.553139 \n", | |
"4 -0.404848 0.647740 ... -0.295733 -2.633194 -2.290419 -0.747353 \n", | |
"\n", | |
" 24 25 26 27 28 29 \n", | |
"0 -0.567301 2.173033 -0.003954 1.367049 1.643030 0.868062 \n", | |
"1 1.195970 -2.769484 0.174465 -1.681907 -0.611340 0.148668 \n", | |
"2 -0.464894 0.511576 -1.289118 0.245467 1.249853 -0.281507 \n", | |
"3 1.486627 -1.677455 1.259744 -0.356439 -0.599071 0.493754 \n", | |
"4 1.080292 -0.609874 -0.289881 1.047457 -1.274673 -0.481361 \n", | |
"\n", | |
"[5 rows x 30 columns]" | |
] | |
}, | |
"execution_count": 8, | |
"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": 9, | |
"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>-1.077783</td>\n", | |
" <td>-1.0</td>\n", | |
" <td>-0.708090</td>\n", | |
" <td>-0.862535</td>\n", | |
" <td>-0.166449</td>\n", | |
" <td>0.252162</td>\n", | |
" <td>-0.112223</td>\n", | |
" <td>-0.174938</td>\n", | |
" <td>-1.380974</td>\n", | |
" <td>...</td>\n", | |
" <td>-1.494549</td>\n", | |
" <td>1.140767</td>\n", | |
" <td>-0.910527</td>\n", | |
" <td>-1.693001</td>\n", | |
" <td>0.044742</td>\n", | |
" <td>-1.130667</td>\n", | |
" <td>-0.414827</td>\n", | |
" <td>-0.081179</td>\n", | |
" <td>1.728920</td>\n", | |
" <td>0.249952</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>36</th>\n", | |
" <td>-1.0</td>\n", | |
" <td>-0.076406</td>\n", | |
" <td>-1.0</td>\n", | |
" <td>-1.482182</td>\n", | |
" <td>-1.609379</td>\n", | |
" <td>0.560579</td>\n", | |
" <td>1.198271</td>\n", | |
" <td>0.203236</td>\n", | |
" <td>-0.505653</td>\n", | |
" <td>-1.275334</td>\n", | |
" <td>...</td>\n", | |
" <td>0.661687</td>\n", | |
" <td>1.901621</td>\n", | |
" <td>0.182451</td>\n", | |
" <td>-1.600305</td>\n", | |
" <td>-0.141153</td>\n", | |
" <td>0.202242</td>\n", | |
" <td>-1.665416</td>\n", | |
" <td>0.482316</td>\n", | |
" <td>0.942921</td>\n", | |
" <td>-0.804717</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>37</th>\n", | |
" <td>-1.0</td>\n", | |
" <td>-0.265708</td>\n", | |
" <td>-1.0</td>\n", | |
" <td>-0.641767</td>\n", | |
" <td>-0.073150</td>\n", | |
" <td>2.310090</td>\n", | |
" <td>-0.127935</td>\n", | |
" <td>0.658451</td>\n", | |
" <td>0.660385</td>\n", | |
" <td>-0.073376</td>\n", | |
" <td>...</td>\n", | |
" <td>-0.975296</td>\n", | |
" <td>0.993728</td>\n", | |
" <td>1.082379</td>\n", | |
" <td>-0.501905</td>\n", | |
" <td>1.501959</td>\n", | |
" <td>0.612743</td>\n", | |
" <td>-2.289610</td>\n", | |
" <td>1.006083</td>\n", | |
" <td>-0.605824</td>\n", | |
" <td>-0.581451</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>38</th>\n", | |
" <td>-1.0</td>\n", | |
" <td>0.961926</td>\n", | |
" <td>-1.0</td>\n", | |
" <td>0.730882</td>\n", | |
" <td>-0.236051</td>\n", | |
" <td>0.068084</td>\n", | |
" <td>-0.891219</td>\n", | |
" <td>-0.822375</td>\n", | |
" <td>-1.105326</td>\n", | |
" <td>-0.655064</td>\n", | |
" <td>...</td>\n", | |
" <td>-0.731743</td>\n", | |
" <td>-0.183111</td>\n", | |
" <td>0.951467</td>\n", | |
" <td>-1.438999</td>\n", | |
" <td>0.452881</td>\n", | |
" <td>-1.770376</td>\n", | |
" <td>-0.513854</td>\n", | |
" <td>0.494221</td>\n", | |
" <td>2.245104</td>\n", | |
" <td>-0.318280</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>39</th>\n", | |
" <td>-1.0</td>\n", | |
" <td>0.867310</td>\n", | |
" <td>-1.0</td>\n", | |
" <td>-2.100335</td>\n", | |
" <td>1.349170</td>\n", | |
" <td>1.367759</td>\n", | |
" <td>-0.466341</td>\n", | |
" <td>0.950130</td>\n", | |
" <td>0.721734</td>\n", | |
" <td>-0.185753</td>\n", | |
" <td>...</td>\n", | |
" <td>0.806313</td>\n", | |
" <td>1.183925</td>\n", | |
" <td>0.780224</td>\n", | |
" <td>-0.269939</td>\n", | |
" <td>-0.941226</td>\n", | |
" <td>1.272114</td>\n", | |
" <td>-0.340602</td>\n", | |
" <td>0.129933</td>\n", | |
" <td>-0.740308</td>\n", | |
" <td>0.197642</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 \\\n", | |
"35 -1.0 -1.077783 -1.0 -0.708090 -0.862535 -0.166449 0.252162 -0.112223 \n", | |
"36 -1.0 -0.076406 -1.0 -1.482182 -1.609379 0.560579 1.198271 0.203236 \n", | |
"37 -1.0 -0.265708 -1.0 -0.641767 -0.073150 2.310090 -0.127935 0.658451 \n", | |
"38 -1.0 0.961926 -1.0 0.730882 -0.236051 0.068084 -0.891219 -0.822375 \n", | |
"39 -1.0 0.867310 -1.0 -2.100335 1.349170 1.367759 -0.466341 0.950130 \n", | |
"\n", | |
" 8 9 ... 20 21 22 23 \\\n", | |
"35 -0.174938 -1.380974 ... -1.494549 1.140767 -0.910527 -1.693001 \n", | |
"36 -0.505653 -1.275334 ... 0.661687 1.901621 0.182451 -1.600305 \n", | |
"37 0.660385 -0.073376 ... -0.975296 0.993728 1.082379 -0.501905 \n", | |
"38 -1.105326 -0.655064 ... -0.731743 -0.183111 0.951467 -1.438999 \n", | |
"39 0.721734 -0.185753 ... 0.806313 1.183925 0.780224 -0.269939 \n", | |
"\n", | |
" 24 25 26 27 28 29 \n", | |
"35 0.044742 -1.130667 -0.414827 -0.081179 1.728920 0.249952 \n", | |
"36 -0.141153 0.202242 -1.665416 0.482316 0.942921 -0.804717 \n", | |
"37 1.501959 0.612743 -2.289610 1.006083 -0.605824 -0.581451 \n", | |
"38 0.452881 -1.770376 -0.513854 0.494221 2.245104 -0.318280 \n", | |
"39 -0.941226 1.272114 -0.340602 0.129933 -0.740308 0.197642 \n", | |
"\n", | |
"[5 rows x 30 columns]" | |
] | |
}, | |
"execution_count": 9, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data.tail()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"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 1 -x 1 --maxit 1000 --threshold 0.0001 -o outfile.tsv`" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## II. Evaluate results" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"coefs = pd.read_csv('./outfile_coefficients.tsv', header=None).values" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"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": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 0.82173772],\n", | |
" [-0.11849766],\n", | |
" [-0.41574922],\n", | |
" [-0.23627303],\n", | |
" [ 0.56560189],\n", | |
" [-0.37633525],\n", | |
" [ 0.48237531],\n", | |
" [ 0.2177073 ],\n", | |
" [ 0.91701405],\n", | |
" [ 0.59402528],\n", | |
" [ 0.31197479],\n", | |
" [ 0.99025297],\n", | |
" [-0.08251468],\n", | |
" [ 1.2865159 ],\n", | |
" [ 0.35286948],\n", | |
" [ 0.38070373],\n", | |
" [ 1.17176761],\n", | |
" [ 0.88121509],\n", | |
" [ 0.31068594],\n", | |
" [ 0.23868895],\n", | |
" [-0.27912378],\n", | |
" [ 0.24124152],\n", | |
" [ 0.95774265],\n", | |
" [ 1.39257334],\n", | |
" [ 0.13548364],\n", | |
" [ 0.80464262],\n", | |
" [ 0.1076002 ],\n", | |
" [-0.57198437],\n", | |
" [-0.02110869],\n", | |
" [ 0.57646079],\n", | |
" [ 0.78127633],\n", | |
" [ 1.24762357],\n", | |
" [ 0.6980027 ],\n", | |
" [-0.29957117],\n", | |
" [ 0.37461279],\n", | |
" [ 0.58389596],\n", | |
" [ 0.56869353],\n", | |
" [ 0.44051784],\n", | |
" [ 0.5670803 ],\n", | |
" [ 0.29767309]])" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"np.dot(data, coefs) + intercept" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"array([[ 0. ],\n", | |
" [ 0. ],\n", | |
" [-0.05684467],\n", | |
" [ 0.1220044 ],\n", | |
" [-0.05052383],\n", | |
" [ 0.07207909],\n", | |
" [-0.1195923 ],\n", | |
" [ 0.01086971],\n", | |
" [-0.08565058],\n", | |
" [ 0.03005658],\n", | |
" [-0.10079133],\n", | |
" [-0.07820072],\n", | |
" [ 0. ],\n", | |
" [-0.21802262],\n", | |
" [ 0. ],\n", | |
" [-0.00667391],\n", | |
" [-0.06549703],\n", | |
" [-0.09133224],\n", | |
" [ 0.094144 ],\n", | |
" [-0.31748399],\n", | |
" [ 0. ],\n", | |
" [ 0. ],\n", | |
" [-0.04789705],\n", | |
" [-0.11631506],\n", | |
" [-0.08864716],\n", | |
" [ 0. ],\n", | |
" [-0.10848871],\n", | |
" [-0.02653332],\n", | |
" [ 0. ],\n", | |
" [ 0. ]])" | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"coefs" | |
] | |
}, | |
{ | |
"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.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment