{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Polynomial Regression\n",
    "Recall linear regression.  We can fit a best fit line to points on a plane, or fit a plane to a cloud of 3D points. The linear equation we fit is of the form Th1*x + Th2*y +Th3*z + Th0 =0\n",
    "We can also modify linear regression to deal with a polynomial curve.\n",
    "We do this by replacing y with x^2 in the above equation.  Notice that the equation is still linear in the Coeficients Th1,Th2 and Th3.\n",
    "\n",
    "How to do it?\n",
    "1. Transform the x data (create an extra column of x^2 data), then create an array of these x and x^2 data points.\n",
    "2. substitute these for variable x and variable y of the equation Th1*x + Th2*y +Th3*z + Th0 =0.\n",
    "3. Perform linear regression on this dataset to find Th0, Th1,Th2 and Th3 as we did for the straight line fit.\n",
    "4. Vizualise the result.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.73028021] [[ 0.20475263  0.92570334  0.51493683 -0.13938739 -0.08896684  0.01104575\n",
      "   0.00452355]]\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Actual</th>\n",
       "      <th>Predicted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5.246580</td>\n",
       "      <td>3.787718</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.114866</td>\n",
       "      <td>3.470767</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.463033</td>\n",
       "      <td>3.107687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.228412</td>\n",
       "      <td>2.884446</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3.540780</td>\n",
       "      <td>2.669181</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>95</th>\n",
       "      <td>7.572478</td>\n",
       "      <td>8.829335</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>11.275187</td>\n",
       "      <td>9.029964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>97</th>\n",
       "      <td>8.686203</td>\n",
       "      <td>9.055842</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>98</th>\n",
       "      <td>9.280535</td>\n",
       "      <td>9.197390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>99</th>\n",
       "      <td>10.288470</td>\n",
       "      <td>9.257833</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>100 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       Actual  Predicted\n",
       "0    5.246580   3.787718\n",
       "1    2.114866   3.470767\n",
       "2    2.463033   3.107687\n",
       "3    1.228412   2.884446\n",
       "4    3.540780   2.669181\n",
       "..        ...        ...\n",
       "95   7.572478   8.829335\n",
       "96  11.275187   9.029964\n",
       "97   8.686203   9.055842\n",
       "98   9.280535   9.197390\n",
       "99  10.288470   9.257833\n",
       "\n",
       "[100 rows x 2 columns]"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#1. Create an array of x and x^2 data points.\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LinearRegression\n",
    "m=100\n",
    "X1=6*np.random.rand(m,1) - 3  #create x values from x=-3 to x= +3\n",
    "X=np.sort(X1,axis=0)   #sort this data\n",
    "#2. substitute these for variable x and variable y of the equation Th1*x + Th2*y +Th3*z + Th0 =0.\n",
    "y=0.5*X**2 + X +2+ np.random.randn(m,1) #calc y data y=0.5x^2+x + 2 + a rand offset\n",
    "#the following uses an order 30 polynomial equation\n",
    "poly_features = PolynomialFeatures(degree=7,include_bias=False)\n",
    "X_poly3=poly_features.fit_transform(X)\n",
    "#print(X_poly3)\n",
    "lin_reg=LinearRegression()\n",
    "#3. perform regression\n",
    "lin_reg.fit(X_poly3,y)\n",
    "print(lin_reg.intercept_,lin_reg.coef_)\n",
    "y_pred = lin_reg.predict(X_poly3)\n",
    "\n",
    "#compare with actual test values\n",
    "data = pd.DataFrame({'Actual': y[:,0], 'Predicted': y_pred[:,0]})\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "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": [
    "#4. vizualize results\n",
    "import matplotlib.pyplot as plt\n",
    "plt.scatter(X, y, color='black')\n",
    "plt.plot( np.sort(X,axis=0),y_pred, color='blue', linewidth=1)\n",
    "plt.title('Attendance vs Classification')\n",
    "plt.xlabel('Hours Attended')\n",
    "plt.ylabel('Percentage Score')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "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.7.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
