{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 作业三\n", "\n", "## 一、Python类" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "class DummyData:\n", " def __init__(self, num=200):\n", " self.num = num\n", " \n", " def load_data(self, train=True):\n", " W = [0.3, 2, 1]\n", " if train:\n", " X = np.linspace(-2, 2, num=self.num)\n", " Y = W[0]*X**2 + W[1]*X + W[2] + 0.4*np.random.randn(X.size)\n", " else:\n", " X = np.linspace(-10, 10, num=self.num)\n", " Y = W[0]*X**2 + W[1]*X + W[2] + 5*np.random.randn(X.size)\n", " return X, Y" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "X_train, Y_train = DummyData(500).load_data()\n", "X_valid, Y_valid = DummyData(200).load_data(train=False)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "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.scatter(X_train, Y_train)\n", "plt.scatter(X_valid, Y_valid)\n", "plt.legend([\"Training data\", \"Validation data\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 拟合上述曲线\n", "\n", "要求:\n", "\n", "* 函数$ f(x) = w_0x^2 + w_1x + w_2 $\n", "* 误差采用均方误差 $L := \\frac{\\sum_{i=1}^{n}(f(X_i) - Y_i)^2}{n}$\n", "* 固定步长的梯度下降法\n", "* 在尽可能不修改代码结构的前提下完成工作\n", "* 利用`X_train, Y_train`拟合,利用`X_valid, Y_valid`来验证拟合的效果" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 定义模型、优化器及误差" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class Parabola:\n", " def __init__(self, step=1e-3):\n", " self.W = np.zeros(3)\n", " self.step = step\n", "\n", " def predict(self, X):\n", " \"\"\"计算f(X),X为向量\"\"\"\n", " assert len(X.shape)==1\n", " # 实现它\n", " raise(NotImplementedError())\n", " \n", " def fit(self, X_train, Y_train, num_iter=1000, verbose=False):\n", " \"\"\"利用训练集(X, Y)拟合函数W\"\"\"\n", " for i in range(num_iter):\n", " X, Y = X_train, Y_train\n", "\n", " Y_out = self.predict(X)\n", " dLdW = self._grad(X, Y)\n", " self._update_weight(dLdW)\n", "\n", " if verbose:\n", " cur_valid_loss = self._loss(Y_valid, self.predict(X_valid))\n", " cur_train_loss = self._loss(Y, self.predict(X))\n", "\n", " if i%50 == 0:\n", " print(f\"Iter {i}: train loss {cur_train_loss}, valid loss {cur_valid_loss}\")\n", " \n", " # 一般来说,如果函数用 _ 开头则表示这个函数是内部实现,随时可以根据需要进行调整(这仅仅只是一个约定)\n", " # 换句话说,Parabola类只提供两组API: fit, predict\n", " # API一般会保证一致性 -- 这里使用的是 sklearn 的 API\n", " def _loss(self, predict, real):\n", " \"\"\"计算预测值与真实值之间的误差 L\"\"\"\n", " assert len(real.shape)==1\n", " assert real.size == predict.size\n", " # 实现它\n", " raise(NotImplementedError())\n", "\n", " def _grad(self, X, Y):\n", " \"\"\"计算L在X处的关于参数W的导数, 其中Y=f(X), X、Y均为向量\"\"\"\n", " assert len(X.shape)==1\n", " # 实现它\n", " raise(NotImplementedError())\n", " return dLdW0, dLdW1, dLdW2\n", " \n", " def _update_weight(self, dLdW):\n", " \"\"\"利用计算出的导数dLdW来更新权重W\"\"\"\n", " # 实现它\n", " raise(NotImplementedError())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 拟合模型" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iter 0: train loss 7.387469877566412, valid loss 358.1376185737317\n", "Iter 50: train loss 5.192845037696437, valid loss 160.08693537131256\n", "Iter 100: train loss 3.7993227032348904, valid loss 103.14076657264337\n", "Iter 150: train loss 2.8636227125989926, valid loss 96.35787891588102\n", "Iter 200: train loss 2.206729210467262, valid loss 103.37637041458811\n", "Iter 250: train loss 1.730252672620262, valid loss 110.99809060880956\n", "Iter 300: train loss 1.3767076385617047, valid loss 115.41139000402633\n", "Iter 350: train loss 1.1103166870208538, valid loss 116.29870118488779\n", "Iter 400: train loss 0.9074881658744149, valid loss 114.4178955811505\n", "Iter 450: train loss 0.7519132526248361, valid loss 110.679998946516\n", "Iter 500: train loss 0.6319138778040571, valid loss 105.84840700299152\n", "Iter 550: train loss 0.5389207350200598, valid loss 100.48027987355904\n", "Iter 600: train loss 0.46654278936343585, valid loss 94.95087773955072\n", "Iter 650: train loss 0.40996333070662927, valid loss 89.49759155918086\n", "Iter 700: train loss 0.36552772603395844, valid loss 84.26110710933355\n", "Iter 750: train loss 0.3304510115073017, valid loss 79.317572677117\n", "Iter 800: train loss 0.3026047908736134, valid loss 74.70170538739922\n", "Iter 850: train loss 0.2803590938925677, valid loss 70.42258659663358\n", "Iter 900: train loss 0.26246364369780906, valid loss 66.47409851465721\n", "Iter 950: train loss 0.24795805508259805, valid loss 62.84163642355465\n" ] } ], "source": [ "model = Parabola()\n", "\n", "model.fit(X_train, Y_train, verbose=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 显示结果" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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P57tsYIwbeLwnNzyKIqiZErTilYE73BGLiZb3YSlXXMpcL+IVAIfAN/HCgU1isgPgA+BGSEdK++MGjWqz3vxiqJkRtOKVq5oXOVp4IXcTLa6CcXIG2NWAl63ClPD2L+iKEox4ky2dvmExQ3hCZH5UXIVr4qiKL2FZJOtYIVqco0aeUVRlByRLCc+bPkCP9TIK4qi5ABnstWLMpHQ5Qv8UCNfBCxYsICbb745YXlTUxNvvvlm2vtbt24dDzzwQPdzt1CaoijZk2qy9RczxuctC1CNfEgUQjogmZFPNp54I68oSnj0hslWN6Vn5Fc3wi2HwIJB1v/VjVnv8rrrrmPs2LHU19fz7W9/u9urnjJlCpdffjl1dXXcdtttLF26lIkTJzJu3DjOPfdcdu3aBVgpmJs2bQJg2bJlTJkyBbA89HPPPZcpU6aw3377cfvtt3cf86c//Sn7778/9fX1rF2bKGj05z//mebmZubMmcOECRN4//33E8ZzzjnnxOjPDxgwAID58+fz0ksvMWHCBG655RbAakii8sSKkj29YbLVTVH0eA3M6kZYchl02JMd2z62ngMcmlma/quvvsojjzzCqlWr6OjoYNKkSRx22GHd69vb21m2bBk7d+5kzJgxLF26lP3335/vfe973HXXXVx++eVJ9//222/z/PPP88UXXzB27FguvPBCVq9ezUMPPcTKlSvp7OxMOCbA17/+dRoaGjj55JNjukU54wE455xzPI+5cOFCbr75Zp544gnACtesXLmSFStW0K9fP8aOHcull17KiBEjMjhjitK36Q2TrW5Ky5Nfem2PgXfoaLOWZ8jLL7/MqaeeSv/+/dl999055ZRTYtY7UsNr165l9OjR7L///gDMmjWLF198MeX+TzrpJPr168fQoUPZc889+fTTT3nppZc47bTTqK6u5itf+QoNDQ2Bx+uMJ11UnlhRsqe3TLa6KS0jv219estDwJEaTkZ5eTnRaBSgu7GHQ9iywO7xuI8bjUZpb2/3fZ3KEytKdvSmyVY3pWXkB9amtzwAkydPZsmSJezcuZPt27d3hzjiGTt2LOvWreuWGv7d737HN7/5TcCKyS9fvhyARx55JOUxjzrqKJqammhra+OLL75gyZIlntslkyKOP25zczMdHR2BXqcoSnr0tslWN6Vl5KdeBRVxkxoVVdbyDDn88MNpaGjg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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(X_valid, model.predict(X_valid))\n", "plt.scatter(X_valid, 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.9" } }, "nbformat": 4, "nbformat_minor": 4 }