├── README.md ├── linear_regression ├── linear_regression_data1.txt └── linear_regression_example.ipynb └── logistic_regression ├── data1.txt ├── data2.txt └── logistic_regression_example.ipynb /README.md: -------------------------------------------------------------------------------- 1 | ### 关于机器学习的一些小例子 2 | 为了便于阅读和交互式学习,这里的例子都是用的ipython notebook格式。欢迎大家下载自己运行。
3 | 有问题可以联系[@寒小阳](http://blog.csdn.net/han_xiaoyang)
4 | 邮箱:hanxiaoyang.ml@gmail.com 5 | -------------------------------------------------------------------------------- /linear_regression/linear_regression_data1.txt: -------------------------------------------------------------------------------- 1 | 6.1101,17.592 2 | 5.5277,9.1302 3 | 8.5186,13.662 4 | 7.0032,11.854 5 | 5.8598,6.8233 6 | 8.3829,11.886 7 | 7.4764,4.3483 8 | 8.5781,12 9 | 6.4862,6.5987 10 | 5.0546,3.8166 11 | 5.7107,3.2522 12 | 14.164,15.505 13 | 5.734,3.1551 14 | 8.4084,7.2258 15 | 5.6407,0.71618 16 | 5.3794,3.5129 17 | 6.3654,5.3048 18 | 5.1301,0.56077 19 | 6.4296,3.6518 20 | 7.0708,5.3893 21 | 6.1891,3.1386 22 | 20.27,21.767 23 | 5.4901,4.263 24 | 6.3261,5.1875 25 | 5.5649,3.0825 26 | 18.945,22.638 27 | 12.828,13.501 28 | 10.957,7.0467 29 | 13.176,14.692 30 | 22.203,24.147 31 | 5.2524,-1.22 32 | 6.5894,5.9966 33 | 9.2482,12.134 34 | 5.8918,1.8495 35 | 8.2111,6.5426 36 | 7.9334,4.5623 37 | 8.0959,4.1164 38 | 5.6063,3.3928 39 | 12.836,10.117 40 | 6.3534,5.4974 41 | 5.4069,0.55657 42 | 6.8825,3.9115 43 | 11.708,5.3854 44 | 5.7737,2.4406 45 | 7.8247,6.7318 46 | 7.0931,1.0463 47 | 5.0702,5.1337 48 | 5.8014,1.844 49 | 11.7,8.0043 50 | 5.5416,1.0179 51 | 7.5402,6.7504 52 | 5.3077,1.8396 53 | 7.4239,4.2885 54 | 7.6031,4.9981 55 | 6.3328,1.4233 56 | 6.3589,-1.4211 57 | 6.2742,2.4756 58 | 5.6397,4.6042 59 | 9.3102,3.9624 60 | 9.4536,5.4141 61 | 8.8254,5.1694 62 | 5.1793,-0.74279 63 | 21.279,17.929 64 | 14.908,12.054 65 | 18.959,17.054 66 | 7.2182,4.8852 67 | 8.2951,5.7442 68 | 10.236,7.7754 69 | 5.4994,1.0173 70 | 20.341,20.992 71 | 10.136,6.6799 72 | 7.3345,4.0259 73 | 6.0062,1.2784 74 | 7.2259,3.3411 75 | 5.0269,-2.6807 76 | 6.5479,0.29678 77 | 7.5386,3.8845 78 | 5.0365,5.7014 79 | 10.274,6.7526 80 | 5.1077,2.0576 81 | 5.7292,0.47953 82 | 5.1884,0.20421 83 | 6.3557,0.67861 84 | 9.7687,7.5435 85 | 6.5159,5.3436 86 | 8.5172,4.2415 87 | 9.1802,6.7981 88 | 6.002,0.92695 89 | 5.5204,0.152 90 | 5.0594,2.8214 91 | 5.7077,1.8451 92 | 7.6366,4.2959 93 | 5.8707,7.2029 94 | 5.3054,1.9869 95 | 8.2934,0.14454 96 | 13.394,9.0551 97 | 5.4369,0.61705 98 | -------------------------------------------------------------------------------- /linear_regression/linear_regression_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 线性回归示例\n", 8 | "\n", 9 | "- [熟悉numpy](#熟悉numpy)\n", 10 | "- [单变量线性回归](#单变量线性回归)\n", 11 | "- [梯度下降](#梯度下降)" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": { 18 | "collapsed": false 19 | }, 20 | "outputs": [ 21 | { 22 | "name": "stderr", 23 | "output_type": "stream", 24 | "text": [ 25 | "/Library/Python/2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", 26 | " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n", 27 | "/Library/Python/2.7/site-packages/IPython/html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n", 28 | " \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n" 29 | ] 30 | } 31 | ], 32 | "source": [ 33 | "# %load ../../standard_import.txt\n", 34 | "import pandas as pd\n", 35 | "import numpy as np\n", 36 | "import matplotlib.pyplot as plt\n", 37 | "\n", 38 | "from sklearn.linear_model import LinearRegression\n", 39 | "from mpl_toolkits.mplot3d import axes3d\n", 40 | "\n", 41 | "pd.set_option('display.notebook_repr_html', False)\n", 42 | "pd.set_option('display.max_columns', None)\n", 43 | "pd.set_option('display.max_rows', 150)\n", 44 | "pd.set_option('display.max_seq_items', None)\n", 45 | " \n", 46 | "#%config InlineBackend.figure_formats = {'pdf',}\n", 47 | "%matplotlib inline \n", 48 | "\n", 49 | "import seaborn as sns\n", 50 | "sns.set_context('notebook')\n", 51 | "sns.set_style('white')" 52 | ] 53 | }, 54 | { 55 | "cell_type": "markdown", 56 | "metadata": {}, 57 | "source": [ 58 | "#### 熟悉numpy" 59 | ] 60 | }, 61 | { 62 | "cell_type": "code", 63 | "execution_count": 2, 64 | "metadata": { 65 | "collapsed": false 66 | }, 67 | "outputs": [], 68 | "source": [ 69 | "def warmUpExercise():\n", 70 | " return(np.identity(5))" 71 | ] 72 | }, 73 | { 74 | "cell_type": "code", 75 | "execution_count": 3, 76 | "metadata": { 77 | "collapsed": false 78 | }, 79 | "outputs": [ 80 | { 81 | "data": { 82 | "text/plain": [ 83 | "array([[ 1., 0., 0., 0., 0.],\n", 84 | " [ 0., 1., 0., 0., 0.],\n", 85 | " [ 0., 0., 1., 0., 0.],\n", 86 | " [ 0., 0., 0., 1., 0.],\n", 87 | " [ 0., 0., 0., 0., 1.]])" 88 | ] 89 | }, 90 | "execution_count": 3, 91 | "metadata": {}, 92 | "output_type": "execute_result" 93 | } 94 | ], 95 | "source": [ 96 | "warmUpExercise()" 97 | ] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": {}, 102 | "source": [ 103 | "### 单变量线性回归" 104 | ] 105 | }, 106 | { 107 | "cell_type": "code", 108 | "execution_count": 4, 109 | "metadata": { 110 | "collapsed": false 111 | }, 112 | "outputs": [], 113 | "source": [ 114 | "data = np.loadtxt('linear_regression_data1.txt', delimiter=',')\n", 115 | "\n", 116 | "X = np.c_[np.ones(data.shape[0]),data[:,0]]\n", 117 | "y = np.c_[data[:,1]]" 118 | ] 119 | }, 120 | { 121 | "cell_type": "code", 122 | "execution_count": 5, 123 | "metadata": { 124 | "collapsed": false 125 | }, 126 | "outputs": [ 127 | { 128 | "data": { 129 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAFkCAYAAADmPNjoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VFWe//FPJWGNIqiAG4QWxA1B22jjtIEoodkCJCzS\nDKEJixN8ArI1a4AKICBKCxij4miPIjba8MMAKtqNkuVpcaB1ZFXHR+gEEALYY4cExSz398e1kspW\nqSy13Kr363l8krq13FOJ5FPn3HO+x2YYhiEAAGAJIb5uAAAAcB/BDQCAhRDcAABYCMENAICFENwA\nAFgIwQ0AgIWEefLFy8rKtHjxYp04cUIhISFatmyZmjdvrgULFigkJES33HKL7Ha7J5sAAEBA8Whw\nf/TRR7LZbNqyZYv279+vZ555RoZhaPbs2YqMjJTdbteePXsUExPjyWYAABAwPDpUHhMToxUrVkiS\nvv32W1111VU6duyYIiMjJUl9+vTRvn37PNkEAAACikd73JIUEhKihQsX6q9//as2bNigv/3tb+X3\nhYeH6+LFiy6f/+OPP+rIkSNq3769QkNDPd1cAAB8rrS0VOfPn1ePHj3UsmXLSvd5PLglafXq1fr9\n73+vUaNG6fLly+XHi4qK1KZNG5fPPXLkiMaNG+fpJgIA4HfeeOON8lFqB48Gd0ZGhvLz85WUlKQW\nLVooJCREPXr00P79+3X//fcrOztbvXv3dvka7du3l2Q2/rrrrvNkcwEA8Atnz57VuHHjyjPQmUeD\ne+DAgVqwYIESEhJUUlKixYsX6+abb9bixYtVXFysrl27auDAgS5fwzE8ft111+mmm27yZHMBAPAr\nNV0i9mhwt2zZUuvXr692/PXXX/fkaQEACFgUYAEAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4A\nACyE4AYAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4AACyE4AYAwEIIbgAALITgBgDAQghuAAAs\nhOAGAMBCCG4AACyE4AYAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4AACyE4AYAwEIIbgAALITg\nBgDAQghuAAAshOAGAMBCCG4AACyE4AYAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4AACwkzJMv\nXlJSokWLFun06dMqLi7W1KlTdf311yspKUldunSRJI0dO1aDBg3yZDMAAAgYHg3unTt3ql27dnrq\nqaf0r3/9S3FxcUpOTtakSZOUmJjoyVMDABCQPBrcgwYN0sCBAyVJZWVlCgsL09GjR3X8+HHt2bNH\nERERSklJUevWrT3ZDAAAAoZHr3G3atVKrVu3VmFhoWbMmKGZM2eqZ8+emj9/vjZv3qxOnTopLS3N\nk00AACCgeHxy2pkzZzRhwgTFx8dryJAhiomJ0R133CFJ6t+/v7788ktPNwEAgIDh0eC+cOGCJk+e\nrLlz5yo+Pl6SNGXKFB0+fFiStG/fPt15552ebAIAAAHFo9e4N27cqIKCAj3//PNKT0+XzWbTokWL\ntGrVKjVr1kzt27fX8uXLPdkEAAACikeDOyUlRSkpKdWOb9myxZOnBQAgYFGABQAQPPLypJycysdy\ncszjFkFwAwCCR26uNGKElJlp3s7MNG/n5vqyVfVCcAMAgkdUlLR1qzR6tJSaan7dutU8bhEENwAg\nuERHS8nJ0rJl5tfoaF+3qF4IbgBAcMnMlNLTJbvd/OoYNrcIj84qBwDAr+TkVAyPR0eb/40eLW3f\nbpnhcoIbABA8IiIqh3R0tHk7IsKnzaoPghsAEDw6dzb/c2aRnrYD17gBALAQghsAAAshuAEAsBCC\nGwAACyG4AQCwEIIbAAJFAGyggboR3AAQKAJgAw3UjeAGgEARABtooG4ENwAEEotvoIG6EdwAEEgs\nvoEG6kbJUwAIFAGwgQbqRnADQKAIgA00UDeCGwACRQBsoIG6cY0bANBwrB33OoIbANBwrB33OoIb\nANBwrB33OoIbANA4rB33KoIbANA4rB33KmaVAwAajrXjXkdwAwAajrXjXsdQOQCg4Tp3NkPbeVlY\nVJR5nGVhHkFwAwAaj2VhXkNwAwAaj2VhXkNwAwCaBsvCvILgBgA0DZaFeQWzygEAjceyMK8huAEA\njceyMK8huAEAjceWol7j0eAuKSnRokWLdPr0aRUXF2vq1Knq1q2bFixYoJCQEN1yyy2y2+2ebAIA\nAAHFo8G9c+dOtWvXTk899ZQKCgo0fPhw3XbbbZo9e7YiIyNlt9u1Z88excTEeLIZAAAEDI/OKh80\naJBmzJghSSotLVVoaKiOHTumyMhISVKfPn20b98+TzYBAICA4tHgbtWqlVq3bq3CwkLNmDFDs2bN\nkmEY5feHh4fr4sWLnmwCAAABxePruM+cOaMJEyYoPj5eQ4YMUUhIxSmLiorUpk0bTzcBAICA4dHg\nvnDhgiZPnqy5c+cqPj5eknT77bfrwIEDkqTs7Gzde++9nmwCAAABxaOT0zZu3KiCggI9//zzSk9P\nl81mU0pKip544gkVFxera9euGjhwoCebAABAQPFocKekpCglJaXa8ddff92TpwUAIGBRqxwAAAsh\nuAEAsBCCGwAACyG4AQCwEIIbAAALIbgBALAQghsAAAshuAEAsBCCGwAACyG4AQCwEIIbAAALIbgB\nAP4pL0/Kyal8LCfHPB7ECG4AgH/KzZVGjJAyM83bmZnm7dxcX7bK5whuAIB/ioqStm6VRo+WUlPN\nr1u3mseDGMHtCQzvAEDTiI6WkpOlZcvMr9HRvm6RzxHcnsDwDgA0jcxMKT1dstvNr46/q0EszNcN\nCEjOwzvJyeb/bAzvAED95ORUDI9HR5v/jR4tbd8e1H9P6XF7CsM7ANA4ERFmSDv+fkZHm7cjInzZ\nKp8juD2F4R0A3hZo82s6d67es46KMo8HMYLbE5yHd1JTK4bNq/6DAoCmxPyaoFDv4C4sLNTXX3/t\nibYEDoZ3APgCy6eCgluT07Zu3arPPvtMc+fOVVxcnMLDw/Wb3/xGs2bN8nT7rKlz5+pDOfzDAeAN\nzvNr7Hbm1wQgt3rcW7Zs0fz58/XOO++oX79+2rVrl3IY9gUA/8P8moDn9lB527ZtlZWVpejoaIWF\nheny5cuebBcAoL6YXxMU3Boq79atm5KSknTq1Ck98MADmjFjhnr27OnptgEA6sMxv8ZxaY75NQHJ\nreBetWqV/ud//kfdu3dX8+bNFR8frwcffNDTbQMA1Afza4JCncGdk5Oj999/X2fPnlVISIg6dOig\nPn36KCyMomsAAHiby/TdsGGDDh06pGHDhqlDhw6SpHPnzmnbtm36/PPPNX/+fK80EgAAmFwG93vv\nvafdu3crJKTyHLbY2FjFxsYS3AAAeJnLWeUtWrTQ2bNnqx3/9ttv1bx5c481CgAA1Mxlj3vBggUa\nN26cunTpovbt20uSzp8/r3/84x9avXq1VxoIAAAquAzuf/u3f9P777+vQ4cO6dy5czIMQx07dlSv\nXr3ocQMA4AN1Tg0/deqUDhw4UGlWeatWrdSjRw9vtA+Ar+XlmZtUOC8ryskx1wYH+S5NgC+4vMb9\nxhtvaPbs2ZKku+66S3feeackafHixfrjH//o+dYB8D12nAL8isse96ZNm5SRkaFWrVpVOj5x4kTF\nx8dr0qRJHm0cAD/gvONUcrJZ/5odpwCfcdnjDgsLU0lJSbXjP/74o5o1a+axRgHwM847TiUns+MU\n4EMue9xTp05VXFycHnjggUqzyj/55JN6bel58OBBrV27Vq+//rq++OILJSUlqUuXLpKksWPHatCg\nQQ1/BwA8r+qOU9HRhDfgIy6De+jQobr//vu1b9++8lnlkZGRmj59ujp27OjWCV5++WXt2LFD4eHh\nkqQjR45o0qRJSkxMbHTjAXiB845TjsAePbryZhYAvKbObT1btWolm81mPjgkRDabrfy2OyIiIpSe\nnl5+++jRo8rMzFRCQoJSUlJ06dKlBjQbgNc4dpxy9LDZcQrwKZfB/de//lUjR47UgQMHdOnSJRUV\nFWn//v0aO3asdu3a5dYJ+vfvr9DQ0PLbvXr10rx587R582Z16tRJaWlpjXsHAEx5edX3Xc7JMY83\nRufO1XvWUVEsBQN8xOVQ+R/+8Ae99dZbuvrqqysd/+c//6lx48Zp6NCh9T5hTEyMrrzySklmqD/x\nxBP1fg0ANXAs23IMaWdmVgxpE7JAwHDZ47bZbOUh6yw8PLxSL7o+pkyZosOHD0uS9u3bV742HEAj\nOS/bSk2tuC7NdWggoLjscY8ePVpjxoxR//79y2eVX7hwQX/5y180atSoBp1w2bJlWrZsmZo1a6b2\n7dtr+fLlDXodADVwXrZltzPzGwhANsMwDFcPOHz4sLKysnTu3DlJUocOHdSnTx/17NnTKw08deqU\n+vXrpw8//FA33XSTV84JWJZjeNy5UArhDViOq+yrs1b5XXfdpbvuustjjQPQRFi2BQSFOoO7NnFx\ncbr77rv14IMPKiYmpinbBKAhHMu2HCHNsi0gIDU4uF999VW1bdtWP/30U1O2B0BDde5cffY4PW0g\n4NQZ3GVlZfrss8+Un58vm82mDh06qGfPnmrbtq0ksS83AABe5DK4P/vsMy1YsEA33nijrr32Wklm\nrfLc3FytWrVKDzzwgFcaCT/BvswA4HMug3vp0qV66aWXyjcEccjNzdW0adPcrp6GAEGBDwDwOZcF\nWEpLS6uFtiR16tRJdawiQyCiwIdveaqkKQBLcdnjjo6O1tSpUzV48OBKBVh27dqlPn36eKWB8DMU\n+PAdRjwAqI7gnj9/vj744ANlZmZWKsAyYsQIDRw40CsNhJ9hX2bfcR7xcC6wwogHEFTqnFU+YMAA\nDRgwwBttgb+jwIfvMeIBBL069+MGyrEvs+9VHfHIzPR1iwB4mcsed2JiosrKymq9f9OmTU3eIPgx\nCnz4FiMeAFRHcD/66KOaPXu2Vq5cqTZt2nirTQBqQklTAKojuH/9618rKSlJWVlZWrFihbfaBKAm\njHgAkBuT0yZOnKhvvvnGG20BAAB1qHNyms1mU7du3cpvf//99x5tEAAAqF2twV1aWqonn3xSL730\nkiQpPz9fsbGxGjx4sKKiorRv3z6vNRIAAJhqDe53331XJ06c0KhRoyRJzz77rAYPHqyPP/5YL7/8\nslatWuW1RgIAAFOtwf3HP/5Rly5d0tNPP62FCxfqvffe0/Hjx7Vw4UK9+uqrOnv2rBYuXOjNtsLq\nqLUdvPjdA02m1uB+7LHH1Lx5c02ePFndunVTjx49tHbtWq1cuVLR0dG6/vrrtXr1am+2Ff6gMX+A\nHbW2HUVDMjPN27m5Td1K+Bt+90CTqTW4BwwYoMjISM2ZM0effvqp1q5dK0n6z//8T23cuFFr1qzx\nWiODni97K1XPnZsrDR0qvfWWebs+f4DZXSx48bsHmo7h506ePGl0797dOHnypK+b4jvZ2YZx7bWG\nsXeveXvvXvN2drZvzt2mjWFcdZVh2O2V73OX3W4YkvkVwYXfPeAWV9lHrXIr8GVvpaZz79ghzZxp\nbnSRnFy/jS6otR28+N0DTYLgtgrnXaHqG5ZNfW6pYX+AnWttp6ZWfCCoehkAgYffPdBkCG6r8GVv\nxfnc69dLcXEN+wPM7mLBi9890GTqLHkqSTk5OVq3bp0KCgpkGIYMw5DNZtOHH37o6fZB8u2uUFXP\nffvtUlKSFBpq3l+fP8DU2g5e/O6BJuNWcD/xxBNasGCBbrnlFtlsNk+3CVX5cleoquceM0a64YbK\n5+YPMAB4jVvB3a5dOz300EOebgtq48veCj0lAPArbgX3vffeq9WrVysqKkotWrQoP37fffd5rGEA\nAKA6t4L70KFDkqRjx46VH7PZbNq0aZNnWgUAAGrkVnC//vrrnm4HAABwg8vgXrJkiVasWKHx48fX\nOCmNHjcAAN7lMrjHjBkjSZo+fbpXGgMAAFxzGdw9evSQJN1///1eaQwAAHCNymkAAFgIwQ1YiS+3\neAXgF9wK7hUrVlQ7Nn/+fLdPcvDgQY0fP16SlJeXp3//939XQkKCli1b5vZrAJC57/mIERW16uuz\nHzqAgODyGndKSopOnjypI0eO6Ouvvy4/XlJSoosXL7p1gpdfflk7duxQeHi4JGn16tWaPXu2IiMj\nZbfbtWfPHsXExDTiLQBBxHmb1eRkc/MXb23xCsAvuAzuxx57TKdPn9bKlSs1bdq08uOhoaHq2rWr\nWyeIiIhQenq65s2bJ0k6evSoIiMjJUl9+vTRxx9/THAD9eG8zard7t0tXgH4nMvgbtGihX71q1/p\nxRdfrHbfpUuX1LZt2zpP0L9/f50+fbr8tmEY5d+Hh4e73XMH8LOqW7w6dowDEBRcBvfixYu1ceNG\nJSQkyGazVQrdhm7rGRJScVm9qKhIbdq0qfdrAEHLl1u8AvALLoO7W7dukiS73a6+ffs2yQnvuOMO\nHThwQPfdd5+ys7PVu3fvJnldICj4cotXAH7BZXDv3r1bv/71r7Vq1SqFh4dX6nFLDdsdbP78+Vqy\nZImKi4vVtWtXDRw4sN6vAQQttlkFgp7L4J46dao2btyoc+fOacOGDZXuq8/uYDfeeKPefPNNSVKX\nLl3YtAQAgAZyGdyPPPKIHnnkEaWnpys5OdlbbfIveXnmGlnnXk1Ojjk0WbXnAwCAh7lVgGXixIl6\n+umnNWLECA0fPlyrV6/WpUuXPN02/0DBC1gZldaAgON25bQffvhBq1at0po1a1RcXCy73e7ptvkH\n54IXqakVM3q5rggr4IMnEHBcDpU7HD16VDt37iy/vXTpUg0ePNhjjfI7FLyAVVFpDQg4bvW4DcNQ\nQUFB+e2CggKFhoZ6rFF+p2rBC0fvBbAC5w+eycl88AQszq0ed2JiokaPHq2HHnpIkvTRRx/pP/7j\nPzzaML9BwQtYHZXWgIDiVnA/9NBDuuuuu3TgwAGVlZUpLS1Nt956q6fb5h8oeAEr44MnEHDcCu5x\n48Zp9+7d6t69u6fb438oeAEr44MnEHDcCu7bbrtNGRkZ6tmzp1q2bFl+/IYbbvBYwwA0AT54AgHH\nreA+ePCgDh48WOlYQzcZAQAADedWcH/00UeebgdgbVTYA+AlLpeD5efna9q0aRo6dKjsdnulJWEA\nnFDoBICXuAzuRYsW6eabb9bcuXP1008/afXq1d5qF+A+fyjrSYU9AF5SZ4979uzZ6tOnj5YvX65D\nhw55q12A+/ylt0uhEwBe4DK4mzVrVul759uAx7nbk/aX3i4V9gB4gVslTx1sNpun2gFUV5+etK97\nu86FTlJTKz5IVP3gAQCN5HJW+ddff61+/fqV387Pz1e/fv1kGAbLweB59dkgw9dlPSl0AsBLXAb3\nBx984K12WFcwLAPy5Xt0Z2c2fyjrSaETAF7icqj8xhtvdPkf5D8TozzJl+/RnevGjt6uI9Qb0tv1\nh5npAOCGel3jRg38ZWKUJ/nqPbp73bhz5+ptiYqq32hAMHwAAxAQCO7GysuTQkMrT4wKDQ28nlpj\nJ381pEfbFD1pdwXDBzAAAYHgbqzcXCk2Vlq/3hzOXb/evO3LnpqrkGzokHBjlzo1pEdbV0/a+b04\nvnd+L/Ud6vb1zHQAcAPB3RRsNskwzO8Nw7xdF09eU3UVkg0J0KZY6uSJHq3ze8nNlYYOrfjQ1JCh\nbtZhA7ACw8+dPHnS6N69u3Hy5ElfN6VmubmGkZ1tGHa7YUjm1+xs87gr2dmGce21hrF3r3l7717z\ndnZ207TL8Xp2e+Xz1HWf4/0427rV/K9q++t6jzVx/jk1Bef30qaNYVx1Vc3vqy6e/n0AQD24yj6C\nuym4CkJPPM9drkKytvs8GWCeer/O76WhHwxq+sDS0A8nANBIBLcnNTbomroH6tDQHrc79zeEpz4Q\nNFWPGwD8CMHtSY3pqXmqB+oqJN0N0Kb+QOGJHq3ze8nONkO7TRvze4a6AViYq+yzGYZjVpV/OnXq\nlPr166cPP/xQN910k6+b03RycszJU889J91wg1RaWlHtS2pcVTJXlc6kuqugZWZWLzPqjzOsnd+n\n43up4r0EWgU7AEHDVfa5LHkKD3KsUZbMAN+61bz97bfStGnm9w0NnLrKb7q6zx/Kh7rL+X1SchRA\nkCC4fcU5aNzdSMMb2CwDAPxacK7j9re61P5U+MNR9MT5Z+QoekLtbgDwueAMbn+rS+2PhT/87WcE\nAJAUrMHtq7rUNfX0n3uu4hp3Q6uSeYK3fkb+NvoBAH4uOINb8s3w9P79ZlnOzEwzmJ59Vlq0SJo1\nyzx/To508821X1P2dsh542cUKD17PoAA8JLgDW5vD0/n5Ulnz5q1zOPizPPOmCEVF5uB6BxYtW1J\n6e2Q88bPKFB25QqUDyAA/J/XV5X/LD4+3hg/frwxfvx4Y+HChbU+ziMFWLKzDePqqw1jwwbztqNY\nR1qa50pcOoqFrFtnGK1amcVNJMMID69fARZPl0mt2l53K501tsCKpyrIeZO3fjcAAp7fVU67fPmy\nER8f79ZjPRLcublmSDv/cd2wwTDatfNspa29e83KXs2amSHVooVhTJhQ/8ByN+QaE6b1fW5jSpoG\nUuAFwgcQAD7nd8F98OBBY8CAAcakSZOMCRMmGJ9//nmtj/VoyVNvB0Z2thnWkmH07WsYrVsbhs1m\nGImJ9e9xz5xplvh0fk7VYPX2jlcN+XkG0q5cgfQBBIBP+V1wf/XVV8af//xnwzAM48SJE0ZMTIxR\nWlpa42M9Xqvcmz0kx7kmTDBDNzzc/G/rVvcCqyG1ub0dJvX9eQbKrlyB9AEEgM/5XXBfvnzZ+PHH\nH8tvjxo1yjh79myNjw2YHnfV6+pvvmkGr/N19boCq2rI7d1rvsbMma7b760PJ8Hc4wyUDyAA/ILf\nBfeWLVuM1NRUwzAM4+zZs8agQYO83+NuSA/Jm9eM3VVXKNcWpk3dHnqcANBkXGWfT5aDjRo1SkVF\nRRo3bpzmzJmjVatWKSTEy01x1OR2rE12pyZ3Y5b8OEqJOqtt2Ze76lqu5bxhSNXiLk29fKkhP08A\nQL35ZJORsLAwPfXUU744dYWG7CblvObY1xuC1LSL18iR0syZ5vdRUVJYmDRunHThgrmOPDraDPmw\nMOmBB5r2vbA7FwB4RfAWYHFX1YpY0dFSbKzvNwSpqYe7bJn09NNm+zIzpQMHzOpsiYlmTzoz03xM\nSUnFc+pTGY3qYADgcwR3XaoOKa9fL732mhmGvtwQpKah92nTpJ07JZtNGjxYWrhQatXK7GF/+GH1\nqmTOQ+3PPmv+56xqKFMdDAB8zwfX3OvF48vB3OGYaJWYaK67Xreu8nFfT8CqOtHMMWHNMWmtpgls\nVSeTbdhgvreq1eQ8sbyMGdgA4JLfzSqvD48Fd33DwxF+iYnuP6ex3G2jcwjv3VtRUrVFC7PIy1VX\nme2++mrXs8o3bDAfU1coN3Z5GTPQAcAlgrsm9QkPX61Prm8br7qqojJbeLhhTJtm9qJbtjTv27Ch\n7oBs6PKy+grmNd8AUAeCuzbuhIcneof16e3XJ+BmzqwYFdi716y9PmiQYVx5pVnwxdV53DlXU/8s\nqOsNADUiuF2pKTycg9XxvXPgNXZ4vL4B6E7A1RS69QlGd9rUlNem6XEDQK0I7trUFh41hVi7dmZ5\nUmeNCXB3g6uhowJt2pjD4+4GozcnjHGNGwBcIrhrUld4VA1Mx/XhN9+svqlHQwOurh6xqza6GhVw\nbEDiGB73t2BkVjkAuERw18Sd8KgarI4JYC1bmpO/HLO4r7228mYh7pzDnZ60q+e7G+q1vTcAgN8i\nuBvCOVjbtatY3+y8RnrkSPMx69bV3KOtLVzT0ppmqJjrxAAQkFxln09qlfu9qnXAr77arAH+9dfS\nm29KEyaY1dP+3/+T+vaVVq6suc53bbXNb75Z6tWr4vEN3ZDDuWSp3e678qsAAK8J3uDOyzNLdTqH\nbU6OGZ6OOuCO+x5/XPrmGyktTfrd76SMDKl1a6m4WMrKMoO8ttCsLVybYkOOqruDOTYbAQAErOCt\nVe6q7nZNdcDnzKnoaf/0k9nLbt3a3JFr06bqdb4d6tp6s6FcbdkJAAhYwRvczsPYqanVN+Co6vhx\n6Z13zCHz0FAziDMypG3bzI1Hli2reecsT4Ur+18DQFAK3qFyyf1rxFWveffuLSUlmQEumUPp99xT\nPTQd4RoRYb6Gc7g6huWrDpm7i/2vASAoBW+PW3J/GLtq73bMGOnll6X8/IrHREWZw+zO22A6htyd\nh+WjoszeO9thAgAaIHiDuz7D2DVd8+7YUXrsMff2pq7vsDwAALUI3uBu7DXi+oax87B8cjKzvwEA\nDRK8wd25c8W1ZoeICGnnzsrD3Tk5lW87q08Ye2p2OQAgqARvcEvVl4RlZJgTzTIyzNuuhr8d97sT\nxizdAgA0keCeVV61sllamvl1xQrpn/80w3jJksrD547CLZIZ6qmp0g03mM8bPdoM8WHDzMc4Zo1X\nLejC0i0AQAMFd3BLlYe7ExPNkqZDhpi3J0wwQ/yeeyqWXjl66c89Jy1fLqWkSKWlUliYNH68Gdxl\nZebztm+vWLbF0i0AQBMI7qFyqfJw9zvvmEu9Nm0ya5Bv2mQGs3PIOnrp06ZJFy5INpu5njsuznyd\noUPN0GbWOADAA4K7x13bZiK/+Y30wQdmj3vlSuneeyuHcNXCLZL5fd++ZknUmoq5uKqN3tAiLACA\noBPcPe6qS8Li4qTp06X9+83wfffd6te4pcq99PXrpXXrzJDPzja/1jRRzVVtdAAA3BTcPe6q155z\nc6U//akizKOjzR658zVu5156aKgZ2qWl5kz0JUukDRvMa9+jR5uvI5nBX9sWnwynAwDqIbh73FW5\nU5TF+TEREeZ18VdfNUugxsSYj+nY0XzMt99W7lVThAUA0EjB3eOuqqbZ3xER5tC54/p0587m99u2\nSfffX73HnJFRe6+6sftnc50cAIIePe665OZKU6ZIsbFm8GZmmjPHp0ypfn06L88cPnfuVYeGmseb\noggL18n9h6zwAAARjUlEQVQBIOjR465LVJTZi46LkwYPNpd/hYVJO3ZU723n5pqhbhhmr3rdOnPy\n2q5dTVOEhevkABD06HHXxtFLlsyQnTlT+uEH6dIladasiiHuqrXMDcMMd8n8ahjm9zXVRq9pK9C6\ncJ0cAIIawe0c0A45OeZSsKFDK4bH166tuH/t2orjzkPVjslqM2eawTpzpnnb0atuiqFuNisBgKBG\ncNcWpqWlZm85NlYaOFAqKpJatzYrphUVmUVa4uIqhqod4V9aWjlYS0srJo41dl9uNisBgKBHcNcW\nptOmmdexS0uly5elFi3MXnhamjRokFRcbC7/io6uCPudO+sOVueh7oQEc/KaM1fbiDZ2D3EAgOUR\n3JJ0881mz9r5unFOjpSfL4X8/CNyBGxmpnTggFkhbft2c2MSR1gPG1Z3sDoPdf/Xf1XMVnfc52ro\nvHPn6r1zxxI1AEBQ8MmscsMwlJqaqq+++krNmzfXypUr1alTJ180xZSRYdYYd5QrbdvW7DGXlJjB\nnZhoBnBsrDmjfPlyc5hcMp+XmFgR1q52AataGz062nyduDjzerg/zRJnzTgA+CWf9Lj37Nmjn376\nSW+++abmzJmj1atX+6IZppwcczevZ54xh8KHDJFmzzZ7vmFh5iYj77xj9sZDQszjK1aYYf/uu2Zo\n79zp3iSxmoa6d+2SJk70v1nirBkHAL/kkx73p59+qqife3K9evXSkSNHfNEMk/P66u+/r9iX+9FH\nzUCNipJ69jR7yiNHmte97faKrTsd17gdtcld9ZZrqsxWWipt3tzwamqewppxAPBLPulxFxYW6sor\nryy/HRYWprKyMl80peK6cdV9uS9frlwsJTnZrEk+fbo5tN0Uk8T8fZY4a8YBwO/4JLivuOIKFRUV\nld8uKytTSIgP58nVFaBV104fP940k8T8fZY4a8YBwO/4JC1/+ctfKisrS5L0+eefq3v37r5oRgVX\nAerJXrE/zxL399EAAAhSPrnG3b9/f/3tb3/Tb3/7W0ny7eQ0qeZrz86B2tga41bUFLXVAQBNzifB\nbbPZtGzZMl+cumZ1LX1yFeqBKljfNwD4OQqwSCx9AgBYBsEtNb6GOAAAXkJwO7D0CQBgAQS3A0uf\nAAAWQHBL5kS0kSOlJUsqL3167rnad+oCAMAHCG7JnD2+bJlZxjQz0xwmX7JEWrq0aSeo5eVVXwft\nahtPAACqILglc9nTtGmVJ6itWFF37fH6YvY6AKCRCG5nnp6gxux1AEAjEdzOvDFBjdnrAIBGILgd\nvFWbm9nrAIBG8EnJU7/kjdrczh8OHPtuu7OPNwAAPyO4HbxRm5uNOwAAjURwexMbdwAAGolr3AAA\nWAjBDQCAhRDcAABYSHAGN6VHAQAWFZzBTelRAIBFBWdwU3oUAGBRwRncEqVHAQCWFLzBTelRAIAF\nBWcBFkqPAgAsKjiDm9KjAACLCs7gpvQoAMCigvcaNwAAFkRwAwBgIQQ3AAAWQnADAGAhBDcAABZC\ncAMAYCEENwAAFkJwAwBgIQQ3AAAWQnADAGAhBDcAABZCcAMAYCE+2WSkT58+6tKliyTpnnvu0axZ\ns3zRDAAALMfrwZ2Xl6c777xTL7zwgrdPDQCA5Xl9qPzIkSPKz8/X7373OyUlJenEiRPebgIAAJbl\n0R73tm3b9Nprr1U6ZrfblZSUpAEDBujTTz/V3LlztW3btlpfo7S0VJJ09uxZTzYVAAC/4cg8RwY6\n82hwjxo1SqNGjap07Mcff1RoaKgk6d5779X58+ddvobj/nHjxnmmkQAA+Knz588rIiKi0jGvX+NO\nT0/XVVddpSlTpujLL7/U9ddf7/LxPXr00BtvvKH27duXBz4AAIGstLRU58+fV48ePardZzMMw/Bm\nYy5evKi5c+eqqKhIYWFhWrp0qX7xi194swkAAFiW14MbAAA0HAVYAACwEIIbAAALIbgBALAQghsA\nAAvxSa1yfzBixAhdccUVkqSbbrpJq1at8nGL4I6DBw9q7dq1ev3115WXl6cFCxYoJCREt9xyi+x2\nu6+bBxecf3dffPGFkpKSyvcsGDt2rAYNGuTbBqJGJSUlWrRokU6fPq3i4mJNnTpV3bp149+eDwVl\ncP/000+SpE2bNvm4JaiPl19+WTt27FB4eLgkafXq1Zo9e7YiIyNlt9u1Z88excTE+LiVqEnV392R\nI0c0adIkJSYm+rZhqNPOnTvVrl07PfXUUyooKNDw4cN122238W/Ph4JyqPzLL7/UpUuXNHnyZCUm\nJurgwYO+bhLcEBERofT09PLbR48eVWRkpCRzx7l9+/b5qmmoQ02/u8zMTCUkJCglJUWXLl3yYevg\nyqBBgzRjxgxJZlGQ0NBQHTt2jH97PhSUwd2yZUtNnjxZr7zyilJTU/X73/9eZWVlvm4W6tC/f/9K\n1fOcSxCEh4fr4sWLvmgW3FD1d9erVy/NmzdPmzdvVqdOnZSWlubD1sGVVq1aqXXr1iosLNSMGTM0\na9Ys/u35WFAGd5cuXTRs2LDy79u2bVtnzXT4n5CQiv99i4qK1KZNGx+2BvURExOjO+64Q5IZ6l9+\n+aWPWwRXzpw5owkTJig+Pl5Dhgzh356PBWVwb9++XU8++aQkKT8/X0VFRWrfvr2PW4X6uuOOO3Tg\nwAFJUnZ2tu69914ftwjumjJlig4fPixJ2rdvn+68804ftwi1uXDhgiZPnqy5c+cqPj5eknT77bfz\nb8+HgnJy2qhRo7Ro0SKNGzdONptNq1atqvQJEtYwf/58LVmyRMXFxeratasGDhzo6ybBTcuWLdOy\nZcvUrFkztW/fXsuXL/d1k1CLjRs3qqCgQM8//7zS09Nls9mUkpKiJ554gn97PkKtcgAALIRuJgAA\nFkJwAwBgIQQ3AAAWQnADAGAhBDcAABZCcAMAYCEENyDp9OnT6tGjh+Lj4xUfH6/Y2FhNnjxZ+fn5\nTXqe5557Ts8995zLx6SlpenTTz+VJC1evFhHjx5t0jY4y8rK0sMPP6y5c+dWuy8zM1Njx45VXFyc\nhg4dqg0bNpTf52hXYWGhkpOT3T7fs88+q71799a7nQsWLFBGRkb57TNnzighIUGDBw9WcnKyfvjh\nh2rPuXjxopKSkjR48GCNHz9e3333nSSpuLhY8+bN0+DBgzVixAgdP368/Dlr1qzRoEGDFBsbq88+\n+6ze7QS8wgBgnDp1ynj44YcrHfvDH/5gJCcnN+l50tLSjLS0NJePSUhIMPbv39+k563NwoULjT//\n+c/VjmdlZRn9+vUzcnNzDcMwjMuXLxtTp041NmzYUOlxJ0+erPZza0r5+flGUlKScffddxtvv/12\n+fGkpCTjvffeMwzDMNLT042nn3662nOXL19uvPTSS4ZhGEZGRoYxc+ZMwzAM45VXXjHsdrthGIZx\n4MABY/To0YZhGMbu3buNpKQkwzAM48SJE0b//v2N0tJSj703oKHocQO1iIyMVG5uriTp888/1yOP\nPKK4uDhNnDhRJ0+elCSNHz9eK1as0IgRIxQbG6uPP/5YkrRw4cJKPcTbbrut2utv3rxZjzzyiIYO\nHarhw4fr+PHjysjI0JEjR7R48WL97//+r8aPH19eWvLFF1/UkCFDNGzYMK1Zs0aGYej06dOKj4/X\nvHnzNHToUE2cOFEFBQXVzrV3717FxcVp+PDhmjZtmr777jtt3bpVH374oV544QVt27at0uM3btyo\nadOmqXPnzpKk5s2bKzU1Vffdd1/5+96/f79Wrlypc+fOafr06dqwYYPWrVtX/hoLFy7U7t27K72u\n4+fibrt37dqlmJiYSpW5SkpKdODAAQ0YMECSNGLECL3//vvVnpuZmVm+J0FsbKxycnJUWlqqzMxM\nDR06VJL5O/7+++919uxZZWVlafDgwZLMPQxuvPFGffbZZ/rqq680ZswYjRo1SuPGjVNeXl61cwHe\nRHADNSguLtbu3bv1y1/+UsXFxZo9e7bsdrsyMjI0ZswYzZo1q/yxJSUl2r59u55++mnNmzdPJSUl\n1V7PZrNVul1YWKiPPvpImzdv1q5du9SvXz/96U9/UlxcnHr06KGVK1eqe/fu5Y/PyspSZmam3n77\nbWVkZCg3N1dbtmyRZG5TO2nSJO3atUtXXnmldu3aVelc//znP2W32/XCCy9ox44duueee7R8+XKN\nHj1aDz/8sB5//HGNGjWq0nOOHTumnj17VjrWsWNHPfDAA5Xe0+LFi9WhQwelpaVpxIgReueddyRJ\nP/zwg/77v//b5R7NdbVbkiZPnlytbf/3f/+nK6+8srxMcfv27Wu8pHHu3LnyPQhCQ0N1xRVX6Lvv\nvtO5c+fUoUOH8se1b99eZ86cqfR4Sbr22mt19uxZvfrqq5o0aZK2bdumhIQEff7557W+J8AbCG7g\nZ/n5+YqPj1dcXJzi4uIkSXPmzNE//vEPtW3btnwjjIEDB+rkyZMqLCyUJI0dO1aSufFChw4d9NVX\nX9V5riuuuEJr167VO++8o2eeeUZ79+6ttCe1UaUS8SeffKIhQ4aoefPmCgkJ0ciRI/XJJ59Ikq65\n5pryHv0tt9yi77//vtJzDx06pF69eun666+XJI0ZM6b8ubUJCQmp1oa6dOrUSTfddJP+/ve/6y9/\n+Yv69u2rZs2a1fr4utpdm5ra5e5eA6GhodWebxhGpS1Hq77uQw89pOXLlyslJUXNmjUr760DvhKU\nm4wANenYsaPefvvtasfPnDlT4x97xx7uzn/0y8rKym87nlNcXFztNc+ePavx48crISFBffr00bXX\nXqsvvvii1rbVdH5Hz75Fixblx202W7XHlpWVVTpWVlam0tLSWs8lSXfddZeOHDmirl27lh87ceKE\nXnzxRa1Zs6bW540cOVI7d+7UmTNnNH36dJfnqKvdtbn66qtVWFgowzBks9l0/vz5Sj1oh44dO+r8\n+fPq2LGjSktLVVhYqLZt25Yf79SpkySVP79Dhw66cOFC+fMdxyMjI3X33XcrMzNTr732mrKysrRi\nxQq32gp4Aj1u4Ge1BccvfvEL/etf/9KRI0ckSe+9955uuOGG8j2IHUO8hw8fVkFBgW699Va1a9dO\nX3/9tSRpz5491V7z8OHDioiI0IQJE9SzZ09lZ2eXfxAICwurNtzeu3dvvfvuu7p8+XL50Hzv3r1d\nttuhV69eOnjwoL799ltJ0ltvvaVf/epXLp8zefJkpaenl1/jLyoq0pNPPqkbb7yx0uPCwsIqfQgY\nMGCAPvnkE3333XfVhtqrqm+P3vmckZGReu+99yRJGRkZ6tOnT7XH9e3bVzt27JAkvfvuu4qMjFRo\naKj69u1bPv/g73//u1q2bKnrrrtOffv21a5du1RWVqbc3Fzl5uaqZ8+emjNnjg4dOqRHHnlEM2bM\n0LFjxxrUbqCp0OMGflb1OrRD8+bNtW7dOi1fvlw//PCD2rZtq/Xr15ffn5ubqxEjRkiS1q9fL5vN\nprFjx2rWrFkaPny4evfuXa1H+OCDD2rLli2KjY1Vu3btFBUVpaysLElSVFSUUlNTtWbNmvI2RUdH\n64svvtDIkSNVWlqqqKgoJSQk6MyZM7W22+Gaa67RihUrlJycrJKSEt1www1auXKly+dERUVp5syZ\nmjVrlsrKylRSUqKBAwdq2rRplX5W11xzja677jpNmDBBr732mlq0aKG7775bt956q8vXd36Nhli6\ndKnmz5+vF154Qddff72eeeYZSdL27dt16tQpPf7443r88ce1YMECxcbGqk2bNlq7dq0kc2Ld0qVL\nFRsbq+bNm+upp56SZF4COXTokIYNG1a+3W/z5s316KOPavHixXr++ecVFhamhQsXNrjdQFNgW0+g\nEcaPH6+5c+fW2bsMFoWFhRo7dqxeffVVXXPNNV4/f0FBgV555ZVKkweBQMNQOdAIjek1BppDhw6p\nX79+GjNmjE9CW5K++eYb/fa3v/XJuQFvoccNAICF0OMGAMBCCG4AACyE4AYAwEIIbgAALITgBgDA\nQv4/qZEOuw5wRmEAAAAASUVORK5CYII=\n", 130 | "text/plain": [ 131 | "" 132 | ] 133 | }, 134 | "metadata": {}, 135 | "output_type": "display_data" 136 | } 137 | ], 138 | "source": [ 139 | "plt.scatter(X[:,1], y, s=30, c='r', marker='x', linewidths=1)\n", 140 | "plt.xlim(4,24)\n", 141 | "plt.xlabel('Population of City in 10,000s')\n", 142 | "plt.ylabel('Profit in $10,000s');" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "metadata": {}, 148 | "source": [ 149 | "#### 梯度下降" 150 | ] 151 | }, 152 | { 153 | "cell_type": "code", 154 | "execution_count": 31, 155 | "metadata": { 156 | "collapsed": false 157 | }, 158 | "outputs": [], 159 | "source": [ 160 | "# 计算损失函数\n", 161 | "def computeCost(X, y, theta=[[0],[0]]):\n", 162 | " m = y.size\n", 163 | " J = 0\n", 164 | " \n", 165 | " h = X.dot(theta)\n", 166 | " \n", 167 | " J = 1.0/(2*m)*(np.sum(np.square(h-y)))\n", 168 | " \n", 169 | " return J" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 32, 175 | "metadata": { 176 | "collapsed": false 177 | }, 178 | "outputs": [ 179 | { 180 | "data": { 181 | "text/plain": [ 182 | "32.072733877455676" 183 | ] 184 | }, 185 | "execution_count": 32, 186 | "metadata": {}, 187 | "output_type": "execute_result" 188 | } 189 | ], 190 | "source": [ 191 | "computeCost(X,y)" 192 | ] 193 | }, 194 | { 195 | "cell_type": "code", 196 | "execution_count": 35, 197 | "metadata": { 198 | "collapsed": false 199 | }, 200 | "outputs": [], 201 | "source": [ 202 | "# 梯度下降\n", 203 | "def gradientDescent(X, y, theta=[[0],[0]], alpha=0.01, num_iters=1500):\n", 204 | " m = y.size\n", 205 | " J_history = np.zeros(num_iters)\n", 206 | " \n", 207 | " for iter in np.arange(num_iters):\n", 208 | " h = X.dot(theta)\n", 209 | " theta = theta - alpha*(1.0/m)*(X.T.dot(h-y))\n", 210 | " J_history[iter] = computeCost(X, y, theta)\n", 211 | " return(theta, J_history)" 212 | ] 213 | }, 214 | { 215 | "cell_type": "code", 216 | "execution_count": 37, 217 | "metadata": { 218 | "collapsed": false 219 | }, 220 | "outputs": [ 221 | { 222 | "name": "stdout", 223 | "output_type": "stream", 224 | "text": [ 225 | "('theta: ', array([-3.63029144, 1.16636235]))\n" 226 | ] 227 | }, 228 | { 229 | "data": { 230 | "image/png": "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\n2TJ16dLlivfNJwL/p3PvW61WuVwuL1b0y9SoUUMhISGy2+16+OGH9cgjj8g4axqE0NBQ2e125eXl\nndPfkJCQSz5rwNvOfnZCeZ/O/m/ky30rl52drW3btunll1/W5MmTNW7cuGrTx4SEBBUVFemWW27R\n008/raFDh1aL383f/OY358zMebl9Kl9vs9nO2beq+Wn/atWqJak0PN577z3dc8895/399NX+uVwu\nTZw4UU8++aRq1KhRsY+v9u+n/+2OHDmiiIgIvf3224qNjdXs2bOveN98IvBtNpvy8vIq3rtcLpnN\nPlH6eY4dO6bhw4frzjvvVFJS0jn9KH+mwC951oC3LVq0SGvWrNHQoUO1c+dOjR8//pzPlXy5b+Ui\nIiLUrVs3Wa1WxcfHKygo6IJ98cU+/vOf/1THjh31v//9Tx988IHGjx+vkpKSiu2+3LezufP/29l/\nd346KKjKli9frmeeeUazZ89WZGRktelfenq6Dh48qMmTJ+uxxx7T7t279dxzz1Wb/kVERKhnz56S\npF69emnbtm0KCwu7on3zidTs2LGjVq5cKUnavHmzmjVr5uWKfpmTJ09q5MiRevzxx3XnnXdKklq0\naFHxaOCvvvpKCQkJatOmjTZu3Kji4mLl5uZq7969atq0qTdLv6R3331Xc+fO1dy5c9W8eXNNnz5d\n3bp1qxZ9K5eQkKBVq1ZJkk6cOKGCggJ16dJFGzZskOTbfczPz684YggLC5PD4VDLli2rRd/O1rJl\ny8v+nezQoUPF352VK1f6xNTe//3vfzVv3jzNnTtX9evXlyS1bdvW5/tnGIbatGmjpUuXas6cOXrp\npZfUpEkTTZgwoVr0Tyr9+1Jeb1pampo2bXrFfzcrZS79X+s3v/mN1qxZU3FV5nPPPeflin6ZWbNm\nKScnR6+99ppeffVVmUwmPfXUU3r22WdVUlKixo0b65ZbbpHJZNLQoUM1ePBgGYahRx99VIGBgd4u\n323jx4/Xn/70p2rTt8TERH3zzTdKTk6WYRiaPHmy6tevr4kTJ/p8H0eOHKkJEyZo8ODBcjqdGjdu\nnFq1alUt+nY2d34nBw0apPHjx2vw4MEKDAzUjBkzvF3+z3K5XJo6darq1aunsWPHymQy6brrrtMD\nDzzg8/0rfx7LhdSqVcvn+yeV/m5OnDhR//rXvxQWFqYZM2YoLCzsivaNufQBAPADPnFKHwAA/DoE\nPgAAfoDABwDADxD4AAD4AQIfAAA/QOADAOAHCHygmmnevLmk0ilHx44de8XaHTZsWMVy+cRRAHwH\ngQ9UM+WTlJw+fVoZGRlXrN3yWfckafHixVesXQCVwydm2gPgvr/85S/64Ycf9OCDD2rmzJlasmSJ\n5syZI8Mw1KpVKz399NMKDAxUly5d1Lp1a506dUoLFizQM888o127dunUqVOKj4/XzJkz9cILL0iS\n7r77br3//vtq3ry5MjIyVFhYqIkTJ2rnzp0ym82699571a9fPy1evFirVq3SmTNndOjQId1www2a\nNGmSTpw4oXHjxqmgoEBms1kTJ05U27ZtvfwvBfgHjvCBamrixImKiYnRzJkztXv3bi1YsEDz58/X\n4sWLFRUVpbfeektS6ZmAUaNGafHixdq8ebMCAwM1f/58ffLJJyooKNBXX32liRMnSpLef/99ST+e\nRXj55ZcVGRmppUuX6p133tErr7yi77//XlLpcy9eeeUVffDBB/riiy+0a9cuLViwQD179tTChQv1\n+OOPa+PGjV74lwH8E0f4gB9Yv369Dhw4oLvvvluGYcjhcKhVq1YV28uPsjt16qSIiAjNmzdP+/bt\n08GDB895UuWF2p06daokKTIyUjfddJM2bNig0NBQdejQoeIxpg0bNtSZM2d0/fXX68EHH1R6eroS\nExOVmprqwV4DOBuBD/gBp9OpW2+9VU899ZSk0qfjOZ1OSaVH6+UPwPn88881c+ZM3XPPPRowYMA5\njzi+kJ8+isPlcsnhcEjSeQ/VMQxDHTt21PLly/XFF1/oo48+0uLFiyvONADwLE7pA9VMeQhbrdaK\nUL/uuuv02WefKSsrq+JJf//3f/93zv6StHbtWt12223q16+foqKilJaWVtGG1WqVy+U653s6d+6s\nhQsXSpKysrL0+eefq3PnzhetbcaMGVqyZIn69eunP/3pT9q+ffsV7j2AiyHwgWqm/PP16OhoxcbG\navjw4WrevLnGjBmj4cOHq2/fvjIMQ/fff/85+0vSXXfdpaVLlyo5OVmTJk1S7969dfjwYUlSr169\ndMcdd6i4uLjie8aOHavTp0+rb9++GjZsmEaPHq0WLVpctKYhQ4bok08+Ub9+/fTAAw/omWee8ei/\nBYAf8XhcAAD8AEf4AAD4AQIfAAA/QOADAOAHCHwAAPwAgQ8AgB8g8AEA8AMEPgAAfuD/AefBODpB\nehgrAAAAAElFTkSuQmCC\n", 231 | "text/plain": [ 232 | "" 233 | ] 234 | }, 235 | "metadata": {}, 236 | "output_type": "display_data" 237 | } 238 | ], 239 | "source": [ 240 | "# 画出每一次迭代和损失函数变化\n", 241 | "theta , Cost_J = gradientDescent(X, y)\n", 242 | "print('theta: ',theta.ravel())\n", 243 | "\n", 244 | "plt.plot(Cost_J)\n", 245 | "plt.ylabel('Cost J')\n", 246 | "plt.xlabel('Iterations');" 247 | ] 248 | }, 249 | { 250 | "cell_type": "code", 251 | "execution_count": 38, 252 | "metadata": { 253 | "collapsed": false 254 | }, 255 | "outputs": [ 256 | { 257 | "data": { 258 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAFkCAYAAADmPNjoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd01FX+//HnpIdAqKGTAAlNmgUQlBIEpHcRXSwoCvgT\nV8WvDdCIKKzKqojoWnZd28qqizSVKgEEBBQF6UgJIUAKAQIJaTP398fHNEoIJJPJTF6PczhhJpOZ\n+5mck9fc+7mf99tmjDGIiIiIW/By9QBERESk6BTcIiIibkTBLSIi4kYU3CIiIm5EwS0iIuJGFNwi\nIiJuxMeZT+5wOJgyZQoHDx7Ey8uLqVOn4ufnxzPPPIOXlxdNmjQhKirKmUMQERHxKE4N7h9++AGb\nzcYXX3zBpk2beP311zHGMHHiRNq1a0dUVBQrVqygZ8+ezhyGiIiIx3DqUnnPnj2ZNm0aAEePHqVy\n5crs3LmTdu3aAdC1a1c2bNjgzCGIiIh4FKfOuAG8vLx49tlnWb58ObNmzWLdunW53wsKCuLMmTOF\n/nx6ejrbt28nJCQEb29vZw9XRETE5ex2O4mJibRq1YqAgIAC33N6cAPMmDGD//u//+O2224jIyMj\n9/7U1FSCg4ML/dnt27czatQoZw9RRESkzPn8889zV6lzODW458+fT3x8POPGjcPf3x8vLy9atWrF\npk2b6NChA2vWrKFjx46FPkdISAhgDb527drOHK6IiEiZcPz4cUaNGpWbgfk5Nbj79OnDM888w113\n3UV2djZTpkyhcePGTJkyhaysLMLDw+nTp0+hz5GzPF67dm3q16/vzOGKiIiUKRc7RezU4A4ICODN\nN9+84P5PP/3UmS8rIiLisVSARURExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE3IiC\nW0RExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE3IiCW0RExI0ouEVERNyIgltERMSN\nKLhFRETciIJbRETEjSi4RURE3IiCW0RExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE\n3IiCW0RExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE3IiCW0RExI0ouEVERNyIgltE\nRMSNKLhFRETciIJbRETEjSi4RURE3IiPM588OzubSZMmERcXR1ZWFuPHj6dOnTqMGzeOhg0bAnDn\n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\n+apklyvZWVLvhaqMiYhcUpkreXolXF7y1AklOU/u+sN8+t4Sc8eL/zVD33rJ3Pafh8yIuePNA18/\nYRbtXm7SMs9d2RhzPPaYFbqjR1uPq1rVmL59jalUyZi5c/OO51L1xi/3WiX9Xqiut4jIRRWWfeW3\nrScUXPZ9+OG8Zd/Dh60lachbUvb2zruk6iqXx48mneWdr7cy5ot1fGPfgL3JKnxqHqG2TxDjP/uZ\nd0IGMKBZz7y2moWN8XzR0fDZZ9by9eLF1n1//au1m3ziRKvgC1y6ZWj+c94vvJB3Ljvnfcj/XuSM\noTinCkq7raqIiKdwwQeJK+KSGffFZpZVq1odxfIrYtvK3YdOmJc++skMnvphgbaaT7060myY+bSx\nhxQyk77aVYHgYGt5vKhL0cVty3klPKmxiIiIE5S5JiNlwuVKdJ6/e/qFF6xZb0iIVarUbs97fEzM\nBRvGHA7Dz7vj+d+qvew+uQvfugfwa5YCQKuazRl6TW9avfsFtqkvXnqTV2FjDAvL21yXMxMGa1XA\n29u6FOy996yZdlHKj5ZmARVVWRMRuWrlN7gvFx7n757+61+hTRvrGumMDCsc/+zKxYgR1mMGDSKr\nbj2ifznCvNV7OObYi0+dg/jXSANs3Fj/Ooak1yQ8/HrYdQDmvFN4Q47Cxnj+zuwDBwqG+qJFZTcY\nVWVNROSqld/gvlx4XKo4Sf5rpN9+G1avhsmTOTv9VZYENmXh0a2cCdiPT51D+Pll4J3toFtgBIO6\n30PdX3bBHX+G/NSpl2/IUdgYQ0MLv6ZawSgi4pHKb3AX5lLFSfbtg7lzrd7ZH38M//sfiT37s3DJ\nPpbeN5Os01vxbRyLr08W/t7+3BrRk/4nAql2x73wcGpeuDZuDG3bFn9GXNr9xEVExOXKb3AXVoDl\nYsVJ9u+3Cpjccw/Mn8/B+s34pk0/1rS6Hq96sfiErMbXy0Elv4r0b9aXWyO6Wm014eLhWhIz4tLs\nJy4iImVC+Q3uwqp3XeySqSeewKSksG3lL8zr9Ti/NgvHp84B/KqvAxuEZPsysN0Iuje6Cf+ctprg\nvHAt7/2vRUTKqfIb3FdQd9tud7B+7W7+Z67j4H1d8al7kIAq6wAIrVyXIYeh0+RZeM8bAU3yhbYz\nw1U7s0VEyqXyG9xw2XPE6RnZLN90mG+WbeeEXzy+nY/hX2kXAM33JTDkxhF5bTVbRF4YmjnhGhZm\n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\n", 259 | "text/plain": [ 260 | "" 261 | ] 262 | }, 263 | "metadata": {}, 264 | "output_type": "display_data" 265 | } 266 | ], 267 | "source": [ 268 | "xx = np.arange(5,23)\n", 269 | "yy = theta[0]+theta[1]*xx\n", 270 | "\n", 271 | "# 画出我们自己写的线性回归梯度下降收敛的情况\n", 272 | "plt.scatter(X[:,1], y, s=30, c='r', marker='x', linewidths=1)\n", 273 | "plt.plot(xx,yy, label='Linear regression (Gradient descent)')\n", 274 | "\n", 275 | "# 和Scikit-learn中的线性回归对比一下 \n", 276 | "regr = LinearRegression()\n", 277 | "regr.fit(X[:,1].reshape(-1,1), y.ravel())\n", 278 | "plt.plot(xx, regr.intercept_+regr.coef_*xx, label='Linear regression (Scikit-learn GLM)')\n", 279 | "\n", 280 | "plt.xlim(4,24)\n", 281 | "plt.xlabel('Population of City in 10,000s')\n", 282 | "plt.ylabel('Profit in $10,000s')\n", 283 | "plt.legend(loc=4);" 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 39, 289 | "metadata": { 290 | "collapsed": false 291 | }, 292 | "outputs": [ 293 | { 294 | "name": "stdout", 295 | "output_type": "stream", 296 | "text": [ 297 | "[ 4519.7678677]\n", 298 | "[ 45342.45012945]\n" 299 | ] 300 | } 301 | ], 302 | "source": [ 303 | "# 预测一下人口为35000和70000的城市的结果\n", 304 | "print(theta.T.dot([1, 3.5])*10000)\n", 305 | "print(theta.T.dot([1, 7])*10000)" 306 | ] 307 | } 308 | ], 309 | "metadata": { 310 | "kernelspec": { 311 | "display_name": "Python 2", 312 | "language": "python", 313 | "name": "python2" 314 | }, 315 | "language_info": { 316 | "codemirror_mode": { 317 | "name": "ipython", 318 | "version": 2 319 | }, 320 | "file_extension": ".py", 321 | "mimetype": "text/x-python", 322 | "name": "python", 323 | "nbconvert_exporter": "python", 324 | "pygments_lexer": "ipython2", 325 | "version": "2.7.10" 326 | } 327 | }, 328 | "nbformat": 4, 329 | "nbformat_minor": 0 330 | } 331 | -------------------------------------------------------------------------------- /logistic_regression/data1.txt: -------------------------------------------------------------------------------- 1 | 34.62365962451697,78.0246928153624,0 2 | 30.28671076822607,43.89499752400101,0 3 | 35.84740876993872,72.90219802708364,0 4 | 60.18259938620976,86.30855209546826,1 5 | 79.0327360507101,75.3443764369103,1 6 | 45.08327747668339,56.3163717815305,0 7 | 61.10666453684766,96.51142588489624,1 8 | 75.02474556738889,46.55401354116538,1 9 | 76.09878670226257,87.42056971926803,1 10 | 84.43281996120035,43.53339331072109,1 11 | 95.86155507093572,38.22527805795094,0 12 | 75.01365838958247,30.60326323428011,0 13 | 82.30705337399482,76.48196330235604,1 14 | 69.36458875970939,97.71869196188608,1 15 | 39.53833914367223,76.03681085115882,0 16 | 53.9710521485623,89.20735013750205,1 17 | 69.07014406283025,52.74046973016765,1 18 | 67.94685547711617,46.67857410673128,0 19 | 70.66150955499435,92.92713789364831,1 20 | 76.97878372747498,47.57596364975532,1 21 | 67.37202754570876,42.83843832029179,0 22 | 89.67677575072079,65.79936592745237,1 23 | 50.534788289883,48.85581152764205,0 24 | 34.21206097786789,44.20952859866288,0 25 | 77.9240914545704,68.9723599933059,1 26 | 62.27101367004632,69.95445795447587,1 27 | 80.1901807509566,44.82162893218353,1 28 | 93.114388797442,38.80067033713209,0 29 | 61.83020602312595,50.25610789244621,0 30 | 38.78580379679423,64.99568095539578,0 31 | 61.379289447425,72.80788731317097,1 32 | 85.40451939411645,57.05198397627122,1 33 | 52.10797973193984,63.12762376881715,0 34 | 52.04540476831827,69.43286012045222,1 35 | 40.23689373545111,71.16774802184875,0 36 | 54.63510555424817,52.21388588061123,0 37 | 33.91550010906887,98.86943574220611,0 38 | 64.17698887494485,80.90806058670817,1 39 | 74.78925295941542,41.57341522824434,0 40 | 34.1836400264419,75.2377203360134,0 41 | 83.90239366249155,56.30804621605327,1 42 | 51.54772026906181,46.85629026349976,0 43 | 94.44336776917852,65.56892160559052,1 44 | 82.36875375713919,40.61825515970618,0 45 | 51.04775177128865,45.82270145776001,0 46 | 62.22267576120188,52.06099194836679,0 47 | 77.19303492601364,70.45820000180959,1 48 | 97.77159928000232,86.7278223300282,1 49 | 62.07306379667647,96.76882412413983,1 50 | 91.56497449807442,88.69629254546599,1 51 | 79.94481794066932,74.16311935043758,1 52 | 99.2725269292572,60.99903099844988,1 53 | 90.54671411399852,43.39060180650027,1 54 | 34.52451385320009,60.39634245837173,0 55 | 50.2864961189907,49.80453881323059,0 56 | 49.58667721632031,59.80895099453265,0 57 | 97.64563396007767,68.86157272420604,1 58 | 32.57720016809309,95.59854761387875,0 59 | 74.24869136721598,69.82457122657193,1 60 | 71.79646205863379,78.45356224515052,1 61 | 75.3956114656803,85.75993667331619,1 62 | 35.28611281526193,47.02051394723416,0 63 | 56.25381749711624,39.26147251058019,0 64 | 30.05882244669796,49.59297386723685,0 65 | 44.66826172480893,66.45008614558913,0 66 | 66.56089447242954,41.09209807936973,0 67 | 40.45755098375164,97.53518548909936,1 68 | 49.07256321908844,51.88321182073966,0 69 | 80.27957401466998,92.11606081344084,1 70 | 66.74671856944039,60.99139402740988,1 71 | 32.72283304060323,43.30717306430063,0 72 | 64.0393204150601,78.03168802018232,1 73 | 72.34649422579923,96.22759296761404,1 74 | 60.45788573918959,73.09499809758037,1 75 | 58.84095621726802,75.85844831279042,1 76 | 99.82785779692128,72.36925193383885,1 77 | 47.26426910848174,88.47586499559782,1 78 | 50.45815980285988,75.80985952982456,1 79 | 60.45555629271532,42.50840943572217,0 80 | 82.22666157785568,42.71987853716458,0 81 | 88.9138964166533,69.80378889835472,1 82 | 94.83450672430196,45.69430680250754,1 83 | 67.31925746917527,66.58935317747915,1 84 | 57.23870631569862,59.51428198012956,1 85 | 80.36675600171273,90.96014789746954,1 86 | 68.46852178591112,85.59430710452014,1 87 | 42.0754545384731,78.84478600148043,0 88 | 75.47770200533905,90.42453899753964,1 89 | 78.63542434898018,96.64742716885644,1 90 | 52.34800398794107,60.76950525602592,0 91 | 94.09433112516793,77.15910509073893,1 92 | 90.44855097096364,87.50879176484702,1 93 | 55.48216114069585,35.57070347228866,0 94 | 74.49269241843041,84.84513684930135,1 95 | 89.84580670720979,45.35828361091658,1 96 | 83.48916274498238,48.38028579728175,1 97 | 42.2617008099817,87.10385094025457,1 98 | 99.31500880510394,68.77540947206617,1 99 | 55.34001756003703,64.9319380069486,1 100 | 74.77589300092767,89.52981289513276,1 101 | -------------------------------------------------------------------------------- /logistic_regression/data2.txt: -------------------------------------------------------------------------------- 1 | 0.051267,0.69956,1 2 | -0.092742,0.68494,1 3 | -0.21371,0.69225,1 4 | -0.375,0.50219,1 5 | -0.51325,0.46564,1 6 | -0.52477,0.2098,1 7 | -0.39804,0.034357,1 8 | -0.30588,-0.19225,1 9 | 0.016705,-0.40424,1 10 | 0.13191,-0.51389,1 11 | 0.38537,-0.56506,1 12 | 0.52938,-0.5212,1 13 | 0.63882,-0.24342,1 14 | 0.73675,-0.18494,1 15 | 0.54666,0.48757,1 16 | 0.322,0.5826,1 17 | 0.16647,0.53874,1 18 | -0.046659,0.81652,1 19 | -0.17339,0.69956,1 20 | -0.47869,0.63377,1 21 | -0.60541,0.59722,1 22 | -0.62846,0.33406,1 23 | -0.59389,0.005117,1 24 | -0.42108,-0.27266,1 25 | -0.11578,-0.39693,1 26 | 0.20104,-0.60161,1 27 | 0.46601,-0.53582,1 28 | 0.67339,-0.53582,1 29 | -0.13882,0.54605,1 30 | -0.29435,0.77997,1 31 | -0.26555,0.96272,1 32 | -0.16187,0.8019,1 33 | -0.17339,0.64839,1 34 | -0.28283,0.47295,1 35 | -0.36348,0.31213,1 36 | -0.30012,0.027047,1 37 | -0.23675,-0.21418,1 38 | -0.06394,-0.18494,1 39 | 0.062788,-0.16301,1 40 | 0.22984,-0.41155,1 41 | 0.2932,-0.2288,1 42 | 0.48329,-0.18494,1 43 | 0.64459,-0.14108,1 44 | 0.46025,0.012427,1 45 | 0.6273,0.15863,1 46 | 0.57546,0.26827,1 47 | 0.72523,0.44371,1 48 | 0.22408,0.52412,1 49 | 0.44297,0.67032,1 50 | 0.322,0.69225,1 51 | 0.13767,0.57529,1 52 | -0.0063364,0.39985,1 53 | -0.092742,0.55336,1 54 | -0.20795,0.35599,1 55 | -0.20795,0.17325,1 56 | -0.43836,0.21711,1 57 | -0.21947,-0.016813,1 58 | -0.13882,-0.27266,1 59 | 0.18376,0.93348,0 60 | 0.22408,0.77997,0 61 | 0.29896,0.61915,0 62 | 0.50634,0.75804,0 63 | 0.61578,0.7288,0 64 | 0.60426,0.59722,0 65 | 0.76555,0.50219,0 66 | 0.92684,0.3633,0 67 | 0.82316,0.27558,0 68 | 0.96141,0.085526,0 69 | 0.93836,0.012427,0 70 | 0.86348,-0.082602,0 71 | 0.89804,-0.20687,0 72 | 0.85196,-0.36769,0 73 | 0.82892,-0.5212,0 74 | 0.79435,-0.55775,0 75 | 0.59274,-0.7405,0 76 | 0.51786,-0.5943,0 77 | 0.46601,-0.41886,0 78 | 0.35081,-0.57968,0 79 | 0.28744,-0.76974,0 80 | 0.085829,-0.75512,0 81 | 0.14919,-0.57968,0 82 | -0.13306,-0.4481,0 83 | -0.40956,-0.41155,0 84 | -0.39228,-0.25804,0 85 | -0.74366,-0.25804,0 86 | -0.69758,0.041667,0 87 | -0.75518,0.2902,0 88 | -0.69758,0.68494,0 89 | -0.4038,0.70687,0 90 | -0.38076,0.91886,0 91 | -0.50749,0.90424,0 92 | -0.54781,0.70687,0 93 | 0.10311,0.77997,0 94 | 0.057028,0.91886,0 95 | -0.10426,0.99196,0 96 | -0.081221,1.1089,0 97 | 0.28744,1.087,0 98 | 0.39689,0.82383,0 99 | 0.63882,0.88962,0 100 | 0.82316,0.66301,0 101 | 0.67339,0.64108,0 102 | 1.0709,0.10015,0 103 | -0.046659,-0.57968,0 104 | -0.23675,-0.63816,0 105 | -0.15035,-0.36769,0 106 | -0.49021,-0.3019,0 107 | -0.46717,-0.13377,0 108 | -0.28859,-0.060673,0 109 | -0.61118,-0.067982,0 110 | -0.66302,-0.21418,0 111 | -0.59965,-0.41886,0 112 | -0.72638,-0.082602,0 113 | -0.83007,0.31213,0 114 | -0.72062,0.53874,0 115 | -0.59389,0.49488,0 116 | -0.48445,0.99927,0 117 | -0.0063364,0.99927,0 118 | 0.63265,-0.030612,0 119 | -------------------------------------------------------------------------------- /logistic_regression/logistic_regression_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "## 逻辑斯特回归示例\n", 8 | "\n", 9 | "- [逻辑斯特回归](#逻辑斯特回归)\n", 10 | "- [正则化后的逻辑斯特回归](#加正则化项的逻辑斯特回归)" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 1, 16 | "metadata": { 17 | "collapsed": false 18 | }, 19 | "outputs": [ 20 | { 21 | "name": "stderr", 22 | "output_type": "stream", 23 | "text": [ 24 | "/Library/Python/2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n", 25 | " warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n", 26 | "/Library/Python/2.7/site-packages/IPython/html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n", 27 | " \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n" 28 | ] 29 | } 30 | ], 31 | "source": [ 32 | "# %load ../../standard_import.txt\n", 33 | "import pandas as pd\n", 34 | "import numpy as np\n", 35 | "import matplotlib as mpl\n", 36 | "import matplotlib.pyplot as plt\n", 37 | "\n", 38 | "from scipy.optimize import minimize\n", 39 | "\n", 40 | "from sklearn.preprocessing import PolynomialFeatures\n", 41 | "\n", 42 | "pd.set_option('display.notebook_repr_html', False)\n", 43 | "pd.set_option('display.max_columns', None)\n", 44 | "pd.set_option('display.max_rows', 150)\n", 45 | "pd.set_option('display.max_seq_items', None)\n", 46 | " \n", 47 | "#%config InlineBackend.figure_formats = {'pdf',}\n", 48 | "%matplotlib inline\n", 49 | "\n", 50 | "import seaborn as sns\n", 51 | "sns.set_context('notebook')\n", 52 | "sns.set_style('white')" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 11, 58 | "metadata": { 59 | "collapsed": true 60 | }, 61 | "outputs": [], 62 | "source": [ 63 | "def loaddata(file, delimeter):\n", 64 | " data = np.loadtxt(file, delimiter=delimeter)\n", 65 | " print('Dimensions: ',data.shape)\n", 66 | " print(data[1:6,:])\n", 67 | " return(data)" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 12, 73 | "metadata": { 74 | "collapsed": false 75 | }, 76 | "outputs": [], 77 | "source": [ 78 | "def plotData(data, label_x, label_y, label_pos, label_neg, axes=None):\n", 79 | " # 获得正负样本的下标(即哪些是正样本,哪些是负样本)\n", 80 | " neg = data[:,2] == 0\n", 81 | " pos = data[:,2] == 1\n", 82 | " \n", 83 | " if axes == None:\n", 84 | " axes = plt.gca()\n", 85 | " axes.scatter(data[pos][:,0], data[pos][:,1], marker='+', c='k', s=60, linewidth=2, label=label_pos)\n", 86 | " axes.scatter(data[neg][:,0], data[neg][:,1], c='y', s=60, label=label_neg)\n", 87 | " axes.set_xlabel(label_x)\n", 88 | " axes.set_ylabel(label_y)\n", 89 | " axes.legend(frameon= True, fancybox = True);" 90 | ] 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "metadata": {}, 95 | "source": [ 96 | "### 逻辑斯特回归" 97 | ] 98 | }, 99 | { 100 | "cell_type": "code", 101 | "execution_count": 13, 102 | "metadata": { 103 | "collapsed": false 104 | }, 105 | "outputs": [ 106 | { 107 | "name": "stdout", 108 | "output_type": "stream", 109 | "text": [ 110 | "('Dimensions: ', (100, 3))\n", 111 | "[[ 30.28671077 43.89499752 0. ]\n", 112 | " [ 35.84740877 72.90219803 0. ]\n", 113 | " [ 60.18259939 86.3085521 1. ]\n", 114 | " [ 79.03273605 75.34437644 1. ]\n", 115 | " [ 45.08327748 56.31637178 0. ]]\n" 116 | ] 117 | } 118 | ], 119 | "source": [ 120 | "data = loaddata('data1.txt', ',')" 121 | ] 122 | }, 123 | { 124 | "cell_type": "code", 125 | "execution_count": 14, 126 | "metadata": { 127 | "collapsed": false 128 | }, 129 | "outputs": [], 130 | "source": [ 131 | "X = np.c_[np.ones((data.shape[0],1)), data[:,0:2]]\n", 132 | "y = np.c_[data[:,2]]" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "execution_count": 15, 138 | "metadata": { 139 | "collapsed": false 140 | }, 141 | "outputs": [ 142 | { 143 | "data": { 144 | "image/png": "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\n", 145 | "text/plain": [ 146 | "" 147 | ] 148 | }, 149 | "metadata": {}, 150 | "output_type": "display_data" 151 | } 152 | ], 153 | "source": [ 154 | "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Pass', 'Fail')" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "#### 逻辑斯特回归假设\n", 162 | "#### $$ h_{\\theta}(x) = g(\\theta^{T}x)$$\n", 163 | "#### $$ g(z)=\\frac{1}{1+e^{−z}} $$" 164 | ] 165 | }, 166 | { 167 | "cell_type": "code", 168 | "execution_count": 16, 169 | "metadata": { 170 | "collapsed": true 171 | }, 172 | "outputs": [], 173 | "source": [ 174 | "#定义sigmoid函数\n", 175 | "def sigmoid(z):\n", 176 | " return(1 / (1 + np.exp(-z)))" 177 | ] 178 | }, 179 | { 180 | "cell_type": "markdown", 181 | "metadata": { 182 | "collapsed": true 183 | }, 184 | "source": [ 185 | "其实scipy包里有一个函数可以完成一样的功能:
\n", 186 | "http://docs.scipy.org/doc/scipy/reference/generated/scipy.special.expit.html#scipy.special.expit" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": {}, 192 | "source": [ 193 | "#### 损失函数\n", 194 | "#### $$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big]$$\n", 195 | "#### 向量化的损失函数(矩阵形式)\n", 196 | "#### $$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big)$$" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 20, 202 | "metadata": { 203 | "collapsed": false 204 | }, 205 | "outputs": [], 206 | "source": [ 207 | "#定义损失函数\n", 208 | "def costFunction(theta, X, y):\n", 209 | " m = y.size\n", 210 | " h = sigmoid(X.dot(theta))\n", 211 | " \n", 212 | " J = -1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y))\n", 213 | " \n", 214 | " if np.isnan(J[0]):\n", 215 | " return(np.inf)\n", 216 | " return J[0]" 217 | ] 218 | }, 219 | { 220 | "cell_type": "markdown", 221 | "metadata": {}, 222 | "source": [ 223 | "#### 求偏导(梯度)\n", 224 | "\n", 225 | "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} $$ \n", 226 | "#### 向量化的偏导(梯度)\n", 227 | "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y)$$\n" 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "execution_count": 18, 233 | "metadata": { 234 | "collapsed": false 235 | }, 236 | "outputs": [], 237 | "source": [ 238 | "#求解梯度\n", 239 | "def gradient(theta, X, y):\n", 240 | " m = y.size\n", 241 | " h = sigmoid(X.dot(theta.reshape(-1,1)))\n", 242 | " \n", 243 | " grad =(1.0/m)*X.T.dot(h-y)\n", 244 | "\n", 245 | " return(grad.flatten())" 246 | ] 247 | }, 248 | { 249 | "cell_type": "code", 250 | "execution_count": 19, 251 | "metadata": { 252 | "collapsed": false 253 | }, 254 | "outputs": [ 255 | { 256 | "name": "stdout", 257 | "output_type": "stream", 258 | "text": [ 259 | "('Cost: \\n', 0.69314718055994518)\n", 260 | "('Grad: \\n', array([ -0.1 , -12.00921659, -11.26284221]))\n" 261 | ] 262 | } 263 | ], 264 | "source": [ 265 | "initial_theta = np.zeros(X.shape[1])\n", 266 | "cost = costFunction(initial_theta, X, y)\n", 267 | "grad = gradient(initial_theta, X, y)\n", 268 | "print('Cost: \\n', cost)\n", 269 | "print('Grad: \\n', grad)" 270 | ] 271 | }, 272 | { 273 | "cell_type": "markdown", 274 | "metadata": {}, 275 | "source": [ 276 | "#### 最小化损失函数" 277 | ] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "execution_count": 22, 282 | "metadata": { 283 | "collapsed": false 284 | }, 285 | "outputs": [ 286 | { 287 | "data": { 288 | "text/plain": [ 289 | " status: 0\n", 290 | " success: True\n", 291 | " njev: 28\n", 292 | " nfev: 28\n", 293 | " hess_inv: array([[ 3.24739469e+03, -2.59380769e+01, -2.63469561e+01],\n", 294 | " [ -2.59380769e+01, 2.21449124e-01, 1.97772068e-01],\n", 295 | " [ -2.63469561e+01, 1.97772068e-01, 2.29018831e-01]])\n", 296 | " fun: 0.20349770158944075\n", 297 | " x: array([-25.16133401, 0.20623172, 0.2014716 ])\n", 298 | " message: 'Optimization terminated successfully.'\n", 299 | " jac: array([ -2.73305312e-10, 1.43144026e-07, -1.58965802e-07])" 300 | ] 301 | }, 302 | "execution_count": 22, 303 | "metadata": {}, 304 | "output_type": "execute_result" 305 | } 306 | ], 307 | "source": [ 308 | "res = minimize(costFunction, initial_theta, args=(X,y), jac=gradient, options={'maxiter':400})\n", 309 | "res" 310 | ] 311 | }, 312 | { 313 | "cell_type": "markdown", 314 | "metadata": {}, 315 | "source": [ 316 | "#### 做一下预测吧" 317 | ] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "execution_count": 23, 322 | "metadata": { 323 | "collapsed": true 324 | }, 325 | "outputs": [], 326 | "source": [ 327 | "def predict(theta, X, threshold=0.5):\n", 328 | " p = sigmoid(X.dot(theta.T)) >= threshold\n", 329 | " return(p.astype('int'))" 330 | ] 331 | }, 332 | { 333 | "cell_type": "markdown", 334 | "metadata": {}, 335 | "source": [ 336 | "#### 咱们来看看考试1得分45,考试2得分85的同学通过概率有多高" 337 | ] 338 | }, 339 | { 340 | "cell_type": "code", 341 | "execution_count": 24, 342 | "metadata": { 343 | "collapsed": false 344 | }, 345 | "outputs": [ 346 | { 347 | "data": { 348 | "text/plain": [ 349 | "0.77629066133254787" 350 | ] 351 | }, 352 | "execution_count": 24, 353 | "metadata": {}, 354 | "output_type": "execute_result" 355 | } 356 | ], 357 | "source": [ 358 | "sigmoid(np.array([1, 45, 85]).dot(res.x.T))" 359 | ] 360 | }, 361 | { 362 | "cell_type": "markdown", 363 | "metadata": {}, 364 | "source": [ 365 | "#### 画决策边界" 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "execution_count": 25, 371 | "metadata": { 372 | "collapsed": false 373 | }, 374 | "outputs": [ 375 | { 376 | "data": { 377 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfMAAAFgCAYAAACv/ZCmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3X18zfX/x/HHmZkxF4vEN9c0X4kvtmkra7nMQt+SrcT4\n6ruKKV+MGpLLQioqXWx0aZSm6ALlR2gtmmuRSChfXcg30syYcX5/fNoaNrs65/M5F8/77dat+Zzt\nnNc5Ozuvz/v9eb9fL5vdbrcjIiIibsvH6gBERESkfJTMRURE3JySuYiIiJtTMhcREXFzSuYiIiJu\nztfqAMri9OnT7Nq1i9q1a1OhQgWrwxEREXGqc+fOcfToUVq1aoW/v/8lt7tlMt+1axf9+/e3OgwR\nERFTLVy4kNDQ0EuOu2Uyr127NmA8qbp161ocjYiIiHP98ssv9O/fPz//Xcwtk3ne1HrdunWpX7++\nxdGIiIiYo6hLy1oAJyIi4ubccmQuIiLmOnbsGCdOnLA6DI9Xo0YNatasWeqf08hcREQua9WqVRw4\ncMDqMLzCgQMHWLVqVal/TiNzEREp0rFjx7jiiisKXUEtjtekSRM2b97MsWPHSjVC18hcRESKdOLE\nCWrVqmV1GF6lZs2apb6k4fRkvmPHDgYMGADAoUOH6NevH7GxsUyePDn/e1JTU+nTpw99+/Zl3bp1\nzg5JRETEZdlstlL/jFOn2V955RU++OADAgICAJg+fToJCQmEhoYyceJEVq9eTdu2bUlJSWHp0qWc\nPn2ae+65hw4dOlCxYkVnhiYiIg72+ogR1N6zp9DbDp09S+/58/lbvXpluu/ff/+dWbNmMWXKlPxj\nEyZMIDAwkISEBADuvPNOqlatCkD9+vWZNm1akff37LPPsn79enx8fHjkkUcIDg7mxIkTdO/enebN\nmwPQrVs3BgwYwJQpU3jooYfKtDDNLE5N5o0aNeLFF1/kkUceAeDrr7/Ov+4SGRnJF198gY+PDyEh\nIfj6+lK1alUaN27M3r17adWqlTNDExERB7umQweavfgiV+fmXnJbaq9eZU7kYCTf2NjY/H8vWrSI\nb7/9luuvvx6AnJwcAObPn1/sfR04cIANGzaQmprKDz/8wMiRI1myZAm7d++mV69ejB8//oLvHzBg\nAE8//fRlTw6s5tRp9m7dul2wwd1ut+d/HRAQwMmTJ8nKyqJatWr5x6tUqUJmZqYzwxIRESeIiI4m\nPTLykuP7/f1pOmxYme/35MmT7Nq1K3/EvG3bNnbu3Enfvn3zv2fPnj2cOnWKuLg4Bg0axI4dO4q8\nv4oVK3L69GlycnLIzMzEz88PMEqF79q1iwEDBjBixAiOHj0KGIvSDhw44NJb80xdAOfj89fDZWVl\nUb16dapWrcrJkycvOS4iIu7FZrPxtyFD+Mn3wknfLV27EnrLLWW+3x07dtCkSRMAfv31V1544QUm\nTJhwwQDR39+fuLg4Xn31VSZNmsTo0aM5f/58offXoEEDgoKCiIqKIi4ujn//+98ANGvWjOHDh5OS\nkkKXLl2YOnVq/s80adKErVu3lvk5OJupW9NatmzJpk2baN++PWlpaYSHh9O6dWtmz55NTk4OZ86c\n4cCBAwQFBZkZlimysrJYvjyZ06cP4+9fn549B+evJRAR8RQR0dEsTkrirjVrgPKPygGOHz/OlVde\nCcDKlSv5/fffuf/++zl69ChnzpyhadOm9OjRg0aNGgHQuHFjAgMDOXr0KHXq1Lnk/pYtW4aPjw9r\n1qzh5MmT3HPPPbRp04awsDAqV64MGDPLc+bMyf+Zq666it9//71cz8OZTE3miYmJPPbYY5w9e5Zm\nzZoRFRWFzWZjwIAB9OvXD7vdTkJCQv6Uh6fIyFhJevowWrfeh58f5ORAUlISERFzCAvrbnV4IiIO\nkz86T0vj6txctnTtyl3lGJUD1KpViz/++AMwrl/n7ZBaunQpBw8e5I477mDRokXs3buXiRMncuTI\nEbKysopsSnLq1CmqVKkCQOXKlfHz8yM7O5snn3ySbt26ceutt7J+/Xquu+66/J85ceKE9y6AA6hX\nrx6LFi0CjLOllJSUS74nJiaGmJgYZ4diiaysLNLThxESsi//mJ8fhITsIz19GK1abdMIXUQ8St7o\nPGT9+nKPygHatGnD008/fdnviY6OZty4cfTv3x+bzcb06dPx8fFh6dKlAPTu3Tv/e3v37s3WrVvp\n27cvdrud2267jcaNGzN69GjGjh3LokWLqFy5Mo8//nj+z3zzzTc8/PDD5X4uzqIKcE62fHkyrVvv\nK/S21q33sWLFXGJiRpoclYiI8+SNzj+uUIGHyjkqB2NhdOvWrfnmm2+49tpr848XTNC+vr7MnDnz\nkp9t2bIlX3/99QXHKlasyIwZMy753quvvpo333zzkuP79++nefPmLj3wUgU4Jzt9+jBFXTXw84Ps\n7MPmBiQiYoKI6Gii33jDYff3n//8h7fffrvUPxcYGMidd95ZrsdesGABw4cPL9d9OJtG5k7m71+f\nnBwKTeg5OVC5svX92POqDRVcGSriCvTedF82m426V1/tsPurWbPmBQVjSqqwBXClNXHixHLfh7Np\nZO5kPXsOZufOwlfn79wZRM+eg02OSEREPI2SuZMFBAQQETGHLVuC+LNAETk5sGVLEBERc/JXVIqI\niJSVptlNEBbWnVattrFixVyysw9TuXJ94uMHW5rICyvkX/CYpjU9mytPX+u9KVJ6SuYmCQgI0Kp1\nMZ0rJ21vpd+JOIOm2b2U3W7P/+9yx0TMpvemZ7DZbGVq5VmcefPmERERkd9YpaCVK1fywgsvlOh+\npk+fzi+//MKJEydYtmwZAD///DNr164tcSy33XZbib/X2ZTMRbxE3odrwQ/Ywo55Gk9/ft7mo48+\nolevXixfvrxc9zN27Fjq1q3Lnj17WPNn6dkNGza4dP31y9E0u4iHKe6as5hP6wAcY+PGjTRq1Ii+\nffsyevTo/Epu06ZNo0aNGlSsWJFWrVrx448/MnLkSOrWrctPP/1Ejx492LdvH7t376Zjx46MHDky\nv095cnIye/fuJTU1lddff50zZ84QHBxMvXr18ivABQYGMm3aNAICApg4cSJ79+6lTp06ZGVlWfyK\n/EXJ3EHcuZGKPki8i91ud5vrtq4en1zI2SctixcvJjo6msaNG+Pn58dXX33F5MmTef7552nUqBGz\nZ8/O/97Dhw/z+uuvk52dTZcuXUhPT6dSpUp07tyZkSP/Wr80ZMgQ3nnnHe666y4qVqzIwYMH6dSp\nE3fffTfTpk2jWbNmvPvuu8ybN49WrVqRnZ3NO++8w7Fjx+je3XV6ayiZO4AaqYgrKfiB6S5J29Fc\nbSSs30n5/fHHH6SlpXHs2DFSUlI4efIkCxYs4H//+19+t7TQ0ND8PuYNGjQgICCAihUrcuWVV1Kt\nWrVSPd7+/fuZPHkyALm5uTRq1IiDBw/SunVrwChi06xZMwc+w/JRMi8nNVIRETE486Tlgw8+IDo6\nOr/ZyenTp+nSpQuVK1dm3759BAUF5Sfyy8V1MR8fH86dO5cfc14P9KZNmzJz5kzq1q3Lpk2bOHHi\nBGC0Tx04cCAnTpzg4MGDDnlujqBkXk5qpCLuyNNHhRoJe5733nvvgkYq/v7+dO/enTp16vDoo48S\nEBBAYGBg/mj54oWeF8s71qBBA/bt28f8+fNp3749ycnJtGzZkkmTJvHwww9z7tw5fHx8eOKJJ2jU\nqBEZGRncdddd1K5du8gWq1aw2d3wHX748GG6dOnCp59+Sv361tY2nz8/gYYNZxd5+6FDCQwc+IyJ\nEYlIQUrm5ZM3+mzSpEmpfk6ve9kV9poXl/e0Na2c8hqpFMZVGqmIiJhNdQHMpWReTmqkIuLalFTE\nGyiZl5MaqYiIiNW0AM4BXLGRioiIeA8l80LY7bBrF/y5nbBE1EhFRESsomn2Qvz4I3TvDmPHUuTi\nNhEREVehZF6I+vVh+3bYuRNuvBH27rU6IhG5mBqouKbz58/z0UevkZQUQ3JyL157bRQ//nioXPe5\nceNGQkNDOXLkSP6xZ555hvfff7/InynYDa20StoNbc+ePbz00ksArF69mqNHjwKQmpqaX4imOKXp\n9HY5SuZFuOoq+OgjiIuDDh1g7lxj+l1ERAp37tw5Zs/uB8TRosW7/P3vy2nSZBbvvdeRbds+L9d9\n+/n5MXbs2BJ/f8FuaM7SokULhg4dCsCbb77JyZMnAaOcd0mTuaPomvll2GwQHw8dO0K/frBiBcyb\nBy5U9EdExGV8+OFcWrR4h4IVrG02+Mc/DrJu3WO0a7euzPcdHh6O3W5n4cKF9O/f/4LbXnvtNVas\nWIGvry/t27dn1KhR+d3QFi9eTExMTP73rly5koULF3Lu3DlsNhsvvPACNWrUKLQb2tixY/H19eWn\nn34iJyeHHj16sHbtWn7++Wdeeuklfv75ZxYtWsTtt9/Onj17SExMpE+fPvzvf/8jISGBF154gVmz\nZrFlyxbOnTvHvffeS/fu3Qvt9FZeGpmXwLXXwpdfQvPm0LYtrFxpdUQi3slberK76/P55ZdPKKoV\nxZVXbuDrrwuvnV4SNpuNSZMm8eabb3Lo0F/T9t9++y0rV64kNTWVRYsW8f333/PZZ58xZMgQwsPD\nL0jkAD/88APz5s1j4cKFNG3alPT0dFavXp3fDW3SpElkZmbmf3/9+vV59dVXadq0KT/++CNz587l\nlltuYe3atflx3XzzzbRo0YKZM2dy9913U7t2bWbPnk1aWho//vgjCxcuZP78+bz88stkZmYyefJk\nnnnmGV599VX+/ve/l/k1KUjJvIQqVYKZMyElBe67D0aMgNOnrY5KRMR12O2ZRd5WvXoOv/32U7nu\nv0aNGowdO5bExMT8QkAHDhygTZs2+PgY6SwkJIR9+wrvlwFwxRVXkJiYyNixY/n222/Jzc3lwIED\nRXZDa9my5Z/xV+eaa67J//rMmTOX3HfB4kR2u51vv/2WXbt2MXDgQOLi4jh37hw//vjjJZ3eHEHJ\nvJQ6d4YdO4wV7+3bG4vkRMQcedXcLv7QVJU31+Dre02Rtx06VI/WrcPL/RidOnWiSZMmLFmyBDC6\nm3311VecP38eu93O5s2bady48QXd0PKcPHmSOXPmMHv2bJ544gkqVaqE3W6nWbNmbN26FeCSbmgl\nnSHx8fHJ77iW93XTpk0JCwtj/vz5vPHGG0RFRdGgQQPq1KnDd999B1Bkp7fSUjIvg5o1ITUVRo0y\nkvtzz8Gfv0MRkTLxhEsIN900lG+//dslx3NywM/vdq644gqHPM64cePw9/cHoHnz5kRFRdG3b1/u\nuusu6tevT9euXS/ohpanatWqhISEcPfdd/Pggw/SpEkTfv31V7p27Urt2rW56667GDduXKHd0Ir7\nHbRr147ExET++OMPQkJCeOCBB+jcuTNVqlShf//+xMTEYLPZCAgIYOrUqYwbN457772X/fv3O+Q1\nUde0ctq/H2JjoXp1eOMN+Nul72MRcQJP68pVXLKw6nmWtmva559/yKZNU2jUaCvVqtn57rs62Gy3\nc999L1CxYkVnhuox1DXNAs2aweefQ3g4tGsHH3xgdUQi3sHTptaLulzgbs/zppv+yYgRG6lT52NO\nn36DmJiviI9PViJ3Mm1NcwBfX5g82agaFxtrbGGbNYsiV3WKiHgyHx8fIiK6Wx2GV9HI3IFuvNGo\nHHf6NAQHw+bNVkckIo7iTteuxb2VZSbG9GR+9uxZEhMT6du3LwMGDGDPnj0cOnSIfv36ERsby+TJ\nk80OyaGqV4c334QpU6BHD5g+HUwuBCQibqqwEwarF8HVqFGD3377zZLH9lbHjh2jRo0apfoZ06fZ\nU1NTqVSpEosWLeLgwYOMGjWKOnXqkJCQQGhoKBMnTmT16tV07drV7NAc6u674YYbYOBA+OQTY396\nw4ZWRyUiUjo1a9Zky5YtbN68mZo1a2p2wonsdjvHjh3j+PHj1KxZs1Q/a/rI/LvvviMyMhIwVuod\nOXKEL7/8Mn/jfGRkJBs2bDA7LKdo2BA+/dQYoYeGwqJFVkckIiVVcERs1nYxV91H361bN5o2bapE\n7mQ2m42mTZvSrVu3Uv+s6SPza6+9lnXr1tG1a1e2b9/OsWPHLrg9ICDgglJ67q5CBUhMhK5doX9/\nWL4cXngBSjmDIiJiqZo1a5Z6tCjmMX1k3qdPHwICAujfvz+ffvopjRs3vuDaQFZWFtWrVzc7LKcL\nCYEtW6BqVaO+e3q61RFJeWlBlHdwxZGyyMVMT+ZfffUV4eHhLFy4kO7du1O7dm3atWvHxo0bAUhL\nSyMkJMTssEwREAAvv2xUjIuOhsceg7NnrY5KRPJcblrdbDphkNIwfZq9SZMmjBw5kuTkZCpVqsTj\njz/O+fPneeyxxzh79izNmjUjKirK7LBM9c9/wvXXw6BBEBEBCxfCNUWXNBYR8UqeVuXPmUxP5oGB\ngbz++uuXHE9JSTE7FEvVrWsUl3nhBWPV+5NPwr33Gr1/5S+u9sdc2Ait4DFXiVPKpuDvz9XeeyKX\no6IxFvLxgf/8B9auhWefhZgY0HZOEREpLSVzF9CqFWzcaGxla9vW2M4mrslVtw6JeApP6B5nBSVz\nF+Hvb9Rzf/VV+Ne/YPRoOHPG6qisoT9mcQU6QTOH/q4dQ8ncxdxyi1Hfff9+CAuD3butjkhELqYE\n5Dya/SobJXMXdOWVsGQJPPQQREbCiy+CK7yHzfoAc5c/ZleLR0S8l5K5i7LZ4L77YP16eOMN6NUL\njhyxOioRkfLTpTTHUzJ3cc2bGwm9bVvjv+XLrY5IxDspAZnPlWa/XP33rGTuBipWhCeegHfegQcf\nNP47dcqcx7b6A8yV/phdnat/2IjkcZdLae5EydyNREYai+OOHze6sG3fbnVEIt5DCUhcmZK5mwkM\nhLfegnHjoFs3ePppOH/eeY+nDzARzXp4K6tnJktDydxNxcbCpk3wwQdGUj982OqIxAru9GFzOe4W\nrziOBgaOoWTuxho3hnXroFMno8Xqu+9aHZGId1AC8g7uNDNpeqMVcawKFWD8eKPYTP/+RvOW556D\natUc/1hlefNu+PBD/rdmTZG3X9m5Mzf885/lCcurqTGI86ipjrgTJXMPcf31sG0bjBgB7drBggUQ\nHm51VFA3KIgK997L9ceOXXJbRq1a1ImPtyAqcQWumiw13S/uSNPsHqRqVXjlFZg5E26/HaZMgdxc\na2Nqcu21fN+rV6G3/dCrF43//neTIxIpGXeaYhXnc/Xfu5K5B7rzTti6FT7/HG6+GQ4etDae9mPG\nsLFmzQuOZdSqxfVjx1oUkWdy9Q+biylZijiOkrmHqlcPVq6EPn2Mhi0pKdbVdy9sdK5RubgST9kV\nIN5LydyD+fhAQgKsWgUzZkC/fvD779bEUnB0rlG5uBvNFoirUzL3Am3awObNRje2Nm3gs8/Mj6Hg\n6FyjcrmY1clSU/7i7pTMvUTlyjBnDrz8MtxzD4wdCzk55sbQfswY5tSvr1G5iIiDKZl7mR49jJru\nu3bBjTfC3r3mPXaTa68lZN48jcpFRBxMydwLXXUVfPghxMVBRAQkJ5u3OO7GqChzHkikjDS1Lu5I\nydxL2WwQHw9paUYyv+MOOHrU6qhERKQslMy93LXXwpdfQosW0LYtfPKJ1RGJiEhpKZkLfn7w5JNG\nCdgHHoDhw+H0aaujEhGRklIyl3ydOhmL437+Gdq3h507rY5IRERKQslcLlCzJrzzDoweDZ07w7PP\nwvnzVkclIiKXo2Qul7DZ4F//Mq6lv/MO3HqrMVoXERHXpGQuRWrWzGjWEh5utFX94AOrIxIRkcIo\nmctl+frC5MmwZAmMHAmDB0NWltVRidnUcETEtSmZS4nceKOxOO70aQgONmq9i4iIa1AylxKrXh3e\nfBOmTDHKwk6bBufOWR2ViIj4mv2AdrudRx99lIMHD1KhQgWmTp1KhQoVGDNmDD4+PgQFBTFx4kSz\nw5JSuPtuY6Q+cKDRM33+fGjUyOqoxNEKm1YveEwlT0Vch+kj8/T0dLKzs3n77bcZOnQos2fPZvr0\n6SQkJLBgwQLOnz/P6tWrzQ5LSqlBA1i92hiht28PixZZHZGIiPcyPZlXqlSJzMxM7HY7mZmZ+Pr6\nsnv3bkJDQwGIjIxkw4YNZoclZVChAiQmwscfw8SJxkj9jz+sjkocRT2+RdyH6ck8JCSEM2fOEBUV\nxYQJExgwYMAFHwwBAQFkZmaaHZaUQ0gIbN0KVapAmzbwxRdWRyQi4l1MT+avvPIKwcHBrFy5kg8/\n/JDExETOnj2bf3tWVhbVq1c3Oywpp4AASEoyKsb16QMTJkCBX6uIiDiR6cn81KlTVK1aFYBq1aqR\nm5tLy5Yt2bhxIwBpaWmEhISYHZZcRlZWFqmps5g/P4HU1FlkXWaj+e23w7ZtsHEj3HQTfPediYGK\n02hqXcS1mb6aPS4ujrFjx9KvXz/OnTvH6NGjue666xg/fjxnz56lWbNmREVFmR2WFCEjYyXp6cNo\n3Xoffn6QkwNJSUlERMwhLKx7oT/zt7/BihUwZw7ccIPRke3ee40ysSIi4nimJ/Pq1avz4osvXnI8\nJSXF7FCkGFlZWaSnDyMkZF/+MT8/CAnZR3r6MFq12kZAQEChP+vjY7RS7dIF+vUzkntyMtSqZVb0\n4s3yttBpNkG8hYrGWKQ0U9dWWb48mdat9xV6W+vW+1ixYm6x99GqlTHl3rAhtG0Ln37q6CjF2VTK\nVcT1KZlbICNjJUlJ7QgMHEXDhrMJDBxFUlI7MjJWWh3aBU6fPoyfX+G3+flBdvbhEt2Pvz/MmgWv\nvmp0Yxs9Gs6ccWCgIiJeTsncZAWnrvMSZcGpa1caofv71ycnp/DbcnKgcuX6pbq/W24x6rvv3w9h\nYbB7twOCFPlT3gxCwVmEwo6JeCIlc5M5YuraLD17DmbnzqBCb9u5M4iePQeX+j6vvNLowPbQQ3Dz\nzfDii6DLmq5HiVHEvSiZm8xRU9dmCAgIICJiDlu2BOWP0HNyYMuWICIi5lClSpUy3a/NBvfdZxSX\neeMNuO02OHLEcXGLd1LFOsnjjSedSuYmc/TUtbOFhXVnyJBtnDgxi0OHEjhxYhbx8duL3JZWGs2b\nGwn9H/+Adu2MFe/iGpQYRdyL6VvTvF3PnoNJSkq6YLtXnp07g4iPL/3UtbMFBAQQEzPSKfft52e0\nUu3e3ajtfttt8NRTULmyUx5OxCNpK55oZG4yZ01du7ubb4YdO+C33yA01FgoJ1JWmkHwPt6+zkMj\ncwuEhXWnVattrFgxl+zsw1SuXJ/4+MFOT+RZWVksX57M6dOH8fevT8+eg4ss+mKFwEB46y1YuNBY\n+Z6YCCNHGgVoxDpKiiKuT8ncIs6cui5MWcqyWsFmg9hY6NABBgww2qu++SbUq+eI+3bvqUh3j18c\nq7DRZsFj3vY+Kfh8vfFvRWMeL+BOe9vzNGkC69YZ0+/BwfDee1ZHJCLiupTMTWZFGVd32ttekK8v\nPPYYfPihMeUeFwcnT1odlYhjlPdarnYcSEFK5iayqoyrO+1tL0xYmNFWFYwtbH92yy0Rd18U4+7x\ni1jBG09olMxNYuVUt7vtbS9MtWpGbffp043ta48/DufOWR2ViIhrUDI3iZVT3c4oy2qV6GjYsgXW\nroWOHeH77y///e4+Fenu8cuFnDXToveDKJmbxMqpbk/b216/PqxaBbffDu3bG1vZRES8mbammSRv\nqruwhG7GVLdVe9udxcfHaKXapQv07w/Ll8NLLxl71UVcVUm2T3njtiopP43MTeIKU915e9sHDnyG\nmJiRbpvIC2rXDjZvhiuugLZt4fPPi/5ed5+KdPf4RcR5lMxN4mlT3a6kShWjleoLL8Bdd8Gjj8LZ\ns1ZHJSJiHk2zm8jTprpdTa9eRk33f//bqCC3cCEEFT4ZImK5wqbcC/Lmam5SekrmJjO7jKu3qVMH\nli0zrp/feKOxlS0uzigT6w10vVXEOymZuyBXb4ji6mw2ePBB6NQJ+vUzFsfNmwdXXml1ZNZRkndt\n3l5XXMpP18xdjFVV4jxRy5aQkQHNmhmL41atsjoiERHnUDJ3Ie7YEMXVVaoETz8Nb7wB994LCQlw\n+rTVUTmWSr6KuB6z//6UzF2IuzZEcQddu8KOHfDDD0at96+/tjoi8yjJuxdtQZSyKFEy/+ijj5g9\nezanTp3i/fffd3ZMXsvdG6K4ulq14N13Yfhwo7XqnDngCZ+ZRZV8FRHvUWwyf/rpp/nss8/4v//7\nP3Jzc1myZAkzZswwIzav4wkNUVydzWZsXduwAVJSoEcP+OUXq6NyDtV1FzGXlZe8ik3m6enpPPXU\nU1SqVInq1avz2muvkZaW5tSgvJUrVInzFkFB8MUXEBpqVJH76COrIxIRKbtik7mPj/EteWcVOTk5\n+cfEscyuEpeVlUVq6izmz08gNXWW1y2wq1gRpk6FxYvhP/+B+Hg4dcrqqMpHo24R61g5G1bsPvOo\nqChGjBjBiRMneOONN/jwww/p1auXU4PyZmZVicvIWEl6+jBatzZWzufkQFJSEhERcwgL6+7Qx3J1\nERFG5bgHH4TgYHjrLeP/nkQJXsSzFZvM4+LiWL9+PVdffTU///wzw4YNo1OnTmbE5rWcXSWu4Ba4\nPAW3wLVqtc3ritTUqAELFhiJPCrK6Mg2ahRUqGB1ZOJuVPRFrFBsMo+Ojmbp0qXcdNNNZsQjJijJ\nFjhvLTnbr59R133AAPj4Y5g/Hxo0sDoqEXE3Zp/MFZvMa9WqxebNm/nHP/6BX1H7pkph6dKlLFmy\nBJvNxpkzZ9izZw8LFy5k2rRp+Pj4EBQUxMSJE8v9OFI0bYG7vEaNYO1aePJJCAn5qxubiIirKjaZ\n79q1i9jY2AuO2Ww2vvnmmzI9YO/evenduzcAU6ZMITo6mhdffJGEhARCQ0OZOHEiq1evpmvXrmW6\nfyle3ha4whK6tsAZKlSAceOgWzfo3x9WrDD2pVerZnVkjqPp4EuV9TVR17PC6T1mnmKXpX/55Zfs\n2bPngv8xmU+8AAAgAElEQVTKmsgL2rlzJ9999x0xMTF8/fXXhIaGAhAZGcmGDRvKff9SNG2BK7n2\n7WHbNuPEp21bY3+6iIirKTaZZ2dn89RTT3HnnXdy++23M336dE45YP/O3LlzGTZs2CXHAwICyMzM\nLPf9S9HM3gLnTgor7hAQAHPnwjPPQO/eMHky5OZaFKC4JBXoEasVm8ynTJlCdnY206ZN48knn+Ts\n2bPlvqadmZnJ999/T/v27Y0gCuxbz8rKonr16uW6fyleWFh3hgzZxokTszh0KIETJ2YRH7/d67al\nlcYdd8DWrUaxmchIOHDA6ohKT01ZLuXs18TbXlu9x6xR7DXzr7/+mg8//DD/3xMmTKBHjx7letBN\nmzYRHh6e/+9rr72WTZs20b59e9LS0i64TZzH2VvgPNHVV8Mnn8Dzz0N4uNGRbcAAo0ysiHiuklz/\nt3KNQLEjc7vdzh9//JH/7z/++IMK5dx8e/DgQRoU2O+TmJjI888/T9++fcnNzSUqKqpc9y9SGqUd\nSfj4wIgRsHo1zJwJffvC8eNmRlx2mg6+lKNfE29+LUHvMasUOzIfNGgQ0dHRdO7cGYA1a9bwwAMP\nlOtB4+LiLvh348aNSUlJKdd9ipjtH/+ATZsgMRHatDH2pHfsaHVU4gq0ul3MVmwy79OnD61bt2bT\npk2cP3+eF154gebNm5sRm4gpCn6wlnaarHJlY8q9Rw9jC9uAATBlSuHb/kTEvZTkpMxVTtyKnWbf\nu3cvL7/8Mv379+fGG29k8uTJHHDHlT8iThQVZdR3370bbrgB9uyxOqLiadrzUo56TTTVbPC252ul\nYpP5Y489ll/kpVmzZgwdOpRHH33U6YGJuJvateGDD+CBB+CmmyApCfQ5JuK+SnJS5ionbiXaZx4Z\nGZn/7w4dOpCdne3UoESsUt4/QJsNBg+Gzz+HefPg9tvh6FEHBigiUohik3nNmjV5++23ycrK+rP/\ndSq1atUyIzYRt9WihVEt7tprjcVxn3xidURiFU01ixmKTebTp09n3bp1RERE0LlzZz777DOeeOIJ\nM2ITcWt+fkazloULjan34cNBk1oi7qkkJ2VWnrgVu5r96quvJjk5GTAqt/3yyy/UrVvX6YGJeIpO\nnWDHDhgyxKj1/tZbxrY2b6TGGyLOUWwyX7x4MVu3buXhhx/mjjvuICAggFtuuYWRI1U5TIqXlZXF\n8uXJnD59GH//+vTsOZiAgACrwzLdFVfAokWQkgJduhgd2YYPNwrQiIiUV7EfJW+//TaJiYksW7aM\nLl268NFHH/H555+bEZu4uYyMlSQltSMwcBQNG84mMHAUSUntyMhYaXVolrDZYOBAyMiAxYuN7Ww/\n/WR1VCLiCUo0LggMDOSzzz6jY8eO+Pr6cubMGWfHJW4uKyuL9PRhhITsyy+g4ucHISH7SE8fRlZW\nlrUBWqhpU0hLgw4dIDgYli61OiLnUuMNKUi/d+coNplfc801DB48mMOHD3PDDTcwfPhw/uGtF/yk\nxJYvT6Z1632F3ta69T5WrJhrckSuxdcXJk40Evno0XD//XDypNVRiXgWbzpxKPaa+bRp09i2bRtB\nQUH4+fnRu3dvIiIizIhN3Njp04eLLGnq5wfZ2YfNDchF3XCDUTnuP/8xRukLFxqL5DxJecrlikjJ\nFJvMfX198/uOA3RUJwm3YPXCM3//+uTkFF6jPCcHKleub1osrq5aNXj9deM6eq9eRmIfMwbK2ZxQ\nxGW4Sv1yT6a1tB7IFRae9ew5mJ07gwq9befOIHr2HGxaLFYp7RRfTAxs3my0Vu3UCX74wYnBiXgo\nb12joWTuYVxl4VlAQAAREXPYsiWInBzjWE4ObNkSRETEHKpUqWJKHO6mQQP49FO47ba/9qR7ElVD\n806uUr/ckxWZzHNzc3nzzTeZMWMGmzdvvuC2OXPmOD0wKRtXWngWFtadIUO2ceLELA4dSuDEiVnE\nx28nLKy7aTG4Ix8fePhhowTslClGa9UTJ6yOSsQ9eOuJQ5HJfMKECXzzzTdcddVVPPLIIyQlJeXf\ntmbNGlOCk9JztYVnAQEBxMSMZODAZ4iJGenxI3JHTvEFB8PWrVCjhlHfXeUdRKQoRS6A27VrFx9+\n+CEAd9xxB4MGDcLf359BgwZ59NmNu9PCM89SpQq89BJ89BHcdRfExRlb2ipWtDoykbJR/nCOIkfm\ndrudU6dOAUbntHnz5jF//nw++ugjj15E4O608Mxazpriu+022LYNtmwxis3sK/xKiogU4OlT6wUV\nmcxjY2Pp3bs3GzZsAKBOnTrMmzePWbNmsX//ftMClNLRwjPPVbcurFhhlIS98UZ45RXwks8pESlG\nkdPsd999N2FhYfgVmK9t1qwZy5YtY/HixaYEJ2UTFtadVq22sWLFXLKzD1O5cn3i4wcrkRfD6r35\nJWGzwUMPGVvX+vUzkvu8eVCrltWRiYiVLls0pnHjxpccCwgIYNCgQU4KRxwlb+GZlExGxkrS04fR\nurWxpS8nB5KSkoiImFPm1ffOnN677jrYuNHovtamDbzxBnTt6rSHExEXp33m4vVcZW9+aVWqBM88\nY1SPGzQIRo0C9UAS8U5K5uL1XGlvfll06wY7dsDBg3D99fD111ZHJCJmK7Y2e05ODunp6fzxxx8X\nHL/jjjucFpSImVxtb35Z1KoF770Hr70GHTsa29cefNC4xi4inq/YZH7//fdjt9upV6/eBceVzMVT\neMrefJvN2IceGWlUjVuxwkjudetaHZmIOFuxyfz48eP5xWNEPFHPnoNJSkoiJOTSqfadO4OIj3ev\nvflBQfDFFzB5MrRrZ6x279XL6qhExJmKvWYeHh7O+vXrOX/+vBnxiJjOE/fmV6wIjz8OqakwbBjE\nx8OfNaBExAMVOzK/+uqr+fe//51f9c1ut2Oz2fjmm2+cHpyIWTx1b/5NN8H27cb18+BgowtbcLB5\nj1/wc0PE01n5fi92ZD5//nzWrFnDN998wzfffMOePXuUyMUjBQQE0KPHA/j71yM7+78sW5bkstvS\nSqNGDViwACZMgKgomDkTNNEm4lmKTeZXXXUVgYGBZsQiYqmMjJUkJbUjMHAUDRvOJjBwFElJ7cjI\nWGl1aA7Rrx9s2gTLlhkFZv77X6sjEhFHKXaavU6dOvTq1Yvg4GAqFmjVNH36dKcG5uncoXSoNylY\nOCZPwcIxrVpt84jfT6NGsHYtPPkkhITAiy9CTIxjH6OwRkwFj2nKXTyJq7zfi03mHTt2pGPHjg59\n0Llz57JmzRpyc3OJjY0lODiYMWPG4OPjQ1BQEBMnTnTo47kaZ5QOlfIpSeEYTymPW6GCUQa2Wzdj\nC9vy5TBnDlSrZnVkIlJWxSbz3r178/vvv5OdnY3dbufcuXMcPlz2IhobN25k27ZtLFq0iFOnTvHK\nK6+wcuVKEhISCA0NZeLEiaxevZquHlpo2ltGgFYqy6yHJxSOKa327WHrVkhIgLZtjevqN9xQ/vst\nOBLRAjjxdK7yfi/2mvmsWbPo0qULUVFR9OvXj1tuuYXk5OQyP2B6ejrNmzdn6NChxMfH07lzZ3bv\n3k1oaCgAkZGR+W1XPZG7lw51dWW97p1XOKYwZhSOsdlshU7XOVvVqjB3Ljz9NPTubexNz801PQwR\nKadik/myZcv47LPP6NGjB/Pnz+f111+nQYMGZX7A48ePs2vXLp5//nkmTZrE6NGjL9jDHhAQQGZm\nZpnv39V54wjQLOVpmNKz52B27gwq9LadO4Po2dO9CseUVu/exij9iy+MCnIHDlgdkYiURolWs1et\nWpWgoCD27NlDeHg4+/YVPrIsicDAQG666SZ8fX1p0qQJlSpV4uTJk/m3Z2VlUb169TLfv6uzegTo\nycoz6+GJhWNK6+qr4ZNPjAVxYWEwfz6Ud7bQbrdril28hpXv92KTedWqVXn//fe57rrr+Oijj9i+\nfTu//fZbmR8wJCSEzz//HIAjR46QnZ1NeHg4GzduBCAtLY2QkJAy37+r8/YRoDOVd9YjLKw7Q4Zs\n48SJWRw6lMCJE7OIj9/utEWJeVPrBafXCztmJh8fGDkSVq829qP37QvHj1sSioiUQrEL4J544gmW\nL1/OHXfcwdq1a5kwYQIjR5Z9VW/Hjh3ZvHkz0dHR2O12Jk2aRL169Rg/fjxnz56lWbNmREVFlfn+\nXV3eCPDi1ew7d3rPCNBZHNEwJSAgwGNWrZdHmzbGnvTEROPrN9+ETp2sjkpEimKzFzMnsGfPHlq0\naHHBsU8++cTShHv48GG6dOnCp59+Sv367jktnZWVdUHp0J493b90qNWysrJISmpXaMOULVuCiI/f\n7rKvsSuv+v7kE6MbW2wsTJ1a+MmSiDhXcXmv2Gn2oUOH8sorrwDw+++/M2LEiHKtZhdD3ghw4MBn\niIkZ6bJJxp3ourdzREUZ9d337DG2ru3ZY3VEInKxYpP5kiVL2LNnD3379iUmJoY2bdrw7rvvmhGb\nSKmZfd3bW9SuDe+/Dw88ABERkJRU/sVxIuI4xV4zt9vtVKxYMb9ojM1mw8en2HMAEcu443VvV5xe\nv5jNBoMHw803G5XjVqyAV16Bq66yOjIRKTYr9+rVi3r16vHee++RmprK9u3biY6ONiM2EXFBLVrA\nhg3QsqVROe7jj62OSESKHZnPmzePli1bAlCzZk2effZZPtZfr4hX8/ODGTOM6+kDB8IddxjNWypX\ntjoyKQ9XXogpl1fkyPytt94CoGXLlpcUidm6datzoxIRt9CxI+zYAb/+CqGhxtciYr4ik/nixYvz\nv37kkUcuuG3z5s3Oi0hE3MoVV8Dbbxt70rt2hdmzoUCFZhExQZHT7AWnWS6ectEUjJSFerh7LpvN\nmG6PiDD2o3/8MbzxhlEiVlxDUVPortKPW8qnRMvSL/5lW1VqUtxXWbuZiXtp2hTS0qBDBwgOhqVL\nrY5IxDsUmcyVsMVRytPNTNyPry9MnGgk8tGj4f77oUAvJXExec1BLp6NVZMc91LkNPu+ffvo0qUL\nYDREyfvabrdz9OhRc6ITj1CSbmbuti9cinfDDUbluP/8xxilL1gA119vdVTeRVPo3qPIZL5ypaY/\nxTHUw917VasGr78OixdDr14wfDiMGQMVKlgdmYhnKTKZ16tXz8w4xIM5opuZuLeYGAgPNxbJrVwJ\nKSnQqJHVUXm+giPvkuwh10jdfakuqzidergLQIMG8OmncNtt0L49/FnKQkQcQMlcnE7dzCSPjw88\n/LDRVnXqVKPG+4kTVkcl4v6UzMUU6mYmBQUHw5YtEBgIbdrA559bHZHn0+p0z1ZsbXYRR3HHbmbi\nPFWqwIsvwq23wl13wb//DZMmQcWKVkcm4n40MhcRS/XqZWxh27bNKDazr/BdjCJyGUrmImK5OnVg\n+XJjtfuNN8Krr4JmhEVKTslcRFyCzQYPPQTr1sGcOdCnD/z2m9VRibgHJXMRcSnXXQcZGUad9zZt\nYPVqqyMScX1aACciLsff3yhwsmqVnUGDjAVy06aBv7+1cYm4Ko3MRcRlde0KO3bADz9AWBh8/bXV\nEYm4Jo3MRRxAvdqdp1YtePddeO016NgRJkwwrq2rsaPIX5TMRcopI2Ml6enDaN3aaPGakwNJSUlE\nRMxxyaI4rnriUZIOX5GREBsLK1YYDVzq1jUzQhHXpWl28QhZWVmkps5i/vwEUlNnmdYj3d16tWdk\nrCQpqR2BgaNo2HA2gYGjSEpqR0aGe3RJDAqC9HQIDYV27WDZMqsjEnENSubi9qxMUCXp1e4qXP3E\nI6/caMGSo4Udq1jRqOu+eDEMGwZDh8KpU1ZELOI6lMzFrVmdoNypV7s7nXiURESEUTnujz8gJMSo\nICfirZTMxa1ZnaDyerUXxtV6tbvTiUdJ1agBCxbAY49B9+4wcyacP291VCLmUzIXt2Z1gnKnXu3u\ndOJR2g5f/frBpk3GNfQuXeC//3VicCIuSMlc3JrVCcqderW704lHWTRqBGvXQrduxgK51FSrIxIx\nj5K5uDVXSFDu1Kv9/PmOrF0b6PInHmVVoQKMG2c0bRk/HgYNMq6pi3g6S/aZ33nnnVStWhWA+vXr\nM2TIEMaMGYOPjw9BQUFMnDjRirDEDeWNjC/e571zp7kJytV7tefthW/TZh/nzsHGjfDrrzVo2PBu\nhg6d7RGJvKDQUNi6FRISjC1sCxbADTdYHZWI85iezHP+HBLMnz8//1h8fDwJCQmEhoYyceJEVq9e\nTdeuXc0OTdxUWFh3WrXaxooVc8nOPkzlyvWJjx+cn6BctUiKWQqu+M8TEQFwgi1b1pbq2rQ7qVoV\n5s6FpUuhd2+Ij4dHHwVflcoSD2T623rPnj2cOnWKuLg4zp07x8iRI9m9ezehoaEAREZGsn79esuS\nubd/8LurokbG7ladzRlKsuLflWcVyqt3b6Ou+6BBEBlpjNKbNrU6KhHHMj2Z+/v7ExcXR0xMDN9/\n/z3333//BSODgIAAMjMzzQ4L0Ae/pylsRFpwD3qrVtu84kTN6hX/ruDqq+GTT+C554zE/swzMGCA\n6ruL5zB9AVzjxo355z//mf91YGAgv/32W/7tWVlZVK9e3eywLC8+Io5n9R50V2H1in9X4eMDI0ca\n/dFnzoS+feH4caujEnEM05P5kiVLmDFjBgBHjhzh5MmTdOjQgY0bNwKQlpZGSEiI2WHpg98DaURq\ncIUV/66kTRtjT3qdOsbX69ZZHZFI+Zk+zR4dHc24cePo378/NpuNGTNmEBgYyPjx4zl79izNmjUj\nKirK7LD0we+B8kakhf1ec3Lg119Pmh+UBVxlxb8rqVwZnn8ebr3VKDgzcCBMmVL4e0XEHZiezH19\nfZk5c+Ylx1NSUswO5QLFffB7y1SkJ+nZczAvvfQy7dt/d8ltGzdChQqfkpWV5RXXzYtb8e+tbr3V\nqO9+333G1rWFC6FFC6ujcqy8NrKeumtBDCoa8ydNRXoeI0l3Ii2NC4qkpKcbU6whIfu96vJJ3or/\ngQOfISZmpNcn8jxXXQUffAD3329s2Xv5ZVDeE3ejZP4ndyrLKSVXp05V2reHLVvgiy+M/4eGGn2x\ndflE8thsMGSIcaL3yitw++3w669WRyVSciqfUICmIj2Pv399KlQovPqXLp/IxVq0gA0bYMIEaNsW\nXn3VmIovCVeazrYVsueu4DFXiFEcS8n8Iq5ellNKp2fPwSQlJV2w1zzPzp1BxMfr8olcyM8PZsyA\nqChjYdwdd8CTTxqL5kRclabZXURWVhapqbOYPz+B1NRZ2tfuILp8ImXVsSPs2AFHjkD79sbX7iKv\nhWzBEXhhx8RzaGTuAlR5zrkud/lE5Xut4S6v+xVXwKJFkJICXbvC2LEwYoRRgAY0nS2uQ8ncYio5\nao7CLp/oJMoa7vS6F7wOHhEBsbFGWdg33jBKxIq4Ck2zW0yV56yh8r3WcOfXvWlTSEuDG2+E4GB4\n/333mM52pVjEeZTMLabKc9bQSZQ13P119/WFSZOMtqqjRsEDD4ALn3+IF1Eyt5iaYJgvKyuLzZs/\nYNMmYxtSdvaFt+skynnc4eTVZrPl/1fUsRtugG3bjL/R4GDYvNmqaKUkLv59eiIlc4up8py5MjJW\nkpTUjq5d0+jQAUJCjEIy+woMFnUS5TyedPJavbpx7XzqVOjRA6ZNs5Obq+lssYaSucW0dco8RV2v\njYgwth/ljdB1EuU87nDyWtrr4HfdZZwQ/t//QefO8MMPZkbrnrxhpGw2JXMXEBbWnSFDtnHixCwO\nHUrgxIlZxMdvd7mVve7uctdrr7/e+EDWSZRzeerJa4MGRp/0nj2NPelvv211RFKSyyWeRFvTXIQq\nzzlf8ddrbyYhYYXbJhR34allkytUgEceMfaj9+sHy5fDiy9CjRqlvy9XKg0r7kHJXLxGcW1u27a9\n3e0Tirtwl5PXsiTT4GDYutVY7d62rVFwJiLCCcG5GbML7BS8P284OdI0u8lUttU67nC9VjxDlSpG\nK9Xnn4foaHjsMTh71uqoxJMpmZsobyV1YOAoGjacTWDgKJKS2pGRsdLq0LyCp16vFdd1222wfbux\ndS0iAr77rujv9fRrvO5QYMedaZq9EM6oG62yra7BU6/XiuuqWxdWrIAXXjD2pz/5JNx7r9FDXczh\nDScLSuYXcVbd6JJUvnKHa4iewF2u14rnsNlg2DDo1MlYHLdiBSQnQ61af32Pmdd4veEasrfRNHsB\n5a0bfbnr4e5Q+UpEnKtVK9i4ERo2NBbHffqp1RFZ4+KpdU+5lGAlJfMCylM3urjr4Z5U+UpEys7f\nH2bNgldfhX/9C0aPhjNnrI5K3J2SeQFlHT2XZESvldTi7bST40K33GIsjtu/H8LCYPfuv24rzaKw\nkr6unr7AztspmRdQ1tFzSUb0WkktzubKyVI7OQp35ZWwZAk89BBERhpFZkpzGdudX1edXDiWknkB\nZR09l3REr7Kt4iyu/KHuzj3MzWCzwX33wfr1RuOWXr2MXgHFKe3rqq1hnk3JvICyjp5LM6LPW0k9\ncOAzxMSM1Ihcys3Vk6W79zA3S/PmRkJv2xbatTNWvF+Ou7+uOrlwLCXzi5Rl9Kzr4WIlV/9Q106O\nkqtYEZ54AhYtgvh4Y/o9r5vfxfS6SkHaZ16I0u5DzhvRX7w/fedOXQ8X53P1D/XiauK74k4OZxSO\nKo3ISNixw0joISHw1lvGiL2g8ryuGvl6Ho3MHUTXw8Uqrr7t0d1mrlxl/UFgoJHEx42Dbt3g6afh\n/Pm/bne31/VyNLVefkrmDqTr4WIFV/xQL7iyfvnyZEJCnnKLnRyutv7AZoPYWKPQzPvvG9vZfvzR\nuE07ZKQgTbOLuDlXu8xTWEnkLVuCCA19il9/PeDSNfFdtexykyawbh1Mn260WH3pJejTR70G5C9K\n5iIewFU+1C/XUGjz5ocZMsS1Gwq58voDX1+jleottxij9RUr4LnnoGrVAHr0eIDly5PJzv4vy5Yl\nmX6NX6ynZC7iIVyhgYyrjmxLyh0W64WFwbZtMHy4sShu7Ngv+f33gQ5vDiXuxbJr5r/99hsdO3bk\n4MGDHDp0iH79+hEbG8vkyZOtCklEysmVR7Yl4YrrDwpTtapR233y5NOMGHENX399NxUqVABcq8aA\nmMeSZJ6bm8vEiRPx9/cHYPr06SQkJLBgwQLOnz/P6tWrrQhLRMrJ1VfWF8fdFpVVrPgSSUlt2b69\nIyNGrOOXXxrl3+YKNQbEPJYk8yeffJJ77rmHq666Crvdzu7duwkNDQUgMjKSDRs2WBGWiJSTu4xs\nL8edtpmePn2YevV+5Omnu3HTTUsZMmQTq1b1B9xjJkQcx/Rr5kuWLKFWrVp06NCBpKQkAM4X2DwZ\nEBBAZmam2WGJOJ3VhUjM4Gor68vKFdYflMRf1/jt3HXXLIKDP+Xxx9/iyy978OCDQ11+JkQcx5Jk\nbrPZ+OKLL9i7dy+JiYkcP348//asrCyqV69udlgiTlXYdi1PXaTkKivrvUHPnoNJSkrK3z1wzTU7\nSEoKJTl5Jvfdt4tFi660OEIxi+nJfMGCBflfDxw4kMmTJzNz5kw2bdpE+/btSUtLIzw83OywRJzm\nctu10tOH0aqVa2/XKgt3Gdm6u8JmQnx8somIeJ6bbrqBQYPqc++9MGmSUffdk3jDTFdpuEQFuMTE\nRJ5//nn69u1Lbm4uUVFRVock4jCu3ghF3FtR1/gTEkLYtg22b4cbb4Rvv7U6UsdxlZK7rsTSfebz\n58/P/zolJcXCSEScx923a4nrK2ompE4dWLYMXn4ZOnSAadOM3uk2mwVBOoijZro8bWTvEiNzEU/m\n7tu1xL3ZbDB0KHz2mVEG9s474X//szqqsnPETJcnjuyVzEWczBO2a4n7a9kSvvwSrrkG2rSB//s/\nqyMqm/LOdLlaMx1HUTIXcTJ3K0QinqtSJXjqKZg/H+LiYORIOH3a6qhKp7wzXZ66hkXJXMQE7lSI\nRDxfly6wYwf8979w/fWwa5fVEZVceWe6PHUNixqtiJhE27XEldSsCYsXwxtvQKdORke2YcNcf3Fc\neQsTuUMznbLQyFxExEvZbHDvvbBhAyxcCD16wM8/Wx1V8coz0+Wpa1g0MhcR8XLXXAPp6TB1KgQH\nQ3Iy/POfVkd1eWWd6fKUksMXUzIXEREqVoQpU6B7dxgwAFasgGeeATfeel0kTyw5rGQuIiL5OnSA\nbduM6+fBwfDWWxASYnVUjudpa1h0zVxERC5Qo4axfW3yZLj1VpgxA86dszoquRyNzEWcxNPKRYr3\n6dvXqOs+YAB88omR4Bs2tDoqKYxG5iJO4InlIsU7NWwIa9ZAVBSEhsI771gdkRRGyVzEwTy1XKR4\nrwoVYMwYY1HchAnwr3/BH39YHZUUpGQu4mCeWi5SJDQUtm4Ff39o2xbWr7c6IsmjZC7iYJ5aLlIE\njK1qyckwe7bRgW3SJMjNtToqUTIXcTC1PBVvcPvtxha2DRvgpptg/36rI/JuSuYiDuap5SJFLva3\nv8HHHxur3sPDjTrvdrvVUXknJXMRB1PLU/EmPj4wfLix4v2ZZ+Duu+HYMauj8j5K5iJOoJan4m1a\nt4ZNm+Dqq43FcWvXWh2Rd1HRGBEn8bRykSLF8feHZ581qsbFxkL//kbzlkqVrI7M82lkLiIiDtW9\nO2zfDt9+a1xL/+YbqyPyfErmIiLicLVrw9KlEB8PkZHw0ktaHOdMSuYiIuIUNhs88IDRK/211+C2\n2+DXX62OyjMpmYuIiFP9/e9Gtbh//MNYHPfxx1ZH5HmUzEVExOn8/GDaNHj7bRgyxOiXnp1tdVSe\nQ8lcRERMc/PNxuK4o0eNWu87dlgdkWdQMhcREVNdcYUxQh8zBrp2NYrNnD9vdVTuTclcRERMZ7PB\ngAGwcSMsWQK33AI//mh1VO5LyVxERCzTpAl89pmxfS04GN57z+qI3JOSuYiIWMrXFyZMgA8+gMRE\niGfjaZ4AAA0sSURBVIuDkyetjsq9KJmLiBQiKyuL1NRZzJ+fQGrqLLKysqwOyeOFhxttVe12aNfO\nmIKXklEyFxG5SEbGSpKS2hEYOIqGDWcTGDiKpKR2ZGSstDo0j1etmlFgZvp0o8jM44/DuXNWR+X6\nTE/m58+fZ9y4cdxzzz3079+f7777jkOHDtGvXz9iY2OZPHmy2SGJiOTLysoiPX0YISH78PMzjvn5\nQUjIPtLTh2mEbpLoaNiyxei+dvPNcPCg1RG5NtOT+Zo1a7DZbLz99tsMHz6cWbNmMX36dBISEliw\nYAHnz59n9erVZoclIgLA8uXJtG69r9DbWrfex4oVc02OyHvVrw+rVsEddxhFZqRopifzrl27MnXq\nVAB++uknatSowe7duwkNDQUgMjKSDRs2mB2WiAgAp08fzh+RX8zPD7KzD5sbkJfz8YHRo+HDD62O\nxLVZcs3cx8eHsWPH8vjjj9OrVy/sBVrpBAQEkJmZaUVYIiL4+9cnJ6fw23JyoHLl+uYGJICR1KVo\nlr0806dPZ+XKlYwfP54zZ87kH8/KyqJ69epWhSUiXq5nz8Hs3BlU6G07dwbRs+dgkyMSKZ7pyfz9\n998nOTkZgEqVKuHj40OrVq3Y+OcehLS0NEJCQswOS0QEMGYHIyLmsGVLUP4IPScHtmwJIiJiDlWq\nVLE2QJFC+Jr9gFFRUYwZM4bY2Fhyc3MZP348TZs2Zfz48Zw9e5ZmzZoRFRVldlgiIvnCwrrTqtU2\nVqyYS3b2YSpXrk98/GAlcnFZpidzf39/nn322UuOp6SkmB2KiEiRAgICiIkZaXUYIiWiJQUiIiJu\nTslcRETEzSmZi4iIuDklcxERETenZC4iIuLmlMxFRETcnJK5iIiIm1MyFxERcXNK5iIiIm5OyVxE\nRMTNmV7O1RHOnTsHwC+//GJxJCIiIs6Xl+/y8t/F3DKZHz16FID+/ftbHImIiIh5jh49SqNGjS45\nbrPb7XYL4imX06dPs2vXLmrXrk2FChWsDkdERMSpzp07x9GjR2nVqhX+/v6X3O6WyVxERET+ogVw\nIiIibk7JXERExM0pmYuIiLg5JXMRERE355Zb0xzp/PnzjB8/noMHD+Lj48PkyZPx8/NjzJgx+Pj4\nEBQUxMSJE60O02F+++03+vTpw+uvv06FChU88nneeeedVK1aFYD69eszZMgQj3uec+fOZc2aNeTm\n5hIbG0twcLDHPcelS5eyZMkSbDYbZ86cYc+ePSxcuJBp06Z51PO02+08+uijHDx4kAoVKjB16lSP\n+9s8e/Ys48eP54cffqBixYo8+uijVKlSxaOe444dO3j66adJSUnh0KFDhT631NRU3nnnHSpWrMiQ\nIUPo2LGj4wKwe7lVq1bZx40bZ7fb7faMjAx7fHy8fciQIfZNmzbZ7Xa7fcKECfZVq1ZZGaLDnD17\n1v7ggw/au3fvbj9w4IBHPs8zZ87Ye/fufcExT3ueGRkZ9iFDhtjtdrs9KyvL/txzz3ncc7zY5MmT\n7ampqR75PNPS0uwjRoyw2+12+xdffGEfNmyYxz3PBQsW2B977DG73W63HzhwwN67d2+Peo7z5s2z\n9+rVy3733Xfb7fbCP3OOHj1q79Wrl/3s2bP2zMxMe69evew5OTkOi8Hrp9m7du3K1KlTAfjpp5+o\nUaMGu3fvJjQ0FIDIyEg2bNhgZYgO8+STT3LPPfdw1VVXYbfbPfJ57tmzh1OnThEXF8egQYPYsWOH\nxz3P9PR0mjdvztChQ4mPj6dz584e9xwL2rlzJ9999x0xMTF8/fXXHvc8K1WqRGZmJna7nczMTHx9\nfT3u9/ndd98RGRkJQJMmTThy5AhffvmlxzzHRo0a8eKLL+b/++L36fr16/nqq68ICQnB19eXqlWr\n0rhxY/bu3euwGLx+mh3Ax8eHsWPHsmrVKp577jm++OKL/NsCAgLIzMy0MDrHWLJkCbVq1aJDhw4k\nJSUBxiWGPJ7yPP39/YmLiyMmJobvv/+e+++/H3uBUgqe8DyPHz/OTz/9RHJyMv/973+Jj4/3yN9l\nnrlz5zJs2LBLjnvK8wwJCeHMmTNERUXx+++/k5SUxObNm/Nv94Tnee2117Ju3Tq6du3K9u3bOXbs\n2AW3u/tz7NatGz/++GP+vy/+zDl58iRZWVlUq1Yt/3iVKlUc+pyVzP80ffp0Ro8eTXR0NGfOnMk/\nnpWVRfXq1S2MzDHyrj1+8cUX7N27l8TERI4fP55/u6c8z8aNG+eXOmzcuDGBgYHs3r07/3ZPeJ6B\ngYE0a9YMX19fmjRpQqVKlThy5Ej+7Z7wHPNkZmby/fff0759e8A48c7jKc/zlVdeITg4mJEjR3Lk\nyBEGDBjA2bNn82/3hOfZp08f9u/fT//+/QkODqZx48Ye+fmTp7D3adWqVTl58uQlxx32mA67Jzf1\n/vvvk5ycDBjTXT4+PrRq1YqNGzcCkJaWRkhIiJUhOsSCBQtISUkhJSWFFi1aMHPmTG666SY2bdoE\neM7zXLJkCTNmzADgyJEjnDx5kg4dOnjU7zMkJITPP/8cMJ5jdnY24eHhHvUc82zatInw8PD8f197\n7bUe9549depU/oLNatWqkZubS8uWLT3q9/nVV18RHh7OwoUL6d69O7Vr16Zdu3Ye9RwLatmy5SXv\n09atW7NlyxZycnLIzMzkwIEDBAUFOewxvX5kHhUVxZgxY4iNjSU3N5fx48fTtGlTxo8fz9mzZ2nW\nrBlRUVFWh+kUiYmJPPbYYx71PKOjoxk3bhz9+/fHZrMxY8YMAgMDPer32bFjRzZv3kx0dDR2u51J\nkyZRr149j3qOeQ4ePEiDBg3y/+2J79m4uDjGjh1Lv379OHfuHKNHj+a6667zqN9nkyZNGDlyJMnJ\nyVSqVInHH3+c8+fPe9zvMk9h71ObzcaAAQPo168fdrudhIQE/Pz8HPaYqs0uIiLi5rx+ml1ERMTd\nKZmLiIi4OSVzERERN6dk/v/t3U9I038cx/HnF4r42kXp0MFbMAwNDyLoQbR/mJDCZim4QiIzBnkS\nd2gjUTMQkbyIFNEwaBHRGmwNrEPsUFod6hAVZaKgDqckU9KI5uwgjcQK+/3oJ19/r8dph30/n/c+\nh732/Yzv5y0iImJxCnMRERGLU5iLiIhY3P/+OXMRK5mamuLIkSPYbLb0kZGGYVBTU4PT6fxPavj6\n9SuNjY2cO3cufTKbiGwuhbmIxezevZtgMLgpc4+NjeHxeHj79u2mzC8iP6cwF9ki3rx5Q2NjI/fv\n38cwDKqrq+nv7ycrKwuv18unT5+YmZmhsrKS5uZmgsEg0WiUeDzOzMwM9fX1xGIxnj59SlZWFteu\nXVt3QlUgEODMmTPcuHHjpzUkk0k8Hg8fPnwAoK6ujpqaGmKxGOfPn2dubg7TNLl48SI5OTkEAgEG\nBgYwDIO8vDxaW1sxTZPi4mL27dvHx48fuXv3LtevX2dwcJBUKkVJSQktLS1/fT1FrET/mYtYTDwe\nx+Fw4HA4sNvtOBwORkZGyM3Npa6uju7ubjo7O3E6nezdu5dIJEJlZSW3b98mFArh9/tJJBLAantR\nn8/HzZs36erqYv/+/YRCIVZWVnj8+PG6uVtaWjh06BC/Ojjy5cuXzM/Pc+/ePXw+Hy9evACgvb2d\niooKwuEwTU1NXLlyhffv33P16lX8fj+hUAjTNOnr6wMgkUjgcrkIBoMMDQ3x+vVrAoEAwWCQ6elp\nwuHwX1pdEWvSnbmIxfxum93lcnHs2DFM06SnpweA06dP8+zZM3w+HyMjIySTST5//gxAQUEBGRkZ\nZGRkYBhGuqlJdnY2CwsLf1ybzWZjfHychoYGysrKcLvdADx//pzLly8Dq/2dS0tL8fv9HDx4MN05\nqra2Fo/Hkx4rPz8fgKGhIV69ekV1dTUrKyt8+fKF7OzsP65NZCtTmItsIQsLCywuLrK0tEQikSAz\nM5Ouri6mpqaoqqri8OHDDA8Pp++st2/fvub6H1s3/hOZmZmEw2GGh4eJRqPY7XYikci67frR0dE1\nPdi/W15eTr/+fk0qlaK+vp5Tp06lP+O2bfrqEvmRttlFLOZ3vZE6Ojo4efIkTqeTtrY2YPXOtqGh\ngfLycmKxGPF4fE1obmTcjYpGo7jdbsrKyvB6vezcuZPp6WkKCwuJRCIAPHnyhNbWVoqKinj06FF6\nB+DOnTtr2p1+V1xcTCgUYmlpiWQySVNTEw8fPvzXtYpsJfp5K2Ixs7OzOBwOYDWADcOgsLCQgoIC\nJiYm6O3tJZVKcfz4cQYHB3G5XLjdbnbt2oXNZqOoqIjJycl14xqGseEafvXekpISHjx4wNGjR9mx\nYwfl5eXYbDYuXLiA1+vl1q1bmKbJpUuX2LNnD2fPnuXEiRMsLy+Tl5dHe3v7uvEPHDjAu3fvqK2t\nJZVKUVpait1u/5MlE9ny1AJVRETE4rTNLiIiYnEKcxEREYtTmIuIiFicwlxERMTiFOYiIiIWpzAX\nERGxOIW5iIiIxSnMRURELO4bdVa1P27yizQAAAAASUVORK5CYII=\n", 378 | "text/plain": [ 379 | "" 380 | ] 381 | }, 382 | "metadata": {}, 383 | "output_type": "display_data" 384 | } 385 | ], 386 | "source": [ 387 | "plt.scatter(45, 85, s=60, c='r', marker='v', label='(45, 85)')\n", 388 | "plotData(data, 'Exam 1 score', 'Exam 2 score', 'Admitted', 'Not admitted')\n", 389 | "x1_min, x1_max = X[:,1].min(), X[:,1].max(),\n", 390 | "x2_min, x2_max = X[:,2].min(), X[:,2].max(),\n", 391 | "xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n", 392 | "h = sigmoid(np.c_[np.ones((xx1.ravel().shape[0],1)), xx1.ravel(), xx2.ravel()].dot(res.x))\n", 393 | "h = h.reshape(xx1.shape)\n", 394 | "plt.contour(xx1, xx2, h, [0.5], linewidths=1, colors='b');" 395 | ] 396 | }, 397 | { 398 | "cell_type": "markdown", 399 | "metadata": {}, 400 | "source": [ 401 | "### 加正则化项的逻辑斯特回归" 402 | ] 403 | }, 404 | { 405 | "cell_type": "code", 406 | "execution_count": 41, 407 | "metadata": { 408 | "collapsed": false 409 | }, 410 | "outputs": [ 411 | { 412 | "name": "stdout", 413 | "output_type": "stream", 414 | "text": [ 415 | "('Dimensions: ', (118, 3))\n", 416 | "[[-0.092742 0.68494 1. ]\n", 417 | " [-0.21371 0.69225 1. ]\n", 418 | " [-0.375 0.50219 1. ]\n", 419 | " [-0.51325 0.46564 1. ]\n", 420 | " [-0.52477 0.2098 1. ]]\n" 421 | ] 422 | } 423 | ], 424 | "source": [ 425 | "data2 = loaddata('data2.txt', ',')" 426 | ] 427 | }, 428 | { 429 | "cell_type": "code", 430 | "execution_count": 42, 431 | "metadata": { 432 | "collapsed": true 433 | }, 434 | "outputs": [], 435 | "source": [ 436 | "# 拿到X和y\n", 437 | "y = np.c_[data2[:,2]]\n", 438 | "X = data2[:,0:2]" 439 | ] 440 | }, 441 | { 442 | "cell_type": "code", 443 | "execution_count": 43, 444 | "metadata": { 445 | "collapsed": false 446 | }, 447 | "outputs": [ 448 | { 449 | "data": { 450 | "image/png": "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\n3FwqnMw2R1QAAAAASUVORK5CYII=\n", 451 | "text/plain": [ 452 | "" 453 | ] 454 | }, 455 | "metadata": {}, 456 | "output_type": "display_data" 457 | } 458 | ], 459 | "source": [ 460 | "# 画个图\n", 461 | "plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y = 1', 'y = 0')" 462 | ] 463 | }, 464 | { 465 | "cell_type": "markdown", 466 | "metadata": {}, 467 | "source": [ 468 | "#### 咱们整一点多项式特征出来(最高6阶)" 469 | ] 470 | }, 471 | { 472 | "cell_type": "code", 473 | "execution_count": 44, 474 | "metadata": { 475 | "collapsed": false 476 | }, 477 | "outputs": [ 478 | { 479 | "data": { 480 | "text/plain": [ 481 | "(118, 28)" 482 | ] 483 | }, 484 | "execution_count": 44, 485 | "metadata": {}, 486 | "output_type": "execute_result" 487 | } 488 | ], 489 | "source": [ 490 | "poly = PolynomialFeatures(6)\n", 491 | "XX = poly.fit_transform(data2[:,0:2])\n", 492 | "# 看看形状(特征映射后x有多少维了)\n", 493 | "XX.shape" 494 | ] 495 | }, 496 | { 497 | "cell_type": "markdown", 498 | "metadata": {}, 499 | "source": [ 500 | "#### 正则化后损失函数\n", 501 | "#### $$ J(\\theta) = \\frac{1}{m}\\sum_{i=1}^{m}\\big[-y^{(i)}\\, log\\,( h_\\theta\\,(x^{(i)}))-(1-y^{(i)})\\,log\\,(1-h_\\theta(x^{(i)}))\\big] + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$\n", 502 | "#### 向量化的损失函数(矩阵形式)\n", 503 | "#### $$ J(\\theta) = \\frac{1}{m}\\big((\\,log\\,(g(X\\theta))^Ty+(\\,log\\,(1-g(X\\theta))^T(1-y)\\big) + \\frac{\\lambda}{2m}\\sum_{j=1}^{n}\\theta_{j}^{2}$$" 504 | ] 505 | }, 506 | { 507 | "cell_type": "code", 508 | "execution_count": 45, 509 | "metadata": { 510 | "collapsed": true 511 | }, 512 | "outputs": [], 513 | "source": [ 514 | "# 定义损失函数\n", 515 | "def costFunctionReg(theta, reg, *args):\n", 516 | " m = y.size\n", 517 | " h = sigmoid(XX.dot(theta))\n", 518 | " \n", 519 | " J = -1.0*(1.0/m)*(np.log(h).T.dot(y)+np.log(1-h).T.dot(1-y)) + (reg/(2.0*m))*np.sum(np.square(theta[1:]))\n", 520 | " \n", 521 | " if np.isnan(J[0]):\n", 522 | " return(np.inf)\n", 523 | " return(J[0])" 524 | ] 525 | }, 526 | { 527 | "cell_type": "markdown", 528 | "metadata": {}, 529 | "source": [ 530 | "#### 偏导(梯度)\n", 531 | "\n", 532 | "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m}\\sum_{i=1}^{m} ( h_\\theta (x^{(i)})-y^{(i)})x^{(i)}_{j} + \\frac{\\lambda}{m}\\theta_{j}$$ \n", 533 | "#### 向量化的偏导(梯度)\n", 534 | "#### $$ \\frac{\\delta J(\\theta)}{\\delta\\theta_{j}} = \\frac{1}{m} X^T(g(X\\theta)-y) + \\frac{\\lambda}{m}\\theta_{j}$$\n", 535 | "##### $$\\text{注意,我们另外自己加的参数 } \\theta_{0} \\text{ 不需要被正则化}$$" 536 | ] 537 | }, 538 | { 539 | "cell_type": "code", 540 | "execution_count": 39, 541 | "metadata": { 542 | "collapsed": true 543 | }, 544 | "outputs": [], 545 | "source": [ 546 | "def gradientReg(theta, reg, *args):\n", 547 | " m = y.size\n", 548 | " h = sigmoid(XX.dot(theta.reshape(-1,1)))\n", 549 | " \n", 550 | " grad = (1.0/m)*XX.T.dot(h-y) + (reg/m)*np.r_[[[0]],theta[1:].reshape(-1,1)]\n", 551 | " \n", 552 | " return(grad.flatten())" 553 | ] 554 | }, 555 | { 556 | "cell_type": "code", 557 | "execution_count": 46, 558 | "metadata": { 559 | "collapsed": false 560 | }, 561 | "outputs": [ 562 | { 563 | "data": { 564 | "text/plain": [ 565 | "0.69314718055994529" 566 | ] 567 | }, 568 | "execution_count": 46, 569 | "metadata": {}, 570 | "output_type": "execute_result" 571 | } 572 | ], 573 | "source": [ 574 | "initial_theta = np.zeros(XX.shape[1])\n", 575 | "costFunctionReg(initial_theta, 1, XX, y)" 576 | ] 577 | }, 578 | { 579 | "cell_type": "code", 580 | "execution_count": 48, 581 | "metadata": { 582 | "collapsed": false 583 | }, 584 | "outputs": [ 585 | { 586 | "data": { 587 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+wAAAFRCAYAAADuEicKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdcleX/x/HXAWQIIu6FM7egOXHgwIWKuMqBMzNTM0vT\nsqVZaZn1VSsz9GvDlbnLVebKPcmBOL9u3IqiHEHW9fuDHyeQeQ5n83k+HjyUe53rPhze3Nd1X/d1\naZRSCiGEEEIIIYQQQlgVB0sXQAghhBBCCCGEEBlJhV0IIYQQQgghhLBCUmEXQgghhBBCCCGskFTY\nhRBCCCGEEEIIKyQVdiGEEEIIIYQQwgpJhV0IIYQQQgghhLBCUmE3wNSpU+nRowc9evTAx8eHzp07\n06NHD3r27El8fHyuj7N9+3amTZtmwpJav1mzZhEYGEi3bt345JNPMrx/Z86cwd/fP8v9Y2JiqFu3\nLj179tR9HTp0CIBNmzbRrVs3unfvzksvvcSVK1cAePjwIQMHDqRbt258//33umMdOXKEiRMn5ul8\nPvzwQ/bv3w/ApEmTOHXqFACDBg3ir7/+ynH/9957j59++ilPZcjKnDlzmDJlSq62rV+/Pjdu3DBJ\nOaKiohg+fDhBQUEEBwdz9OjRPG0nbIPkpvEsXbqUoKAgunfvzujRo3n48CEAN2/eZNiwYXTv3p3g\n4GB+++23TPePi4tj/PjxdOnShc6dO7N161bduiVLluDv76/L04EDBwKSm7lhytxMtWfPHnr06JHl\neslN2yUZaTyHDx+mb9++dO/enUGDBnHt2rV063O6tswuI3fv3s0LL7xAz5496dWrF3v27AEkI3PD\nUhn5999/061bNzp37szYsWPRarUAJCcnM23aNDp37kxgYCC//vprpsfM7XYmpUSetG3bVkVERFi6\nGDZp1apVqmfPnkqr1SqllJo2bZqaPn26UkqpxMRE9dNPP6nmzZur+vXrZ3mM3bt3q5dffjnD8nv3\n7qkmTZqoW7duKaWUWrJkiRo2bJhSSqlFixap+fPnK6WUCgoKUjExMSopKUn1799f3bt3z2jnFxAQ\noE6ePKmUUmrgwIFq8+bNOe7z7rvvqh9//NFoZUjr22+/VR999FGutq1fv766fv26Scrx5ptvqnnz\n5imllDp9+rRq2bKliouLM3g7YXskNw13+fJl1aRJExUdHa2UUmrq1Knqk08+UUopNXLkSLVo0SKl\nVEoGNmjQQJeBac2YMUNNmjRJKaXUjRs3lL+/v267t956S23YsCHDPpKbOTNlbsbFxalZs2apRo0a\nqa5du2a5neSmfZCMNNytW7dUkyZN1OnTp5VSKdmVep2Y22vLrDLy8ePHqkmTJup///ufUkqpM2fO\nqEaNGimtVisZmQuWyMj79++rZs2aqatXryqllPryyy/VlClTlFIpdYNXX31VJScnq+joaNWpUyd1\n4sSJDMdeunRprrYzJbnDnkdKKZRS6Zb5+voyduxYOnfuTEREBKtWraJPnz706tWLtm3b6lpm1q5d\ny8iRI4GUVrKZM2cycOBA2rZtyzvvvJPp6x07doyBAwfSt29f2rZty4cffqhbt2PHDnr06EH37t3p\n168fZ86cyXL59evXqV+/vm7ftN+vXbuWAQMG0KtXL4YMGUJsbCwTJ06kX79+dOrUiRdeeIHLly8D\ncO/ePUaPHk3nzp3p2rUrixcv5ubNmzRo0ICYmBjd8QMDAzl79my6czl16hTt2rWjYMGCAHTo0EHX\nUhgREcG5c+f45ptvsn3/jx49ysOHD+nfvz89e/Zk2bJlABQrVox9+/ZRqlQpEhMTuX79Ol5eXgA4\nOzsTFxdHQkICSUlJODo6smzZMtq1a0exYsUyfZ3k5GSaNWuma6WdP38+bdu21a1/+eWX2blzp661\nc9asWdy5c4cJEyZw4sQJALZu3Urv3r1p27YtH3zwQbbnlZnQ0FB69+5N9+7d6dixo67Fd86cObzz\nzjv069ePdu3aMW7cOFatWsXAgQMJCAhg06ZNumNcvHiRQYMGERwczMSJE3ny5AmQ0gLco0cPevXq\nxaRJk3SfaaUUU6dOpW/fvnTt2pWgoKBM79js379fdycg7dfevXvTbZeUlMTff/9N7969AahZsyaV\nKlVi9+7dBm0nbJPkpuG56eLigkaj4fHjxyQnJxMXF4ezszMA33//ve6O+PXr13FycsLV1TXD+7F1\n61b69OkDQJkyZfD39+ePP/4AUjJ1/fr19OzZk1deeYVz584BkpuWzE1IuasXFxfH559/nuW5Sm7a\nD8lIwzPyzz//pHXr1tSsWROAvn376rIjt9eWWWVkYmIiU6ZM4bnnngOgatWqADx48EAy0kozcu/e\nvdStW5fy5csDEBISwoYNGwDYtm0bvXr1QqPR4OnpSVBQEOvWrctw7K1bt+ZqO5Mya/OAHUrb0pWq\nRo0aat26dUoppbRarerbt696+PChUkqpY8eO6Vr11qxZo0aMGKGUSmklGzt2rFJKqZiYGNWyZUt1\n8ODBDK/31ltvqUOHDumO3bRpUxUREaHu3bunGjVqpM6cOaOUUuqvv/5Sw4cPz3J5ZGRkutbFtN+v\nWbNGNWnSRHfn+88//1RTp07VbTt58mT16aefKqWUGj16tPryyy+VUko9fvxYde3aVV29elWNHj1a\n/fLLL0oppfbt26f69u2b4VzWrl2revXqpR48eKCSkpLU5MmTla+vb7ptni3ns+bOnavmzJmjkpOT\n1a1bt1THjh3V1q1bdevDw8NVixYtVKNGjdSxY8eUUko9efJEjRkzRvXs2VOtWLFCRUVFqX79+qnE\nxMQsX0cppd5//321ZMkSpVTKz8vf319dvnxZPX78WDVr1kwlJCSka+0MCAjQtZAPHDhQjR49Wiml\nVGxsrPL391dHjhzJ8BpZtYJev35dDRkyRD19+lQppdTGjRtVcHCwUiqldbNdu3YqJiZGxcXFqSZN\nmuh6KmzdulUFBgbqtgsICFAPHjxQSik1YcIE9dVXX6n4+HjVokULdeDAAaWUUn/88YeqWbOmun79\nujp69Kh68803deWYN2+eGjlyZLbvU3bu3r2r6tatm27ZhAkT1OLFiw3aTtgmyU3Dc1MppebMmaN8\nfHxUixYtVGBgoO59SjVo0CBVp04d3Ws8y9fXN90dn1mzZqnp06erJ0+eqGHDhumyctOmTapVq1bq\nyZMnkpsWzM20Dh48mOUddslN+yEZaXhGTpkyRU2aNEmNGzdO9ejRQ7322mu6u6uZlSszWWXks/7z\nn/+oF198USkl15bWmpHz5s1L1wMgMTFR1axZU8XExKhOnTqp48eP69atWLFCjRkzJsMxc7udKTmZ\nt3kg/2jYsCEABQsWJDQ0lB07dnDlyhVOnz5NbGxspvsEBAQA4O7uTsWKFYmOjs6wzfTp09m5cyfz\n5s3j4sWLxMXF8eTJE/755x+qV69OjRo1gJS71R06dGDLli2ZLr9+/Xq25a9Ro4buzndgYCDly5dn\nyZIlXLlyhUOHDulaTPfv3697NsfDw4P169cD0L9/f7766itCQkJYsWIFISEhGV6jR48e3Lx5k8GD\nB1OoUCGCg4N1rV65NWrUKN3/S5UqRb9+/di6dSvt2rUDwMfHhz179rB7925effVVtm3bhoeHR7rW\n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\n", 588 | "text/plain": [ 589 | "" 590 | ] 591 | }, 592 | "metadata": {}, 593 | "output_type": "display_data" 594 | } 595 | ], 596 | "source": [ 597 | "fig, axes = plt.subplots(1,3, sharey = True, figsize=(17,5))\n", 598 | "\n", 599 | "# 决策边界,咱们分别来看看正则化系数lambda太大太小分别会出现什么情况\n", 600 | "# Lambda = 0 : 就是没有正则化,这样的话,就过拟合咯\n", 601 | "# Lambda = 1 : 这才是正确的打开方式\n", 602 | "# Lambda = 100 : 卧槽,正则化项太激进,导致基本就没拟合出决策边界\n", 603 | "\n", 604 | "for i, C in enumerate([0.0, 1.0, 100.0]):\n", 605 | " # 最优化 costFunctionReg\n", 606 | " res2 = minimize(costFunctionReg, initial_theta, args=(C, XX, y), jac=gradientReg, options={'maxiter':3000})\n", 607 | " \n", 608 | " # 准确率\n", 609 | " accuracy = 100.0*sum(predict(res2.x, XX) == y.ravel())/y.size \n", 610 | "\n", 611 | " # 对X,y的散列绘图\n", 612 | " plotData(data2, 'Microchip Test 1', 'Microchip Test 2', 'y = 1', 'y = 0', axes.flatten()[i])\n", 613 | " \n", 614 | " # 画出决策边界\n", 615 | " x1_min, x1_max = X[:,0].min(), X[:,0].max(),\n", 616 | " x2_min, x2_max = X[:,1].min(), X[:,1].max(),\n", 617 | " xx1, xx2 = np.meshgrid(np.linspace(x1_min, x1_max), np.linspace(x2_min, x2_max))\n", 618 | " h = sigmoid(poly.fit_transform(np.c_[xx1.ravel(), xx2.ravel()]).dot(res2.x))\n", 619 | " h = h.reshape(xx1.shape)\n", 620 | " axes.flatten()[i].contour(xx1, xx2, h, [0.5], linewidths=1, colors='g'); \n", 621 | " axes.flatten()[i].set_title('Train accuracy {}% with Lambda = {}'.format(np.round(accuracy, decimals=2), C))" 622 | ] 623 | }, 624 | { 625 | "cell_type": "code", 626 | "execution_count": null, 627 | "metadata": { 628 | "collapsed": true 629 | }, 630 | "outputs": [], 631 | "source": [] 632 | } 633 | ], 634 | "metadata": { 635 | "kernelspec": { 636 | "display_name": "Python 2", 637 | "language": "python", 638 | "name": "python2" 639 | }, 640 | "language_info": { 641 | "codemirror_mode": { 642 | "name": "ipython", 643 | "version": 2 644 | }, 645 | "file_extension": ".py", 646 | "mimetype": "text/x-python", 647 | "name": "python", 648 | "nbconvert_exporter": "python", 649 | "pygments_lexer": "ipython2", 650 | "version": "2.7.10" 651 | } 652 | }, 653 | "nbformat": 4, 654 | "nbformat_minor": 0 655 | } 656 | --------------------------------------------------------------------------------