{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "前面在计算多项式回归时，随着维度的增多，程序写起来也越来越麻烦。这一节我们使用 scikit-learn 来简化这个操作。\n",
    "\n",
    "scikit-learn 简称 sklearn，它是 Python 语言里的一个通用机器学习库，里面包含了大量常用的机器学习方法，如分类，回归，无监督学习，降维，预处理等等。在前面求解线性回归问题时，我们使用了最原始的方法，手工推导出了用最小二乘法的解析解：\n",
    "\n",
    "$$\n",
    "\\bf{a} = \\rm{X}^{\\dagger}\\bf{y}\n",
    "$$\n",
    "\n",
    "这一节，我们使用 sklearn 自带的 `LinearRegression` 模块来求解线性回归。首先看一元的场景："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "\n",
    "plt.xlim(30, 60)\n",
    "plt.ylim(100, 600)\n",
    "\n",
    "X = np.array([39.93, 42.05, 43.18, 44.68, 49.87, 53.57]).reshape(-1, 1)\n",
    "Y = np.array([199,   290,   298,   310,   399,   420]).reshape(-1, 1)\n",
    "plt.scatter(X, Y)\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(X, Y)\n",
    "x = np.linspace(30, 60, 100).reshape(-1, 1)\n",
    "y = model.predict(x)\n",
    "plt.plot(x, y)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用 sklearn 里的机器学习算法，都是同一个套路，先使用 `fit` 方法训练出模型，然后再使用模型的 `predict` 方法进行预测（注意输入的数据要使用 `reshape(-1, 1)` 转换为列向量）：\n",
    "\n",
    "```\n",
    "model = LinearRegression()\n",
    "model.fit(X, Y)\n",
    "x = ...\n",
    "y = model.predict(x)\n",
    "```\n",
    "\n",
    "再来看看二元的场景："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "import numpy as np\n",
    "from matplotlib import cm\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(1,1,1,projection='3d')\n",
    "X = np.array([6000, 6000, 8000, 8000, 10000]).reshape(-1, 1)\n",
    "Y = np.array([60, 80, 70, 100, 90]).reshape(-1, 1)\n",
    "Z = np.array([340000, 350000, 400000, 450000, 500000]).reshape(-1, 1)\n",
    "ax.scatter(X, Y, Z, c='red', marker='o')\n",
    "\n",
    "model = LinearRegression()\n",
    "XY = np.hstack([X, Y])\n",
    "model.fit(XY, Z)\n",
    "x = np.linspace(6000, 10000, 10).reshape(-1, 1)\n",
    "y = np.linspace(60, 90, 10).reshape(-1, 1)\n",
    "xy = np.hstack([x, y])\n",
    "z = model.predict(xy)\n",
    "x, y = np.meshgrid(x, y)\n",
    "ax.plot_surface(x, y, z, linewidth=0, antialiased=False)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "画出来的图形和前面的有一定的差异，这是因为数据量比较少，而且 sklearn 的线性回归使用的算法也不是我们前面介绍的正规解法，而是使用了梯度下降法（待验证）。不过 numpy 里提供了一个最小二乘方法 `lstsq`，我们可以验证下前面的求解结果对不对:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[62105.26315789]\n",
      " [   32.10526316]\n",
      " [ 1273.68421053]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from numpy.linalg import lstsq\n",
    "\n",
    "np.set_printoptions(suppress=True)\n",
    "\n",
    "X = np.matrix([\n",
    "    [1, 1, 1, 1, 1], \n",
    "    [6000, 6000, 8000, 8000, 10000], \n",
    "    [60, 80, 70, 100, 90]]).T\n",
    "Y = np.matrix([340000, 350000, 400000, 450000, 500000]).T\n",
    "\n",
    "print(lstsq(X, Y, rcond=None)[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "同样，sklearn 也可以求解多项式回归，但是多项式回归其本质依然是线性回归，只是在做线性回归之前将入参从一维扩展到多维。我们使用 sklearn 预处理模块中的 `PolynomialFeatures.fit_transform()` 来完成这个转换。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "\n",
    "plt.xlim(30, 60)\n",
    "plt.ylim(100, 600)\n",
    "\n",
    "def draw_polynomial(X, Y, degree):\n",
    "    polynomial = PolynomialFeatures(degree = degree)\n",
    "    X_t = polynomial.fit_transform(X)\n",
    "    model = LinearRegression()\n",
    "    model.fit(X_t, Y)\n",
    "    x = np.linspace(30, 60, 100).reshape(-1, 1)\n",
    "    x_t = polynomial.fit_transform(x.reshape(x.shape[0], 1))\n",
    "    y = model.predict(x_t)\n",
    "    plt.plot(x, y)\n",
    "\n",
    "X = np.array([39.93, 42.05, 43.18, 44.68, 49.87, 53.57]).reshape(-1, 1)\n",
    "Y = np.array([199,   290,   298,   310,   399,   420]).reshape(-1, 1)\n",
    "plt.scatter(X, Y)\n",
    "\n",
    "# 二次回归\n",
    "draw_polynomial(X, Y, 2)\n",
    "\n",
    "# 三次回归\n",
    "draw_polynomial(X, Y, 3)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "也可以画出十次回归的曲线图："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "\n",
    "plt.xlim(30, 60)\n",
    "plt.ylim(100, 600)\n",
    "\n",
    "def draw_polynomial(X, Y, degree):\n",
    "    polynomial = PolynomialFeatures(degree = degree)\n",
    "    X_t = polynomial.fit_transform(X)\n",
    "    model = LinearRegression()\n",
    "    model.fit(X_t, Y)\n",
    "    x = np.linspace(30, 60, 100).reshape(-1, 1)\n",
    "    x_t = polynomial.fit_transform(x.reshape(x.shape[0], 1))\n",
    "    y = model.predict(x_t)\n",
    "    plt.plot(x, y)\n",
    "\n",
    "X = np.array([39.93, 42.05, 43.18, 44.68, 49.87, 53.57]).reshape(-1, 1)\n",
    "Y = np.array([199,   290,   298,   310,   399,   420]).reshape(-1, 1)\n",
    "plt.scatter(X, Y)\n",
    "\n",
    "# 十次回归\n",
    "draw_polynomial(X, Y, 10)\n",
    "\n",
    "plt.show()"
   ]
  }
 ],
 "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.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
