{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 机器学习练习 1 - 线性回归" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这个是另一位大牛写的,作业内容在根目录: [作业文件](ex1.pdf)\n", "\n", "代码修改并注释:黄海广,haiguang2000@qq.com" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 单变量线性回归" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PopulationProfit
06.110117.5920
15.52779.1302
28.518613.6620
37.003211.8540
45.85986.8233
\n", "
" ], "text/plain": [ " Population Profit\n", "0 6.1101 17.5920\n", "1 5.5277 9.1302\n", "2 8.5186 13.6620\n", "3 7.0032 11.8540\n", "4 5.8598 6.8233" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = 'ex1data1.txt'\n", "data = pd.read_csv(path, header=None, names=['Population', 'Profit'])\n", "data.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PopulationProfit
count97.00000097.000000
mean8.1598005.839135
std3.8698845.510262
min5.026900-2.680700
25%5.7077001.986900
50%6.5894004.562300
75%8.5781007.046700
max22.20300024.147000
\n", "
" ], "text/plain": [ " Population Profit\n", "count 97.000000 97.000000\n", "mean 8.159800 5.839135\n", "std 3.869884 5.510262\n", "min 5.026900 -2.680700\n", "25% 5.707700 1.986900\n", "50% 6.589400 4.562300\n", "75% 8.578100 7.046700\n", "max 22.203000 24.147000" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看下数据长什么样子" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在让我们使用梯度下降来实现线性回归,以最小化成本函数。 以下代码示例中实现的方程在“练习”文件夹中的“ex1.pdf”中有详细说明。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "首先,我们将创建一个以参数θ为特征函数的代价函数\n", "$$J\\left( \\theta \\right)=\\frac{1}{2m}\\sum\\limits_{i=1}^{m}{{{\\left( {{h}_{\\theta }}\\left( {{x}^{(i)}} \\right)-{{y}^{(i)}} \\right)}^{2}}}$$\n", "其中:\\\\[{{h}_{\\theta }}\\left( x \\right)={{\\theta }^{T}}X={{\\theta }_{0}}{{x}_{0}}+{{\\theta }_{1}}{{x}_{1}}+{{\\theta }_{2}}{{x}_{2}}+...+{{\\theta }_{n}}{{x}_{n}}\\\\] " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def computeCost(X, y, theta):\n", " inner = np.power(((X * theta.T) - y), 2)\n", " return np.sum(inner) / (2 * len(X))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "让我们在训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "data.insert(0, 'Ones', 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在我们来做一些变量初始化。" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# set X (training data) and y (target variable)\n", "cols = data.shape[1]\n", "X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列\n", "y = data.iloc[:,cols-1:cols]#X是所有行,最后一列" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "观察下 X (训练集) and y (目标变量)是否正确." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OnesPopulation
016.1101
115.5277
218.5186
317.0032
415.8598
\n", "
" ], "text/plain": [ " Ones Population\n", "0 1 6.1101\n", "1 1 5.5277\n", "2 1 8.5186\n", "3 1 7.0032\n", "4 1 5.8598" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.head()#head()是观察前5行" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Profit
017.5920
19.1302
213.6620
311.8540
46.8233
\n", "
" ], "text/plain": [ " Profit\n", "0 17.5920\n", "1 9.1302\n", "2 13.6620\n", "3 11.8540\n", "4 6.8233" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "代价函数是应该是numpy矩阵,所以我们需要转换X和Y,然后才能使用它们。 我们还需要初始化theta。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "X = np.matrix(X.values)\n", "y = np.matrix(y.values)\n", "theta = np.matrix(np.array([0,0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "theta 是一个(1,2)矩阵" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[0, 0]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "theta" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看下维度" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "((97, 2), (1, 2), (97, 1))" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape, theta.shape, y.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "计算代价函数 (theta初始值为0)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "32.072733877455676" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "computeCost(X, y, theta)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# batch gradient decent(批量梯度下降)\n", "$${{\\theta }_{j}}:={{\\theta }_{j}}-\\alpha \\frac{\\partial }{\\partial {{\\theta }_{j}}}J\\left( \\theta \\right)$$" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def gradientDescent(X, y, theta, alpha, iters):\n", " temp = np.matrix(np.zeros(theta.shape))\n", " parameters = int(theta.ravel().shape[1])\n", " cost = np.zeros(iters)\n", " \n", " for i in range(iters):\n", " error = (X * theta.T) - y\n", " \n", " for j in range(parameters):\n", " term = np.multiply(error, X[:,j])\n", " temp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))\n", " \n", " theta = temp\n", " cost[i] = computeCost(X, y, theta)\n", " \n", " return theta, cost" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "初始化一些附加变量 - 学习速率α和要执行的迭代次数。" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "alpha = 0.01\n", "iters = 1000" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在让我们运行梯度下降算法来将我们的参数θ适合于训练集。" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[-3.24140214, 1.1272942 ]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "g, cost = gradientDescent(X, y, theta, alpha, iters)\n", "g" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最后,我们可以使用我们拟合的参数计算训练模型的代价函数(误差)。" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4.515955503078912" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "computeCost(X, y, g)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在我们来绘制线性模型以及数据,直观地看出它的拟合。" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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EOqXW70jxnhrFo8tSZIkdZqsheYY4wZgQ+b790MIK4GSznr82tpa1q1bx/bt2zvrIdVO++23H4MGDaJnz55pD0WSJCkruuRCwBDCEKAU+D1wGjAhhPDPwBKS2ej32vqY69ato2/fvgwZMoQQQqeOV60XY+Sdd95h3bp1DB06NO3hSJIkZUXWLwQMIfQBfgxcF2PcAswCDgdGkMxE39bE/a4KISwJISx5++23P3D79u3bOeiggwzMKQshcNBBBznjL0mSClpWQ3MIoSdJYL4vxjgfIMa4Mca4M8a4C5gNjGrsvjHGe2KMI2OMIw8++AOt8uofP0sjV1v4e5AkSYUum90zAvBdYGWM8fYG2wc02O184MVsjSHbevTowYgRIzj22GO58MIL2bZtW7sfa9y4cTz88MMAXHHFFbz00ktN7vv000/z29/+dvfPd999N//93//d7mNLkiSpedmsaT4N+CdgeQhhaWbbN4CLQwgjgAisAb6cxTFkVVFREUuXLgXg0ksv5e677+b666/fffvOnTvp0aNHmx93zpw5zd7+9NNP06dPH0499VQAxo8f3+ZjSJIkqfWyNtMcY/x1jDHEGI+PMY7IfD0WY/ynGONxme3nZrps5L1PfvKTrF69mqeffpozzzyTSy65hOOOO46dO3dSXl7Oxz/+cY4//ni+853vAMkFdBMmTGD48OF89rOf5a233tr9WKNHj969AuLjjz/OiSeeyAknnMCnP/1p1qxZw913380dd9zBiBEj+NWvfsVNN93ErbcmHfyWLl3KySefzPHHH8/555/Pe++9t/sxJ02axKhRo/jYxz7Gr371qy4+Q5IkSfkrL5bRbtF110FmxrfTjBgBM2a0ate6ujp+9rOfcfbZZwPw3HPP8eKLLzJ06FDuueceDjjgAP7whz/w17/+ldNOO42zzjqLyspKVq1axfLly9m4cSPDhw/nX/7lX/Z43Lfffpsrr7ySZ599lqFDh/Luu+/Sr18/xo8fT58+fbjhhhsA+OUvf7n7Pv/8z//MzJkzOeOMM/jmN7/JzTffzIzM86irq+O5557jscce4+abb+YXv/hFh0+TJElSd1AYoTklNTU1jBgxAkhmmr/0pS/x29/+llGjRu1uv/bEE0/wxz/+cXe98ubNm3nllVd49tlnufjii+nRowcDBw7kU5/61Acef/HixZx++um7H6tfv37Njmfz5s1UV1dzxhlnAHDZZZdx4YUX7r597NixAJx00kmsWbOmQ89dkiSpOymM0NzKGeHO1rCmuaH9999/9/cxRmbOnElZWdke+zz22GMtdp2IMXZqZ4oPfehDQHIBY11dXac9riRJUqHLep/m7q6srIxZs2ZRW1sLwJ/+9Cf+8pe/cPrpp/Pggw+yc+dONmzYwFNPPfWB+55yyik888wz/PnPfwbg3XffBaBv3768//77H9j/gAMO4MADD9xdr/z9739/96yzJEmS2q8wZppz2BVXXMGaNWs48cQTiTFy8MEHs2DBAs4//3yefPJJjjvuOD72sY81Gm4PPvhg7rnnHsaOHcuuXbs45JBD+PnPf87nPvc5LrjgAhYuXMjMmTP3uM+9997L+PHj2bZtG4cddhhz587tqqcqSZJUsEKMMe0xtGjkyJGxvptEvZUrV3L00UenNCLtzd+HJEnqqAWVVVQsWsX66hoGFhdRXjaMMaUlXTqGEMLzMcaRe293plmSJEmpW1BZxZT5y6mp3QlAVXUNU+YvB+jy4NwYa5olSZKUuopFq3YH5no1tTupWLQqpRHtydAsSZKk1K2vrmnT9q5maJYkSVLqBhYXtWl7VzM0S5IkKXXlZcMo6tljj21FPXtQXjYspRHtyQsBJUmSlLr6i/3S7p7RFENzO73zzjt8+tOfBuDNN9+kR48eHHzwwQA899xz9OrVq12Pe84553D//fdTXFzcofGtWbOGo48+mqOOOort27fTt29frr76ai677LJm77d06VLWr1/POeec06HjS5IktdWY0pKcCcl7MzS300EHHbR7Ce2bbrqJPn36cMMNN+y+va6ujn33bfvpfeyxxzpriBx++OFUVlYC8Nprr+1eJOXyyy9v8j5Lly5lyZIlhmZJkqQGuk1N84LKKk6b9iRDJ/+U06Y9yYLKqk4/xrhx47j++us588wzmTRpEs899xynnnoqpaWlnHrqqaxalbRMmTdvHmPHjuXss8/myCOPZOLEibsfY8iQIWzatGn3TPGVV17JMcccw1lnnUVNTXL16B/+8AeOP/54TjnlFMrLyzn22GNbHNthhx3G7bffzre+9S2ARse2Y8cOvvnNb/LDH/6QESNG8MMf/rDJ5yBJktSddIuZ5q5slv2nP/2JX/ziF/To0YMtW7bw7LPPsu+++/KLX/yCb3zjG/z4xz8GkhndyspKPvShDzFs2DCuueYaPvrRj+7xWK+88goPPPAAs2fP5qKLLuLHP/4xX/ziF7n88su55557OPXUU5k8eXKrx3biiSfy8ssvA3DUUUc1OrZ///d/Z8mSJXz7298GaPY5SJIkdRfdIjQ31yy7s0PzhRdeSI8eyZWfmzdv5rLLLuOVV14hhEBtbe3u/T796U9zwAEHADB8+HBef/31D4TmoUOHMmLECABOOukk1qxZQ3V1Ne+//z6nnnoqAJdccgn/8z//06qxNVwyvbmxNdTa/SRJkgpZtyjP6Mpm2fvvv//u7//t3/6NM888kxdffJGf/OQnbN++ffdtH/rQh3Z/36NHD+rq6j7wWI3t0zD4tlVlZSVHH310i2NrqLX7SZIkFbJuEZrTapa9efNmSkqSmex58+Z1ymMeeOCB9O3bl8WLFwPw4IMPtup+a9as4YYbbuCaa65pdmx9+/bl/fff3/1zNp6DJElSvukWoTmtZtkTJ05kypQpnHbaaezcubPlO7TSd7/7Xa666ipOOeUUYoy7yzz29uqrr1JaWsrRRx/NRRddxDXXXLO7c0ZTYzvzzDN56aWXdl8ImK3nIEmSlE9CR/7c31VGjhwZlyxZsse2lStX7i41aI0FlVU52yy7rbZu3UqfPn0AmDZtGhs2bODOO+9MdUxt/X1IkiTlohDC8zHGkXtv7xYXAkJuN8tuq5/+9KdMnTqVuro6Dj30UMsmJEmSsqzbhOZC8oUvfIEvfOELaQ9DkiSp2+gWNc2SJElSR+R1aM6HeuzuwN+DJEkqdHkbmvfbbz/eeecdA1vKYoy888477LfffmkPRZIkKWvytqZ50KBBrFu3jrfffjvtoXR7++23H4MGDUp7GJIkSVmTt6G5Z8+eDB06NO1hSJKklBVSW1nlrrwNzZIkSQsqq5gyfzk1tckCXFXVNUyZvxzA4KxOlbc1zZIkSRWLVu0OzPVqandSsWhVSiNSoTI0S5KkvLW+uqZN26X2MjRLkqS8NbC4qE3bpfYyNEuSpLxVXjaMop499thW1LMH5WXDUhqRCpUXAkqSpLxVf7Gf3TOUbYZmSZKU18aUlhiSlXWWZ0iSJEktMDRLkiRJLTA0S5IkSS0wNEuSJEktMDRLkiRJLbB7hiRJUkoWVFbZLi9PONMsSZKUggWVVUyZv5yq6hoiUFVdw5T5y1lQWZX20NK1di0sWpT2KD7A0CxJkpSCikWrqKnduce2mtqdVCxaldKIUvbSSzBuHBx+ePLfurq0R7QHQ7MkSVIK1lfXtGl7wVq8GMaMgWOOgR/9CL761WTbvrlVRZxbo5EkSeomBhYXUdVIQB5YXJTCaLpYjEkJxrRp8MwzcOCB8M1vwoQJcPDBaY+uUc40S5IkpaC8bBhFPXvssa2oZw/Ky4alNKIuUFcHDz4IpaXwmc/A6tVw++1JHfPNN+dsYAZnmiVJklJR3yWjW3TP2L4d5s2Digp47TUYNgy+9z249FLo1Svt0bWKoVmSJCklY0pLCjMk19u8GWbNghkzYONGGDUKbr0VzjsP9smvggdDsyRJkjrXm28mQXnWLNiyBc46CyZPhtGjIYS0R9cuhmZJkiR1jldfTWaS586F2lq44AKYNAlOPDHtkXWYoVmSJEkds3QpTJ+etIzbd1+4/HK44QY44oi0R9ZpDM2SJEkpy8vltGNM2sVNnw6PPw59+yZB+brrYMCAtEfX6QzNkiRJKapfTrt+dcD65bSB3AzOu3bBo48mPZZ//3s45BCYOhXGj4fi4rRHlzX5ddmiJElSgcmb5bR37Ejaxh1zDJx/Prz1Ftx1F6xZk1zkV8CBGZxpliRJSlXOL6e9dSvMmQO33Qbr1sHxx8P998OFF+bcUtfZ1H2eqSRJUg7K2eW033kHZs5Mvt59F04/He65B84+O2/bxnWE5RmSJEkpyrnltN94I7mYb/DgZGnr006D3/wmuejvM5/ploEZnGmWJElKVc4sp71yJdxyC/zgB8nPl1wCEycmNcwyNEuSJKUt1eW0Fy9O2sYtWABFRfCVr8DXvw6HHprOeHKUoVmSJKm7iRGeeCJpG/f003DggXDjjTBhAvTvn/bocpKhWZIkqbvYuRMefjgJy0uXwqBBcMcdcMUV0KdP2qPLaYZmSZKkQrd9O9x7L1RUwKuvwlFHwfe+B5deCr16pT26vGBoliRJKlSbN8PddyezyRs3wqhRcOutcO65sI9N1NrC0CxJklRo3nwT7rwzWbFvyxYoK0tW7TvjjG7bMq6jDM2SJEmF4tVXk5nkuXOhtjZZtW/iRDjxxLRHlveyNi8fQvhoCOGpEMLKEMKKEMK1me39Qgg/DyG8kvnvgdkagyRJUrewdClcfDF87GNJrfK4cbBqFTz4oIG5k2SzmKUO+HqM8WjgZODqEMJwYDLwyxjjkcAvMz9LkiSpLWL82yp9paXw059CeTmsWZPUMR9xRNojLChZK8+IMW4ANmS+fz+EsBIoAc4DRmd2uxd4GpiUrXFIkiQVlF274Cc/SdrGLV4MhxwCU6fC+PFQXJz26ApWl9Q0hxCGAKXA74GPZAI1McYNIYRDumIMkiRJeW3HDrj//mSp65UrYejQ5EK/ceOSlfyUVVkPzSGEPsCPgetijFtCK6/YDCFcBVwFMHjw4OwNUJIkKZdt3Qpz5sBtt8G6dXD88Ul4vvBC2NeeDl0lqw36Qgg9SQLzfTHG+ZnNG0MIAzK3DwDeauy+McZ7YowjY4wjDz744GwOU5IkKfe88w7cdBMceih87Wtw2GHw2GN/u+jPwNylstk9IwDfBVbGGG9vcNOjwGWZ7y8DFmZrDJIkSXnnjTfguutg8GC4+Wb4+7+H3/zmbxf92Wc5Fdn8iHIa8E/A8hDC0sy2bwDTgB+FEL4ErAUuzOIYJEmS8sPKlUm98g9+kPx88cUwaRIcc0y64xKQ3e4Zvwaa+ij06WwdV5IkKa8sXpx0wli4EHr3hquvhuuvT2aalTMshpEkSepqMcKiRUlYfuYZOPBAuPFGmDAB+vdPe3RqhKFZkiSpq9TVwcMPJ2F52TIYNAhuvx2uvBL69El7dGqGoVmSJCnbtm+HefOgogJeew2OOgrmzoVLLoFevdIenVrB0CxJkpQtmzfDrFkwYwZs3AijRiX9ls89F/bJaudfdTJDsyRJUmd78024885kxb4tW6CsDCZPhjPOsGVcnjI0S5IkdZZXX4Vbb01KL2prk1X7Jk2C0tK0R6YOMjRLkiR11NKlMH06/OhHyUp948ZBeTkccUTaI1MnMTRLkiS1R4zw7LNJJ4zHH4e+feHrX0+WvB4wIO3RqZMZmiVJktpi1y74yU+SsLx4MRxyCEydCuPHQ3Fx2qNTlhiaJUmSWmPHDrj//mSp65UrYejQ5EK/ceOgqCjt0SnLDM2SJEnN+ctfYM6cpFXcG2/A8ccn4fnCC5P6ZXUL/qYlSZIa8847MHNm8vXuu3D66fCd78DZZ9s2rhsyNEuSJDW0dm2ytPXs2bBtW7IQyaRJcOqpaY9MKTI0S5IkAbz0UlKvfN99yc+XXAITJ8Ixx6Q7LuUEQ7MkSereFi9OOmEsXAi9e8PVV8P118PgwWmPTDnE0CxJkrqfGGHRoiQsP/MMHHggfPObcM010L9/2qNTDjI0S5Kk7qOuDh5+OAnLy5ZBSUnSFeOqq6BPn7RHpxxmaJYkSYVv+3aYNw8qKuC11+Coo2Du3KRuuVevtEenPGBoliRJhWvzZpg1C2bMgI0bYdSoZGb53HNhn33SHp3yiKFZkiQVnjffTILyrFmwZQuUlcHkyXDGGfZYVrsYmiVJUuF49VW49dak9KK2Nlm1b9IkKC1Ne2TKc4ZmSZKU/5YuhenT4Uc/Spa2vvxyuOEGOOKItEemAmFoliRJ+SlGePbZpBPG449D375QXg7XXgsDBqQ9uryzoLKKikWrWF9dw8DiIsrLhjGmtCTtYeUMQ7MkScovu3bBT36ShOXFi+GQQ2DqVBg/HoqL0x5dXlpQWcWU+cupqd0JQFV1DVPmLwcwOGd42agkScoPO3bAvffCscfCmDHw1lvJhX5r1iQX+RmY261i0ardgbleTe1OKhatSmlEuceZZkmSlNv+8heYMydpFffGG3DCCfDAA3DBBUn9sjpsfXVNm7Z3R77SJElSbnrnHfj2t+Fb34J3303axd1zT9I+zrZxnWpgcRFVjQTkgcVFKYwmNxma84xF+pKkgvfGG8ms8uzZsG0bnHde0jbulFPSHlnBKi8btkdNM0BRzx6Ulw1LcVS5xdCcRyzSlyQVtJUr4ZZb4Ac/SH6+9FKYOBGGD093XN1AfY5wYq5phuY80lyRvi9qSVLeWrw46bG8YAEUFcFXvwpf/zoMHpz2yLqVMaUl5olmGJrziEX6kqSCESM88UTSNu7pp+HAA+Gb34RrroH+/dMenfQBhuY8YpG+JCnv1dXBww8nM8tLl0JJCdx+O1x5JfTpk/bopCbZpzmPlJcNo6hnjz22WaQvScoL27fD3XfDsGFw8cVQUwPf+x689hp87WsGZuU8Z5rziEX6kqS8s3lzsgDJjBmwcSOMGgW33pp0xNjHuTvlD0NznrFIX5KUF958MwnKs2bBli1w1lnJqn2jR9tjWXnJ0CxJkjrPq68mM8lz50JtbbJq36RJcOKJWTukaxioKxiaJUlSxy1dmlzc96MfJUtbjxsHN9wARx6Z1cO6hoG6isVEkiSpfWKEZ56Bz3wGSkvhpz9NgvKaNfCd72Q9MEPzaxhIncmZZkmS1Da7dsFPfpL0WF68GA45BKZOhfHjobi4S4fiGgbqKs40S5Kk1tmxA+69F449FsaMgbfeSi70W7MmuciviwMzNL1WgWsYqLMZmiVJUvO2bk06YRxxRFKr3KsXPPAArFqVzC4XpRdQXcNAXcXyDEmS1Lh33oGZM5Ovd9+FM86Ae+6BsrKcaRvnGgbqKoZmSZK0pzfegNtug9mzYdu2ZCGSSZPglFPSHlmjXMNAXcHQLEmSEi+9BLfcAvfdl/x86aUwcSIMH57uuKQcYGiWJKm7W7w46YSxcCH07g1XXw3XXw+DB6c9MilnGJolSeqOYoRFi5Kw/Mwz0K8f3HgjTJgA/funPTop5xiaJUnqTurq4OGHk7C8bBkMGgR33AFXXAF9+qQ9OilnGZolSeoOtm+HefOgogJeew2OOgrmzoVLLklayElqlqFZkqRCtnlzsgDJjBmwcSOMGpV0xjj3XNjH5Rqk1jI0S5JUiN58MwnKs2bBli1w1lkwZUrSazlHeixL+cTQLElSIVm9Gm69NSnFqK2FCy9MeiyXlqY9MimvGZolSSoElZUwfTo89BDsuy9cfjnccEOy9LWkDjM0S5KUr2JM2sVNm5a0j+vbNwnK110HAwakPTqpoBiaJUnKN7t2waOPJmH597+HQw6BqVNh/HgoLk57dFJBMjRLkpQvduyA++9PlrpeuRKGDoW77oJx46CoKO3RSQXN0CxJUq7buhXmzElaxa1bB8cfn4TnCy9M6pclZZ3/p0mSlKveeQdmzky+3n03aRd3zz1w9tm2jZO6mKFZkqRc88YbcPvtSUDetg3OOy9pG3fKKWmPTOq2DM2SpCYtqKyiYtEq1lfXMLC4iPKyYYwpLUl7WIVr5cqkXvkHP0h+vuSSJCwPH57uuCQZmiVJjVtQWcWU+cupqd0JQFV1DVPmLwcwOHe2xYuTHssLFkDv3nD11XD99TB4cNojk5ThovOSpEZVLFq1OzDXq6ndScWiVSmNqMDECI8/DqNHJ2UXzz4LN94Ir7+eLH9tYJZyijPNkqRGra+uadN2tVJdHTz8cNJjedkyGDQoqV++8kro0yft0UlqgjPNkqRGDSxuvO9vU9vVgu3b4e67YdgwuPhi+OtfYe5cePVV+NrXDMxSjjM0S5IaVV42jKKePfbYVtSzB+Vlw1IaUZ7avDmZVR4yBL7yFejfHx55BFasSBYl6dUr7RFKagXLMyRJjaq/2M/uGe305ptJbfKsWbBlC5SVJZ0wRo+2x7KUh7IWmkMI3wP+AXgrxnhsZttNwJXA25ndvhFjfCxbY5AkdcyY0hJDclu9+ipUVMC8eVBbm6zaN2kSlJamPTJJHZDNmeZ5wLeB/95r+x0xxluzeFxJkrpeZWXSNu6hh5KlrS+/HG64AY44Iu2RSeoEWQvNMcZnQwhDsvX4kiSlLkZ45pmkZnnRIujbF8rL4dprYcCAtEcnqROlcSHghBDCH0MI3wshHNjUTiGEq0IIS0IIS95+++2mdpMkqevt2pUsRHLKKXDmmcks89SpsHZtEqANzFLB6erQPAs4HBgBbABua2rHGOM9McaRMcaRBx98cBcNT5KkZuzYkdQqH3MMnH8+vPUW3HUXrFkDkydDcXHKA5SULV3aPSPGuLH++xDCbOB/uvL4kpQPFlRW2bEi12zdCnPmwG23wbp1cPzxcP/9yUV++9qISuoOuvT/9BDCgBjjhsyP5wMvduXxJSnXLaisYsr85buXr66qrmHK/OUABuc0vPMOzJyZfL37Lpx+OtxzD5x9tm3jpG4mmy3nHgBGA/1DCOuAG4HRIYQRQATWAF/O1vElKR9VLFq1OzDXq6ndScWiVYbmrvTGG8ms8uzZsG0bfO5zSfnFqaemPTJJKclm94yLG9n83WwdT5IKwfrqmjZtVydbuRJuuQV+8IPk50sugYkTkxpmSd2ahViSlEMGFhdR1UhAHlhclMJoupHFi5MeywsWQO/ecPXVcP31MHhw2iOTlCPSaDknSWpCedkwinr22GNbUc8elJcNS2lEBSxGePzxZFnrU05J+i3feCO8/nqy/LWBWVIDzjRLUg6pr1u2e0YW1dXBww8n/ZSXLYNBg+COO+CKK6BPn7RHJylHGZolKceMKS0xJGfD9u1Jj+WKCnjtNTjqKJg7N6lb7tUr7dFJynGGZklSYdu8GWbNSkouNm6EUaOSzhjnngv7WKUoqXUMzZKkwrRhA9x5ZxKYt2yBsrKkbdwZZ9hjWVKbGZolSYVl9eqkBOPee6G2Nlm1b9IkKC1Ne2SS8pihWZJUGF54IWkb9/DDydLW48ZBeTkccUTaI5NUAAzNkqT8FSM8/XTSCeOJJ6Bv3yQoX3stDBiQ9ugkFRBDsyQp/+zaBQsXJjPLv/89HHIITJ0K48dDcXHao5NUgAzNkqT8sWMH3H9/EpZffhkOOwzuuispxShy1URJ2WNoVre3oLLKhSSkXLd1K8yZk7SKW7cOTjgBHngALrggqV+WpCzznUbd2oLKKqbMX05N7U4AqqprmDJ/OYDBWcoFmzbBt78NM2fCu+8m7eJmz07ax9k2TlIXsqu7urWKRat2B+Z6NbU7qVi0KqURSQJg7Vq47jo49FC4+Wb45Cfht79NLvo7+2wDs6Qu50yzurX11TVt2i61hyVAbfDSS3DLLXDffcnPl14KEyfC8OHpjktSt2doVrc2sLiIqkYC8sBiLyhS57AEqJUWL07axi1cCL17w9VXw/XXw+DBaY9MkgDLM9TNlZcNo6hnjz22FfXsQXnZsJRGpEJjCVAzYoTHH4fRo+GUU+BXv4Ibb4TXX4cZMwzMknKKM83q1upn+vzTubLFEqBG1NUlq/ZNmwbLlsGgQXDHHXDFFdCnT9qjk6RGGZrV7Y0pLTEkK2ssAWpg+3aYNw8qKuC11+Coo2DuXLjkEujVK+3RSVKzLM+QpCyyBAjYvDmZVR4yBL7yFejfHx55BFasSBYlMTBLygPONEtSFnXrEqA330xqk2fNgi1bkt7KkycnvZZtGScpzxiaJSnLul0J0OrVcOutSSlGbS1ceCFMmgSlpWmPTJLazdAsSeoclZUwfTo89FCytPXll8MNN8ARR6Q9MknqMEOzJKn9YkxW6Zs+HRYtgr59obwcrr0WBgxIe3SS1GkMzZKkttu1K1mIZNo0eO45OOQQmDoVxo+H4uK0RydJnc7QLElqvR07kiWub7kFXn4ZDjssudDvssugqBu20ZPUbRiaJUkt27oV5syB226DdevghBPggQfggguS+mVJKnC+00mSmrZpE8ycmXy99x6cfjrMnp20j7NtnKRuxNAsSfqgtWvh9tuTgLxtG5x3XtI27pRT0h6ZJKXC0CxJ+puXXkrqle+7L/n50kth4kQYPjzdcUlSygzNkiRYvDjphLFwIfTuDV/9Knz96zB4cNojk6ScYGiWpO4qxqS38rRp8MwzcOCBcOONMGEC9O+f9ugkKacYmiWpu6mrg4cfTsLysmVQUpLUL195JfTpk/boJCknGZolqbvYvh3mzYOKCnjtNRg2DL77XfjiF6FXr7RHJ0k5zdAsdZEFlVVULFrF+uoaBhYXUV42jDGlJWkPS93B5s3JAiQzZsDGjTBqFNx6a9IRY5990h6dJOUFQ7PUBRZUVjFl/nJqancCUFVdw5T5ywEMzsqeN99MgvKsWbBlC5x1FkyeDKNH52SPZT9YSsplhmYpI5v/YFcsWrU7MNerqd1JxaJVhgJ1vtWrk5nkefOgtjZZtW/SJDjxxLRH1iQ/WErKdYZmdStNBeNs/4O9vrqmTduldqmshOnT4aGHkqWtL78cbrgBjjgi7ZG1yA+WknKdoVmtlu9/Om0uGGf7H+yBxUVUNRKQBxYXdfix1c3FmLSLmzYtaR/34Q9DeTlcey0MGJD26FrND5aScp1XgKhV6gNnVXUNkb8FzgWVVWkPrdWaC8bZ/ge7vGwYRT177LGtqGcPysuGdcrjqxvatQseeSRZ1vrMM2HpUvjP/0yWv542La8CMzT9AdIPlpJyhaFZrdJc4MwXzQXjbP+DPaa0hKljj6OkuIgAlBQXMXXscXk1U68csWMHzJ0LxxwDY8fC228nF/r9+c8wZQoccEDaI2wXP1hKynWWZ6hVCuFPp82VSJSXDdujdAM6/x/sMaUlhmS139atMHs23HYbVFXBCSfAAw8kF/ntm/9v5fX/b+RzCZikwpb/77TqEoVQk9tcMPYfbOWsTZtg5szk67334IwzkvB89tk52TauI/xgKSmXGZrVKl0xE5ttLQVj/8FWTlm7NplVnj0bamqShUgmTUpqmCVJXc7QrFYplJlYg7Fy3ooVcMstcP/9yc+XXgoTJ8Lw4emOS5K6OUOzWs3AKWXR736XdL149FHo3Ruuvhquvx4GD057ZJIkDM2SlJ4Y4fHHk7D87LPQrx/ceCNMmAD9+6c9OklSA61qORdC+GVrtkmSWqGuLul8UVoK55wDr70Gd9wBr78ON91kYJakHNTsTHMIYT+gN9A/hHAgUH+p9oeBgVkemyQVlpoamDcPKiqSvspHHZX0XL7kEujVK+3RSZKa0VJ5xpeB60gC8gsNtm8B/itLY5KkwrJ5c7IAyYwZsHEjjBoFt98O554L+7jGlCTlg2ZDc4zxTuDOEMI1McaZXTQmSSoMGzbAnXcmgXnLFjjrrGTVvjPOKLgey5JU6Foqz/hUjPFJoCqEMHbv22OM87M2MknKV6tXw623JqUYtbVw4YVJj+XS0rRHJklqp5bKM04HngQ+18htETA0S1K9ykqYPh0eeihZ2vryy+GGG+CII9IemSSpg1oKze9l/vvdGOOvsz0YSco7McIzzyRt4xYtgr59k6B83XUwYEDao5MkdZKWrkC5PPPfb2V7IJKUV3btggULkmWtzzwzmWWeOjVZ/nr6dAOzJBWYlmaaV4YQ1gAHhxD+2GB7AGKM8fisjUySctGOHckS17fcAitXwmGHJRf6XXYZFBWlPTpJUpa01D3j4hDC3wGLgHO7ZkiSlIO2boU5c+C222DdOjjhhCQ8X3hhUr8sSSpoLb7TxxjfBE4IIfQCPpbZvCrGWJvVkUlSLti0CWbOTL7eey9pFzd7NpSV2TZOkrqRVk2PhBDOAP4bWENSmvHREMJlMcZnszg2SUrP2rXJrPKcObBtG5x3XtI27pRT0h6ZJCkFrf2b4u3AWTHGVQAhhI8BDwAnZWtgkpSKFSuSeuX7709+vuSSJCwPH57uuCRJqWptaO5ZH5gBYox/CiH0zNKYJKnr/e53Sdu4Rx+F3r3h6qvh+uth8OC0RyZJygGtDc3PhxC+C3w/8/OlwPPZGZIkdZEY4fHHk7D87LPQrx/ceCNMmAD9+6c9OklSDmltaB4PXA38K0lN87PAXdkalCRlVV1dsmrf9OmwbBkMGgS33w5XXgl9+qQ9OklSDmoxNIcQ9gGejzEeS1LbLEn5qaYG7r0XKirgtdfgqKNg7tykbrlXr6wddkFlFRWLVrG+uoaBxUWUlw1jTGlJ1o4nSep8La0ISIxxF7AshNCmwr4QwvdCCG+FEF5ssK1fCOHnIYRXMv89sB1jlqS2qa5OVusbMgS+8pWk9OKRR5KL/saNy3pgnjJ/OVXVNUSgqrqGKfOXs6CyKmvHlCR1vhZDc8YAYEUI4ZchhEfrv1q4zzzg7L22TQZ+GWM8Evhl5mdJyo4NG2DyZDj0UPjGN6C0FJ58EhYvhjFjYJ/WvgW2X8WiVdTU7txjW03tTioWrWriHpKkXNTamuab2/rAMcZnQwhD9tp8HjA68/29wNPApLY+tiQ1a/VquPVWmDcPamuTVfsmTUpCcxdbX13Tpu2SpNzUbGgOIexHchHgEcBy4LsxxroOHO8jMcYNADHGDSGEQzrwWJK0p8rK5OK+hx5Klra+/HK44QY44ojUhjSwuIiqRgLywOKiFEYjSWqvlv42eS8wkiQwfwa4LesjygghXBVCWBJCWPL222931WEl5ZsY4emn4eyz4cQT4bHHoLwc1qyBu+9ONTADlJcNo6hnjz22FfXsQXnZsJRGJElqj5bKM4bHGI8DyPRpfq6Dx9sYQhiQmWUeALzV1I4xxnuAewBGjhwZO3hcSYVm165kIZJp0+D3v4dDDkku9hs/HoqL0x7dbvVdMuyeIUn5raXQXFv/TYyxLoTQ0eM9ClwGTMv8d2FHH1BSN7NjR7LE9fTp8PLLMHQo3HVX0gWjKDdLHsaUlhiSJSnPtRSaTwghbMl8H4CizM8BiDHGDzd1xxDCAyQX/fUPIawDbiQJyz8KIXwJWAtc2MHxS+outm6FOXPgtttg3To44QR44AG44IKkflmSpCxq9l+aGGOP5m5v4b4XN3HTp9v7mJK6oU2b4Nvfhpkz4d13YfRomD0bysqg43/9kiSpVZyekZSb1q5NlraePRu2bYPzzkt6Lp98ctojkyR1Q4ZmSbnlpZfgllvgvvuSn7/4xaQbxvDh6Y5LktStGZol5YbFi5NOGAsXQu/eMGECfO1rMHhw2iOTJMnQLClFMcLjjyedMJ55Bvr1gxtvhGuugYMOSnt0kiTtZmiW1PXq6pJV+6ZPh2XLYNAguOMOuOIK6NMn7dFJkvQBhuYsWlBZ5YIGUkM1NTBvHtx6K7z2Ghx1FMydC5dcAr16pT06SZKaZGjOkgWVVUyZv5ya2p0AVFXXMGX+cgCDs7qf6mqYNQtmzIC33oJRo5J+y+eeC/vsk/bo8o4fyCWp6/mvVZZULFq1OzDXq6ndScWiVSmNSErBhg0waVJyMd83vgGlpfDUU8lFf2PGGJjbof4DeVV1DZG/fSBfUFmV9tAkqaD5L1aWrK+uadN2qaCsXg1f/jIMGZKUYpxzDrzwQnLR3+jRLkrSAX4gl6R0WJ6RJQOLi6hqJCAPLC5KYTRSF3nhheTivocfTpa2Hjcu6bF8xBFpj6xg+IFcktLhTHOWlJcNo6jnnquQF/XsQXnZsJRGJGVJjEnJRVkZnHQS/OxnSVBeswa+8x0Dcydr6oO3H8glKbsMzVkyprSEqWOPo6S4iACUFBcxdexxXqyjwrFrFzzySLKs9ac+BUuXwtSpyfLX06bBgAFpj7Ag+YFcktJheUYWjSktMSSr8OzYkSxxfcst8PLLcNhhcNddSSlGkbOd2Vb/nmL3DEnqWoZmSa2zdSvMmZO0ilu3Dk44AR54AC64IKlfVpfxA7kkdT3/pZPUvE2bYObM5Ou99+CMM2D27KSG2S4YkqRuwtAsqXFr18LttycBeds2OO+8pOfyKaekPTJJkrqcoVnSnl56KalXvu++5OdLL4WJE2H48HTHJUlSigzNkhKLFyddLxYuhN69YcIE+NrXktX8JEnq5gzNUncWIyxalITlZ56Bfv3gppvg6quhf/+0RydJUs4wNEvdUV1dsmrftGmwbBkMGgQzZsAVV8D++6c9OkmSco6hWepOamrg3nuhogJeew2OPhrmzYOLL4ZevdIenSRJOcvQLHUH1dUwa1Yym/zWWzBqVNJv+dxzYR8XBpUkqSWGZqmQbdiQBOVZs+D995PeypMnJ72WC6jH8oLKKlfIkyRllaFZKkSrVyclGPPmJfXLF1yQhOXS0rRH1ukWVFYxZf5yamp3AlBVXcOU+csBDM6SpE7j32WlQvLCC/CFL8CwYUlgvvxyWLUKfvjDggzMABWLVu0OzPVqandSsWhVSiOSJBUiZ5qlfBcjPP100gnjiSegb18oL4drr4UBAxq9SyGVM6yvrmnTdkmS2sPQLOWrXbuShUimTYPnnoNDDoGpU2H8eCgubvJuhVbOMLC4iKpGAvLA4qIURiNJKlSWZ0j5ZscOmDsXjjkGxo6FTZuSC/3WrEnqlpsJzFB45QzlZcMo6tljj21FPXtQXjYspRFJkgqRM81Svti6FebMYdu0W+i9cQMvHTKUB//x/3DS9Vdy3scPbfXDFFo5Q/3seKGUm0iScpOhWcp1mzbBzJnJ13vvsWLwsXz7wvE8M/RECIGHHl1J3HffVofEQixnGFNaYkiWJGWVoVnKVWvXwu23w+zZsG0bnHceVw34NE8ccNgeu9WXVrQ2NJaXDdujphksZ5AkqSXWNEu55qWXYNw4OPxw+K//ggsvhBUrYMECfr5XYK7XltKKMaUlTB17HCXFRQSgpLiIqWOPc6ZWkqRmONMs5YrFi5NOGAsXQu/e8NWvwte/DoMH796ls0orLGeQJKltDM05pJB65+aynDrPMcLjj8P06fDMM9CvH9x4I0yYAP37f2B3SyskSUqHoTlHFFrv3FyVM+e5rg4eeigJy8uWwaBBMGMGfOlL0KdPk3ezU4QkSekwNOeI5nrnGog6T+rnuaYmWd66ogL+/Gc4+uik5/Ill0CvXq16CEsrJEnqeobmHFFovXNzVWrnefPmZAGSGTNg40b4xCfgjjvgc5+DfQr3etycKoWRJKkDDM05ohB75+aiLj/PGzbAnXcmgXnLFjj77GTVvtNPhxCyc8wckTOlMJIkdYLCneLKMy4F3DW67DyvXg1f/jIMGZKUYpxzDrzwAvzsZ3DGGQUfmKHwluuWJHVvhuYcMaa0hM+fVEKPTJjqEQKfP8na1c6W9R7FL7wAX/gCDBsG994L//IvPPHIs5x2wpUM/eF6Tpv2JAsqqzrnWDnOkiNJUiGxPCNHLKis4sfPV7EzRgB2xsiPn69i5KH9CjI4t6XWtbPrYjv9QroY4emnkx7LTzwBH/4wTJwI117Lgg07c7ZEIdv1xpYcSZIKiaE5R6Te1aELtaXWNafrYnftShYimTYNnnsOPvKR5Pvx4+GAAwComPdkTvxe9w7IZx51MD9+viqr59We0pKkQmJ5Ro7I5p+yF1RWcdq0Jxk6+ac5UR7QllrXnKyL3bEjaRM3fDiMHQubNsHdd8OaNTBp0u7ADLlRolD/waOquoZIEpDvW7w26+fV5bolSYXEmeYcka0/ZefiTG1bgmR7Q2dWSg+2boXZs+G226CqCkaMgAcfhM9/HvZt/H+lXChRaOyDR2xi384O8/aUliQVCmeac0S2ujrk4kxtU4Gxse1t2bdeYzOrU+Yvb/8M+6ZNydLWgwfD9dfDkUcmXTDqL/prIjBDbnRFaUsQtt5YkqTGGZpzRLb+lJ0L5QF7a0uQbE/o7LQPCmvXwrXXJmH53/896a38u9/BU08l/ZZb0TYuF0oUmgrCe4/eemNJkppmeUYOycafsnOhPGBv9c+xNeUTbdm3Xoc/KKxYAbfcAvffn/x86aVJN4zhw1t3/72kXaLQ1AV5nz+phKdeftvV+iRJagVDc4HL1Q4GbQmSbQ2d7f6g8LvfJd0vHn0UeveGq69OyjEGD271sXNRez54SJKkPRmaC1x3DExt+qAQIzz+eBKWn30W+vVL6pcnTID+/btw1NmV9my3JEn5ztDcDXS3wNSqDwp1dfDQQzB9OixbBoMGwR13wBVXQJ8+KY1ckiTlKkOzClKTHxRqamDePKiogD//GY46Kum5fMkl0KtXl49TkiTlB0NzN5Tt5ZNz0ubNMGsWzJgBGzfCJz4Bt98O554L+9hERpIkNc/Q3M3k4mInWbVhA9x5ZxKYt2yBsjKYMiVpH9eKlnGSJElgn+ZuJxcXO8mK1ath/HgYOjQpxTjnHKisTC76O+MMA7MkSWoTZ5q7mVxc7KRTVVYmF/c99BD07AmXXw433ACHH572yCRJUh5zprmbac+y1DkvxmSVvrIyOPHEZInr8nJYswZmzWLBlv04bdqTDJ38U06b9mT7l9OWJEndljPNTSjUi+VydbGTdtm1CxYuTHosP/ccfOQjyffjx8MBBwDdsIZbkiRlhTPNjagPWlXVNUT+FrQKYYZyTGkJU8ceR0lxEQEoKS5i6tjj8itA7tiRtIk75hgYOxY2bYK7705mlidN2h2YoRvVcEuSpKxyprkRzQWtvAqXTcjbxU62boXZs+G226CqCk44AR54AC64APZt/KVc8DXckiSpSxiaG5HPQasgy0o2bYKZM5Ov996D0aPhu9+Fs85qsQvGwOIiqhr5veV1DbckSepyhuZG5GvQ6sr63S4J52vXJrPKs2cnK/mNGZOUX5x8cqsfIl9quAvyw04X8vxJkrLN0NyIfAlae2uqrOTmn6zYfXtnhIqsh/MVK+CWW+D++5OfL70UJk6E4cPb/FD148nlQOXFih3j+ZMkdYUQY0x7DC0aOXJkXLJkSZceMx9nroZO/ilN/TZ79gjU7vzbrUU9e7T7AsDTpj3Z6Ex8SXERv5n8qTY/3m6/+13S/eLRR6F3b7jqKvja12Dw4PY/Zh7I2vnsJjx/kqTOFEJ4PsY4cu/tzjQ3IR8vlivu3ZP3ttU2elvDwAwdu7CxU2u+Y0xW6Zs2DZ59Fvr1gxtvhGuugYMOavvjZVk2Pkzlcw19LvD8SZK6gqG5Gfk027ygsoqt2+vadJ/2hopOqfmuq0tW7Zs+HZYtg0GD4Pbb4coroU+fdo0r27JVBpCvNfS5wvMnSeoKqfRpDiGsCSEsDyEsDSF0bd1FK+Vbr+aKRauo3dW2Upv2horysmEU9eyxx7ZW13zX1CQ9lYcNg0sugb/+Nem5/OqrSSlGjgZmyF7P5w6dT3n+JEldIs2Z5jNjjJtSPH6z8q1Xc3Ozxj33CRD4QE1ze0NFuy6uq66GWbNgxgx46y0YNSrpjHHuuSxYtoGK23+d8zP62SoDyIeLFXOZ50+S1BUsz2hCvtVJNvUn6h4hUHHhCUDnhopW13xv2AB33pkE5i1boKwsaRs3ejSEkFedD7JZBpCPNfS5xPMnScq2tEJzBJ4IIUTgOzHGe1IaR5PyrU6yqTZ5DTtkZDtUNKwB/3jdu0xf8wRD/+chqK2Fiy5K2saVlu5xn3ya0c/XVoSSJKnj0grNp8UY14cQDgF+HkJ4Ocb4bMMdQghXAVcBDE6h5Vi+BaS0/0RdP2N82BurmPL7H/OZVb+hbp8e/Pn8f2TotBvh8MMbvV8+zeinfY4lSVJ6UgnNMcb1mf++FUJ4BBgFPLvXPvcA90DSp7mrx5iPASm1P1HHyC/vepDv/OI+Tl9TyZZevfnOJ8Yy96Tz6DVoIL9pIjBD/s3oWwYgSVL31OWhOYSwP7BPjPH9zPdnAf/e1eNoDQNSC3btgoULYdo0Zj73HG/vX8y0M8ZxX+lneP9D+wMQWpgxzrcZfUmS1D2lMdP8EeCREEL98e+PMT6ewji6XD71fW7Wjh1w333JUtcvvwyHHcYtY67ju4efzl/37bXHri3NGLd1Rr9gzqEkScorXR6aY4yvASd09XHTlk9dIpq0dSvMnp20iquqghEj4MEH4fOf52PLN7LP/OXQjhnj1s7oF8Q5lCRJeSmVxU26o2wtjNElNm1KlrYePBiuvx6OPDJZ+vqFF+ALX4B992VMaQlTxx5HSXERASgpLtqjc0dnyOtzKEmS8pp9mrtIPnWJ2O3115OlrWfPTlbyO+88mDwZTj650d1bM2PckfKKvDyHkiSpIBiau0hedYlYsSKpV77//uTnL34x6bF89NHtfsgFlVXc/JMVvLetdve2huUV0HJdc16dQ0mSVFAMzVmy94zqmUcdzI+fr8rtLhG/+x1MmwaPPgq9e8OECUk5xkc/2qGH3bsWuaGa2p3c9OgK/lq3q8Va5Wx12vDiQkmS1BJrmrOgPiRWVdcQSULgj5+v4vMnlWS15rddYoSf/QzOOANOPRV+/eukfnntWrjjjg4HZmi8Frmh6praVtUqZ6NuurHf1ZT5y1lQWdXux5QkSYXHmeYsaOqCtadefpvfTP5USqPaS10dPPRQMrP8xz/CoEEwYwZccQXsv3+nHqq9NceN3a+puun2zhbn0zLekiQpPYbmLMjpC9ZqamDePKiogD//OalTnjcPLr4YevVq6d5tUh9km1vOsahnD/bruc8etc71Wlur3JFWdDn9u5IkSTnD8owsaCrspXrBWnU1TJ0KQ4bAV78KhxwCjzwCL74Il12WlcBcX/bQlOKinkwdexw3fu4Yinr22OO2ttQqd6QVXRq/qwWVVZw27UmGTv4pp0170lIQSZLygKE5C8rLhnUoBHaqDRtg0qSkx/I3vgEnnghPP51c9DdmDOzT9EugI+GuuTrmkuIivnjyYPb/0L587YdLqVi0qkP13h2ZLe7q35U11JIk5SfLM5rQkY4KbV0aOitWr05KMObNS+qXL7ooaRtXWtqqu3d09b2mAmvgg10w6i+UbO9FfR1pRdfVvytrqCVJyk+G5kZ0xnLNrV0autO98AJMnw4PPww9e8K4cVBeDkcc0aaH6Wi4ay7IdnZw7Ggruq78XVlDLUlSfrI8oxF5t1xzjPDUU1BWBiedlCxxPXEirFkD3/lOmwMzdDzcNVf20NnBsSuW8O4sOVnvLkmSWuRMcyPyZjZw1y5YuDBpG/fcc/CRjyTfjx8PBxyQlJjMe7JdZQcdXX2vubKHikWrOn1lv9Rm9tsoWwu0SJKk7DI0NyLnl2vesQPuuy9Z6vrll+Gww2DWrKQUY7/9gI6XmHRGuGsqyHbn4JgT9e6SJKnNDM2NaE+o65KlmLduhTlz4LbbYN06GDECHnwQPv952HfPX2VH64azGe66e3DMl1lxSZL0N4bmRrQ11HXGhYPN2rQJZs5Mvt57D0aPTsLzWWdBCI3epTNKTLIZ7gyOkiQpnxiam9CWUNeaWd12zUSvXZvMKs+enazkN2ZM0nP55JNbHFMaJSZdMtsuSZKUArtndIKWZnXbvKDFihXJKn2HHw533QVf+AK89FKygl8rAjO4aIckSVJnMjR3gpbaiDU1E/31Hy3bc7W93/0OzjsPjj026bM8YQK89hrMnQtHH92mMXV1G7a8a9MnSZLUBpZndIKWLhxsaiZ6Z4wQI0c+/ysG3nUtvPEi9OsHN92UBOaDDmr2uC2VQ7hohyRJUucwNHeC5i4cXFBZxT4hJAG5gR67dvLZl3/NVxY/xNFvr2F93/7ccvZ4Jj58K+y/f4vHzPrFh22U8236JEmSOsDQ3Ekam9WtD7YNA/OHav/KhS/+kqt+/2MGb97I6n6D+Po5X+PR4adT26MnE1sRmKHjLeU6W3fuvSxJkgqfoTmLGgbbD2/fyhcrH+PyJY9y8LZqKgcM4z8+fSW/OGIUMbS9tDzXyiG6e+9lSZJU2AzNWbS+uoaDt77Ll5Ys5NLKx+i7o4anh57ErJMv4PcfPfYDPZYP7N2z1Y+di+UQ9l6WJEmFytDcjA71HV69mjuemsVnnl/Evrt28bNhpzHr5AtY8ZHDObB3T3r+tY7anX8r2+jZI3Dj545p9dgsh5AkSeo6huYmtPtCuxdegOnT4eGH+dy+PXnohLO4a+T5rD1wAJAE2/pw3JFSBsshJEmSuo6huQltutAuRnj6aZg2DZ54Aj78YZg4kR7XXst+G3ayc9EqQiPBtqMB13IISZKkrmFobkKrLrTbtQsWLkzC8nPPwUc+Av/5n/DVr8IBBwAw5u/SaQEnSZKkzuOKgE1odpW/HTuSVfqOOQbGjoVNm+Duu2HNGpgyZXdgliRJUmFwprkJjV1od1Dcwd2blsDhl8G6dTBiBDz4IHz+87BvuqeyQxctSpIkqVmG5iY0vNCuZv2bTFjxOF9c8ii9tmyGM86AOXPgrLM+0DaurToj7Oba6oCSJEmFxtDcjDEH7WTMhoXw3TmwbRuMGQOTJsHJJ3fK43dW2M211QElSZIKjTXNTfn+9+Hww+Guu+Cii+Cll+CRRzotMEPzYbctcm11QEmSpELjTHNTPvlJuPpquP56GDw4K4forLCbi6sDSpIkFRJnmpsyZAjMmJG1wAwtdOhog/KyYRT17LHHNlcHlCRJ6jyG5hYsqKzitGlPMnTyTzlt2pMsqKzqtMfurLA7prSEqWOPo6S4iACUFBcxdexx1jNLkiR1EsszmtHShXod7XzRmUthuzqgJElS9hiam9HShXqd0fnCsCtJkpT7DM3NaO5CvY62eWs4S13cuycxwuaa2j2+d5ESSZKk3GBobkZzXSka2w40ub2hvcs+3ttWu/u2ht+7SIkkSVJu8ELAZjR3oV6PJlYCbGp7Q43NUjelPX2bJUmS1LkMzc1orivFzhgbvU9T2xtqax9mFymRJElKl+UZLWjqQr2SJko0SlrRY7m58o6m9pckSVJ6nGlup470WG7svk1xkRJJkqT0OdPcTh3psbz3fe2eIUmSlNtCbEUNbtpGjhwZlyxZkvYw8kJHF1yRJEnqzkIIz8cYR+693ZnmAtLSCoaSJElqH0NzjmvLzHFHF1yRJElS4wzNOaytM8fNrWAoSZKk9rN7Rg5rbua4MU21prNlnSRJUscYmnNYW2eOO9IGrz0WVFZx2rQnGTr5p5w27UkWVFZl5TiSJElpszwjS+prkauqa+gRAjtjpKSN3SyaWgSlqZnjjrTBaysvOpQkSd2JoTkL9g6U9UtrtzVYlpcNo/yhZdTu+ltbwJ77hGZnjptawbCzedGhJEnqTizPyILGAmW95mqSGxVa+DklXnQoSZK6E0NzFrQUHFsbLCsWraJ2556Lz9TujG0L3VniRYeSJKk7MTRnQUvBMUKrLpzL5dncrr7oUJIkKU3WNHeyBZVVbNtR1+J+ralvbuuFgPXH74oLAbvyokNJkqS0GZpbobVB9P8uWM59i9cS99oe4APboOUL58rLhu1xQSE0P5vb1R0tuuqiQ0mSpLRZntGC+iBaVV1D5G9BdO/SigWVVY0GZkhmhpu6fq+quqbJUo0xpSVMHXscJZn7lxQXMXXsce1aRluSJEnt50xzC1rbWq1i0apGAzOwe4a6sVILaH5GuC2zublcAy1JkpTPnGluQWuDaHPBtL6kY+8L5xrqjBlhO1pIkiRlh6G5Ba0Nok3tF2B3DXR9qUVTOjoj3FJHC5e9liRJah9Dcwta21qtsf0CcOnJg3eXV4wpLeE3kz/VZHDu6IxwczXQra3NliRJ0gdZ09yChq3Vqqpr6BHCHqUUDQNx/X71NcxnHnUwT738NkMn/3SPrhtt7YrR1vE2VgPdnZe97qo2fJIkqXAZmluhPmC11M6tYWBtTfu3rgxy3fUiwa5uwydJkgpTKqE5hHA2cCfQA5gTY5yWxjjaoq0ztS3t39U9jtuzUEoh6M4z7JIkqfN0eU1zCKEH8F/AZ4DhwMUhhOFdPY62autMba7N7HbXZa9z7fcgSZLyUxoXAo4CVscYX4sx7gAeBM5LYRxt0tZ2brnW/q2tC6UUilz7PUiSpPyURmguAd5o8PO6zLac1taZ2lyc2a3v3vHnaZ/lN5M/VfCBGXLz9yBJkvJPGjXNja0o/YHF9EIIVwFXAQwePDjbY2pRWy/eS+NiP32QvwdJktQZQoxNLf6cpQOGcApwU4yxLPPzFIAY49Sm7jNy5Mi4ZMmSLhqhJEmSuqsQwvMxxpF7b0+jPOMPwJEhhKEhhF7APwKPpjAOSZIkqVW6vDwjxlgXQpgALCJpOfe9GOOKrh6HJEmS1Fqp9GmOMT4GPJbGsSVJkqS2SqM8Q5IkScorhmZJkiSpBamUZ+SrBZVVti6TJEnqhgzNrbSgsoop85dTU7sTgKrqGqbMXw5gcJYkSSpwlme0UsWiVbsDc72a2p1ULFqV0ogkSZLUVQzNrbS+uqZN2yVJklQ4DM2tNLC4qE3bJUmSVDgMza1UXjaMop499thW1LMH5WXDUhqRJEmSuooXArZS/cV+ds+QJEnqfgzNbTCmtMSQLEmS1A0ZmtvBfs2SJEndi6G5jezXLEmS1P0YmtuouX7NuRKanQmXJEnqXIbmNsr1fs3OhEuSJHU+W861Ua73a3blQkmSpM5naG6jXO/XnOsz4ZIkSfnI0NxGY0pLmDr2OEqKiwhASXERU8celzOlD7k+Ey5JkpSPrGluh1zu11xeNmyPmmbIrZlwSZKkfGRoLjCuXChJktT5DM0FKJdnwiVJkvKRNc2SJElSCwzNkiRJUgsMzZIkSVILDM2SJElSCwzNkiRJUgsMzZIkSVILDM2SJElSCwzNkiRJUgsMzZIkSVILDM2SJElSCwzNkiRJUgv2TXsAuWhBZRUVi1axvrqGgcVFlJcNY0xpSdrDkiRJUkoMzXtZUFnFlPnLqandCUBVdQ1T5i8HMDhLkiR1U5Zn7KVi0ardgbleTe1OKhatSmlEkiRJSpuheS/rq2vatF2SJEmFz9C8l4HFRW3aLkmSpMJnaN5Ledkwinr22GNbUc8elJcNS2lEkiRJSpsXAu6l/mI/u2dIkiSpnqG5EWNKSwzJkiRJ2s3yDEmSJKkFhmZJkiSpBYZmSZIkqQWGZkmSJKkFhmZJkiSpBYZmSZIkqQWGZkmSJKkFhmZJkiSpBYZmSZIkqQWGZkmSJKkFhmZJkiSpBYZmSZIkqQWGZkmSJKkFhmZJkiSpBYZmSZIkqQUhxpj2GFoUQngbeL2LD9sf2NTFx+xuPMfZ5znOLs9v9nmOs8vzm32e4+zr7HN8aIzx4L035kVoTkMIYUmMcWTa4yhknuPs8xxnl+c3+zzH2eX5zT7PcfZ11Tm2PEOSJElqgaFZkiRJaoGhuWn3pD2AbsBznH2e4+zy/Gaf5zi7PL/Z5znOvi45x9Y0S5IkSS1wplmSJElqQbcPzSGENSGE5SGEpSGEJY3cHkII3wohrA4h/DGEcGIa48xXIYRhmXNb/7UlhHDdXvuMDiFsbrDPN1Mabt4IIXwvhPBWCOHFBtv6hRB+HkJ4JfPfA5u479khhFWZ1/Tkrht1/mji/FaEEF7OvA88EkIobuK+zb6nKNHEOb4phFDV4L3gnCbu62u4BU2c3x82OLdrQghLm7ivr+FWCCF8NITwVAhhZQhhRQjh2sx234s7QTPnN7X34m5fnhFCWAOMjDE22t8v86Z9DXAO8AngzhjjJ7puhIUjhNADqAI+EWN8vcH20cANMcZ/SGloeSeEcDqwFfjvGOOxmW23AO/GGKdl3oAPjDFO2ut+PYA/Af8bWAf8Abg4xvhSlz6BHNfE+T0LeDLGWBdCmA6w9/nN7LeGZt5TlGjiHN8EbI0x3trM/XwNt0Jj53ev228DNscY/72R29bga7hFIYQBwIAY4wshhL7A88AYYBy+F3dYM+d3ECm9F3f7meZWOI/kTSfGGBcDxZlfpNru08CrDQOz2ifG+Czw7l6bzwPuzXx/L8mby95GAatjjK/FGHcAD2bupwYaO78xxidijHWZHxeTvHGrnZp4DbeGr+FWaO78hhACcBHwQJcOqsDEGDfEGF/IfP8+sBIowffiTtHU+U3zvdjQDBF4IoTwfAjhqkZuLwHeaPDzusw2td0/0vSb9CkhhGUhhJ+FEI7pykEVkI/EGDdA8mYDHNLIPr6eO8e/AD9r4raW3lPUvAmZP7t+r4k/a/sa7rhPAhtjjK80cbuv4TYKIQwBSoHf43txp9vr/DbUpe/F+3bGg+S502KM60MIhwA/DyG8nPmEXi80cp/uXdPSDiGEXsC5wJRGbn6BZMnKrZlymAXAkV04vO7E13MHhRD+D1AH3NfELi29p6hps4D/IHlN/gdwG8k/ig35Gu64i2l+ltnXcBuEEPoAPwauizFuSSbyW75bI9t8HTdi7/PbYHuXvxd3+5nmGOP6zH/fAh4h+ZNJQ+uAjzb4eRCwvmtGV1A+A7wQY9y49w0xxi0xxq2Z7x8DeoYQ+nf1AAvAxvrSocx/32pkH1/PHRBCuAz4B+DS2MQFIa14T1ETYowbY4w7Y4y7gNk0fu58DXdACGFfYCzww6b28TXceiGEniSB7r4Y4/zMZt+LO0kT5ze19+JuHZpDCPtnissJIewPnAW8uNdujwL/HBInk1w4saGLh1oImpzZCCH8XabGjhDCKJLX5TtdOLZC8ShwWeb7y4CFjezzB+DIEMLQzOz/P2bupxaEEM4GJgHnxhi3NbFPa95T1IS9rhc5n8bPna/hjvlfwMsxxnWN3ehruPUy/259F1gZY7y9wU2+F3eCps5vqu/FMcZu+wUcBizLfK0A/k9m+3hgfOb7APwX8CqwnORKzNTHnk9fQG+SEHxAg20Nz/GEzPlfRlLUf2raY871L5IPIBuAWpIZiy8BBwG/BF7J/LdfZt+BwGMN7nsOyVXbr9a/5v1q1fldTVKDuDTzdffe57ep9xS/Wn2Ov595n/0jSYAYsPc5zvzsa7gd5zezfV79e2+DfX0Nt+8c/z1JScUfG7wvnON7cdbPb2rvxd2+5ZwkSZLUkm5dniFJkiS1hqFZkiRJaoGhWZIkSWqBoVmSJElqgaFZkiRJaoGhWZJSEELYGUJYGkJ4MYTwUAihdyc//tMhhJEt7HNdw+OGEB4LIRR35jgkqVAYmiUpHTUxxhExxmOBHSS9y7vadSR91AGIMZ4TY6xOYRySlPMMzZKUvl8BR4QQ+oUQFoQQ/hhCWBxCOB4ghHBTCOH7IYQnQwivhBCuzGwfHUL4n/oHCSF8O4Qwbu8HDyHMCiEsCSGsCCHcnNn2rySLATwVQngqs21N/RL2IYTrM7PgL4YQrstsGxJCWBlCmJ15rCdCCEVZPTOSlCMMzZKUohDCvsBnSFbCuxmojDEeD3wD+O8Gux4PfBY4BfhmCGFgGw7zf2KMIzOPcUYI4fgY47eA9cCZMcYz9xrTScDlwCeAk4ErQwilmZuPBP4rxngMUA18vi3PV5LylaFZktJRFEJYCiwB1gLfJVk29vsAMcYngYNCCAdk9l8YY6yJMW4CngJGteFYF4UQXgAqgWOA4S3s//fAIzHGv8QYtwLzgU9mbvtzjHFp5vvngSFtGIck5a190x6AJHVTNTHGEQ03hBBCI/vFvf7bcHsde05+7Lf3nUMIQ4EbgI/HGN8LIcxrbL+979bMbX9t8P1OwPIMSd2CM82SlDueBS6FpF4Z2BRj3JK57bwQwn4hhIOA0cAfgNeB4SGED2VmpD/dyGN+GPgLsDmE8BGSUpB67wN9mxjHmBBC7xDC/sD5JHXXktRtOdMsSbnjJmBuCOGPwDbgsga3PQf8FBgM/EeMcT1ACOFHwB+BV0jKL/YQY1wWQqgEVgCvAb9pcPM9wM9CCBsa1jXHGF/IzEg/l9k0J8ZYGUIY0hlPUpLyUYhx77/4SZJySQjhJmBrjPHWtMciSd2V5RmSJElSC5xpliRJklrgTLMkSZLUAkOzJEmS1AJDsyRJktQCQ7MkSZLUAkOzJEmS1AJDsyRJktSC/x9bjeBPyNCHwwAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.linspace(data.Population.min(), data.Population.max(), 100)\n", "f = g[0, 0] + (g[0, 1] * x)\n", "\n", "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(x, f, 'r', label='Prediction')\n", "ax.scatter(data.Population, data.Profit, label='Traning Data')\n", "ax.legend(loc=2)\n", "ax.set_xlabel('Population')\n", "ax.set_ylabel('Profit')\n", "ax.set_title('Predicted Profit vs. Population Size')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "由于梯度方程式函数也在每个训练迭代中输出一个代价的向量,所以我们也可以绘制。 请注意,代价总是降低 - 这是凸优化问题的一个例子。" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(np.arange(iters), cost, 'r')\n", "ax.set_xlabel('Iterations')\n", "ax.set_ylabel('Cost')\n", "ax.set_title('Error vs. Training Epoch')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 多变量线性回归" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "练习1还包括一个房屋价格数据集,其中有2个变量(房子的大小,卧室的数量)和目标(房子的价格)。 我们使用我们已经应用的技术来分析数据集。" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SizeBedroomsPrice
021043399900
116003329900
224003369000
314162232000
430004539900
\n", "
" ], "text/plain": [ " Size Bedrooms Price\n", "0 2104 3 399900\n", "1 1600 3 329900\n", "2 2400 3 369000\n", "3 1416 2 232000\n", "4 3000 4 539900" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "path = 'ex1data2.txt'\n", "data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])\n", "data2.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于此任务,我们添加了另一个预处理步骤 - 特征归一化。 这个对于pandas来说很简单" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SizeBedroomsPrice
00.130010-0.2236750.475747
1-0.504190-0.223675-0.084074
20.502476-0.2236750.228626
3-0.735723-1.537767-0.867025
41.2574761.0904171.595389
\n", "
" ], "text/plain": [ " Size Bedrooms Price\n", "0 0.130010 -0.223675 0.475747\n", "1 -0.504190 -0.223675 -0.084074\n", "2 0.502476 -0.223675 0.228626\n", "3 -0.735723 -1.537767 -0.867025\n", "4 1.257476 1.090417 1.595389" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2 = (data2 - data2.mean()) / data2.std()\n", "data2.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在我们重复第1部分的预处理步骤,并对新数据集运行线性回归程序。" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-1.10910099e-16 8.78503652e-01 -4.69166570e-02]]\n" ] }, { "data": { "text/plain": [ "0.1307033696077189" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# add ones column\n", "data2.insert(0, 'Ones', 1)\n", "\n", "# set X (training data) and y (target variable)\n", "cols = data2.shape[1]\n", "X2 = data2.iloc[:,0:cols-1]\n", "y2 = data2.iloc[:,cols-1:cols]\n", "\n", "# convert to matrices and initialize theta\n", "X2 = np.matrix(X2.values)\n", "y2 = np.matrix(y2.values)\n", "theta2 = np.matrix(np.array([0,0,0]))\n", "\n", "# perform linear regression on the data set\n", "g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)\n", "\n", "print(g2)\n", "# get the cost (error) of the model\n", "computeCost(X2, y2, g2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们也可以快速查看这一个的训练进程。" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(np.arange(iters), cost2, 'r')\n", "ax.set_xlabel('Iterations')\n", "ax.set_ylabel('Cost')\n", "ax.set_title('Error vs. Training Epoch')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们也可以使用scikit-learn的线性回归函数,而不是从头开始实现这些算法。 我们将scikit-learn的线性回归算法应用于第1部分的数据,并看看它的表现。" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LinearRegression()" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn import linear_model\n", "model = linear_model.LinearRegression()\n", "model.fit(X, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "scikit-learn model的预测表现" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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1++Y2TJJDaW6/66uLq1cuVLr168v1V2inwYPHqwddthBtbW1UZcCAAAQiFBOBDSzUZKaJP1N0iRJ55nZaZIWyZuNfqvY+1y5cqW22GILjRo1SmZW0npROOec1q5dq5UrV2r06NFRlwMAABCIwE8ENLOhku6SdKFzbp2kn0v6uKTx8maif5zjdmeb2SIzW7RmzZpel69fv15bb701gTliZqatt96aGX8AAFDRAg3NZlYrLzD/2jk3T5Kcc68757qdcxslXS9pv2y3dc5d55yb6JybOGJEr6XykvcfUOUoBj8HAABQ6YJcPcMk3SBpmXPuipTx7VOudqKk54KqIWg1NTUaP368PvGJT+ikk07S+++/3+/7Ov300/W73/1OkvTlL39ZL7zwQs7rPvzww3r88cd7vr/22mt1yy239PuxAQAA0Lcge5onSfqipKVmtsQfu0TSyWY2XpKTtELSVwKsIVB1dXVasmSJJOmUU07Rtddeq69//es9l3d3d6umpqbo+/3lL3/Z5+UPP/ywhg4dqoMOOkiSdM455xT9GAAAAChcYDPNzrm/OOfMOTfOOTfe/zPfOfdF59xYf/zT/iobZe/ggw/WSy+9pIcffliTJ0/WF77wBY0dO1bd3d1qaWnRvvvuq3HjxukXv/iFJO8EuvPOO09jxozRscceqzfeeKPnvg477LCeHRD/9Kc/acKECdp77711xBFHaMWKFbr22mt15ZVXavz48Xrsscc0a9YsXX65t4LfkiVLdMABB2jcuHE68cQT9dZbb/Xc54wZM7Tffvtp991312OPPRbyEQIAAChfZbGNdl4XXij5M74lM3689JOfFHTVDRs26I9//KOOOuooSdKTTz6p5557TqNHj9Z1112nYcOG6amnntIHH3ygSZMm6cgjj1RbW5va29u1dOlSvf766xozZoy+9KUvpd3vmjVrdNZZZ+nRRx/V6NGj9eabb2r48OE655xzNHToUF100UWSpAcffLDnNqeddpquvvpqHXroofrOd76jyy67TD/xn8eGDRv05JNPav78+brsssv0wAMPDPgwAQAAVIPKCM0RSSQSGj9+vCRvpvnMM8/U448/rv32269n+bU///nPevbZZ3v6ld9++20tX75cjz76qE4++WTV1NRo5MiROvzww3vd/xNPPKFDDjmk576GDx/eZz1vv/22Ojs7deihh0qSpk+frpNOOqnn8qlTp0qS9tlnH61YsWJAzx0AAKCaVEZoLnBGuNRSe5pTbb755j1fO+d09dVXq7m5Oe068+fPz7vqhHOupCtTbLbZZpK8Exg3bNhQsvsFAACodIGv01ztmpub9fOf/1xdXV2SpL///e967733dMghh+g3v/mNuru7tXr1aj300EO9bnvggQfqkUce0SuvvCJJevPNNyVJW2yxhd55551e1x82bJi22mqrnn7lW2+9tWfWGQAAAP1XGTPNMfblL39ZK1as0IQJE+Sc04gRI9Ta2qoTTzxRCxcu1NixY7X77rtnDbcjRozQddddp6lTp2rjxo3adtttdf/99+v444/XZz/7Wf3hD3/Q1VdfnXabm2++Weecc47ef/997bLLLrrxxhvDeqoAAAAVy5xzUdeQ18SJE11yNYmkZcuWac8994yoImTi5wEAAAaqta1Dcxe0a1VnQiPr69TS3KgpTQ2h1mBmi51zEzPHmWkGAABA5FrbOjRz3lIlurolSR2dCc2ct1SSQg/O2dDTDAAAgMjNXdDeE5iTEl3dmrugPaKK0hGaAQAAELlVnYmixsNGaAYAAEDkRtbXFTUeNkIzAAAAItfS3Ki62pq0sbraGrU0N0ZUUTpOBAQAAEDkkif7Rb16Ri6E5n5au3atjjjiCEnSv/71L9XU1GjEiBGSpCeffFKbbrppv+73mGOO0W233ab6+voB1bdixQrtueee2mOPPbR+/XptscUWOvfcczV9+vQ+b7dkyRKtWrVKxxxzzIAeHwAAoFhTmhpiE5IzEZr7aeutt+7ZQnvWrFkaOnSoLrroop7LN2zYoEGDij+88+fPL1WJ+vjHP662tjZJ0ssvv9yzScoZZ5yR8zZLlizRokWLCM0AAAApqqanubWtQ5PmLNToi+/TpDkL1drWUfLHOP300/X1r39dkydP1owZM/Tkk0/qoIMOUlNTkw466CC1t3tLptx0002aOnWqjjrqKO2222765je/2XMfo0aN0r///e+emeKzzjpLe+21l4488kglEt7Zo0899ZTGjRunAw88UC0tLfrEJz6Rt7ZddtlFV1xxhX76059KUtbaPvzwQ33nO9/RHXfcofHjx+uOO+7I+RwAAACqSVXMNIe5WPbf//53PfDAA6qpqdG6dev06KOPatCgQXrggQd0ySWX6K677pLkzei2tbVps802U2Njo84//3ztuOOOafe1fPly3X777br++us1bdo03XXXXTr11FN1xhln6LrrrtNBBx2kiy++uODaJkyYoBdffFGStMcee2St7bvf/a4WLVqka665RpL6fA4AAADVoipCc1+LZZc6NJ900kmqqfHO/Hz77bc1ffp0LV++XGamrq6unusdccQRGjZsmCRpzJgxevXVV3uF5tGjR2v8+PGSpH322UcrVqxQZ2en3nnnHR100EGSpC984Qu69957C6otdcv0vmpLVej1AAAAKllVtGeEuVj25ptv3vP1t7/9bU2ePFnPPfec7rnnHq1fv77nss0226zn65qaGm3YsKHXfWW7TmrwLVZbW5v23HPPvLWlKvR6AAAAlawqQnNUi2W//fbbamjwZrJvuummktznVlttpS222EJPPPGEJOk3v/lNQbdbsWKFLrroIp1//vl91rbFFlvonXfe6fk+iOcAAABQbqoiNEe1WPY3v/lNzZw5U5MmTVJ3d3f+GxTohhtu0Nlnn60DDzxQzrmeNo9M//jHP9TU1KQ999xT06ZN0/nnn9+zckau2iZPnqwXXnih50TAoJ4DAABAObGB/Lo/LBMnTnSLFi1KG1u2bFlPq0EhWts6YrtYdrHeffddDR06VJI0Z84crV69WldddVWkNRX78wAAAIgjM1vsnJuYOV4VJwJK8V4su1j33XefZs+erQ0bNmjnnXembQIAACBgVROaK8nnPvc5fe5zn4u6DAAAgKpRFT3NAAAAwECUdWguh37sasDPAQAAVLqyDc2DBw/W2rVrCWwRc85p7dq1Gjx4cNSlAAAABKZse5p32GEHrVy5UmvWrIm6lKo3ePBg7bDDDlGXAQAAEJiyDc21tbUaPXp01GUAAICIVdKysoivsg3NAAAArW0dmjlvqRJd3gZcHZ0JzZy3VJIIziipsu1pBgAAmLugvScwJyW6ujV3QXtEFWHAEglp/fqoq+iF0AwAAMrWqs5EUeOIsTfekLbbThoyRNpvv6ir6YXQDAAAytbI+rqixhFD//qXtPXWXmB+4w1v7FvfiramLAjNAACgbLU0N6qutiZtrK62Ri3NjRFVhIKtWiUNGyZtv7305pve2I9/LDknTZsWbW1ZcCIgAAAoW8mT/Vg9o4x0dEi77y69//5HY1ddJV1wQXQ1FYDQDAAAytqUpgZCcjl4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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.array(X[:, 1].A1)\n", "f = model.predict(X).flatten()\n", "\n", "fig, ax = plt.subplots(figsize=(12,8))\n", "ax.plot(x, f, 'r', label='Prediction')\n", "ax.scatter(data.Population, data.Profit, label='Traning Data')\n", "ax.legend(loc=2)\n", "ax.set_xlabel('Population')\n", "ax.set_ylabel('Profit')\n", "ax.set_title('Predicted Profit vs. Population Size')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4. normal equation(正规方程)\n", "正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:$\\frac{\\partial }{\\partial {{\\theta }_{j}}}J\\left( {{\\theta }_{j}} \\right)=0$ 。\n", " 假设我们的训练集特征矩阵为 X(包含了${{x}_{0}}=1$)并且我们的训练集结果为向量 y,则利用正规方程解出向量 $\\theta ={{\\left( {{X}^{T}}X \\right)}^{-1}}{{X}^{T}}y$ 。\n", "上标T代表矩阵转置,上标-1 代表矩阵的逆。设矩阵$A={{X}^{T}}X$,则:${{\\left( {{X}^{T}}X \\right)}^{-1}}={{A}^{-1}}$\n", "\n", "梯度下降与正规方程的比较:\n", "\n", "梯度下降:需要选择学习率α,需要多次迭代,当特征数量n大时也能较好适用,适用于各种类型的模型\t\n", "\n", "正规方程:不需要选择学习率α,一次计算得出,需要计算${{\\left( {{X}^{T}}X \\right)}^{-1}}$,如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为$O(n3)$,通常来说当$n$小于10000 时还是可以接受的,只适用于线性模型,不适合逻辑回归模型等其他模型" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# 正规方程\n", "def normalEqn(X, y):\n", " theta = np.linalg.inv(X.T@X)@X.T@y#X.T@X等价于X.T.dot(X)\n", " return theta" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[-3.89578088],\n", " [ 1.19303364]])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_theta2=normalEqn(X, y)#感觉和批量梯度下降的theta的值有点差距\n", "final_theta2" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "#梯度下降得到的结果是matrix([[-3.24140214, 1.1272942 ]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在练习2中,我们将看看分类问题的逻辑回归。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 1 }