diff --git a/4_logistic_regression/Least_squares.ipynb b/4_logistic_regression/Least_squares.ipynb
index 42bbd81..e2af4ce 100644
--- a/4_logistic_regression/Least_squares.ipynb
+++ b/4_logistic_regression/Least_squares.ipynb
@@ -26,7 +26,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
@@ -83,7 +83,8 @@
"\n",
"如何构建函数来评估模型输出与观测数据之间的误差是一个关键问题,这里我们使用观测数据与模型输出的平方和来作为评估函数(也被称为损失函数Loss function):\n",
"$$\n",
- "L = \\sum_{i=1}^{N} (y_i - a x_i - b)^2\n",
+ "L = \\sum_{i=1}^{N} (y_i - a x_i - b)^2 \\\\\n",
+ "L = \\sum_{i=1}^{N} \\{y_i - (a x_i + b)\\}^2\n",
"$$\n",
"\n",
"使误差函数最小,那么我们就可以求出模型的参数:\n",
@@ -114,7 +115,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
@@ -220,7 +221,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 7,
"metadata": {},
"outputs": [
{
@@ -1156,7 +1157,13 @@
"epoch 926: loss = 1741938.470661, a = 800.256095, b = 152.614425\n",
"epoch 927: loss = 1741850.081082, a = 800.552373, b = 152.614236\n",
"epoch 928: loss = 1741762.043319, a = 800.848058, b = 152.614047\n",
- "epoch 929: loss = 1741674.355969, a = 801.143152, b = 152.613859\n",
+ "epoch 929: loss = 1741674.355969, a = 801.143152, b = 152.613859\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
"epoch 930: loss = 1741587.017634, a = 801.437656, b = 152.613670\n",
"epoch 931: loss = 1741500.026924, a = 801.731571, b = 152.613483\n",
"epoch 932: loss = 1741413.382452, a = 802.024898, b = 152.613295\n",
@@ -1186,13 +1193,7 @@
"epoch 956: loss = 1739434.277612, a = 808.891453, b = 152.608910\n",
"epoch 957: loss = 1739355.854363, a = 809.170463, b = 152.608732\n",
"epoch 958: loss = 1739277.743190, a = 809.448915, b = 152.608554\n",
- "epoch 959: loss = 1739199.942847, a = 809.726810, b = 152.608376\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "epoch 959: loss = 1739199.942847, a = 809.726810, b = 152.608376\n",
"epoch 960: loss = 1739122.452096, a = 810.004149, b = 152.608199\n",
"epoch 961: loss = 1739045.269701, a = 810.280934, b = 152.608022\n",
"epoch 962: loss = 1738968.394433, a = 810.557165, b = 152.607846\n",
@@ -1433,13 +1434,7 @@
"epoch 1197: loss = 1727262.359044, a = 862.289047, b = 152.574805\n",
"epoch 1198: loss = 1727232.327005, a = 862.461279, b = 152.574695\n",
"epoch 1199: loss = 1727202.414181, a = 862.633167, b = 152.574585\n",
- "epoch 1200: loss = 1727172.620097, a = 862.804711, b = 152.574476\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "epoch 1200: loss = 1727172.620097, a = 862.804711, b = 152.574476\n",
"epoch 1201: loss = 1727142.944280, a = 862.975912, b = 152.574366\n",
"epoch 1202: loss = 1727113.386259, a = 863.146771, b = 152.574257\n",
"epoch 1203: loss = 1727083.945566, a = 863.317288, b = 152.574148\n",
@@ -1697,13 +1692,7 @@
"epoch 1455: loss = 1722405.759587, a = 897.030088, b = 152.552616\n",
"epoch 1456: loss = 1722394.975336, a = 897.132850, b = 152.552550\n",
"epoch 1457: loss = 1722384.233710, a = 897.235407, b = 152.552485\n",
- "epoch 1458: loss = 1722373.534540, a = 897.337758, b = 152.552419\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "epoch 1458: loss = 1722373.534540, a = 897.337758, b = 152.552419\n",
"epoch 1459: loss = 1722362.877657, a = 897.439904, b = 152.552354\n",
"epoch 1460: loss = 1722352.262894, a = 897.541846, b = 152.552289\n",
"epoch 1461: loss = 1722341.690083, a = 897.643585, b = 152.552224\n",
@@ -1885,7 +1874,13 @@
"epoch 1637: loss = 1721003.777210, a = 912.720300, b = 152.542595\n",
"epoch 1638: loss = 1720998.523911, a = 912.791687, b = 152.542549\n",
"epoch 1639: loss = 1720993.291280, a = 912.862931, b = 152.542504\n",
- "epoch 1640: loss = 1720988.079235, a = 912.934032, b = 152.542458\n",
+ "epoch 1640: loss = 1720988.079235, a = 912.934032, b = 152.542458\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
"epoch 1641: loss = 1720982.887695, a = 913.004991, b = 152.542413\n",
"epoch 1642: loss = 1720977.716578, a = 913.075808, b = 152.542368\n",
"epoch 1643: loss = 1720972.565804, a = 913.146484, b = 152.542322\n",
@@ -2173,7 +2168,13 @@
"epoch 1925: loss = 1720096.340125, a = 928.361108, b = 152.532605\n",
"epoch 1926: loss = 1720094.642123, a = 928.401218, b = 152.532579\n",
"epoch 1927: loss = 1720092.950726, a = 928.441248, b = 152.532554\n",
- "epoch 1928: loss = 1720091.265906, a = 928.481197, b = 152.532528\n",
+ "epoch 1928: loss = 1720091.265906, a = 928.481197, b = 152.532528\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
"epoch 1929: loss = 1720089.587638, a = 928.521067, b = 152.532503\n",
"epoch 1930: loss = 1720087.915897, a = 928.560858, b = 152.532477\n",
"epoch 1931: loss = 1720086.250656, a = 928.600568, b = 152.532452\n",
@@ -2495,13 +2496,7 @@
"epoch 2247: loss = 1719783.365139, a = 937.890737, b = 152.526518\n",
"epoch 2248: loss = 1719782.874794, a = 937.911791, b = 152.526505\n",
"epoch 2249: loss = 1719782.386313, a = 937.932803, b = 152.526492\n",
- "epoch 2250: loss = 1719781.899690, a = 937.953773, b = 152.526478\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "epoch 2250: loss = 1719781.899690, a = 937.953773, b = 152.526478\n",
"epoch 2251: loss = 1719781.414916, a = 937.974701, b = 152.526465\n",
"epoch 2252: loss = 1719780.931986, a = 937.995587, b = 152.526451\n",
"epoch 2253: loss = 1719780.450892, a = 938.016431, b = 152.526438\n",
@@ -2679,7 +2674,13 @@
"epoch 2425: loss = 1719719.760650, a = 941.046575, b = 152.524503\n",
"epoch 2426: loss = 1719719.510258, a = 941.061318, b = 152.524493\n",
"epoch 2427: loss = 1719719.260800, a = 941.076032, b = 152.524484\n",
- "epoch 2428: loss = 1719719.012273, a = 941.090716, b = 152.524475\n",
+ "epoch 2428: loss = 1719719.012273, a = 941.090716, b = 152.524475\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
"epoch 2429: loss = 1719718.764672, a = 941.105371, b = 152.524465\n",
"epoch 2430: loss = 1719718.517995, a = 941.119997, b = 152.524456\n",
"epoch 2431: loss = 1719718.272238, a = 941.134594, b = 152.524447\n",
@@ -2708,13 +2709,7 @@
"epoch 2454: loss = 1719712.865738, a = 941.462375, b = 152.524237\n",
"epoch 2455: loss = 1719712.641027, a = 941.476287, b = 152.524228\n",
"epoch 2456: loss = 1719712.417151, a = 941.490171, b = 152.524219\n",
- "epoch 2457: loss = 1719712.194107, a = 941.504027, b = 152.524211\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "epoch 2457: loss = 1719712.194107, a = 941.504027, b = 152.524211\n",
"epoch 2458: loss = 1719711.971892, a = 941.517856, b = 152.524202\n",
"epoch 2459: loss = 1719711.750502, a = 941.531657, b = 152.524193\n",
"epoch 2460: loss = 1719711.529935, a = 941.545430, b = 152.524184\n",
@@ -3127,7 +3122,13 @@
"epoch 2867: loss = 1719664.917619, a = 945.375777, b = 152.521738\n",
"epoch 2868: loss = 1719664.866907, a = 945.381863, b = 152.521734\n",
"epoch 2869: loss = 1719664.816370, a = 945.387938, b = 152.521730\n",
- "epoch 2870: loss = 1719664.766007, a = 945.394000, b = 152.521726\n",
+ "epoch 2870: loss = 1719664.766007, a = 945.394000, b = 152.521726\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
"epoch 2871: loss = 1719664.715819, a = 945.400050, b = 152.521722\n",
"epoch 2872: loss = 1719664.665804, a = 945.406087, b = 152.521718\n",
"epoch 2873: loss = 1719664.615962, a = 945.412113, b = 152.521714\n",
@@ -3213,13 +3214,7 @@
"epoch 2953: loss = 1719661.135884, a = 945.857112, b = 152.521430\n",
"epoch 2954: loss = 1719661.098120, a = 945.862236, b = 152.521427\n",
"epoch 2955: loss = 1719661.060484, a = 945.867350, b = 152.521424\n",
- "epoch 2956: loss = 1719661.022975, a = 945.872453, b = 152.521420\n"
- ]
- },
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
+ "epoch 2956: loss = 1719661.022975, a = 945.872453, b = 152.521420\n",
"epoch 2957: loss = 1719660.985594, a = 945.877546, b = 152.521417\n",
"epoch 2958: loss = 1719660.948338, a = 945.882629, b = 152.521414\n",
"epoch 2959: loss = 1719660.911209, a = 945.887702, b = 152.521411\n",
@@ -3313,7 +3308,7 @@
},
{
"cell_type": "code",
- "execution_count": 6,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
@@ -4099,7 +4094,7 @@
{
"data": {
"text/html": [
- "
"
+ "
"
],
"text/plain": [
""
@@ -4107,228 +4102,902 @@
},
"metadata": {},
"output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib nbagg\n",
- "\n",
- "import matplotlib.pyplot as plt\n",
- "import matplotlib.animation as animation\n",
- "\n",
- "n_epoch = 3000 # epoch size\n",
- "a, b = 1, 1 # initial parameters\n",
- "epsilon = 0.001 # learning rate\n",
- "\n",
- "fig = plt.figure()\n",
- "imgs = []\n",
- "\n",
- "for i in range(n_epoch):\n",
- " for j in range(N):\n",
- " a = a + epsilon*2*(Y[j] - a*X[j] - b)*X[j]\n",
- " b = b + epsilon*2*(Y[j] - a*X[j] - b)\n",
- "\n",
- " L = 0\n",
- " for j in range(N):\n",
- " L = L + (Y[j]-a*X[j]-b)**2\n",
- " #print(\"epoch %4d: loss = %f, a = %f, b = %f\" % (i, L, a, b))\n",
- " \n",
- " if i % 50 == 0:\n",
- " x_min = np.min(X)\n",
- " x_max = np.max(X)\n",
- " y_min = a * x_min + b\n",
- " y_max = a * x_max + b\n",
- "\n",
- " img = plt.scatter(X, Y, label='original data')\n",
- " img = plt.plot([x_min, x_max], [y_min, y_max], 'r', label='model')\n",
- " imgs.append(img)\n",
- " \n",
- "ani = animation.ArtistAnimation(fig, imgs)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 4. 如何使用批次更新的方法?\n",
- "\n",
- "如果有一些数据包含比较大的错误(异常数据),因此每次更新仅仅使用一个数据会导致不精确,同时每次仅仅使用一个数据来计算更新也导致计算效率比较低。\n",
- "\n",
- "\n",
- "* [梯度下降方法的几种形式](https://blog.csdn.net/u010402786/article/details/51188876)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 5. 如何拟合多项式函数?\n",
- "\n",
- "需要设计一个弹道导弹防御系统,通过观测导弹的飞行路径,预测未来导弹的飞行轨迹,从而完成摧毁的任务。按照物理学,可以得知模型为:\n",
- "$$\n",
- "y = at^2 + bt + c\n",
- "$$\n",
- "我们需要求解三个模型参数$a, b, c$。\n",
- "\n",
- "损失函数的定义为:\n",
- "$$\n",
- "L = \\sum_{i=1}^N (y_i - at^2 - bt - c)^2\n",
- "$$\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "name": "stderr",
- "output_type": "stream",
- "text": [
- "Traceback (most recent call last):\n",
- " File \"/home/bushuhui/.virtualenv/dl/lib/python3.5/site-packages/matplotlib/cbook/__init__.py\", line 215, in process\n",
- " func(*args, **kwargs)\n",
- " File \"/home/bushuhui/.virtualenv/dl/lib/python3.5/site-packages/matplotlib/animation.py\", line 1462, in _stop\n",
- " self.event_source.remove_callback(self._loop_delay)\n",
- "AttributeError: 'NoneType' object has no attribute 'remove_callback'\n"
- ]
- },
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "%matplotlib inline\n",
- "\n",
- "t = np.array([2, 4, 6, 8])\n",
- "#t = np.linspace(0, 10)\n",
- "\n",
- "pa = -20\n",
- "pb = 90\n",
- "pc = 800\n",
- "\n",
- "y = pa*t**2 + pb*t + pc\n",
- "\n",
- "\n",
- "plt.scatter(t, y)\n",
- "plt.show()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### 5.1 如何得到更新项?\n",
- "\n",
- "$$\n",
- "L = \\sum_{i=1}^N (y_i - at^2 - bt - c)^2\n",
- "$$\n",
- "\n",
- "\\begin{eqnarray}\n",
- "\\frac{\\partial L}{\\partial a} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c) t^2 \\\\\n",
- "\\frac{\\partial L}{\\partial b} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c) t \\\\\n",
- "\\frac{\\partial L}{\\partial c} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c)\n",
- "\\end{eqnarray}"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "## 6. 如何使用sklearn求解线性问题?\n"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 9,
- "metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "a = 949.435260, b = 152.133484\n"
- ]
},
{
"data": {
- "image/png": "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\n",
- "text/plain": [
- ""
- ]
- },
- "metadata": {
- "needs_background": "light"
- },
- "output_type": "display_data"
- }
- ],
- "source": [
- "from sklearn import linear_model\n",
- "\n",
- "# load data\n",
- "d = datasets.load_diabetes()\n",
- "\n",
- "X = d.data[:, np.newaxis, 2]\n",
- "Y = d.target\n",
- "\n",
- "# create regression model\n",
- "regr = linear_model.LinearRegression()\n",
- "regr.fit(X, Y)\n",
- "\n",
- "a, b = regr.coef_, regr.intercept_\n",
- "print(\"a = %f, b = %f\" % (a, b))\n",
- "\n",
- "x_min = np.min(X)\n",
- "x_max = np.max(X)\n",
- "y_min = a * x_min + b\n",
- "y_max = a * x_max + b\n",
- "\n",
- "plt.scatter(X, Y)\n",
- "plt.plot([x_min, x_max], [y_min, y_max], 'r')\n",
- "plt.show()"
- ]
- },
+ "application/javascript": [
+ "/* Put everything inside the global mpl namespace */\n",
+ "window.mpl = {};\n",
+ "\n",
+ "\n",
+ "mpl.get_websocket_type = function() {\n",
+ " if (typeof(WebSocket) !== 'undefined') {\n",
+ " return WebSocket;\n",
+ " } else if (typeof(MozWebSocket) !== 'undefined') {\n",
+ " return MozWebSocket;\n",
+ " } else {\n",
+ " alert('Your browser does not have WebSocket support.' +\n",
+ " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
+ " 'Firefox 4 and 5 are also supported but you ' +\n",
+ " 'have to enable WebSockets in about:config.');\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
+ " this.id = figure_id;\n",
+ "\n",
+ " this.ws = websocket;\n",
+ "\n",
+ " this.supports_binary = (this.ws.binaryType != undefined);\n",
+ "\n",
+ " if (!this.supports_binary) {\n",
+ " var warnings = document.getElementById(\"mpl-warnings\");\n",
+ " if (warnings) {\n",
+ " warnings.style.display = 'block';\n",
+ " warnings.textContent = (\n",
+ " \"This browser does not support binary websocket messages. \" +\n",
+ " \"Performance may be slow.\");\n",
+ " }\n",
+ " }\n",
+ "\n",
+ " this.imageObj = new Image();\n",
+ "\n",
+ " this.context = undefined;\n",
+ " this.message = undefined;\n",
+ " this.canvas = undefined;\n",
+ " this.rubberband_canvas = undefined;\n",
+ " this.rubberband_context = undefined;\n",
+ " this.format_dropdown = undefined;\n",
+ "\n",
+ " this.image_mode = 'full';\n",
+ "\n",
+ " this.root = $('');\n",
+ " this._root_extra_style(this.root)\n",
+ " this.root.attr('style', 'display: inline-block');\n",
+ "\n",
+ " $(parent_element).append(this.root);\n",
+ "\n",
+ " this._init_header(this);\n",
+ " this._init_canvas(this);\n",
+ " this._init_toolbar(this);\n",
+ "\n",
+ " var fig = this;\n",
+ "\n",
+ " this.waiting = false;\n",
+ "\n",
+ " this.ws.onopen = function () {\n",
+ " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
+ " fig.send_message(\"send_image_mode\", {});\n",
+ " if (mpl.ratio != 1) {\n",
+ " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
+ " }\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " }\n",
+ "\n",
+ " this.imageObj.onload = function() {\n",
+ " if (fig.image_mode == 'full') {\n",
+ " // Full images could contain transparency (where diff images\n",
+ " // almost always do), so we need to clear the canvas so that\n",
+ " // there is no ghosting.\n",
+ " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
+ " }\n",
+ " fig.context.drawImage(fig.imageObj, 0, 0);\n",
+ " };\n",
+ "\n",
+ " this.imageObj.onunload = function() {\n",
+ " fig.ws.close();\n",
+ " }\n",
+ "\n",
+ " this.ws.onmessage = this._make_on_message_function(this);\n",
+ "\n",
+ " this.ondownload = ondownload;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_header = function() {\n",
+ " var titlebar = $(\n",
+ " '');\n",
+ " var titletext = $(\n",
+ " '');\n",
+ " titlebar.append(titletext)\n",
+ " this.root.append(titlebar);\n",
+ " this.header = titletext[0];\n",
+ "}\n",
+ "\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_canvas = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var canvas_div = $('');\n",
+ "\n",
+ " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
+ "\n",
+ " function canvas_keyboard_event(event) {\n",
+ " return fig.key_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " canvas_div.keydown('key_press', canvas_keyboard_event);\n",
+ " canvas_div.keyup('key_release', canvas_keyboard_event);\n",
+ " this.canvas_div = canvas_div\n",
+ " this._canvas_extra_style(canvas_div)\n",
+ " this.root.append(canvas_div);\n",
+ "\n",
+ " var canvas = $('');\n",
+ " canvas.addClass('mpl-canvas');\n",
+ " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
+ "\n",
+ " this.canvas = canvas[0];\n",
+ " this.context = canvas[0].getContext(\"2d\");\n",
+ "\n",
+ " var backingStore = this.context.backingStorePixelRatio ||\n",
+ "\tthis.context.webkitBackingStorePixelRatio ||\n",
+ "\tthis.context.mozBackingStorePixelRatio ||\n",
+ "\tthis.context.msBackingStorePixelRatio ||\n",
+ "\tthis.context.oBackingStorePixelRatio ||\n",
+ "\tthis.context.backingStorePixelRatio || 1;\n",
+ "\n",
+ " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
+ "\n",
+ " var rubberband = $('');\n",
+ " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
+ "\n",
+ " var pass_mouse_events = true;\n",
+ "\n",
+ " canvas_div.resizable({\n",
+ " start: function(event, ui) {\n",
+ " pass_mouse_events = false;\n",
+ " },\n",
+ " resize: function(event, ui) {\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " stop: function(event, ui) {\n",
+ " pass_mouse_events = true;\n",
+ " fig.request_resize(ui.size.width, ui.size.height);\n",
+ " },\n",
+ " });\n",
+ "\n",
+ " function mouse_event_fn(event) {\n",
+ " if (pass_mouse_events)\n",
+ " return fig.mouse_event(event, event['data']);\n",
+ " }\n",
+ "\n",
+ " rubberband.mousedown('button_press', mouse_event_fn);\n",
+ " rubberband.mouseup('button_release', mouse_event_fn);\n",
+ " // Throttle sequential mouse events to 1 every 20ms.\n",
+ " rubberband.mousemove('motion_notify', mouse_event_fn);\n",
+ "\n",
+ " rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
+ " rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
+ "\n",
+ " canvas_div.on(\"wheel\", function (event) {\n",
+ " event = event.originalEvent;\n",
+ " event['data'] = 'scroll'\n",
+ " if (event.deltaY < 0) {\n",
+ " event.step = 1;\n",
+ " } else {\n",
+ " event.step = -1;\n",
+ " }\n",
+ " mouse_event_fn(event);\n",
+ " });\n",
+ "\n",
+ " canvas_div.append(canvas);\n",
+ " canvas_div.append(rubberband);\n",
+ "\n",
+ " this.rubberband = rubberband;\n",
+ " this.rubberband_canvas = rubberband[0];\n",
+ " this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
+ " this.rubberband_context.strokeStyle = \"#000000\";\n",
+ "\n",
+ " this._resize_canvas = function(width, height) {\n",
+ " // Keep the size of the canvas, canvas container, and rubber band\n",
+ " // canvas in synch.\n",
+ " canvas_div.css('width', width)\n",
+ " canvas_div.css('height', height)\n",
+ "\n",
+ " canvas.attr('width', width * mpl.ratio);\n",
+ " canvas.attr('height', height * mpl.ratio);\n",
+ " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
+ "\n",
+ " rubberband.attr('width', width);\n",
+ " rubberband.attr('height', height);\n",
+ " }\n",
+ "\n",
+ " // Set the figure to an initial 600x600px, this will subsequently be updated\n",
+ " // upon first draw.\n",
+ " this._resize_canvas(600, 600);\n",
+ "\n",
+ " // Disable right mouse context menu.\n",
+ " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
+ " return false;\n",
+ " });\n",
+ "\n",
+ " function set_focus () {\n",
+ " canvas.focus();\n",
+ " canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " window.setTimeout(set_focus, 100);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items) {\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) {\n",
+ " // put a spacer in here.\n",
+ " continue;\n",
+ " }\n",
+ " var button = $('');\n",
+ " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
+ " 'ui-button-icon-only');\n",
+ " button.attr('role', 'button');\n",
+ " button.attr('aria-disabled', 'false');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ "\n",
+ " var icon_img = $('');\n",
+ " icon_img.addClass('ui-button-icon-primary ui-icon');\n",
+ " icon_img.addClass(image);\n",
+ " icon_img.addClass('ui-corner-all');\n",
+ "\n",
+ " var tooltip_span = $('');\n",
+ " tooltip_span.addClass('ui-button-text');\n",
+ " tooltip_span.html(tooltip);\n",
+ "\n",
+ " button.append(icon_img);\n",
+ " button.append(tooltip_span);\n",
+ "\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " var fmt_picker_span = $('');\n",
+ "\n",
+ " var fmt_picker = $('');\n",
+ " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
+ " fmt_picker_span.append(fmt_picker);\n",
+ " nav_element.append(fmt_picker_span);\n",
+ " this.format_dropdown = fmt_picker[0];\n",
+ "\n",
+ " for (var ind in mpl.extensions) {\n",
+ " var fmt = mpl.extensions[ind];\n",
+ " var option = $(\n",
+ " '', {selected: fmt === mpl.default_extension}).html(fmt);\n",
+ " fmt_picker.append(option)\n",
+ " }\n",
+ "\n",
+ " // Add hover states to the ui-buttons\n",
+ " $( \".ui-button\" ).hover(\n",
+ " function() { $(this).addClass(\"ui-state-hover\");},\n",
+ " function() { $(this).removeClass(\"ui-state-hover\");}\n",
+ " );\n",
+ "\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
+ " // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
+ " // which will in turn request a refresh of the image.\n",
+ " this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_message = function(type, properties) {\n",
+ " properties['type'] = type;\n",
+ " properties['figure_id'] = this.id;\n",
+ " this.ws.send(JSON.stringify(properties));\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.send_draw_message = function() {\n",
+ " if (!this.waiting) {\n",
+ " this.waiting = true;\n",
+ " this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " var format_dropdown = fig.format_dropdown;\n",
+ " var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
+ " fig.ondownload(fig, format);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
+ " var size = msg['size'];\n",
+ " if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
+ " fig._resize_canvas(size[0], size[1]);\n",
+ " fig.send_message(\"refresh\", {});\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
+ " var x0 = msg['x0'] / mpl.ratio;\n",
+ " var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
+ " var x1 = msg['x1'] / mpl.ratio;\n",
+ " var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
+ " x0 = Math.floor(x0) + 0.5;\n",
+ " y0 = Math.floor(y0) + 0.5;\n",
+ " x1 = Math.floor(x1) + 0.5;\n",
+ " y1 = Math.floor(y1) + 0.5;\n",
+ " var min_x = Math.min(x0, x1);\n",
+ " var min_y = Math.min(y0, y1);\n",
+ " var width = Math.abs(x1 - x0);\n",
+ " var height = Math.abs(y1 - y0);\n",
+ "\n",
+ " fig.rubberband_context.clearRect(\n",
+ " 0, 0, fig.canvas.width, fig.canvas.height);\n",
+ "\n",
+ " fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
+ " // Updates the figure title.\n",
+ " fig.header.textContent = msg['label'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
+ " var cursor = msg['cursor'];\n",
+ " switch(cursor)\n",
+ " {\n",
+ " case 0:\n",
+ " cursor = 'pointer';\n",
+ " break;\n",
+ " case 1:\n",
+ " cursor = 'default';\n",
+ " break;\n",
+ " case 2:\n",
+ " cursor = 'crosshair';\n",
+ " break;\n",
+ " case 3:\n",
+ " cursor = 'move';\n",
+ " break;\n",
+ " }\n",
+ " fig.rubberband_canvas.style.cursor = cursor;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
+ " fig.message.textContent = msg['message'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
+ " // Request the server to send over a new figure.\n",
+ " fig.send_draw_message();\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
+ " fig.image_mode = msg['mode'];\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Called whenever the canvas gets updated.\n",
+ " this.send_message(\"ack\", {});\n",
+ "}\n",
+ "\n",
+ "// A function to construct a web socket function for onmessage handling.\n",
+ "// Called in the figure constructor.\n",
+ "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
+ " return function socket_on_message(evt) {\n",
+ " if (evt.data instanceof Blob) {\n",
+ " /* FIXME: We get \"Resource interpreted as Image but\n",
+ " * transferred with MIME type text/plain:\" errors on\n",
+ " * Chrome. But how to set the MIME type? It doesn't seem\n",
+ " * to be part of the websocket stream */\n",
+ " evt.data.type = \"image/png\";\n",
+ "\n",
+ " /* Free the memory for the previous frames */\n",
+ " if (fig.imageObj.src) {\n",
+ " (window.URL || window.webkitURL).revokeObjectURL(\n",
+ " fig.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
+ " evt.data);\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ " else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
+ " fig.imageObj.src = evt.data;\n",
+ " fig.updated_canvas_event();\n",
+ " fig.waiting = false;\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var msg = JSON.parse(evt.data);\n",
+ " var msg_type = msg['type'];\n",
+ "\n",
+ " // Call the \"handle_{type}\" callback, which takes\n",
+ " // the figure and JSON message as its only arguments.\n",
+ " try {\n",
+ " var callback = fig[\"handle_\" + msg_type];\n",
+ " } catch (e) {\n",
+ " console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " if (callback) {\n",
+ " try {\n",
+ " // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
+ " callback(fig, msg);\n",
+ " } catch (e) {\n",
+ " console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
+ " }\n",
+ " }\n",
+ " };\n",
+ "}\n",
+ "\n",
+ "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
+ "mpl.findpos = function(e) {\n",
+ " //this section is from http://www.quirksmode.org/js/events_properties.html\n",
+ " var targ;\n",
+ " if (!e)\n",
+ " e = window.event;\n",
+ " if (e.target)\n",
+ " targ = e.target;\n",
+ " else if (e.srcElement)\n",
+ " targ = e.srcElement;\n",
+ " if (targ.nodeType == 3) // defeat Safari bug\n",
+ " targ = targ.parentNode;\n",
+ "\n",
+ " // jQuery normalizes the pageX and pageY\n",
+ " // pageX,Y are the mouse positions relative to the document\n",
+ " // offset() returns the position of the element relative to the document\n",
+ " var x = e.pageX - $(targ).offset().left;\n",
+ " var y = e.pageY - $(targ).offset().top;\n",
+ "\n",
+ " return {\"x\": x, \"y\": y};\n",
+ "};\n",
+ "\n",
+ "/*\n",
+ " * return a copy of an object with only non-object keys\n",
+ " * we need this to avoid circular references\n",
+ " * http://stackoverflow.com/a/24161582/3208463\n",
+ " */\n",
+ "function simpleKeys (original) {\n",
+ " return Object.keys(original).reduce(function (obj, key) {\n",
+ " if (typeof original[key] !== 'object')\n",
+ " obj[key] = original[key]\n",
+ " return obj;\n",
+ " }, {});\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.mouse_event = function(event, name) {\n",
+ " var canvas_pos = mpl.findpos(event)\n",
+ "\n",
+ " if (name === 'button_press')\n",
+ " {\n",
+ " this.canvas.focus();\n",
+ " this.canvas_div.focus();\n",
+ " }\n",
+ "\n",
+ " var x = canvas_pos.x * mpl.ratio;\n",
+ " var y = canvas_pos.y * mpl.ratio;\n",
+ "\n",
+ " this.send_message(name, {x: x, y: y, button: event.button,\n",
+ " step: event.step,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ "\n",
+ " /* This prevents the web browser from automatically changing to\n",
+ " * the text insertion cursor when the button is pressed. We want\n",
+ " * to control all of the cursor setting manually through the\n",
+ " * 'cursor' event from matplotlib */\n",
+ " event.preventDefault();\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " // Handle any extra behaviour associated with a key event\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.key_event = function(event, name) {\n",
+ "\n",
+ " // Prevent repeat events\n",
+ " if (name == 'key_press')\n",
+ " {\n",
+ " if (event.which === this._key)\n",
+ " return;\n",
+ " else\n",
+ " this._key = event.which;\n",
+ " }\n",
+ " if (name == 'key_release')\n",
+ " this._key = null;\n",
+ "\n",
+ " var value = '';\n",
+ " if (event.ctrlKey && event.which != 17)\n",
+ " value += \"ctrl+\";\n",
+ " if (event.altKey && event.which != 18)\n",
+ " value += \"alt+\";\n",
+ " if (event.shiftKey && event.which != 16)\n",
+ " value += \"shift+\";\n",
+ "\n",
+ " value += 'k';\n",
+ " value += event.which.toString();\n",
+ "\n",
+ " this._key_event_extra(event, name);\n",
+ "\n",
+ " this.send_message(name, {key: value,\n",
+ " guiEvent: simpleKeys(event)});\n",
+ " return false;\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
+ " if (name == 'download') {\n",
+ " this.handle_save(this, null);\n",
+ " } else {\n",
+ " this.send_message(\"toolbar_button\", {name: name});\n",
+ " }\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
+ " this.message.textContent = tooltip;\n",
+ "};\n",
+ "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
+ "\n",
+ "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
+ "\n",
+ "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
+ " // Create a \"websocket\"-like object which calls the given IPython comm\n",
+ " // object with the appropriate methods. Currently this is a non binary\n",
+ " // socket, so there is still some room for performance tuning.\n",
+ " var ws = {};\n",
+ "\n",
+ " ws.close = function() {\n",
+ " comm.close()\n",
+ " };\n",
+ " ws.send = function(m) {\n",
+ " //console.log('sending', m);\n",
+ " comm.send(m);\n",
+ " };\n",
+ " // Register the callback with on_msg.\n",
+ " comm.on_msg(function(msg) {\n",
+ " //console.log('receiving', msg['content']['data'], msg);\n",
+ " // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
+ " ws.onmessage(msg['content']['data'])\n",
+ " });\n",
+ " return ws;\n",
+ "}\n",
+ "\n",
+ "mpl.mpl_figure_comm = function(comm, msg) {\n",
+ " // This is the function which gets called when the mpl process\n",
+ " // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
+ "\n",
+ " var id = msg.content.data.id;\n",
+ " // Get hold of the div created by the display call when the Comm\n",
+ " // socket was opened in Python.\n",
+ " var element = $(\"#\" + id);\n",
+ " var ws_proxy = comm_websocket_adapter(comm)\n",
+ "\n",
+ " function ondownload(figure, format) {\n",
+ " window.open(figure.imageObj.src);\n",
+ " }\n",
+ "\n",
+ " var fig = new mpl.figure(id, ws_proxy,\n",
+ " ondownload,\n",
+ " element.get(0));\n",
+ "\n",
+ " // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
+ " // web socket which is closed, not our websocket->open comm proxy.\n",
+ " ws_proxy.onopen();\n",
+ "\n",
+ " fig.parent_element = element.get(0);\n",
+ " fig.cell_info = mpl.find_output_cell(\"\");\n",
+ " if (!fig.cell_info) {\n",
+ " console.error(\"Failed to find cell for figure\", id, fig);\n",
+ " return;\n",
+ " }\n",
+ "\n",
+ " var output_index = fig.cell_info[2]\n",
+ " var cell = fig.cell_info[0];\n",
+ "\n",
+ "};\n",
+ "\n",
+ "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
+ " var width = fig.canvas.width/mpl.ratio\n",
+ " fig.root.unbind('remove')\n",
+ "\n",
+ " // Update the output cell to use the data from the current canvas.\n",
+ " fig.push_to_output();\n",
+ " var dataURL = fig.canvas.toDataURL();\n",
+ " // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
+ " // the notebook keyboard shortcuts fail.\n",
+ " IPython.keyboard_manager.enable()\n",
+ " $(fig.parent_element).html('
');\n",
+ " fig.close_ws(fig, msg);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.close_ws = function(fig, msg){\n",
+ " fig.send_message('closing', msg);\n",
+ " // fig.ws.close()\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
+ " // Turn the data on the canvas into data in the output cell.\n",
+ " var width = this.canvas.width/mpl.ratio\n",
+ " var dataURL = this.canvas.toDataURL();\n",
+ " this.cell_info[1]['text/html'] = '
';\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.updated_canvas_event = function() {\n",
+ " // Tell IPython that the notebook contents must change.\n",
+ " IPython.notebook.set_dirty(true);\n",
+ " this.send_message(\"ack\", {});\n",
+ " var fig = this;\n",
+ " // Wait a second, then push the new image to the DOM so\n",
+ " // that it is saved nicely (might be nice to debounce this).\n",
+ " setTimeout(function () { fig.push_to_output() }, 1000);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._init_toolbar = function() {\n",
+ " var fig = this;\n",
+ "\n",
+ " var nav_element = $('')\n",
+ " nav_element.attr('style', 'width: 100%');\n",
+ " this.root.append(nav_element);\n",
+ "\n",
+ " // Define a callback function for later on.\n",
+ " function toolbar_event(event) {\n",
+ " return fig.toolbar_button_onclick(event['data']);\n",
+ " }\n",
+ " function toolbar_mouse_event(event) {\n",
+ " return fig.toolbar_button_onmouseover(event['data']);\n",
+ " }\n",
+ "\n",
+ " for(var toolbar_ind in mpl.toolbar_items){\n",
+ " var name = mpl.toolbar_items[toolbar_ind][0];\n",
+ " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
+ " var image = mpl.toolbar_items[toolbar_ind][2];\n",
+ " var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
+ "\n",
+ " if (!name) { continue; };\n",
+ "\n",
+ " var button = $('');\n",
+ " button.click(method_name, toolbar_event);\n",
+ " button.mouseover(tooltip, toolbar_mouse_event);\n",
+ " nav_element.append(button);\n",
+ " }\n",
+ "\n",
+ " // Add the status bar.\n",
+ " var status_bar = $('');\n",
+ " nav_element.append(status_bar);\n",
+ " this.message = status_bar[0];\n",
+ "\n",
+ " // Add the close button to the window.\n",
+ " var buttongrp = $('');\n",
+ " var button = $('');\n",
+ " button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
+ " button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
+ " buttongrp.append(button);\n",
+ " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
+ " titlebar.prepend(buttongrp);\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._root_extra_style = function(el){\n",
+ " var fig = this\n",
+ " el.on(\"remove\", function(){\n",
+ "\tfig.close_ws(fig, {});\n",
+ " });\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._canvas_extra_style = function(el){\n",
+ " // this is important to make the div 'focusable\n",
+ " el.attr('tabindex', 0)\n",
+ " // reach out to IPython and tell the keyboard manager to turn it's self\n",
+ " // off when our div gets focus\n",
+ "\n",
+ " // location in version 3\n",
+ " if (IPython.notebook.keyboard_manager) {\n",
+ " IPython.notebook.keyboard_manager.register_events(el);\n",
+ " }\n",
+ " else {\n",
+ " // location in version 2\n",
+ " IPython.keyboard_manager.register_events(el);\n",
+ " }\n",
+ "\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
+ " var manager = IPython.notebook.keyboard_manager;\n",
+ " if (!manager)\n",
+ " manager = IPython.keyboard_manager;\n",
+ "\n",
+ " // Check for shift+enter\n",
+ " if (event.shiftKey && event.which == 13) {\n",
+ " this.canvas_div.blur();\n",
+ " event.shiftKey = false;\n",
+ " // Send a \"J\" for go to next cell\n",
+ " event.which = 74;\n",
+ " event.keyCode = 74;\n",
+ " manager.command_mode();\n",
+ " manager.handle_keydown(event);\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
+ " fig.ondownload(fig, null);\n",
+ "}\n",
+ "\n",
+ "\n",
+ "mpl.find_output_cell = function(html_output) {\n",
+ " // Return the cell and output element which can be found *uniquely* in the notebook.\n",
+ " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
+ " // IPython event is triggered only after the cells have been serialised, which for\n",
+ " // our purposes (turning an active figure into a static one), is too late.\n",
+ " var cells = IPython.notebook.get_cells();\n",
+ " var ncells = cells.length;\n",
+ " for (var i=0; i= 3 moved mimebundle to data attribute of output\n",
+ " data = data.data;\n",
+ " }\n",
+ " if (data['text/html'] == html_output) {\n",
+ " return [cell, data, j];\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ " }\n",
+ "}\n",
+ "\n",
+ "// Register the function which deals with the matplotlib target/channel.\n",
+ "// The kernel may be null if the page has been refreshed.\n",
+ "if (IPython.notebook.kernel != null) {\n",
+ " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
+ "}\n"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "text/html": [
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Traceback (most recent call last):\n",
+ " File \"/home/bushuhui/.virtualenv/dl/lib/python3.5/site-packages/matplotlib/cbook/__init__.py\", line 215, in process\n",
+ " func(*args, **kwargs)\n",
+ " File \"/home/bushuhui/.virtualenv/dl/lib/python3.5/site-packages/matplotlib/animation.py\", line 1462, in _stop\n",
+ " self.event_source.remove_callback(self._loop_delay)\n",
+ "AttributeError: 'NoneType' object has no attribute 'remove_callback'\n"
+ ]
+ }
+ ],
+ "source": [
+ "%matplotlib nbagg\n",
+ "\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib.animation as animation\n",
+ "\n",
+ "n_epoch = 3000 # epoch size\n",
+ "a, b = 1, 1 # initial parameters\n",
+ "epsilon = 0.001 # learning rate\n",
+ "\n",
+ "fig = plt.figure()\n",
+ "imgs = []\n",
+ "\n",
+ "for i in range(n_epoch):\n",
+ " for j in range(N):\n",
+ " a = a + epsilon*2*(Y[j] - a*X[j] - b)*X[j]\n",
+ " b = b + epsilon*2*(Y[j] - a*X[j] - b)\n",
+ "\n",
+ " L = 0\n",
+ " for j in range(N):\n",
+ " L = L + (Y[j]-a*X[j]-b)**2\n",
+ " #print(\"epoch %4d: loss = %f, a = %f, b = %f\" % (i, L, a, b))\n",
+ " \n",
+ " if i % 50 == 0:\n",
+ " x_min = np.min(X)\n",
+ " x_max = np.max(X)\n",
+ " y_min = a * x_min + b\n",
+ " y_max = a * x_max + b\n",
+ "\n",
+ " img = plt.scatter(X, Y, label='original data')\n",
+ " img = plt.plot([x_min, x_max], [y_min, y_max], 'r', label='model')\n",
+ " imgs.append(img)\n",
+ " \n",
+ "ani = animation.ArtistAnimation(fig, imgs)\n",
+ "plt.show()"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## 7. 如何使用sklearn拟合多项式函数?"
+ "## 4. 如何使用批次更新的方法?\n",
+ "\n",
+ "如果有一些数据包含比较大的错误(异常数据),因此每次更新仅仅使用一个数据会导致不精确,同时每次仅仅使用一个数据来计算更新也导致计算效率比较低。\n",
+ "\n",
+ "\n",
+ "* [梯度下降方法的几种形式](https://blog.csdn.net/u010402786/article/details/51188876)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 5. 如何拟合多项式函数?\n",
+ "\n",
+ "需要设计一个弹道导弹防御系统,通过观测导弹的飞行路径,预测未来导弹的飞行轨迹,从而完成摧毁的任务。按照物理学,可以得知模型为:\n",
+ "$$\n",
+ "y = at^2 + bt + c\n",
+ "$$\n",
+ "我们需要求解三个模型参数$a, b, c$。\n",
+ "\n",
+ "损失函数的定义为:\n",
+ "$$\n",
+ "L = \\sum_{i=1}^N (y_i - at^2 - bt - c)^2\n",
+ "$$\n"
]
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
+ "image/png": "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\n",
"text/plain": [
- "array([800., 90., -20.])"
+ ""
]
},
- "execution_count": 10,
- "metadata": {},
- "output_type": "execute_result"
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
}
],
"source": [
- "# Fitting polynomial functions\n",
- "\n",
- "from sklearn.preprocessing import PolynomialFeatures\n",
- "from sklearn.linear_model import LinearRegression\n",
- "from sklearn.pipeline import Pipeline\n",
+ "%matplotlib inline\n",
"\n",
"t = np.array([2, 4, 6, 8])\n",
+ "#t = np.linspace(0, 10)\n",
"\n",
"pa = -20\n",
"pb = 90\n",
@@ -4336,50 +5005,50 @@
"\n",
"y = pa*t**2 + pb*t + pc\n",
"\n",
- "model = Pipeline([('poly', PolynomialFeatures(degree=2)),\n",
- " ('linear', LinearRegression(fit_intercept=False))])\n",
- "model = model.fit(t[:, np.newaxis], y)\n",
- "model.named_steps['linear'].coef_\n"
+ "\n",
+ "plt.scatter(t, y)\n",
+ "plt.show()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### 5.1 如何得到更新项?\n",
+ "\n",
+ "$$\n",
+ "L = \\sum_{i=1}^N (y_i - at^2 - bt - c)^2\n",
+ "$$\n",
+ "\n",
+ "\\begin{eqnarray}\n",
+ "\\frac{\\partial L}{\\partial a} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c) t^2 \\\\\n",
+ "\\frac{\\partial L}{\\partial b} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c) t \\\\\n",
+ "\\frac{\\partial L}{\\partial c} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c)\n",
+ "\\end{eqnarray}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "## 8. 如何通过模型来估计缺失的值?\n"
+ "## 6. 如何使用sklearn求解线性问题?\n"
]
},
{
"cell_type": "code",
- "execution_count": 11,
- "metadata": {
- "lines_to_next_cell": 0
- },
+ "execution_count": 12,
+ "metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Y_est = [148.6844971 167.17376752 174.36403934 195.93485483 109.65159289\n",
- " 120.95059148 245.23957594 204.15230835 269.89193649 75.75459712\n",
- " 241.13084918 104.51568444 141.49422527 126.08649992 208.26103511\n",
- " 233.94057735 151.76604217 158.956314 161.01067738 228.8046689\n",
- " 220.58721538 129.16804499 100.40695768 117.86904641 168.2009492\n",
- " 226.75030552 114.78750134 163.06504076 113.76031965 119.92340979\n",
- " 157.92913231 237.02212242 120.95059148 98.3525943 123.00495485\n",
- " 205.17949004 95.27104923 153.82040555 130.19522668 81.91768726\n",
- " 171.28249427 137.38549851 137.38549851 189.77176469 82.94486895]\n",
- "Y_test = [198. 242. 232. 175. 93. 168. 275. 293. 281. 72. 140. 189. 181. 209.\n",
- " 136. 261. 113. 131. 174. 257. 55. 84. 42. 146. 212. 233. 91. 111.\n",
- " 152. 120. 67. 310. 94. 183. 66. 173. 72. 49. 64. 48. 178. 104.\n",
- " 132. 220. 57.]\n",
- "err = 8.437628 (56.601327), score = 0.422889\n",
- "a = 953.024850, b = 152.544562\n"
+ "a = 949.435260, b = 152.133484\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzsnXt4FOX1xz/vhg0kYgkCCgQQ6g1FMFGgIFAFKqgopqJQL1V/VbHWqlgLBEohIkqUKkq9It5FDQpEFLyDWqgUuQQUAREFIYBcA0JCskne3x+zs9nLzOzs7mx2k7yf5+EhmZ2ZfWc2e+a85z3ne4SUEoVCoVDUX1yJHoBCoVAo4osy9AqFQlHPUYZeoVAo6jnK0CsUCkU9Rxl6hUKhqOcoQ69QKBT1HGXoFQqFop6jDL1CoVDUc5ShVygUinpOo0QPAKBly5ayY8eOiR6GQqFQ1ClWrVq1T0rZKtx+SWHoO3bsyMqVKxM9DIVCoahTCCG22dlPhW4UCoWinqMMvUKhUNRzwhp6IUQTIcQKIcRaIcR6IcR93u0vCSF+FEIUef9lebcLIcQMIcT3Qoh1Qohz430RCoVCoTDHToy+HBggpTwihHADS4UQ73tfGy2lfDto/0uA07z/fgM87f0/IjweDzt27ODYsWORHqowoEmTJrRr1w63253ooSgUilomrKGXmmD9Ee+vbu8/KxH7K4BXvMctF0JkCCHaSCl3RTKwHTt2cPzxx9OxY0eEEJEcqghCSsn+/fvZsWMHnTp1SvRwFApFLWMrRi+ESBFCFAF7gI+llP/zvvSANzwzXQjR2LstE9jud/gO77aIOHbsGC1atFBG3gGEELRo0ULNjhSKKClcU0yf/MV0yl1In/zFFK4pTvSQIsKWoZdSVkkps4B2QE8hxNnAOKAz0AM4ARgbyRsLIUYKIVYKIVbu3bvXbJ9ITqmwQN1LhSI6CtcUM27e1xSXlCGB4pIyxs37uk4Z+4iybqSUJcAS4GIp5S6pUQ68CPT07lYMtPc7rJ13W/C5Zkopu0spu7dqFTbfX6FQKBLCtA83UeapCthW5qli2oebEjSiyLGTddNKCJHh/TkNuAjYKIRo490mgBzgG+8hC4AbvNk3vYBDkcbn6yMdO3Zk3759Me+jUNRnkjFEsrOkLKLtyYidrJs2wMtCiBS0B8McKeV7QojFQohWgACKgD97918EXAp8D5QC/+f8sBUKRX1DD5Ho3rMeIgHIyY54mc8x2makUWxg1NtmpCVgNNER1qOXUq6TUmZLKbtJKc+WUk72bh8gpezq3Xa9lPKId7uUUt4hpTzF+3qd1TbYunUrnTt35qabbuL000/nuuuu45NPPqFPnz6cdtpprFixggMHDpCTk0O3bt3o1asX69atA2D//v0MGjSILl26cMstt6AlIWm89tpr9OzZk6ysLG677TaqqqrMhqBQNBiSNUQyevAZpLlTAraluVMYPfiMBI0ocpJC6yYso0ZBUZGz58zKgsceC7vb999/z1tvvcULL7xAjx49eP3111m6dCkLFizgwQcfpH379mRnZ1NYWMjixYu54YYbKCoq4r777qNv375MnDiRhQsX8vzzzwOwYcMGCgoKWLZsGW63m7/85S/Mnj2bG264wdnrUygSQOGaYqZ9uImdJWW0zUhj9OAzbHvjyRoi0ccf7XUlA3XD0CeQTp060bVrVwC6dOnCwIEDEULQtWtXtm7dyrZt25g7dy4AAwYMYP/+/Rw+fJgvvviCefPmATBkyBCaN28OwKeffsqqVavo0aMHAGVlZZx44okJuDKFwlliDb0kc4gkJzuzThn2YOqGobfheceLxo0b+352uVy+310uF5WVlRFXmkopufHGG5k6daqj41QoEo1V6MWOkRw9+IyABwXUvRBJsqJEzWKkX79+zJ49G4DPPvuMli1b8qtf/Yrf/va3vP766wC8//77HDx4EICBAwfy9ttvs2fPHgAOHDjAtm22lEYVigCSLUMl1tBLTnYmU6/sSmZGGgLIzEhj6pVd67QnnSzUDY8+icnLy+NPf/oT3bp1Iz09nZdffhmASZMmcc0119ClSxfOP/98OnToAMBZZ53FlClTGDRoENXV1bjdbp588klOPvnkRF6Goo6RjBkqToRe6nqIJFkR/tkgiaJ79+4yuPHIhg0bOPPMMxM0ovqJuqf1hz75iw2NamZGGstyByRgRKEPH9BCL8orjx9CiFVSyu7h9lMevUJRB0nGDJX6kJ1SX1GGXqGogyRrhooKvSQnajFWoaiD1IciHkXtoTx6haIOosIkikhQhl6hqKMkKkwSS/WrIjEoQ69QKGyTjGmdivCoGL0JJSUlPPXUU1Ede+mll1JSUhL1ezdt2tTy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\n",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJztnXl4VdXV/z8r4YIB+zOgvBYiCI5URaFQh9LXKlVxNtVWbbVqtdK+ta/FKiWoVUAULLVatbXV1zrVARWNWFSqglpRVDAMUkFBRYyoKAQHAmTYvz/OPeEOZ77nDknW53nyJDn3DHufe+/3rL322muJMQZFURSl41JW7AYoiqIo+UWFXlEUpYOjQq8oitLBUaFXFEXp4KjQK4qidHBU6BVFUTo4KvSKoigdHBV6RVGUDo4KvaIoSgenS7EbALDTTjuZAQMGFLsZiqIo7YqFCxd+aozp7bdfSQj9gAEDWLBgQbGboSiK0q4QkdVB9lPXjaIoSgdHhV5RFKWD4yv0IrKdiLwqIotFZJmITExuv1NE3hWRRcmfIcntIiI3ishKEVkiIt/MdycURVEUd4L46LcAI40xX4pIAnhRRJ5MvjbWGPNwxv7HAHsmfw4Cbkn+VhRFUYqAr0VvLL5M/ptI/nglsT8JuDt53HygUkT65N5URVEUJQqBfPQiUi4ii4BPgKeNMa8kX7o66Z65XkS6JbdVAWtSDv8guU1RFKVdUltXz4ipcxhYM4sRU+dQW1df7CaFIpDQG2NajDFDgF2AA0VkP2A8MAj4FtALGBfmwiIyWkQWiMiCdevWhWy2oihKYaitq2f8I0upb2jEAPUNjYx/ZGm7EvtQUTfGmAZgLnC0MWZt0j2zBbgDODC5Wz3QL+WwXZLbMs91qzFmuDFmeO/evvH+iqIoRWHa7BU0NrWkbWtsamHa7BVFalF4gkTd9BaRyuTfFcCRwHLb7y4iAlQDbyQPmQmclYy+ORjYaIxZm5fWK4rSoShFF8mHDY2htpciQaJu+gB3iUg51oPhQWPMP0Vkjoj0BgRYBPwiuf8TwLHASmAT8NP4m60oSkfDdpHY1rPtIgGoHlq8ab6+lRXUO4h638qKIrQmGr5Cb4xZAgx12D7SZX8DXJB70xRF6Ux4uUiKKfRjR+2d9gACqEiUM3bU3kVrU1hKIteNoigdg9q6eqbNXsGHDY30raxg7Ki9A4t0qbpI7PZH7VcpoEKvKEos5Op6KWUXSfXQqnYl7JlorhtFUWIh1+iUsaP2piJRnratvblIShW16BWlnZKLmyQf5Op66QguklJFhV5R2iGlGKESh+ulvbtIShV13ShKO6QUF/Go66V0UYteUdohpRihoq6X0kWFXlHaIaUaoaKul9JEXTeK0g5RN4kSBrXoFaUdom4SJQwq9IrSTimWm6TUwjoVf1ToFUUJTCmGdSr+qNArSkQ6o2VbqonHFG9U6BUlAp3Vsi3FsE7FH426UZQIlOKCpULgFr5Z7LBOxRsVekWJQGe1bDWsMwQtLf77FAh13ShFp9R83UHaE3TBUnvsmxca1hmAFSvgssvga1+DO+4odmsAFXqlyJSarztoe4JUHWqvffNDV7+6UF8PEyfC3/8OFRUwbhwYAyLFbpm6bpTiUmq+7qDtqR5axZSTB1NVWYEAVZUVTDl5cJoAtte+lQKlWCTclQ0boKYG9twT7rwTLrgAVq2Cyy8vCZEHteiVIlNqvu4w7fGzbEuhb6muGuOyT6nNK5TaSMiVxka46SaYOhUaGuCMM2DSJBg4sNgty0IteqWolFoUR5ztKXbfbMGs9xD5QrYnKCU/8mhuhttvtyz4cePgkEOgrg7uuackRR5U6JUiU6gojqCugDjbM3bU3iTK04fuiXIpWISKk2BmUooRM6UwEnLEGHj0URg8GH72M+jXD55/HmbNggMOKG7bfPAVehHZTkReFZHFIrJMRCYmtw8UkVdEZKWITBeRrsnt3ZL/r0y+PiC/XVDaM0F83bmSadnargAnsY+9PZmmtJdpHTNewpivex0HxR4JOfL88/Dtb8PJJ1t+90cfhZdegkMPLV6bQhDER78FGGmM+VJEEsCLIvIk8BvgemPMAyLyV+A84Jbk7w3GmD1E5HTgWuC0PLVf6QDkO4oj7LL9uNozbfYKmlrTlb2p1RQsXYBbCGhVZQXzakbm/fpRCRLRVDAWL4bx4+HJJ6GqynLZnHUWdGlf05u+Fr2x+DL5byL5Y4CRwMPJ7XcB1cm/T0r+T/L174mUyNSz0m7JJQqjWK6AYrsg2uvipkKM8nx5910480wYOhTmz4ff/x7efhvOPbfdiTwEjLoRkXJgIbAH8GdgFdBgjGlO7vIBYL8LVcAaAGNMs4hsBHYEPo2x3UonItcoDDfL1gAjps7J24KfYleBas+Lm4oWq//JJzB5Mvz1r5agjxtn/VRWFr4tMRJI6I0xLcAQEakEHgUG5XphERkNjAbo379/rqdTOjC5Zkx0cgXY5DN0Ly4XRC6rWXVxU0C++AKuu876aWyE886DK6+Evn2L3bJYCBV1Y4xpAOYChwCVImI/KHYB7LF0PdAPIPn6DsBnDue61Rgz3BgzvHfv3hGbr3QGcnWBpLoCnMhH6J4tzo1NLZQnPZdRXBBhJpKVCGzZAjfeCLvvbq1qPfpoWLYM/va3DiPyECzqpnfSkkdEKoAjgTexBP8Hyd3OBh5L/j0z+T/J1+cYYwoYa6Dkmyj+8lx87HFEYVQPrWJezUjcJovi9JunijNAizFtlnxY67rkY8rbK62tcO+9MGgQ/PrXVsjkq6/CQw/B3qU9hxGFIBZ9H2CuiCwBXgOeNsb8ExgH/EZEVmL54G9P7n87sGNy+2+AmvibrRSLKBZmrlZpnJOKhQjdi1Ociz2h2+Ewxoqg+eY3rcnWnj1h9mx45hn41reK3bq8ESTqZokxZqgxZn9jzH7GmEnJ7e8YYw40xuxhjPmhMWZLcvvm5P97JF9/J9+dUApHFBHLVfjijMIoRCRKnOJc2T3huL3UVrO2C+bPh8MPh2OPhS+/hPvvhwUL4KijSiYnTb5of3FCSlGJImJxCF9ck4qFiESJK9qmtq6eLzc3Z20v5OraDsHy5XDppdYip//6L7j5Zjj/fOjatdgtKxgq9EoooohYscMMM8l3JEpc0TZOC64AenTtopE0QfjgA5gwwcoJ36OHlXDsootg++2L3bKCo0KvhMJPxJxCAYu10rFYRT/iGjW4jXg2Njbl3MYOzfr1VkbJm26yJl0vvNCy6DtxdJ+UQkDM8OHDzYIFC4rdDIVg4ui2T+bCJrAEfcrJg4H8uUuc2gO4tqUUrOEg93nE1DntMoVBWGJ7IG/aZIVKXnstbNwIP/mJFTI5YEDsbS4VRGShMWa4734q9IqNl1AH+eIVQ5jc2tytSxkNDpZvPtoSVqiC3udc34/2QCx9bG62qjpNnAgffgjHHw/XXGOFTHZwggq9pilW2sg1OqYYoYBubXYS+Xy0JUroaJxVrKK0t5QqN+X0mTMGZsyAffeFn/8cdt0VXngBHn+8U4h8GNRHr7SRq1DnMunq5n7xs5TDCnfcE8BR0jMEuc+Z9+P604bkbMWXYuWmyJ+5uXOt8n2vvgr77AOPPQYnnNDhwySjokKvtJFrdEzUSVcnARr78GIwtEWduImSW5t7dk+wuak17xPAYYTKFm83Z6l9n90EecHq9cxaspYNm6zRSmVFggkn7htYpIM+lAo5iR36M1dXZ6UNnj3bKvxxxx2WL7683Hl/BVDXjZJCrouJoroanASoqcVkhRZmDulr6+rZtDU7zrwiUc6VJ+xbkFS3QVfaZqZFcGpz6ijGSZD/Mf/9NpEHaGhsYuxDiwO7X4I8lC6vXcpF0xcVLLdO4M/cqlXw4x9bK1pfew3+8Ad46y045xwV+QCoRa+0EUdYYJQY9TDuF3tfp0k8yLZy4xb2TGv38EG9mbGw3jfc1E3gwXoIpd7nMPcjTCETP+u5tq6ee+e/nzXiCJMpNCy+n7mPP4arrrKSjCUSVpjkb38LO+wQe1s6Mir0ShrFSGvrJkBu+4J7PdQe3cItJgrjpnByqcxYWM8pw6qYu3xdoHDTTASyooDC3A8I/mDwc615uZW85g9yde04fuY+/9yy2v/4R9i82VrJesUV0KdP5Ot0ZlTolaLjJECJcknz0cM2Uaqtq3cVwjDWcNjJSTeXytzl6xxDNoMU596hIjuXjdP9ENzLzQadQ/Gznr3und/8Qer5c2LLFrjlFrj6avj0Uzj1VKsQyJ575n7uTowKvVJ03ATIbZstLE6EiaoJGzETNkIkyEPnq63N1NbVp13P6X4cPqg3019bQ1NLutwnysLlvfEasbmNJAR85w9ydu20tFhpg6+4AlavhiOOgClTYLhviLgSABV6pSRwEyCn1aJuVnKiXDh8UG+GTPxXWxx9z+4JrjzBOTIlrECHjRAJ4oJpanH2sTvdj+G79mLi48siR9344TaSOOPg/r5Wf+T1CcbAE09YkTRLl1qTrbfdBkceGe18iiMq9Eq7wktQWloN981/n9aUbRs2NVmhmmQ/NMIKd9jwUa8ShqmEqZQVRyy918ipsnuCbl3K2NjY5Oh/jzVB3csvW/VY//1v2GMPmD4dfvADKNNgwLhRoVdiJd8x2F5WskOiR8Ddag4r3GGjkjL3B2c/u5OfPh8EWa+wYVMTFYly1wVasSSo+89/rOiZxx6Dr3/d8smfd54VVaPkBRV6JTYKsfIyqJWciZPVHCWcNKxVnbr/0En/SouDt8nnYs7UB2+ZCC0Zua0yff7g7XPPKQR3zRqr4PZdd1mpgidPhjFjrBTCSl5RoVdiw2+irraungkzlwXyn7th73vxg4uzRMsLN9dCLu6QsKOXBgeRd9oe16go88Eb5n55uZPc7plruz/7zJpYvflmyyc/Zoxl0e+4o2/7i5FmuiOiQq/kROqX0SsGu7aunrEPLU4Ll/Tyn3th7ztm+qJA++ejIlOU0UsQ/3bUUZGTKAYJ73QjSjWszHZPeuA19rr9Jva55xardN9ZZ1kZJvv3j3S+Yuflac/orIcSmczMjW70raxwrZZk+8/DUj20ikoX33aqK6Rn9wTTfnBA7OIQJetikOX+Uc7rlkEzyKKrRLmQKEv3HUWthmW3u0tLM2fUPcFTfz6Xff58LRx2GCxZYuWlCSDymeeziVpgXVGLXsmBIBajLRoXeVjfUUPzJpy4b9HytUcJMwzi345yXjdRLHfwyQOUi9BqTKgsoX582NAIxnDc8he5+N/3sNuGD3l1l334ZfV4Hv7H2FDnajtfiO2KNyr0BSYffseo58y1LV5fOoG0c3rle4maOrgQhb7diBpm6Dcn4HbeMhEG1swK9XBoMYaKRHmgB2Gu9+yET9/kvFm3csBHb7Nip/6cd8rveHb3A6nq2T3S+UqtznB7x9d1IyL9RGSuiPxHRJaJyK+T2yeISL2ILEr+HJtyzHgRWSkiK0RkVD470J6IUqQiX+eMoy1uX7qqygrenXoc82pGtgnI2FF7Z7kIIHf/efXQKubVjMy6Xr7JNdNnmPOCJdpu75PX+5D3DJ6vvw5HHcWNt4+l96aNXHzsRRzz05t4do+DqOjaJfL9yNf97awE8dE3AxcbY/YBDgYuEJF9kq9db4wZkvx5AiD52unAvsDRwF9ERPOIkh+/Y9RzxtGWMF/G6qFVTPvhAWl+ddt/DpRU1aMg5KP6k9N5yx1iLzPfJ6/3IW8PwpUr4fTTYdgwS+yvv54F/3qZ+f99PKasPOf7ka/721nxdd0YY9YCa5N/fyEibwJed/sk4AFjzBbgXRFZCRwIvBxDe9s1+fA7Rj1nHG3JdJ3sUJFABC6avohps1dkuRic3Ba5RFfE6QaLcq58ZfpMPe/AmlmO+6S+TwV1YX30EUyaZKUp6NoVLr8cLrkEdtiBE4ETD9ottksVI5NqRyWUj15EBgBDgVeAEcCvROQsYAGW1b8B6yEwP+WwD3B4MIjIaGA0QP+AM/HtnXz4HaOeM6622F/GMILtt4gnSJIsp+uNmb6ICTOXhc7/4nSui6YvYsz0RVm54uMgzEMl6PuUd1HcuBGmTYPrr4etW2H0aPjd76yVrUrJEzi8UkS2B2YAY4wxnwO3ALsDQ7As/uvCXNgYc6sxZrgxZnjv3r3DHNpuyYffMeo5425LUFdQ5tyA2yIev5GFW8RPQ2OT51yDU3Fsp3PZrYq7wlLYuZGi+6o3b7Zywu++u5U6+MQT4c034c9/VpFvRwQSehFJYIn8vcaYRwCMMR8bY1qMMa3AbVjuGYB6oF/K4bskt3V68uF3jHrOuNsS1BUUdBGP28jCFmqvGHG3uYao8eZxxm+7PRAnzFzmuH+xfNW1C97n6h/+lvqd+8PFF/PxnvvBwoVw//1WAjLFFSdjotj4um5ERIDbgTeNMX9M2d4n6b8H+D7wRvLvmcB9IvJHoC+wJ/BqrK1ux+RjiB31nKGXsnsQ1MUQZA7AzWINUrHJ6zph4839zhcFt4dKQ2NTVl56m4L6qo1h/p/uZN9rJlK9bjWLv74nlxw7hkV7fJMpsjPVhWlFu6VUV/QGsehHAD8BRmaEUv5eRJaKyBLgcOAiAGPMMuBB4D/AU8AFxpho67CVghM17DKoi8HNUi8X8bVYwyzpd7qOX7x52PNFwSmKxqboqz7nzYP//m8Ovuhcypub+OVJNZx01h95edcDdFVqQEp1RW+QqJsXsda/ZPKExzFXA1fn0C6lSEStIBQ08sMtzW0Qd0RQq9ptROA26rAnXO1FXZll++L0iXuNHIq26vONN6wkY48/Dn36cOmoC3hw8JE0l6fLQ5T2dbbEZKW6oldXxipp5PJBDeJiyCUUMEjFJgFOGebcDreHzOGDere1pypZts+p2HccVHn0oeCrPlevttIG3303/L//Z2WYvPBCnr9xPs0xRGSVqhsjn5Tqil4VeiWNQnxQgzwQbEuwvqGxzYdeWZEgUS6OOdRtDDB3+TrX60J2LdYZC+vTxGjGwvq8TXiOHbU3Yx9enHPt15z49FO45horckYELr7YKuXXq1dbG3MuLkIe68uWMHHdu7hRoVfSGDtq76x0wgUVIdzzqDc0NpEoE3p2T9Cwqck1Y2Z9Q6NrXpjMh4xTDVovMcrVFWHvG1ft11Dt+eorKw5+2jQrbfA558CECdCvX9pucS3AKpQbo5TcQ8XMv+SFCr2STeaMTB4rIDnhNena1Gro3rULdVcc5RlmmTqRDO6ugjBiFJcrIq4omsDtaWqyVrJOmgQffwzV1VZM/D77OJ02tjYWYnRYiu6hUlzRq/nolTSmzV6R5VYImzPeK444SIxx0PQNbgnAUvGLeHATHaftQSIqChlD7due1lZ44AH4xjfgggtg773hpZfg0Uc9RT4uCrHYq1SjXEoNteiVNHIdbntZWEAg68tv0tUW4cxhsleFKzfC+FT97k2hrUvP9jz9NNTUWAnHBg+GWbPgmGPyW6A2g0K4MUo1yqXUUKFX0sh1uO1nYQXxh3sVAM8U4dRhspsrx6vtYcTI794UevLRqT2D177NFfPugWtfh113tSJqfvxjKC9OAtl8uzFKNcql1FDXjZJGrsNtLwsrqPWVuuwfti0yshdTgXNaY6e2J8qFr7Y0e7pSgqby9bs3hbYuU9szcH09N9dO5fG7L2L/z96DG26AFSvgJz8pmsgXgqLnAmonqEWvpJHrcNvPwgpqfXmlZ/Bzj9htr+ye4MvNzTQ0NrnuGwa/e1No67J6aBXbrfuIzb+bwPGvPcHWRFeWnz+GQX+YaMXFdwJKNcql1BDjk+OjEAwfPtwsWLCg2M1QYsApH4298hWIvCrWxs09U1VZwbyakYH2zayZmqsopMb8O62qzUtMfkMD/P73luXe3Aw//7mVG37nneO9jlLSiMhCY8xwv/3UolccySU2ebtEWZuYO8WI51Lf1m2S1sk94pXbBtwt/DB9z3ywGWgT+1xy2ae2wS7o0rCpiQE9yrlp/Tz2u+vPsGGD5X+/6irYLb6CH0rHQ4VeySJq9IiTNb+luTVtnyiTc0GyVjq5R4KkTMicLA3bd7dc9k4jjKBktqGhsYny1hZ+8MazXPTiffT94lM+/vZh7Pzn62HIkEjXUDoXKvRKFn6RM27WrttxFz+4mIumL4rsKvHLWuk2+eYVvZNKquUfNnImjnDUzPuZ1gZjOOrt+Yx94W72/GwNi/rsxW+O/w1r9j+IeSrySkBU6JUs3ETKtm7drN2orpKo7QFv90jmRJ1T2UJIHw2EFe4oE7BuPv3M+3vgmjcY99ydDPtwOat67cLPqy9l9l6HgAiiceJKCFToY6SUcm7k0h438SoX8bR2o7hKguCVXtjPPZLqKnKbKE4dDYQV7rBJrJx8+qk0NrXwjXWrueT5O/neqtf4aPte1Iz6FQ/tfyQtZdvCCDVOXAmDxtHHRNSCHaXYnsMHOdfw9avvGiQlQer+QXE6r2D1KUyagSBl+cLGZYct9eflhtpl48dc98/rmPX3XzG8/k2mfvccDht9Kw8MOTpN5DVOXAmLWvQxUWopWXNpj1uaX7eSe24pCYK4StzIHI2cMqyKucvXubo7Uq/vhd9kcJS47DATzE4PuV6bNvKrl6ZzxqInMFLGfYeeSs9Jv+Pxlz9mS0MjlSlRN6UwUlTaHyr0MVFqOTe8/Owjps7xFDG/knteboqwrhInnCJf7BzxTiGWUR6oXm6tfC7bT3UNdd/ayM9eq+X8Vx+he9MWHhx8BH877EzGnDOS44ZWcdx3981LG5TOhwp9TBQz54aTaLm1x3Z5QPikYpkl92yfvR2NkymOUVcteo1G4nigFjO17dhRe3PFQ69T/dos/vel6fTe1MCTe32bPxz6Ezbvvpda60peUKGPiWJVlnETrVOGVaVVTgKyVm1C8KRidl/s/YIKZRTr2EvM43igFs3N1tpK9ZvPc+Q9l9Ljg9W83H8wlx43mePOr+ZZFXclj+hkbEyEnZSLCzfRmrt8XVZ7gqbx9etLvnOAe+WIjyOJVcHdbMbAU0/BsGFwxhn02LESnnySQ95bzG1/uUAteCXv+Fr0ItIPuBvYGcsgvNUY8ycR6QVMBwYA7wGnGmM2iIgAfwKOBTYB5xhjXs9P80uLYlSW8RItp7J5uSYVA+fEZJltySXUNMiIIuq5a+vqY50k9r32q6/CuHHw3HMwcCDcey+cfjqUqY2lFI4grptm4GJjzOsi8jVgoYg8DZwDPGuMmSoiNUANMA44Btgz+XMQcEvytxKSIKLi5sooE6G2rt7XJZOaxjeIcNXW1Tu6gOy22PsEde149dFpey4PELtdTiIfdZLY1be/YgVcdhnMmAG9e8ONN1qJx7p2DdTWQlFqaz+U/OAr9MaYtcDa5N9fiMibQBVwEnBYcre7gOewhP4k4G5jpcWcLyKVItIneR4lIEFFxW2Zf4sxWftnCmj3ruV8tbUlVBrfabNXuLqA7Pj7oD5wvz46PRRymUT1imF3m1ROFUKnkUBWv+rrYeJE+PvfoaLCKr79m9/A177m275CU4r1VpX8EGr8KCIDgKHAK8DOKeL9EZZrB6yHwJqUwz5IblNCENQPbvvTyx1KxLntP69mJNefNoRNW7NFz8/X7uXHvv+VNdTW1bu6djK3h/X1u+0/8fFlgeq0+vngMxeVZS4681wwtmGDVbpvjz3gzjutGq2rVsGVV5akyIPWW+1MBI66EZHtgRnAGGPM55IiLMYYIyKhEtuLyGhgNED//v3DHNopCDNhWD20ioumLwp1Hi/L3EsQvdIc2KMIEWv+MZPypDspao1Xt+0bNjWxYVP2qATS3T+V3RNt+7mRaqH7JVMD6Na0hQv/8xTsdiZs3AhnnAGTJln++BKn1NZ+KPkjkEUvIgkskb/XGPNIcvPHItIn+Xof4JPk9nqgX8rhuyS3pWGMudUYM9wYM7x3b+cl950Zr8iTOLb7ibkbY0ftjVd56camFkeRh20PgnoPkfe6ftAQysamFibMXJaVAuLLzc0kyv2LY9v3xuselbe2cNri2Tx/22gueOo2+Pa3YdEiuOeediHykPt9VtoPvkKfjKK5HXjTGPPHlJdmAmcn/z4beCxl+1licTCwUf3z4QkbRhh2f7cvsyTP5Ub10CrOOLi/p9i74ZQULZOwfXSjobEp61pNrYYeXbu0hY06ubtg271xvEfGMGrFS8y+/QKufeomug7YFZ5/HmbNgv33b9uttq4+kDupmGi91c5DEIt+BPATYKSILEr+HAtMBY4UkbeBI5L/AzwBvAOsBG4Dfhl/szs+YePynQpq224IJ5FxSxR2xsH9fSfiJlcP5oyD3d1tlRUJRwFx83HblItwyjD3WrG2KyW1WHhlRcLznJlsbGxqKwR+3akHeApd5j06+P0lPHrPJfyt9hqMCKO/fxm9Fi+AQw/NamspJbhzo1hrP5TCEyTq5kVwNeC+57C/AS7IsV2dllzC3cKsWs0lHr22rp4ZC51FqyJRzoQT93U8t1cpQLBcOzMW1jN8116e0Tl2zh1bkJ1i7rdLlDn641OtdL97YP++7aZHGfvcnRz27kLWbr8jY4+5kEf2+x5f77U9OIwKSi3BnRfFWPuhFB5NgVBCxBHuFkZkon7J3SYpy0XSLEKnc/tVfHJqq1ef7Hz0mWLtdC0nt4TnPXjnHaqvu4KT7ruPjd16cM1hP+Wubx7PlkQ3TxeHTnIqpYYKfQkRJv7czQoNUzw7Km7najXG0+1iF7reLlFGw6amwFE3fsLpJdaRRkeffGIV3P7b36BLF2TcOOYd8xNmvfQRWxsafYt+u0X3VHa33Ey6SEkpNCr0JUQQS9DL6gfnxGUQbyRFmMRiToWuKxLlXH/aEFdXTuZ5oiYyCzNiqa2r588z6zju6fsY/dqjbNfSRNl551lx8H37chxw3KH7BDqX21SEMbpISSkOmnCjCLhFZAQJd/Oy+t1i4/0iacLiFq1x+KDeWf3yaq9bFM1XW5rTJi6jRIeEiXqZ+co7LKuZzP2/P5Mx8+5n7sBhHDf6r9T+4gro29fzXjixsdE5Vn9jY5MuUlKKghifSIhCMHz4cLOrGwNiAAAgAElEQVRgwYJiN6MgOBXjSJQLPbp2oaGxKcsir0iUp/m9B9bMchVzcLbmAd6belwMrd/G5bVLuf+VNbQYQ7kIB+/Wk9ff35jlE3fzxwvw7tTjqK2rZ+Ljy7JcHZn9DuPucCt4khVR0toK993HhxeOpe+Gj5i36/5c+91zWNJnL8CKHurRrUtoF4tb8riqygrXhWL2/cgFdQl1PkRkoTFmuN9+6ropME4WXVOLacs3Y9jmfnHyBfu5MdwEBuITAjvqxg6XbDGGeavWZ+1nh0L6lR+cNntFltBnzk2EccP4znUYA08+CePHw5IlrN95d8adOol/DxiaFkXT0NgUKg+QjVf2zaDuqrCoS0jxQoW+wASZFLVFfl7NyDYXhC3Ohw/qzfTX1tDUsk08E+XiG2kSpxAESQ1gE6T8YC5RKqkPr8ruCYyhTZwdzzd/vpU2+IUXYPfd4f77+cU7O/HB51t8rxU0RNIrbHPB6vXcO//9rFFbrq619hTSqRQeFfoC45UrJpUPGxodxXn6q2uyLeTkv14CM2LqnNiEIEwET2r5QbeRRNTJ1sz745XHZvdP13DF/Hvh2hfhv/4Lbr4Zzj8funblEgdXjxtB++6WfXPGwvo0kRdwXSQWBg3pVLxQoS8wbmmFM+lbWeHs5mnNdoM0tZo2wXZzccQpBEEfVvYksJ/bxe2ebNranJVTP5UgI4s+n6/j1/Pu54dLn6G1e3cr4dhFF8H227ft4/SA3LS12fHBsUNFos0Hb7ul/MItvdprgLnL13keF4Ri1ixWSh8V+gKTKSqV3RN8ubk5TcDtobxbRkonvAQ716pKmdht85vGNwRzC9n7TJi5LM3tsmFTk2fBEq+HzQ6NX/DL+Q9xzsLHrYnOH53LHjdcQ+0HW5l286tZo4vMh5HjpHmZ8NXW5rY22vfTzQ2WOSeSzzUOxapZrLQPVOiLgJOoOLk2/FIGpOIm2LlUVXJrl5uvOZOqEA8Ru7+Z/nWvgiVObNe0mZ8ufJz/mf8w22/ZxOyhR3DMI7eyx4ABoeYpwlj5Tu10ulY+1zjkWmJR6dio0MdMlMgWN9eGY+m/MgEhbTLWS7C90hWcMswS14umL8pqq58oTq4ezPBde7U9jJzCQsNak0HdS059Km9t4dQlT/Preffx9S/X88zu3+LG7/2Uc39xIgywShBe/OBi/wpRKWS+LwNrZgVuv5ubJo775IbmrVHcUKGPkbhD3NysNKdtbqkHvIqEzFhY79rWMFEcAm0RLxsbmyJbk0H9zGnCbwzHrJjHJf++h93X17Oo3z7870nj+HC/4Wl1Zt1GNZnn83pQ+81NpLbT7aFlR1Sp1a0UEhX6GMlHiJubleZ3Pi/3Bjjnhk9tq185QKeIFzu1QdS+BvUz24J7yOrFjHv+ToasfZu3duzPuJ9cxbV3XcZDGRkl/SZt/YqaL1i9nrnL13m6XzLb6fZQsMNmFaWQqNDHSCmFuHmJm9eKVbutbgud7FzwXvVbc02z7Hf85F2bSNx2Bd9553Xqv9abS44dw5NDjuDqHwxxTBvsdf9TBdqtT6lzEanuF6eoG3tEEJc7S1HiQIU+RkopxM1L3KacPNh1oneHZCEPNzeHvT1s/dYwYu+676pVcPnlHP7AA2zdoZKbjv05N39jFDvttANXezxQ3N6XzLTKXu6WzP+dLPPMEUHqcUFDMBUlH2hSsxgJknyrUCXm3B4uVZUVVA+tYuyova2J3Qy+Ssauu0XM2NvD1G/NOWHXRx/BBRfAoEHw2GNw6aV0Xf0e/zvrr6z4w/eZVzPSN07f6X257tQDshZuBcXpoeA2ikpdT6AoxUCFPkb8SrMVssScW6nA+oZGRkydA8D222UP6JpajGtmydR0Cl9taQ7clsiuq88/h9/9DvbYw8oN/7OfWVb91VfDDjsEPo3f+2Ljds+ccHooeI0INDulUkzUdZMDXnHmThQyH0mqvzvTX2w/YLz89F4RP0HTBdiEdl1t2QK33GIJ+qefwqmnwuTJsOee4c6TQpDQQ6c+Hz6od1p0Erj72vO9KEpRoqJCH5EooZR+kSxxY4ubU9pcr8ySZSJtqQcy++KUM8eLUBOQLS1w771wxRWwejUccQRMmQLDfbOwxoZTn+31An4TzF4rhjUVgVJMVOgjEsU694tkyRdesfROETgtxrg+tMJYpmWCo4skC2Ng1iwrbfAbb8CwYfB//2cJfRHJHLH5hY7mMzulouSC+ugj4iZ49Q2NrhOtfpEs+aC2rt7Vz2z7qp0eNG6TqGEs00APsJdegkMPhRNOgM2bYfp0ePXVkhD5KPMpk6sHc/1pQ3znAxSlkPha9CLyd+B44BNjzH7JbROA8wE77d6lxpgnkq+NB84DWoALjTGz89DuouPlj00VBthmFVd5LKIJS9BUC27lBcHKDumVnMx+mGUW906US1YKBjA0NrWmHZ+aVTOLZcvg0kth5kz4+tctn/x550GiNApo5zKfEmQ+oNj9UzoXQSz6O4GjHbZfb4wZkvyxRX4f4HRg3+QxfxGR7KKgHQC3eqepZFrFUWqfOhHG2vRytWzY1OSZlKyye4IhE//FmOmL2q7V0NgEBnp2T6RZrJszRN71+u+/Dz/9Key/Pzz3nDXJunIl/OIXaSI/9uHFaf0b+/DivEQnuYW75nPxWyGjrxQFAgi9MeYFILtOnDMnAQ8YY7YYY94FVgIH5tC+kiUzZM+NVGEIGubnR5gC07lMAm7Y1ORYramp1dC9axfenXpcWwy7b2Hzzz6Diy+GvfaC++6DMWPgnXfgssugR4+0YyY+vixtxABW2OfEx5dF7osTXoIbpFB7VLRAuFJocpmM/ZWInAUsAC42xmwAqoD5Kft8kNzWIUkdorsVhM4UhjgyDHrND6SWHRw7au/AhU5ybYNbnpqaQ/tZYZK//z18+SWcdRZMnAj9+7ue2y0VsFcFqSh4Ce7YUXsz9qHFaXUCEmUSy6RqKaXKUDoHUSdjbwF2B4YAa4Hrwp5AREaLyAIRWbBuXe4VdopNXG6ZILhZlfaCqMw5gsxRRGUyzUGcbcgcrfT/WoL7WxdxwimHwuWXw2GHwZIlcMcdniKfL5xcNL6CmzlUiyk4Kp+jBUVxQkyAiA8RGQD8056MdXstORGLMWZK8rXZwARjzMte5x8+fLhZsGBB2LaXHGEn2KJOyDlVP3LLqhgkJ0tYKhLl7i6n1lZ4+GFL3N9+G77zHZg6FUaMcO1L5j3IrDSVypkH92dy9eBQ7XXqb0WinG5dyhyvY0+OB80+GeV9d2qPRucoYRGRhcYY34UmkYReRPoYY9Ym/74IOMgYc7qI7Avch+WX7ws8C+xpjPFUlPYi9HFGSuT6ZQ9apk6Ad6ce53p82MVaPbsnuPKEfZ3b+MwzUFMDCxfCfvvBlCnU9h3CtH+9lbbSdO7ydZ5lFE8ZVsX0V9c41scF6J4o45qT9w98793caj27J9jc1Or4HnhFIwl4rhS2+2D30+mzEuazpBE6ihuxCb2I3A8cBuwEfAxcmfx/CJYR+R7w8xThvww4F2gGxhhjnvRrRHsQ+ritMDfxiZqv3O185SJZybuCHJdJZUWCCSe6CPzChZbAP/OM5Za56io44wxql3wUaeRgZ3oc41EzN8y9H1gzy1G0Bbj+tCGOIhrkvlQkytkuUeY4d+CUojjKZyXf1r8+RNo3sVr0+aY9CH3cwuwlPrYFHtbqcxNVL2Fwa4fdFs/rvv225aJ58EHYcUfr7//5H+jWDQj+EHHivanHMcCndF+5CK3G+N6bKO9dru4tJ6J8VuL+3KWiLqT2T1Ch1xQILgR1jUSNlPDLXR82l469LWxd1EiVkNauhUmTrDQFXbtaAn/JJVkZJaOKvGD13y1lhI39mt+9CVq5KpXMpHBxEOWzks8InUIm2VOKi6ZAcMApvjpMutogHD6od9Y5g1Q78ou1DlIXNZVQ0UIbN1px73vsYYn86NFW2uCrrnJMGxw1h4+d1vdHB/ULfIzXvYm6fsHO2++1MK6yIhE4tfEOFYnQtQjyGaGjYZ6dB7XoHXAS2SB1QoNSW1fPjIX1aecU4JRh22Lsw34J/WrEuglDoPJ9mzfDX/5ixcOvXw+nn26J+x57OLbDPlcuTsEPGxrbomvufeV9gngYvQQq6voFv5KME07ct20/r9TGiTLhq63NbVE+QatvRRmNBKWUKqIp+UWF3gEvwbAn2XIpDef2IJm7fNt6grBfQj9B8nNTOPajpQXuuYdN4y+j+0cf8sKAodzx46s56dwTqN4je/+gfu1U3/pXW5odQxztfk6uHszk6sFpD5AyF5dOPgTKrySjfd/8Uhtv2tqcNWnb2NTCxQ8udjzeJmgd3Sjk8yGilBYq9A74JSzLdSIsiLUe9ksYVJD8qK2rZ9pTy9lnwfOMn3cPu338Hiv77sWU06/m5V0PAGC+gyVaW1fvOD+QSeZkn9uagMMH9U47LvVh5DaJmK/FaW5zGH4pi1NfH+gyseyVEjr1XLBN7G0XVa5in8+HiFJaqI/eAT+/bK4+TD+/q2292sVBwN+vvF3C+a30E6RUauvqeeiG+7nhzxdy2yNXYZqa+OVJNZx45nVtIg/Z/nBbeL1E3q20otvoZsbCelcfdvXQKk4ZVtV2b8pF0txeceL2WfhqS3OoJGReow2/uRdNgqbkilr0DnhFsEDuLgIvaz3TWrWLg3hZWmfc9nJWimCwnuKBrdw33mCnH5/Pvcvn8/H2vRg/6lc8NPgImsudPyKpDzsvtxFEW53r5daw5zjs96bFGGYsrGf4rr3yVpJx4uPL0lwvDY1NgXzsNn45h7yMh3xFx0Spkqa0T9Sid6F6aBXXnXpAXvLXeEWBhI22qa2rZ94q5+SizomDM1i9Gs4+G/bfn/3fXcq13z2b746+lfuHHO0q8pD+sPOb08h0w4D/wwG2uTUyLddCZ3+sHlpF967Z9yLMNe333C0Syct4yFd0jGbR7DyoRe9BPn2YbhOgYb/UE2Z6p+51tdA+/dSKovnLX0AELr6YUytGsHxrdsIzpzw6tuvCTlHsNafhZG0HFSkny7UYYYFxXNPuQ9j5hXxFx2h4ZedBLXofqodWMa9mZFru9XwSJm66tq7eNfmXTZaF9uWXVmjkbrvBjTfCmWdaK1ynTeMX3/+W4wjmjIP707N7+gPAdl3U1tX7zmk4+fTLQsTYZwpPkHvkVlDEbbsfccWzR4npz1dmVM2i2XlQi77ECBNtE3SIXd/QCE1NcNtt1orWjz+G6mrLot9nn7b9vEYwc5evcwwPnDZ7RZv/3WsVaWpZQr+J20wyhcfvHl1euzStQLfte16wen1afHsYn3ScoYh+Mf1OqS+mnDw49pGlhld2HlToS4ww7qIgQ2wxrRz/5r/5crcL2P6D1VYh7kcfhUMOcb1+FJeSfZxfARY333y5CD86qF/WQiMn4fG6R7V19Wkib9PY1ML9r6wJlR4i6DXjxG2CdMrJg3PObZOJhld2HlToS5Cgqzi9fOMYw3+/V8e45+9iv49X8dbOA7n17GuYsfNg+j7fyNjtLJdF0C95UD+xn5Xo9sBoNYbJ1YOzFhqlCnjmdifh8yqGHjY9RCZxVAfzo9D5ZwrRJ6X4qNC7EEf61nyngHUL2dt/7VuMe/5ORqxewpoddmbM8Rfz2D7fxYg1JWMX28bQlvM9rsRg1UOrWLB6fZv1bMe4g5WJ0U2E7QeGk/CECQP0Em23JGml5JPWCVIlH6jQOxBHfHFcMcpeD4vMofdBTZ9y3lO3c+R//s1nFf+PCd8bzX1DjmFrl+xImszi2+BtOQYd5jvFuE9/dQ3TX1vjeE3w9wuHsXLdRh4CgV1DxUTzzyj5QPPROxBHDvA4zhE4X/iHH/Lu//6WfrX3s6W8K7cd+H1u+9b3+apb90DXScWtIlVQwuagD5IzyCtnflVlRdqDB7LDFwU4I1mCsNQLbWiOeCUMmo8+B+IYPud6DrfcMWmWbEMDXHstzTfcQNXWZv4x5Fhu/vZpfNqjZ1uq3CqPxGFO9K2syEkMw7oYvB56dju8CqPYD5XUSUuvCJVS90nrBKmSD1ToHYhj+ByksIjbl9kvBPGzdQ0wbRpMmQIbNjDngO9x1cE/Yk3l19v2SU2+5mQlJsolzUcPlnAO2LEiJ5eT5wRxBqmrRDPvh1Oq31ScFnGlhnuWujA69derxqyi5IIumHIgjgUqXufwS1LlGoLY2sIPl/yL52//Bfz2t3DQQVBXx8+PvihN5G1SQx8zk4Cd9q1+nHZgv7QiGQaYt2p9Tsvi/RZPpdJiDLV19QyZ+C/GTF+Udj/unf++q8hXVVa4WvntYdLS6f3/x/z3NWmZkjdU6B2IWpEo6Dn8coxkiZUxHPXWyzz1918x7ckbSfSrgrlz4cknYciQQNkwnZKAzVqyNnBxkDAhiKn99qoy1bN7gvGPLHV0K3m5a+bVjKSqHa/qDJLnR3POKHHSKVw3UXzOcfhyoy4+SnV/HLjmDcY9dyfDPlzOql678Mq0Wzno4p9Z+WmS+GXDdPP1hyl8bYABNbPaFjbZ1Z/8+u2Whx3AGEIX37aFvD2v6gz60GwPoxOlfdDhhb4UU7H6+e/HjtqbO26Zya+f/Tsj31nA2u135NJjLuRf3zqazz5tZYdJTyMCDZua0pbIT5i5rM063i5R1rbkP0y6AT9ajOEf898H8BR7v75WViTY6DNBnOmHTxXyQk9axhmtE3Qeoz2MTpT2gW94pYj8HTge+MQYs19yWy9gOjAAeA841RizQUQE+BNwLLAJOMcY87pfI/IZXukV5jh21N5ZX14o/DJ3SAmhq9wKV1yBufdevujWg78c/AMeHXEy6025Zxz6KcOqsiYvnSYsU6msSLCluTW0VQ2WS2bVlGN99/Pqq1duHLtPpTBBGXfIY5CSixpSqQQhaHhlEKE/FPgSuDtF6H8PrDfGTBWRGqCnMWaciBwL/C+W0B8E/MkYc5BfI/Ip9F4x2BWJ8qwCzkj6YqJcv3BulmDm9ssO3IljH7sdbrkFysvhwguhpgZ69gwUm+626tMNAa4/bQiw7cFW2T3Bl5ub0yJxvHgvJd7eL4rI7R44CV7P7gmuPGHfkhE5t/ufWvs27ENIo26UOIgtjt4Y84KIDMjYfBJwWPLvu4DngHHJ7Xcb6+kxX0QqRaSPMWZt8KbHi9swuVwkS2CcBC6XPCN+bqPqoVXwxRfwxz/CSX+ATZvg3HPhyithl13azhPEVxvWPWPv7TaiCfJgsQnSz1xW2xYbt/tv3/Mo7sBSj+dXOhaBVsYmhf6fKRZ9gzGmMvm3ABuMMZUi8k9gqjHmxeRrzwLjjDGe5no+LXq3YXcYd0XQ1aK1dfVpJefcXCdVlRXM+8134G9/s3LDr1sHJ59spQ0eNKjtXLYAlgWw1ssEAhrigLPbxh69AIyZvsjz+O6JMk4etgtzl69zfSjkWkTdiWKsbA262jcf/VUULwq2MtYYY0Qk9GyfiIwGRgP0798/12Z40q1LWZug2W6BIFarTZBJsdq6esY+vDjN7eN0U8S0MvylJ+G28+Gdd+Cww2DqVCsmPuVcmXVjfTHWIqjU6yfKhLIyYUtzelHBikQ5ItkRL41NLUyYuSxrfyc2NbW2Tcq6ESYVQhCKNbHuV+/VJpcomVJPzaC0b6LG0X8sIn0Akr8/SW6vB/ql7LdLclsWxphbjTHDjTHDe/fOrikaB7YwpMZpb04W0XZa2JMoE2vFaApBQ/amzV7hOlkKgDF8952F/PPOMfzp8T/A175mxcHPmZMm8va5wk6QtmLNLdgulcqKBAhZol1ZkWDKyYNp2OQc8dLQ2BRpctYJgVgX/RSrxmnQtQFRo2T8FtApSq5EtehnAmcDU5O/H0vZ/isReQBrMnZjMf3zXsKQWhUpjqgbL2tuyIcrGPf8nRzy/lLWVH6dBVffxPCaX0KZ83M2F8uwxZg2i93pwfPF5mYgXKqCqBjg4gcXA/FY3MVM4ZvqU3dzBwYxCJws90LnoFc6H75CLyL3Y0287iQiHwBXYgn8gyJyHrAaODW5+xNYETcrscIrf5qHNgfGSxiCpP8Ng5Nw7v7ZGi554R6Oeesl1nWvZMKRv8Ccfz4Tf/jN0OcKg9diqBZjGP/IUsdwzHxgXw9yE3u7zmw+88kHdZ9EnUR2cz25vQe6YEqJiw6dpthtEs1rIjKXMErbR7/zF58y5sX7OHXpMzQmunHrgSdz+/CT+KpbdxJlwvbbdUlb7ORXaCMfiMC3d+vFvFXr83aNVCorEiy68qhIx3rdj7jizQuRHtgrTNPpAaaTu4ofQSdjO3SuG7fEYm4Tkbn4equHVnHDUbty5Yt38fytoznljTnc/c3j+O7o27hxxI/acsM3tRo2bGpy9cXaVmVjU4tnnhg/KisSnsnFjCF2kS8vc29vQ2NTZJ+zV53ZuIS4EP5/rzDNXJPoKYoXHVro3RKLuU1E1jc0MrBmFiOmzgknSo2NcO21HFf9HX760sNsd/qpdF35FpOO+Dmf9aj0PjRFTFIn5cBZAIIgwIQT920r4RcF+54FpWf3BNf98ADPh1NqP0dMnRP4XnvVmY3L2na7Rn3SzRcHbi4m+3OZSxI9RfGiw+e6cVqY4hVamWpp28e70twMd9wBEybAhx/Csccy56wx/O7dcj78238Cxb/DtgeM0/62Ze90HicXlF1NqXpoFRMfX+Z7bTfslZpB5goqEuVpK1ndYvDtuZGwIZL5Lq/n5f8HYgvhPHxQb8eQ1MMH9dYFVEpe6dAWvRtBcqZ7DtuNgUcegf32g9GjoX9/eP55aiffygVvtLSFyYVZreq1v9vQfsKJ+2ZZgtefNqStZN4Gl5FLEGYsrOfwQb0DjigMY6YvYvfxTzBm+iLcPDh9KysiuUjiqA/ghl+RlyDtC8rc5etCbVeUuOjwFr0TmVEToYpYPPeclYPmlVfgG9+ARx+Fk04CEaZNnZOXCVS3BGxeUUK5ClNjUwtzl6/jlGFV3P/KGh8htGL17X2cVujawnyRh7XvRj5TJQRdsxBHBEwxw0OVzk2nFHpId+m4RUOkuQYWLYLx4+Gpp6CqCm6/Hc46C7pYt7C2rt7TzRE27ULqcbaoOQmbW0ign3j07J7wtfjrGxpzSnPslPTLzW3m54bJl2sjqMjG4SYK4oLSFbJKPuiUrptMPF0D77wDZ5wBQ4fCK6/wxpjLOfzntzHwrZ0Z8YcXqK2rt0IrH1rsen6nybYbThviWiWpXKRtv1OGWeLoNHHptaLSS5huOG0IdVcc5Xp9mzKH6KQwtBrDu1OPS6vhmk83TBSCCHhc7fPru66QVfJFh46jD0OmJXX58F4c89jtVuKxLl1gzBhmHX0mlzz9flasNZg290UmXrHYTrHbdiK0KpcC2al52r2SidluEtekai5Fw20y8+ZEwS0OvJSsVsfC6QHWOuRyPbe+e9VO0Hh6xYnY8tEXglIQ+jY+/xyuu8762bwZzjvPShvct2/gLIap3HDaEE+RsL/49Q2NWdku3bJf+hUUsbNtDnAp42e/XltXn1aVys6AWVVZwVdbmh1rucI2l4xX/vogi41KRfBLpR1utROCZk9VOh8Fy17ZYdiyhSWXT6XfLdfT86uNzNnvUFonXcUR3z+0bZcok2ZORUYyJ1Krh1Y5PkTcxNzv0Wy7I6o8fMJOlmy3LtvE2avW63WnHpBVVKS+obEtDLQqgFiWUonHUgltzHcYqdJ5UaFvaYH77uOrmsvY/8M1zNt1f6495RyW9NmLitc3MWVAfZsIhM1B07N7Iit9cX1DI2Mfzk70FVfkRarP16uAtluY45jpi1iwer1nrdfUdkcVyVJM5FVsy749FzxXSpvOK/TGWGmCx4+HJUv4oO8eTD51Ev8eMNRKBEO28ATNSw6Wj/vKE/Zl4uPLsnzdTS2Gix5cxEXTF7UJShzZJEVIc5ekhiXaFrfdJ69r/WP++4zYvRfrv9qaJToTTtw3UFv8RDPXUMO4RTkfI4ywbWwvFbeU9kfn9NHPnw/jxsELL8Duu8PkyexW14NWyQ5CyvSPpn55ve6c7Zt385On4lbcOwrvOfhyoyRJKxfhulMPiCQ6QRKEec13VFYkmHCie83YfCQgi3sitBBJ0hRFk5o58eab8P3vwyGHwPLlcPPN8J//wOmn06dnD8dDMv2j1UOrmFczknenHucanmhvHzF1TqBm2YuTghS38CMz/HLE1DmMmb4o9AOkJZlHxu5raoikH0FWv3qtTm5obGLsQ4tdwwrzkYAs7sVMxSqSoihOdA6hX7PGip7Zbz949lmrTuuqVXDBBdC1KxAtvtvtmMMH9U5LThaEDxsa04T1ulMPCNHBbdhx15kJ0sKSS+bMIKJpJ5xzu05Tq3EVxXysMHWb8Iw6EaqrYJVSonMI/TXXwD/+Ab/+tbUA6vLLYfvt03Zxy3TpZ8Vul9h2C+0yfXOXrwttQe9QkchqT8/uCZe93bGtxijlCFM5eLeekY91E0cDaYu+qodW0erhOnQTxbhFGeJfyJWPNipKVDrHZOyECVZ+ml139dwtTASJkw/Wrs8axWpraGzi8tqlTK4e3LbtyhP2jVSAJA6r8b3P/M+RGYdvF14fO2pvxj602DG+PnOS02sS2k0U8xGdEvdEqEbQKKVE5xD6nXeO/ZRe4YlRuXf++wzftZdj1Izf5G8qtkB6uW16dk/weWOzax4bv4eFnfYhVcw3bGri4ocW86MD++GVzD41mmnAjs5CXya4imK+olPijKfXCBqllOicUTcRCRpxkwteUR5BVubakR2Ab/m9BavXO+ZH92uHX1vsFbZeCHD9aUNc0zTkUnpQUToLujI2RjJdFGGprEjw1dbmQLljvCxpJ3dAolzo0bULGxud87JkxsyXi3DKsG2W673z388S2kS5+LoYvNrpJ/KwLTe9264bI97rjkixF0LSKA4AAAorSURBVHIp7R8Veh9yLdQtwKIrjwr8sPCarIviDti0tTnt/xZjmLGwnuG79nIV2h5du/gKSS4LvPxy09vnV0orVYTSflGh9yHX6JUyEQbWzKJvZUXbqlK3lalBJuv8/MiX1y4NUCikpe1h4USmNe1kUY4dtbfnfIRbgrbUPDhu90Fw98+HIQ5LuNjWdCmmilDaHzmFV4rIeyKyVEQWiciC5LZeIvK0iLyd/B09Tq+AuBWszjWCpcWYrDq082pG8t7U49py0sdVEPry2qX8Y/77gQqF2MLlRJlIW//dcqQDnHlwf9fzG7bNx9olDt+belxbnp2BNbPYtLWZREbdwdSat7kQR273UsgPr/H4ShzEYdEfboz5NOX/GuBZY8xUEalJ/j8uhuvkDa/hsZ+Lwi9lcCqZlljcWRPvdZlYdcK2Tp3cUi3GtCVe87Io59WMbHMBOd0j24K3J3UzI3U2bGqiTKw5DLc5hqjEYQmXgjWtGS2VOMjHgqmTgLuSf98FVOfhGrHi9YX2KyTuJPJe+4e1xNxGGk77hYkEsgV1ysmDHYt5N7VYBb/dHnJ2P+zVvG7RlKn9nTBzWVZsfavJz8RrHJZwKVjTpVaRS2mf5Cr0BviXiCwUkdHJbTsbY9Ym//4IiD+IPWa8vtDVQ6s4ZViVV1h4GvbqWLc8OGEssTCugzA5VFJTDVurUwMf2kZmP4KsBHWbiDbJnzhdI3GsTC2F1a1RV2wrSiq5Cv13jDHfBI4BLhCRQ1NfNFaQvqOMiMhoEVkgIgvWrVuXYzNyw+8LPXf5usDWco9uVsTK2FF7Z/mfE2X+YYuphEmMFdTKDJNq2Oscmf3wsjztUUkQ4kr8FYclXCrWdNTkcopik5OP3hhTn/z9iYg8ChwIfCwifYwxa0WkD/CJy7G3AreCtWAql3bkit9y9cjD/cxhQMb/ueRszzy2snuCDZuyLeZuXcooF9iUrGm7ubmFBavXp12nsiIRaI2AgKsf3S30E9wXbrkRh2skjpWpurpV6ShEXhkrIj2AMmPMF8m/nwYmAd8DPkuZjO1ljPmt17lKYWVslKLNTtiTj375zXPJ2d6ze4LNTa1ZBa0R0hZlVSTK+Wb/HZi3an3WOc48uH9bXh2ndAZu7Q5LlDq7WgxbUYJRiHz0OwMvishi4FVgljHmKWAqcKSIvA0ckfy/5PEaHvtNyNoEGQXY2yc+vixSzvaKRDnGkHVsU6uhqcW0pf21fbnz39ng2I77X1nT9nf10Cqm/fCAtnmFzIFIEHdFlPDUnt0TWe4tnWhUlPiJ7LoxxrwDZCVNN8Z8hmXVdxi83BJuowCvsLjaunpHNwtk52x3uobXitIWY9rEsnpoleuipsxY+9RQz7CLhKKEp6aObNQ1oij5RZOa5YnLa5dm5ZGxXTNeNVuDuC2CuEPs8+w+/gnHBVTlIqyacqxvP4Lg5aZym//QyBFFyR0tJVhEauvqmbGwPisFgJ1MzC9xmR9BXEn2NX50UD/H1922R8EvPFXDAxWluGiumzzgFBZpsMI0wd2dkRrf7kWqS8evaIc94WrnvykX4UcH9UsrcJIrfqs3414BrChKOFTo84DfRKybOyNMfLstnm7RO6kjg8nVg2MV9kycKkqFXTOgKEr+UKHPA0EsXIgnPrtkYr191gwoilI8dDI2DwSJke9I+K0ZUBQlP2iFqSJSMlZ2gSiF5F+KorijQp8nOsMEpB0D7zYm1FS6ilIaqNArkfArsagrXBWldFChVyLhVWKxqoO7qhSlvaFCr0TCzf8uoBOwilJi6MpYJRKlUJRDUZRgqNArkSiVohyKovijrhslEp0thFRR2jMq9EpkOkMIqaJ0BNR1oyiK0sFRoVcURengqNAriqJ0cFToFUVROjgq9IqiKB2ckkhTLCLrgNURD98J+DTG5pQKHbVf0HH71lH7Bdq3UmVXY0xvv51KQuhzQUQWBMnH3N7oqP2Cjtu3jtov0L61d9R1oyiK0sFRoVcURengdAShv7XYDcgTHbVf0HH71lH7Bdq3dk2799EriqIo3nQEi15RFEXxoOSFXkR6icjTIvJ28ndPl/2eEpEGEflnxvaBIvKKiKwUkeki0rUwLfcnRN/OTu7ztoicnbL9ORFZISKLkj//VbjWO7bz6GR7VopIjcPr3ZLvwcrkezIg5bXxye0rRGRUIdsdhKh9E5EBItKY8h79tdBt9yNA3w4VkddFpFlEfpDxmuNnsxTIsV8tKe/ZzMK1Ok8YY0r6B/g9UJP8uwa41mW/7wEnAP/M2P4gcHry778C/1PsPoXpG9ALeCf5u2fy757J154Dhhe7H8m2lAOrgN2ArsBiYJ+MfX4J/DX59+nA9OTf+yT37wYMTJ6nvNh9iqlvA4A3it2HHPs2ANgfuBv4QZDPZrF/culX8rUvi92HOH9K3qIHTgLuSv59F1DttJMx5lngi9RtIiLASOBhv+OLRJC+jQKeNsasN8ZsAJ4Gji5Q+8JwILDSGPOOMWYr8ABW/1JJ7e/DwPeS79FJwAPGmC3GmHeBlcnzlQq59K3U8e2bMeY9Y8wSoDXj2FL+bObSrw5HexD6nY0xa5N/fwTsHOLYHYEGY0xz8v8PgFJKoB6kb1XAmpT/M/twR3J4+bsiC4tfO9P2Sb4nG7HeoyDHFpNc+gYwUETqROR5EfnvfDc2JLnc+1J+33Jt23YiskBE5otIKRmHkSiJwiMi8gzwdYeXLkv9xxhjRKRdhQnluW9nGGPqReRrwAzgJ1jDUKV0WAv0N8Z8JiLDgFoR2dcY83mxG6Z4smvyu7UbMEdElhpjVhW7UVEpCaE3xhzh9pqIfCwifYwxa0WkD/BJiFN/BlSKSJeklbULUJ9jc0MRQ9/qgcNS/t8FyzePMaY++fsLEbkPa7haLKGvB/ql/O90r+19PhCRLsAOWO9RkGOLSeS+GcvhuwXAGLNQRFYBewEL8t7qYORy710/myVATp+plO/WOyLyHDAUy+ffLmkPrpuZgD2bfzbwWNADk1+yuYA9ox7q+AIQpG+zgaNEpGcyKucoYLaIdBGRnQBEJAEcD7xRgDa78RqwZzLKqSvWhGRmtEJqf38AzEm+RzOB05ORKwOBPYFXC9TuIETum4j0FpFygKR1uCfWpGWpEKRvbjh+NvPUzrBE7leyP92Sf+8EjAD+k7eWFoJizwb7/WD5OZ8F3gaeAXoltw8H/i9lv38D64BGLH/cqOT23bBEYyXwENCt2H2K0Ldzk+1fCfw0ua0HsBBYAiwD/kSRI1WAY4G3sCyfy5LbJgEnJv/eLvkerEy+J7ulHHtZ8rgVwDHFfm/i6htwSvL9WQS8DpxQ7L5E6Nu3kt+pr7BGYMu8Ppul8hO1X8C3gaVYkTpLgfOK3Zdcf3RlrKIoSgenPbhuFEVRlBxQoVcURengqNAriqJ0cFToFUVROjgq9IqiKB0cFXpFUZQOjgq9oihKB0eFXlEUpYPz/wH/uNUjwSIOOgAAAABJRU5ErkJggg==\n",
"text/plain": [
""
]
@@ -4391,33 +5060,18 @@
}
],
"source": [
+ "from sklearn import linear_model\n",
+ "\n",
"# load data\n",
"d = datasets.load_diabetes()\n",
"\n",
- "N = d.target.shape[0]\n",
- "N_train = int(N*0.9)\n",
- "N_test = N - N_train\n",
- "\n",
- "X = d.data[:N_train, np.newaxis, 2]\n",
- "Y = d.target[:N_train]\n",
- "\n",
- "X_test = d.data[N_train:, np.newaxis, 2]\n",
- "Y_test = d.target[N_train:]\n",
+ "X = d.data[:, np.newaxis, 2]\n",
+ "Y = d.target\n",
"\n",
"# create regression model\n",
"regr = linear_model.LinearRegression()\n",
"regr.fit(X, Y)\n",
"\n",
- "Y_est = regr.predict(X_test)\n",
- "print(\"Y_est = \", Y_est)\n",
- "print(\"Y_test = \", Y_test)\n",
- "err = (Y_est - Y_test)**2\n",
- "err2 = sklearn.metrics.mean_squared_error(Y_test, Y_est)\n",
- "score = regr.score(X_test, Y_test)\n",
- "print(\"err = %f (%f), score = %f\" % (np.sqrt(np.sum(err))/N_test, np.sqrt(err2), score))\n",
- "\n",
- "\n",
- "# plot data\n",
"a, b = regr.coef_, regr.intercept_\n",
"print(\"a = %f, b = %f\" % (a, b))\n",
"\n",
@@ -4426,13 +5080,54 @@
"y_min = a * x_min + b\n",
"y_max = a * x_max + b\n",
"\n",
- "\n",
- "plt.scatter(X, Y, label='train data')\n",
- "plt.scatter(X_test, Y_test, label='test data')\n",
- "plt.plot([x_min, x_max], [y_min, y_max], 'r', label='model')\n",
- "plt.legend()\n",
+ "plt.scatter(X, Y)\n",
+ "plt.plot([x_min, x_max], [y_min, y_max], 'r')\n",
"plt.show()"
]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## 7. 如何使用sklearn拟合多项式函数?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([800., 90., -20.])"
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Fitting polynomial functions\n",
+ "\n",
+ "from sklearn.preprocessing import PolynomialFeatures\n",
+ "from sklearn.linear_model import LinearRegression\n",
+ "from sklearn.pipeline import Pipeline\n",
+ "\n",
+ "t = np.array([2, 4, 6, 8])\n",
+ "\n",
+ "pa = -20\n",
+ "pb = 90\n",
+ "pc = 800\n",
+ "\n",
+ "y = pa*t**2 + pb*t + pc\n",
+ "\n",
+ "model = Pipeline([('poly', PolynomialFeatures(degree=2)),\n",
+ " ('linear', LinearRegression(fit_intercept=False))])\n",
+ "model = model.fit(t[:, np.newaxis], y)\n",
+ "model.named_steps['linear'].coef_\n"
+ ]
}
],
"metadata": {
diff --git a/4_logistic_regression/Logistic_regression.ipynb b/4_logistic_regression/Logistic_regression.ipynb
index 80b841d..954707d 100644
--- a/4_logistic_regression/Logistic_regression.ipynb
+++ b/4_logistic_regression/Logistic_regression.ipynb
@@ -180,7 +180,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
@@ -196,7 +196,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 2,
"metadata": {},
"outputs": [
{
@@ -222,7 +222,7 @@
"Text(0.5, 1.0, 'Original Data')"
]
},
- "execution_count": 3,
+ "execution_count": 2,
"metadata": {},
"output_type": "execute_result"
},
@@ -252,7 +252,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
@@ -436,7 +436,7 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 8,
"metadata": {},
"outputs": [
{
@@ -483,16 +483,16 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 8,
+ "execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
@@ -529,16 +529,16 @@
},
{
"cell_type": "code",
- "execution_count": 9,
+ "execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- ""
+ ""
]
},
- "execution_count": 9,
+ "execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
@@ -573,7 +573,7 @@
},
{
"cell_type": "code",
- "execution_count": 10,
+ "execution_count": 11,
"metadata": {},
"outputs": [
{
@@ -608,6 +608,8 @@
"x_test = digits[N_train:, :]\n",
"y_test = dig_label[N_train:]\n",
"\n",
+ "# FIXME: need to use Isomap to transform data\n",
+ "\n",
"# do logistic regression\n",
"lr=LogisticRegression()\n",
"lr.fit(x_train,y_train)\n",
@@ -628,12 +630,12 @@
},
{
"cell_type": "code",
- "execution_count": 21,
+ "execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
- "image/png": "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\n",
+ "image/png": "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\n",
"text/plain": [
""
]
diff --git a/References.md b/References.md
index ae2551d..fa58e5a 100644
--- a/References.md
+++ b/References.md
@@ -3,6 +3,16 @@
+## Notebook, Book, Tutorial
+* [Deep Learning with PyTorch](https://pytorch.org/deep-learning-with-pytorch-thank-you)
+* [Machine Learning Yearning 中文版 - 《机器学习训练秘籍》](https://github.com/deeplearning-ai/machine-learning-yearning-cn) ([在线阅读](https://deeplearning-ai.github.io/machine-learning-yearning-cn/))
+* [ipython-notebooks: A collection of IPython notebooks covering various topics](https://github.com/jdwittenauer/ipython-notebooks)
+* [Learn Data Science](http://learnds.com/)
+* [AM207 2016](https://github.com/AM207/2016/tree/master)
+* [Python机器学习](https://ljalphabeta.gitbooks.io/python-/content/)
+* [scientific-python-lectures](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/tree/master/)
+
+
## Python & IPython
* [Python Numpy Tutorial - 简明Python, Numpy, Matplotlib教程](http://cs231n.github.io/python-numpy-tutorial/)
@@ -29,16 +39,6 @@
-## Notebook, Book, Tutorial
-
-* [Machine Learning Yearning 中文版 - 《机器学习训练秘籍》](https://github.com/deeplearning-ai/machine-learning-yearning-cn) ([在线阅读](https://deeplearning-ai.github.io/machine-learning-yearning-cn/))
-* [ipython-notebooks: A collection of IPython notebooks covering various topics](https://github.com/jdwittenauer/ipython-notebooks)
-* [Learn Data Science](http://learnds.com/)
-* [AM207 2016](https://github.com/AM207/2016/tree/master)
-* [Python机器学习](https://ljalphabeta.gitbooks.io/python-/content/)
-* [scientific-python-lectures](http://nbviewer.jupyter.org/github/jrjohansson/scientific-python-lectures/tree/master/)
-
-
## Awesome series & Collections
@@ -48,7 +48,6 @@
* [Awesome Deep Vision](https://github.com/kjw0612/awesome-deep-vision)
* [Awesome 3D Reconstruction](https://github.com/openMVG/awesome_3DReconstruction_list)
* [awesome-algorithm](https://github.com/apachecn/awesome-algorithm)
-
* [Papers with code. Sorted by stars. Updated weekly.](https://github.com/zziz/pwc)
diff --git a/requirements.txt b/requirements.txt
index 236d726..aa4300a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,11 +8,23 @@
# pip
# sudo apt-get install python-pip python3-pip
# pip install pip -U
+# pip config set global.index-url 'https://mirrors.aliyun.com/pypi/simple/'
# pip config set global.index-url 'https://mirrors.ustc.edu.cn/pypi/web/simple'
#
#
-# Install virtualenv
+# Install virtualenv by apt-get
+# sudo apt-get install virtualenvwrapper
+#
+# Add following lines to `~/.bashrc`
+# # virtualenv
+# export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python
+# export WORKON_HOME=/home/bushuhui/virtualenv
+# source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
+#
+
+
+# Install virtualenv by pip
# pip install setuptools
# pip install virtualenv
# pip install virtualenvwrapper
@@ -24,6 +36,8 @@
# export WORKON_HOME=/home/bushuhui/virtualenv
# source /usr/local/bin/virtualenvwrapper.sh
#
+
+#
# Usage:
# # create virtual env
# mkvirtualenv --python=/usr/local/python3.5.3/bin/python venv
@@ -35,7 +49,8 @@
#
# Install this list packages:
# pip install -r requirements.txt
-#
+# Save package list
+# pip freeze >> requirements.txt
attrs==19.1.0
diff --git a/tips/cheatsheet/Scikit Learn.pdf b/tips/cheatsheet/Scikit Learn.pdf
new file mode 100644
index 0000000..c7db959
Binary files /dev/null and b/tips/cheatsheet/Scikit Learn.pdf differ