{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 回归\n",
    "\n",
    "### 线性回归\n",
    "\n",
    "基本问题 $ \\widetilde{y}(w,x)=w_0+w_1 x_1+...+w_p x_p $\n",
    "\n",
    "斜率为向量 $ w=(w_1,...,w_p) $,截距为 $ w_0 $\n",
    "\n",
    "求一条直线,使该直线拟合原始数据\n",
    "\n",
    "#### 第一种思路:最小二乘回归\n",
    "\n",
    "使 $ \\min_{w} || Xw-y || $ 最小即拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.5,  0.5])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn import linear_model\n",
    "reg = linear_model.LinearRegression()\n",
    "reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])\n",
    "reg.coef_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "这里X是一维,能画出二维图象\n",
      "diabetes_X_train:\n",
      " [[ 0.06169621]\n",
      " [-0.05147406]\n",
      " [ 0.04445121]\n",
      " [-0.01159501]\n",
      " [-0.03638469]]\n",
      "diabetes_y_train:\n",
      " [ 151.   75.  141.  206.  135.]\n",
      "Coefficients: \n",
      " [ 938.23786125]\n",
      "Mean squared error: 2548.07\n",
      "Variance score: 0.47\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f42110577b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from sklearn import datasets, linear_model\n",
    "from sklearn.metrics import mean_squared_error, r2_score\n",
    "\n",
    "# Load the diabetes dataset\n",
    "diabetes = datasets.load_diabetes()\n",
    "\n",
    "# Use only one feature\n",
    "diabetes_X = diabetes.data[:, np.newaxis, 2]\n",
    "\n",
    "# Split the data into training/testing sets\n",
    "diabetes_X_train = diabetes_X[:-20]\n",
    "diabetes_X_test = diabetes_X[-20:]\n",
    "print(\"这里X是一维,能画出二维图象\\ndiabetes_X_train:\\n\",diabetes_X_train[:5])\n",
    "# Split the targets into training/testing sets\n",
    "diabetes_y_train = diabetes.target[:-20]\n",
    "diabetes_y_test = diabetes.target[-20:]\n",
    "print(\"diabetes_y_train:\\n\", diabetes_y_train[:5])\n",
    "# Create linear regression object\n",
    "regr = linear_model.LinearRegression()\n",
    "\n",
    "# Train the model using the training sets\n",
    "regr.fit(diabetes_X_train, diabetes_y_train)\n",
    "\n",
    "# Make predictions using the testing set\n",
    "diabetes_y_pred = regr.predict(diabetes_X_test)\n",
    "\n",
    "# The coefficients\n",
    "print('Coefficients: \\n', regr.coef_)\n",
    "# The mean squared error\n",
    "print(\"Mean squared error: %.2f\"\n",
    "      % mean_squared_error(diabetes_y_test, diabetes_y_pred))\n",
    "# Explained variance score: 1 is perfect prediction\n",
    "print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))\n",
    "\n",
    "# Plot outputs\n",
    "plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')\n",
    "plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=2)\n",
    "\n",
    "# plt.xticks(())\n",
    "# plt.yticks(())\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 第二种思路:脊回归\n",
    "\n",
    "使 $ \\min_{w} || Xw-y ||^2+\\alpha ||w||^2 $ 最小即拟合\n",
    "\n",
    "$ \\alpha \\geqslant 0 $ 是系数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,\n",
      "   normalize=False, random_state=None, solver='auto', tol=0.001)\n",
      "[ 0.34545455  0.34545455]\n",
      "0.136363636364\n"
     ]
    }
   ],
   "source": [
    "from sklearn import linear_model\n",
    "reg = linear_model.Ridge (alpha = .5)\n",
    "reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) \n",
    "print(reg)\n",
    "print(reg.coef_)\n",
    "print(reg.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f421027cc88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import linear_model\n",
    "\n",
    "# X is the 10x10 Hilbert matrix\n",
    "X = 1. / (np.arange(1, 11) + np.arange(0, 10)[:, np.newaxis])\n",
    "y = np.ones(10)\n",
    "\n",
    "###############################################################################\n",
    "# Compute paths\n",
    "\n",
    "n_alphas = 200\n",
    "alphas = np.logspace(-10, -2, n_alphas)\n",
    "\n",
    "coefs = []\n",
    "for a in alphas:\n",
    "    ridge = linear_model.Ridge(alpha=a, fit_intercept=False)\n",
    "    ridge.fit(X, y)\n",
    "    coefs.append(ridge.coef_)\n",
    "\n",
    "###############################################################################\n",
    "# Display results\n",
    "\n",
    "ax = plt.gca()\n",
    "\n",
    "ax.plot(alphas, coefs)\n",
    "ax.set_xscale('log')\n",
    "ax.set_xlim(ax.get_xlim()[::-1])  # reverse axis\n",
    "plt.xlabel('alpha')\n",
    "plt.ylabel('weights')\n",
    "plt.title('Ridge coefficients as a function of the regularization')\n",
    "plt.axis('tight')\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.5.2"
  },
  "toc": {
   "colors": {
    "hover_highlight": "#DAA520",
    "navigate_num": "#000000",
    "navigate_text": "#333333",
    "running_highlight": "#FF0000",
    "selected_highlight": "#FFD700",
    "sidebar_border": "#EEEEEE",
    "wrapper_background": "#FFFFFF"
   },
   "moveMenuLeft": true,
   "nav_menu": {
    "height": "12px",
    "width": "252px"
   },
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 4,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false,
   "widenNotebook": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}