{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from sklearn import datasets\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import math" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def load_iris(ratio=0.8):\n", " features, target = datasets.load_iris(True)\n", " \n", " # 只保留0,1分类 -- 把任务变成二分类任务\n", " # 如果做多分类任务请注释这一段话\n", " idx = np.bitwise_or(target == 0, target == 1)\n", " features = features[idx]\n", " target = target[idx]\n", " \n", " num_samples = len(target)\n", " num_train = math.ceil(num_samples * ratio)\n", " \n", " \n", " # 随机打乱数据\n", " idx = np.random.permutation(np.arange(num_samples))\n", " traindata = features[idx[:num_train]], target[idx[:num_train]]\n", " validdata = features[idx[num_train:]], target[idx[num_train:]]\n", " \n", " return traindata, validdata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 作业三\n", "\n", "## 四、Logistic回归与最大熵模型\n", "\n", "要求:\n", "\n", "* 通过logistic回归来对只含两类的iris数据集进行二分类\n", "* 利用梯度下降法(定步长)\n", "* 在尽量不修改代码结构的前提下完成工作\n", "\n", "ETA:1-5 hours" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "读取数据" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "(X_train, Y_train), (X_valid, Y_valid) = load_iris()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 一、定义线性回归函数\n", "\n", "为了简化推导,记$\\hat{Y} = WX+b$\n", "\n", "预测 -- 取下述概率最大的值:\n", "\n", "$$P(class=1|x) = \\frac{\\exp(\\hat{Y})}{1+\\exp(\\hat{Y})}$$\n", "$$P(class=0|x) = \\frac{1}{1+\\exp(\\hat{Y})}$$" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "class Logistic:\n", " def __init__(self, in_channels):\n", " self.W = np.zeros(in_channels)\n", " self.b = 0\n", " \n", " \n", " def __call__(self, X):\n", " \"\"\"计算 \\hat{Y} = WX + b,其中WX为内积\"\"\"\n", " assert len(X.shape) == 2\n", " # 这里只计算WX+b,因为在计算对数似然函数时需要用到该值\n", " \n", " # 实现它\n", " raise(NotImplementedError())\n", " return None\n", " \n", " \n", " def predict(self, X):\n", " \"\"\"预测X所属的类别\"\"\"\n", " assert len(X.shape) == 2\n", " \n", " # 实现它\n", " raise(NotImplementedError())\n", " return None\n", " \n", " \n", "def accuracy(real, predict):\n", " \"\"\"计算预测准确度\"\"\"\n", " return np.sum(real == predict)/real.size" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n", " 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 测试LinearLayer是否能够正确调用\n", "num_features = X_train.shape[-1]\n", "f = Logistic(num_features)\n", "\n", "f(X_train)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f.predict(X_train)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.5" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "accuracy(Y_train, f.predict(X_train)) # 瞎猜 -- 50%左右的分类准确度" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 二、定义误差 -- 对数似然函数\n", "\n", "$$ L(Y, \\hat{Y}) = \\sum_{i=1}^{N} [y_i\\hat{y}_i - log(1+\\exp(\\hat{y}_i))]$$\n", "\n", "其中$Y$为真实值,$\\hat{Y} = Wx + b$为预测值\n", "\n", "注:$L(Y, \\hat{Y}) \\neq L(\\hat{Y}, Y)$" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "class NegativeLogLikelihood:\n", " # 针对二项Logistic的负对数似然函数\n", " # 梯度下降法求解的问题实际上是 min. -L\n", " def __call__(self, real, predict):\n", " assert len(real.shape) == 1\n", " assert real.size == predict.size\n", " \n", " # 实现它\n", " raise(NotImplementedError())\n", " return None" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "55.451774444795625" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 测试loss是否能够正确调用\n", "loss = NegativeLogLikelihood()\n", "loss(Y_train, f(X_train))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 三、计算梯度\n", "\n", "为了使用梯度下降法,需要计算梯度$(\\frac{\\partial L}{\\partial W}, \\frac{\\partial L}{\\partial b})$\n", "\n", "利用链式法则:\n", "\n", "$$ \\frac{\\partial L}{\\partial W} = \\sum_{i=1}^{N}\\frac{\\partial L}{\\partial \\hat{Y}_i} \\frac{\\partial \\hat{Y}_i}{\\partial W} $$\n", "$$ \\frac{\\partial L}{\\partial b} = \\sum_{i=1}^{N}\\frac{\\partial L}{\\partial \\hat{Y}_i} \\frac{\\partial \\hat{Y}_i}{\\partial b} $$" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "def grad(Y, X, Y_out):\n", " \"\"\"\n", " 计算负对数似然函数在(X, Y)上关于W与b的偏导数\n", " Inputs:\n", " Y: shape (N, )\n", " 类别的真实值\n", " X: shape (N, C)\n", " 输入特征\n", " Y_out: shape (N, )\n", " Y_out = WX+b\n", "\n", " Outputs:\n", " dLdW: shape (C, )\n", " dLdb: shape (1, )\n", " \"\"\"\n", " # 实现它\n", " raise(NotImplementedError())\n", " dLdY = None # dLdY.shape == (?, ) (?为占位符, 不需要回答..)\n", " dYdW = None # dYdW.shape == (?, 4)\n", " dYdb = None # dYdb.shape == (?, 1)\n", " \n", " dLdW = None # dLdW.shape == (4, )\n", " dLdb = None # dLdb.shape == (1, )\n", " \n", " return dLdW, dLdb" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([-18.5 , 12.8 , -56.2 , -21.85]), array(0.))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 测试梯度是否正确计算\n", "grad(Y_train, X_train, f(X_train))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "class GradientDescent:\n", " def __init__(self, step=1e-3, thres=1e3):\n", " self.step = step\n", " self.thres = np.abs(thres)\n", " \n", " \n", " def update(self, f:Logistic, dLdW, dLdb):\n", " \"\"\"利用梯度dW来更新f的权重\"\"\"\n", " # 实现它\n", " raise(NotImplementedError())" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "before update: loss:55.4518 accuracy:0.5\n", "after update: loss:52.0012 accuracy:0.5\n" ] } ], "source": [ "# 测试梯度更新是否正常工作\n", "opt = GradientDescent(1e-3)\n", "f = Logistic(num_features)\n", "\n", "print(f\"before update: loss:{loss(Y_train, f(X_train)):.4f} accuracy:{accuracy(Y_train, f.predict(X_train))}\")\n", "\n", "dLdW, dLdb = grad(Y_train, X_train, f(X_train))\n", "opt.update(f, dLdW, dLdb)\n", "\n", "print(f\"after update: loss:{loss(Y_train, f(X_train)):.4f} accuracy:{accuracy(Y_train, f.predict(X_train))}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 四、把所有函数组合成一个完整的训练过程" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iter 0: loss 55.4518, accu: 0.5000, valid loss 13.8528, valid accu 0.5000\n", "Iter 50: loss 53.6407, accu: 0.5000, valid loss 13.4073, valid accu 0.5000\n", "Iter 100: loss 52.1356, accu: 0.5000, valid loss 13.0342, valid accu 0.5000\n", "Iter 150: loss 50.7720, accu: 0.5000, valid loss 12.6949, valid accu 0.5000\n", "Iter 200: loss 49.4897, accu: 0.5125, valid loss 12.3752, valid accu 0.6000\n", "Iter 250: loss 48.2658, accu: 0.7000, valid loss 12.0699, valid accu 0.8000\n", "Iter 300: loss 47.0908, accu: 0.9000, valid loss 11.7768, valid accu 0.9000\n", "Iter 350: loss 45.9604, accu: 0.9750, valid loss 11.4947, valid accu 0.9500\n", "Iter 400: loss 44.8717, accu: 1.0000, valid loss 11.2230, valid accu 1.0000\n", "Iter 450: loss 43.8228, accu: 1.0000, valid loss 10.9611, valid accu 1.0000\n", "Iter 500: loss 42.8118, accu: 1.0000, valid loss 10.7087, valid accu 1.0000\n", "Iter 550: loss 41.8372, accu: 1.0000, valid loss 10.4653, valid accu 1.0000\n", "Iter 600: loss 40.8975, accu: 1.0000, valid loss 10.2305, valid accu 1.0000\n", "Iter 650: loss 39.9912, accu: 1.0000, valid loss 10.0041, valid accu 1.0000\n", "Iter 700: loss 39.1169, accu: 1.0000, valid loss 9.7856, valid accu 1.0000\n", "Iter 750: loss 38.2733, accu: 1.0000, valid loss 9.5747, valid accu 1.0000\n", "Iter 800: loss 37.4590, accu: 1.0000, valid loss 9.3710, valid accu 1.0000\n", "Iter 850: loss 36.6729, accu: 1.0000, valid loss 9.1744, valid accu 1.0000\n", "Iter 900: loss 35.9138, accu: 1.0000, valid loss 8.9845, valid accu 1.0000\n", "Iter 950: loss 35.1806, accu: 1.0000, valid loss 8.8010, valid accu 1.0000\n" ] } ], "source": [ "num_features = X_train.shape[-1]\n", "f = Logistic(num_features)\n", "opt = GradientDescent(1e-5)\n", "loss = NegativeLogLikelihood()\n", "\n", "valid_losses = []\n", "valid_accuracies = []\n", "train_losses = []\n", "train_accuracies = []\n", "for i in range(1000):\n", " X, Y = X_train, Y_train\n", " \n", " Y_out = f(X) \n", " dLdW, dLdb = grad(Y, X, Y_out)\n", " opt.update(f, dLdW, dLdb)\n", " \n", " # 记录中间结果\n", " cur_valid_loss = loss(Y_valid, f(X_valid))\n", " cur_valid_accu = accuracy(Y_valid, f.predict(X_valid))\n", " cur_train_loss = loss(Y, Y_out)\n", " cur_train_accu = accuracy(Y, f.predict(X))\n", " valid_losses.append(cur_valid_loss) \n", " valid_accuracies.append(cur_valid_accu)\n", " train_losses.append(cur_train_loss)\n", " train_accuracies.append(cur_train_accu)\n", " \n", " if i%50 == 0:\n", " print(f\"Iter {i}: loss {cur_train_loss:.4f}, accu: {cur_train_accu:.4f}, valid loss {cur_valid_loss:.4f}, valid accu {cur_valid_accu:.4f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 五、打印中间结果" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(train_losses)\n", "plt.plot(valid_losses)\n", "plt.legend([\"train loss\", \"validation loss\"])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD4CAYAAAD8Zh1EAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nO3de3xU5b3v8c8vFxJugZAAQiCALXIRRSAI3V5qrbR4KVguRbfdbjy2nN2tqHu3nk1bW62tr1rbWssp9UgtVbutQLFeX1h2YePGtmoBRURAQKUSQAjXBEjITOY5f6yVcRISZhImmcya7/v1yiuZtZ7M/BYr8+WZZ631LHPOISIi6S8r1QWIiEhyKNBFRAJCgS4iEhAKdBGRgFCgi4gERE6qXri4uNgNHjw4VS8vIpKW1q9ff8A517updSkL9MGDB7Nu3bpUvbyISFoys783t05DLiIiAaFAFxEJCAW6iEhAKNBFRAJCgS4iEhBxA93MFpnZfjPb1Mx6M7P5ZrbDzDaa2djklykiIvEk0kN/DJh8mvVXAkP9rznAw2deloiItFTc89Cdc2vMbPBpmkwFnnDePLyvmVlPM+vnnNubpBolaN58Eg7vJFQXYUP5EerqNIWzZJZeY6dyzthPJ/15k3FhUQmwK+Zxub/slEA3szl4vXhKS0uT8NKSdkLV8Ny/ApCDMU5ZLhlobUE/6KCBnjDn3EJgIUBZWZneypmortb7/rn7eDrvWr7x+7dYc+dnKC3qktq6RNrRhDZ63mSc5bIbGBjzeIC/TORUkTrve1YOldUhAAo6p2wGCpFASUagPw/c6J/tMhE4qvFzaVY00LOprPECvVueAl0kGeK+k8zsKeAyoNjMyoG7gVwA59z/A5YDVwE7gBPATW1VrKQn5xwL17zP3qM1dK+t4OvAC5v2s/L4Prrl5ZCTrcshRJIhkbNcro+z3gG3JK0iCZyKqpP88KWt5OdmUZp9iK8Daz+s5ENO8KlPFKW6PJHA0GddaXNH/bHyH88YzRcGnoT5cO+1F3DvBZ9PcWUiwaLPutLm6sfKCzrnNjgoKiLJpUCXNldZHQagID8HIt7PZGWnsCKRYFI3SZJmx/5j/GrN+9S5hpcY7Dp0AvB76HX1ga4/PZFk07tKkub5t/awZN0uSnp2PmXd6IE9veUVCnSRtqJ3lSRNZXWI7vk5/GXe5c030hi6SJvRGLokTWVNiIL83NM30hi6SJtRoEvSVFaHvXHy04loyEWkrehdJWfsLzsO8MSrO3nzw8N8sk+30zdWoIu0GfXQ5Yz9ft0uVm+toHf3PCaPOuv0jRXoIm1G7yo5Y5U1Yc45qxsvzr0kfmMdFBVpM+qhyxmrrE7gYGg9HRQVaTMKdDljCZ3dUk+BLtJm9LlX4qs+As/dAicrGyzeV3mSimMn+V51iOJwHjwe54AowPED3ncNuYgknd5VEt/+LbD1RegzEvJ7RBcfrDxGbaiOnnnZ9O5sUBeK/1z5PWDY1VA4uO3qFclQCnSJr36Y5MoHYMjHBz7n/vRlhg8uYMENY1NUmIjE0hi6xNfMqYaVNWHdD1SkA1GgS3zNnGpY1ZKDoSLS5tS9kvhizkxZsHoHf9z0EQ5HTShC93z9CYl0FOqhS3wxQy7PbdjNvsoa+nTPZ9LIvlwxsm9qaxORKHWvJL6YQK+sDnPZsN48MGN0amsSkVOohy7xxQa6xs1FOiwFusTnHxQNk8WJ2rr4U+SKSEoo0CU+v4d++9K3AXQgVKSDUqBLfH6gr99VBcAVI3QgVKQjUqBLfH6g15HNd64ZycBeXVJckIg0RYEu8cWMoefl6E9GpKPSu1Pii+mhK9BFOi69OyU+P9DDZJOXq3nMRToqBbrEF+2ha8hFpCPTu1Pii46hZ9NJgS7SYSX07jSzyWb2rpntMLN5TawfZGarzGyjmb1sZgOSX6qkjHroImkh7rvTzLKBBcCVwEjgejMb2ajZT4AnnHPnA/cCP0x2oZJCkTDOsgAjL0dj6CIdVSKX/F0I7HDOvQ9gZouBqcDmmDYjgX/3f14NPJvMIqUdHPkQHvk01B6LLgrVRXAOsqkj5P+p5Oeqhy7SUSUS6CXArpjH5cCERm3eAqYBPwe+CHQ3syLn3MHYRmY2B5gDUFpa2tqapS0c+RCqD8GoGdBzIACPvvwefQvy6dcznwOdz+Y/Bg5n+FkFKS5URJqTrEk5vgH8wsxmA2uA3UBd40bOuYXAQoCysjKXpNeWZKifUXH8zTDoH4hEHD9auZw7xg5l2hXnpLY2EUlIIoG+GxgY83iAvyzKObcHr4eOmXUDpjvnjiSrSGkHje4bGopEAMjN1hCLSLpI5N26FhhqZkPMrBNwHfB8bAMzKzaz+uf6JrAouWVKm4veN9Q76Bmq8z5A5WZbqioSkRaKG+jOuTBwK7AC2AIsdc69Y2b3mtkUv9llwLtmtg3oC9zXRvVKW2nUQw/XeT30nCz10EXSRUJj6M655cDyRsu+G/PzMmBZckuTdtV4yEU9dJG0o+6XeBr30P0x9ByNoYukDb1bxRMdQ/d76OH6Hrr+RETShd6t4on20P2DotGzXDTkIpIuFOjiOeWgqNdD10FRkfShd6t4Tjkoqh66SLpRoIun8Rh6nS4sEkk3ereKp9EYejjiD7mohy6SNhTo4mk05FIb1oVFIulG71bxNAr0p98oB6BbXrLmbxORtqZAF099oJs35OL8uTDP7a/pckXShQJdPP555/U99MrqEKNKCsjK0hi6SLpQoIsnEgYM/DHzypoQ3fNyU1uTiLSIBkgzSV0I9r0DLnLqusrdkJXD3qPVVFSdpKLqJMPO6t7+NYpIqynQM8mffwarm5/Z2HXuxRU//R+O13rnpF88tLi9KhORJFCgZ5IThyC3C8z4TZOrj+aXcPzhD7lhQimXD+9D2aBe7VygiJwJBXomiYQhJx+GTW5y9ZEDx4EPGTeokM+O6Nu+tYnIGdNB0UwSCUfPYmlKZU0IgIJ8HQwVSUcK9EwSL9CrvXPRCzor0EXSkQI9k0TqEuuhd9ZInEg6UqBnkkg4OvlWU6o05CKS1hTomSTBIZfu+eqhi6QjBXomSeCgaJZB104KdJF0pEDPJPHG0KtDdM/P1fwtImlKgZ5J4oyhV9aEdUBUJI0p0DNJnCGXqpqQDoiKpDEFeiZJ4KCoDoiKpC8FeiZJ4Dx09dBF0pe6Y5kkEoacvFMWv7K9gr1Ha9hXWcOokh4pKExEkkGBnkkiYcjq0mDR0eoQNy76W/SWc6W9ujTxiyKSDhTomcSdOuRy5EQtzsFdV4/gyvP60b9HfoqKE5EzldAYuplNNrN3zWyHmc1rYn2pma02szfNbKOZXZX8UuWMNXFQtP7q0EFFXSnp2RkznYMukq7iBrqZZQMLgCuBkcD1ZjayUbO7gKXOuTHAdcAvk12oJEGk7pTz0D+eMlcf1kTSXSLv4guBHc659wHMbDEwFdgc08YBBf7PPYA9ySxSzkD4JLz1FNSegOMV0HtYg9Ubdh0BNGWuSBAkEuglwK6Yx+XAhEZt7gH+y8zmAl2BK5p6IjObA8wBKC0tbWmt0ho7X4EXbv/4cc9BDVav3XkIgH4aOxdJe8n6nH098Jhz7qdm9ingt2Y2yrmGt5d3zi0EFgKUlZW5JL22nE74pPd99nLoey7kNzwtsbq2jjGlPenZpVMKihORZErkoOhuYGDM4wH+slg3A0sBnHOvAvmAbhnfEUS8g5507ul9NTroWVkTpqjrqeemi0j6SSTQ1wJDzWyImXXCO+j5fKM2HwKfBTCzEXiBXpHMQqWV6gO9mStEK6tDmpBLJCDiBrpzLgzcCqwAtuCdzfKOmd1rZlP8Zl8HvmpmbwFPAbOdcxpS6Qgidd73ZgJdE3KJBEdCXTPn3HJgeaNl3435eTNwUXJLk6SI9tBPnTY3EnFUnQzrDBeRgNDkXEF3miGXY7VhnNM56CJBoUAPutMEemW1bgotEiQK9KA7zRh6/WX/OigqEgx6JwddE2Por753kJVb9rGvsgZQD10kKBToQdfEkMv//e/tvPb+Qbp0yuGsgnzO7t0tRcWJSDIp0IOuiUA/Wh3iM8P68OvZ41NUlIi0BY2hB10TgV5ZE9KpiiIBpEAPuvqDovbxGHpVTVinKooEkAI96CJ1gEGWt6udc/7l/uqhiwSNAj3oGt2l6HhtHREH3dVDFwkcBXrQNQp0XUwkElwK9KCL1J1yQBR0hyKRIFKgB10k3OCioqoa/+pQ9dBFAkcDqUG0YxWsf8z7+aONDXro81dtB3S5v0gQ6V0dRBt+B+++BEWfhJzO8InLo6v+suMAAEOKu6aqOhFpIwr0IIqEodfZcMtrDRbXhLwzXO78/DC6a8hFJHA0hh5Ejc5sqacDoiLBpkAPokhdk3co+viAqD6YiQSRAj2Imuihb9p9lP9YthHQGS4iQaVAD6ImAn3lln2s+/thLhlazHkDeqSoMBFpS/rsHURNBHpldZhueTn89uYJKSpKRNqaeuhB1MQYelVNSGPnIgGnQA+ipnromgNdJPAU6EHUKNDrIo4V7+zTDIsiAadAD6JGgb6/yrsZdHG3vFRVJCLtQIEeRI3G0CurvfPPrzm/f6oqEpF2oEAPolNmWKy/QlRDLiJBpkAPosY3tfADXfO3iASbAj2IXKObWlTrkn+RTKBADyLdpUgkIynQg6jRGHr9fUR12qJIsCUU6GY22czeNbMdZjavifU/M7MN/tc2MzuS/FIlYY3G0KtqwuTnZpGXc+oMjCISHHG7bGaWDSwAJgHlwFoze945t7m+jXPu32LazwXGtEGtkqgmDorqgKhI8CXyGfxCYIdz7n0AM1sMTAU2N9P+euDu5JQnLXa0HKoPg2VRUXWSWQtfZffhagYUdk51ZSLSxhIJ9BJgV8zjcqDJKfvMbBAwBPjvZtbPAeYAlJaWtqhQSdDB97zvRZ9kx/5jvF9xnCtG9OHaMSWprUtE2lyyD4peByxzztU1tdI5t9A5V+acK+vdu3eSX1oAcBHve99R0QuK7rjiHF0lKpIBEgn03cDAmMcD/GVNuQ546kyLkjNQH+iWRWX0lnMaPxfJBIkE+lpgqJkNMbNOeKH9fONGZjYcKAReTW6J0iLOed8tK3q6oi75F8kMcQPdORcGbgVWAFuApc65d8zsXjObEtP0OmCxc/WJIinRoIfuBXq3PAW6SCZI6J3unFsOLG+07LuNHt+TvLKk1aKBbtHbzuVk6/oxkUygd3rQxPTQdds5kcyiQA+aRkMuuqBIJHMo0IMmJtCPnAjpgKhIBlGgB40f6MdCEV7/4BCdOynQRTKFAj1o/EA/cKwWgAsG9EhlNSLSjhToQVPfQz/pfR8/pFcqqxGRdqRADxr/MoBjtd7sCzooKpI5FOhB4/fQD57QbedEMo0CPWj8QP/Riu0A9OzSKZXViEg7UqAHjR/oEYxLz+lNr64KdJFMoUAPGj/QnTOmaQ50kYyiQA+aaA89SzeFFskwCvSgiRlyKeisM1xEMokCPWhiA12nLIpkFAV60NSPoZOleVxEMowCPWj8C4simC4qEskwCvTAqb8FndG1U3ZqSxGRdqVADxp/yKVrfifMLMXFiEh7UqAHjR/o3fJ1QZFIplGgB019oOuURZGMo0APmvohl055KS5ERNqbAj1o1EMXyVg6UTkgdh44zt6jNfQ/cIxBaAxdJBMp0AMgEnFcPf8VjtfWcUv2h9yZC30KuqS6LBFpZwr0ADhWG+Z4bR03fmoQsyIl8Bb86+VDU12WiLQzBXoAVFaHABjVvwelx/MByO+kMXSRTKODogFQWe3dbq57fk70oCi6qEgk4yjQA+DNXYcBvOlyXQRMu1UkE+mdHwA/XL4VgH498hXoIhlM7/wAqIs4rhjRl7N7d1Ogi2SwhN75ZjbZzN41sx1mNq+ZNl8ys81m9o6Z/S65Zcrp1EUcQ/t28x4o0EUyVtyzXMwsG1gATALKgbVm9rxzbnNMm6HAN4GLnHOHzaxPWxUsDUUijtq6CJ2y/RBXoItkrEROW7wQ2OGcex/AzBYDU4HNMW2+Cixwzh0GcM7tT3ahGWnX3+Dge6dtEq6LMC1rI+cf3A4b1sP+LQp0kQyVSKCXALtiHpcDExq1OQfAzP4CZAP3OOf+2PiJzGwOMAegtLS0NfVmlv+cASePnrZJJ+DBTsBW/wugcEgbFyYiHVGyLizKAYYClwEDgDVmdp5z7khsI+fcQmAhQFlZmUvSawdX6DiU3Qz/MLfZJgeOneSLD/+Vr08axrUX9PcWdi1upwJFpCNJJNB3AwNjHg/wl8UqB153zoWAD8xsG17Ar01KlZnIOYiEvXDu1XyPu5oT7HLvESoohV4Dm20nIsGXyGDrWmComQ0xs07AdcDzjdo8i9c7x8yK8YZg3k9inZmn/orPrNP/n3sy7LXLy9X9Q0UyXdxAd86FgVuBFcAWYKlz7h0zu9fMpvjNVgAHzWwzsBq40zl3sK2KzggR73J+sk4f1OWHTwCQl6MDoSKZLqExdOfccmB5o2XfjfnZAf/uf0kyRAP99LtozbYDAJT07NzWFYlIB6duXUeVYKDXhOvonpfDqJIe7VCUiHRkCvSOKlLnfY8T6JXVIYq76/6hIqJA77gSHEOvqglTkK9p7UVEgd5x1Qe6NR/oB4+d5H+2VXjT5opIxlOgd1QJDLk886Z3OcAnendrj4pEpINToHdUCRwUPerfeu6714xsj4pEpIPT4GtHlUAPvbI6REF+DllZut1cuguFQpSXl1NTU5PqUqSDyM/PZ8CAAeTmJj6kqkDvqBI4KFpVE9b4eUCUl5fTvXt3Bg8ejOl+sBnPOcfBgwcpLy9nyJDEJ9tToHdUzQy5rNlWwZ93eBcTvfHhYbrnK9CDoKamRmEuUWZGUVERFRUVLfo9BXpH1UygP7BiK5v3VJKX4/XcZ5b1bu/KpI0ozCVWa/4eFOgdVTNj6EerQ0wZ3Z+HrhuTgqJEpCPTWS4dVTNj6JXVGjeX5Dty5Ai//OUvW/W7V111FUeOHInfUNqcAr2jamLIxTlHVU2IAo2bS5KdLtDD4fBpf3f58uX07NmzLco6I845IpFIqstoVxpySQXn4OUfQtVHzbepXxcT6O9VHCfioLsu9Q+0773wDpv3VCb1OUf2L+DuL5zb7Pp58+bx3nvvccEFFzBp0iSuvvpqvvOd71BYWMjWrVvZtm0b1157Lbt27aKmpobbb7+dOXPmADB48GDWrVvHsWPHuPLKK7n44ov561//SklJCc899xydOzecCfSFF17gBz/4AbW1tRQVFfHkk0/St29fjh07xty5c1m3bh1mxt1338306dP54x//yLe+9S3q6uooLi5m1apV3HPPPXTr1o1vfOMbAIwaNYoXX3wRgM9//vNMmDCB9evXs3z5cu6//37Wrl1LdXU1M2bM4Hvf+x4Aa9eu5fbbb+f48ePk5eWxatUqrr76aubPn88FF1wAwMUXX8yCBQsYPXp0UvdHW1EypELVXvifH0FeAeR2ab5d0Scb3K3oL/7ZLboyVJLt/vvvZ9OmTWzYsAGAl19+mTfeeINNmzZFT5tbtGgRvXr1orq6mvHjxzN9+nSKiooaPM/27dt56qmn+NWvfsWXvvQlnn76ab785S83aHPxxRfz2muvYWY8+uijPPDAA/z0pz/l+9//Pj169ODtt98G4PDhw1RUVPDVr36VNWvWMGTIEA4dOhR3W7Zv387jjz/OxIkTAbjvvvvo1asXdXV1fPazn2Xjxo0MHz6cWbNmsWTJEsaPH09lZSWdO3fm5ptv5rHHHuOhhx5i27Zt1NTUpE2YgwI9Neq8KzyZfD+MuSHhX6uq8X7v4qG6Z2iQna4n3Z4uvPDCBudAz58/n2eeeQaAXbt2sX379lMCfciQIdHe7bhx49i5c+cpz1teXs6sWbPYu3cvtbW10ddYuXIlixcvjrYrLCzkhRde4NJLL4226dWrV9y6Bw0aFA1zgKVLl7Jw4ULC4TB79+5l8+bNmBn9+vVj/PjxABQUFAAwc+ZMvv/97/PjH/+YRYsWMXv27Liv15FoDD0VEpzrvLGqmjB5OVnk63Zz0g66du0a/fnll19m5cqVvPrqq7z11luMGTOmyata8/I+nso5Ozu7yfH3uXPncuutt/L222/zyCOPtOrq2JycnAbj47HPEVv3Bx98wE9+8hNWrVrFxo0bufrqq0/7el26dGHSpEk899xzLF26lBtuSLzD1REo0FMhekpiy4K5siakM1ykTXTv3p2qqqpm1x89epTCwkK6dOnC1q1bee2111r9WkePHqWkpASAxx9/PLp80qRJLFiwIPr48OHDTJw4kTVr1vDBBx8ARIdcBg8ezBtvvAHAG2+8EV3fWGVlJV27dqVHjx7s27ePl156CYBhw4axd+9e1q717mNfVVUV/c/nK1/5Crfddhvjx4+nsLCw1duZCgr0VGhlD72yOqwDotImioqKuOiiixg1ahR33nnnKesnT55MOBxmxIgRzJs3r8GQRkvdc889zJw5k3HjxlFc/PHw4V133cXhw4cZNWoUo0ePZvXq1fTu3ZuFCxcybdo0Ro8ezaxZswCYPn06hw4d4txzz+UXv/gF55xzTpOvNXr0aMaMGcPw4cP5x3/8Ry666CIAOnXqxJIlS5g7dy6jR49m0qRJ0Z77uHHjKCgo4Kabbmr1NqaKebcDbX9lZWVu3bp1KXntlNu7ER65BGY9CSOuSfjX/unXr1NVE+bZWy5qw+IkFbZs2cKIESNSXYYAe/bs4bLLLmPr1q1kZaW2z9vU34WZrXfOlTXVXj30VGh1D11DLiJt6YknnmDChAncd999KQ/z1tDn91Ro5Rh6VU2Ygb1Oc5qjiJyRG2+8kRtvvDHVZbRa+v0XFASu9QdFNbuiiDRHgZ4KrRhyWf3ufg4cq6Wgsz5UiUjTFOip0IpAf9a/f+hnhvVpi4pEJAAU6KnQikCvqgkzqqSAiWcXxW8sIhlJgZ4KrTgo6t0/VOPn0nF06+bNKbRnzx5mzJjRZJvLLruMeKcnP/TQQ5w4cSL6WNPxtp4CPRVa2UPXRUXSEfXv359ly5a1+vcbB3pHnY63OR1pml4lRCo0E+gvvb2Xha+83+SvfHDgOOcP6NHWlUlH8NI8+Ojt5D7nWefBlfc3u3revHkMHDiQW265BSA6Pe2//Mu/MHXqVA4fPkwoFOIHP/gBU6dObfC7O3fu5JprrmHTpk1UV1dz00038dZbbzF8+HCqq6uj7b72ta+dMo3t/Pnz2bNnD5/5zGcoLi5m9erV0el4i4uLefDBB1m0aBHgXZJ/xx13sHPnTk3T2wwFeio0E+jLN33Eux9VMW7QqfNHTPxEEV8Y3b89qpMMNGvWLO64445ooC9dupQVK1aQn5/PM888Q0FBAQcOHGDixIlMmTKl2ftdPvzww3Tp0oUtW7awceNGxo4dG13X1DS2t912Gw8++CCrV69uMA0AwPr16/nNb37D66+/jnOOCRMm8OlPf5rCwkJN09sMBXoqNHO/0KqaEEP7dOO3N09IQVHSYZymJ91WxowZw/79+9mzZw8VFRUUFhYycOBAQqEQ3/rWt1izZg1ZWVns3r2bffv2cdZZZzX5PGvWrOG2224D4Pzzz+f888+PrmtqGtvY9Y39+c9/5otf/GJ09sRp06bxyiuvMGXKFE3T24yExtDNbLKZvWtmO8xsXhPrZ5tZhZlt8L++kpTqgqrZ+4Xq0n5JnZkzZ7Js2TKWLFkSnQTrySefpKKigvXr17Nhwwb69u3bquluWzqNbTyaprdpcQPdzLKBBcCVwEjgejMb2UTTJc65C/yvR5NSXVA1M+RSqQOfkkKzZs1i8eLFLFu2jJkzZwLeVLd9+vQhNzeX1atX8/e///20z3HppZfyu9/9DoBNmzaxceNGoPlpbKH5qXsvueQSnn32WU6cOMHx48d55plnuOSSSxLenkycpjeR9LgQ2OGcex/AzBYDU4HNSamghdb+4ef03vSrVLx00nR3xykCrvvV3ziY9V50+c4DxxlXml7zL0twnHvuuVRVVVFSUkK/fv0AuOGGG/jCF77AeeedR1lZGcOHDz/tc3zta1/jpptuYsSIEYwYMYJx48YBDaexHThwYHQaW4A5c+YwefJk+vfvz+rVq6PLx44dy+zZs7nwwgsBLwDHjBnT5PBKU+qn6S0sLOTyyy+PhvFdd93FLbfcwqhRo8jOzubuu+9m2rRp0Wl6I5EIffr04U9/+hPTp0/niSee4Nxzz2XChAkJTdMbu32x0/RWV1fTuXNnVq5cSbdu3dpkmt640+ea2QxgsnPuK/7jfwImOOdujWkzG/ghUAFsA/7NOberieeaA8wBKC0tHRfvf/umvPlf/4nbuKTFv9fRHMkp5unif8XZxx+SDGP2RYMZPzj++J0Ei6bPzTyJTNPb0ulzk/X5/gXgKefcSTP738DjwOWNGznnFgILwZsPvTUvNOZzX4bPfTl+wzRwyj+QiGSEJ554gm9/+9s8+OCDSZ2mN5FA3w0MjHk8wF8W5Zw7GPPwUeCBMy9NRCSY2mqa3kT+a1gLDDWzIWbWCbgOeD62gZn1i3k4BdiSvBJFMkOq7h4mHVNr/h7i9tCdc2EzuxVYAWQDi5xz75jZvcA659zzwG1mNgUIA4eA2S2uRCSD5efnc/DgQYqKipq9aEcyh3OOgwcPkp+f36Lf0z1FRTqAUChEeXn5GZ2bLcGSn5/PgAEDyM1teG1KexwUFZEzkJubG71KUaS1NNuiiEhAKNBFRAJCgS4iEhApOyhqZhVAyy8V9RQDB5JYTjrQNmcGbXNmOJNtHuSc693UipQF+pkws3XNHeUNKm1zZtA2Z4a22mYNuYiIBIQCXUQkINI10BemuoAU0DZnBm1zZmiTbU7LMXQRETlVuvbQRUSkEQW6iEhApF2gx7thdboys4FmttrMNpvZO2Z2u7+8l5n9ycy2+98L/eVmZvP9f4eNZjY2tVvQOmaWbWZvmtmL/uMhZva6v11L/CmbMbM8//EOf/3gVNbdWmbW08yWmdlWM9tiZp/KgH38b/7f9CYze8rM8oO4n81skWs1M/8AAANTSURBVJntN7NNMctavG/N7J/99tvN7J9bUkNaBXoLblidjsLA151zI4GJwC3+ts0DVjnnhgKr/Mfg/RsM9b/mAA+3f8lJcTsN58//EfAz59wngcPAzf7ym4HD/vKf+e3S0c+BPzrnhgOj8bY9sPvYzEqA24Ay59wovCm4ryOY+/kxYHKjZS3at2bWC7gbmIB3P+e76/8TSIhzLm2+gE8BK2IefxP4ZqrraqNtfQ6YBLwL9POX9QPe9X9+BLg+pn20Xbp84d39ahXe3fheBAzv6rmcxvsbbz7+T/k/5/jtLNXb0MLt7QF80LjugO/jEmAX0Mvfby8Cnw/qfgYGA5tau2+B64FHYpY3aBfvK6166Hz8x1Gv3F8WKP7HzDHA60Bf59xef9VHQF//5yD8WzwE/B8g4j8uAo4458L+49htim6vv/6o3z6dDMG7kfpv/GGmR82sKwHex8653cBPgA+BvXj7bT3B3s+xWrpvz2ifp1ugB56ZdQOeBu5wzlXGrnPef9mBOM/UzK4B9jvn1qe6lnaUA4wFHnbOjQGO8/FHcCBY+xjAHy6YivefWX+gK6cOS2SE9ti36RbocW9Ync7MLBcvzJ90zv3BX7yv/p6t/vf9/vJ0/7e4CJhiZjuBxXjDLj8HeppZ/Y1XYrcpur3++h5A7M3J00E5UO6ce91/vAwv4IO6jwGuAD5wzlU450LAH/D2fZD3c6yW7tsz2ufpFuhxb1idrsy7keSvgS3OuQdjVj0P1B/p/me8sfX65Tf6R8snAkdjPtp1eM65bzrnBjjnBuPtx/92zt0ArAZm+M0ab2/9v8MMv31a9WSdcx8Bu8xsmL/os8BmArqPfR8CE82si/83Xr/Ngd3PjbR0364APmdmhf6nm8/5yxKT6oMIrTjocBWwDXgP+Haq60nidl2M93FsI7DB/7oKb/xwFbAdWAn08tsb3hk/7wFv451FkPLtaOW2Xwa86P98NvA3YAfweyDPX57vP97hrz871XW3clsvANb5+/lZoDDo+xj4HrAV2AT8FsgL4n4GnsI7ThDC+zR2c2v2LfC//O3fAdzUkhp06b+ISECk25CLiIg0Q4EuIhIQCnQRkYBQoIuIBIQCXUQkIBToIiIBoUAXEQmI/w+33tu22Aec/gAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(train_accuracies)\n", "plt.plot(valid_accuracies)\n", "plt.legend([\"train accuracy\", \"validation accuracy\"])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ysvLMbN8lxMkd+fw4cO0tLRQUVGRseUm8w4fd18DrIlrWxgz7MA/Rb9EpIi1trYq7PPMzLjooovI9M0t+qStiJxBYZ9/2XgNFPgi8rHWu3dvAPbv38/06dM77btkyRKOHj3aPj558mQ++OCDrNaXSwp8ESk6H3300VnPM2DAAJ555plO+8QH/po1a+jb94w7zIuWAl9E0rJ6yz5q7vsNFQv+jZr7fsPqLfF3bZ+d5uZmhg4dyqxZsxg2bBjTp0/n6NGjlJeX861vfYuqqiqefvpp3nzzTSZNmsSYMWMYN24cr7/+OgB/+tOf+PSnP82IESO45557Tlvu8OHDgcgvjG9+85sMHz6cyspKli1bxg9/+EP279/PhAkTmDBhAgDl5eW8++67ADzwwAMMHz6c4cOHs2TJkvZlDhs2jLlz53LZZZdxzTXXcOzYsbS2P5sU+CKSstVb9vHt515j3wfHcGDfB8f49nOvpR36u3bt4pZbbmHnzp2cf/75/OhHPwLgoosuYvPmzcyYMYPa2lqWLVtGQ0MD999/P7fccgsAd955JzfffDOvvfYaF198ccLlr1ixgubmZhobG9m2bRuzZs3ijjvuYMCAAaxdu5a1a9ee1r+hoYFHHnmEV199lY0bN/LQQw+xZcsWAN544w1uvfVWduzYQd++fXn22WfT2vZsUuCLSMoWv7SLYydOP71y7MRHLH5pV1rLHTRoEDU1NQDccMMNvPLKKwBcf/31ABw5coTf//73fOUrX2HUqFHMmzePt99+G4D169czc+ZMAG688caEy3/55ZeZN28e3btHblS88MILO63nlVde4brrruO8886jd+/efPnLX+Z3v/sdABUVFYwaNQqAMWPG0NzcnMaWZ1dSt2WKiCSy/4PEpy86ak9W/B0qbePnnXceAKdOnaJv3740NjYmNX82nXvuue3D3bp10ykdEfl4GtC311m1J+utt95iw4YNADzxxBNceeWVp00///zzqaio4OmnnwYiH1TaunUrADU1NaxcuRKAxx9/POHyr776ah588EFOnjwJwHvvvQdAnz59+Mtf/nJG/3HjxrF69WqOHj3KX//6V55//nnGjRuX1jbmgwJfRFI2//ND6NWj22ltvXp0Y/7nh6S13CFDhrB8+XKGDRvG+++/z80333xGn8cff5wf//jHjBw5kssuu4yf/exnACxd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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 预测结果与真实结果重合\n", "plt.scatter(np.arange(Y_valid.size), f.predict(X_valid))\n", "plt.scatter(np.arange(Y_valid.size), Y_valid)\n", "plt.legend([\"prediction\", \"ground truth\"])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "AI-Course", "language": "python", "name": "ai-course" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }