{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Normal equations"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "x1s = [     3,      2,      4,      2,      3,      2,      5,      4]  # bedrooms\n",
    "x2s = [     2,      1,      3,      1,      2,      2,      3,      2]  # bathrooms\n",
    "ys  = [48_800, 44_300, 53_800, 44_200, 49_700, 44_900, 58_400, 52_900]  # price\n",
    "\n",
    "x1 = np.array(x1s)\n",
    "x2 = np.array(x2s)\n",
    "y  = np.array(ys)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(8, 25, 16, 397000, 1281100, 817700, 87, 36, 55)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "n        = len(ys)\n",
    "sum_x1   = np.sum(x1)\n",
    "sum_x2   = np.sum(x2)\n",
    "sum_y    = np.sum(y)\n",
    "sum_x1y  = np.sum(x1*y)\n",
    "sum_x2y  = np.sum(x2*y)\n",
    "sum_x1x1 = np.sum(x1*x1)\n",
    "sum_x2x2 = np.sum(x2*x2)\n",
    "sum_x1x2 = np.sum(x1*x2)\n",
    "\n",
    "n, sum_x1, sum_x2, sum_y, sum_x1y, sum_x2y, sum_x1x1, sum_x2x2 , sum_x1x2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([     8,     25,     16, 397000]),\n",
       " array([     25,      87,      55, 1281100]),\n",
       " array([    16,     55,     36, 817700]))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The system of normal equations\n",
    "eqn1 = np.array([n, sum_x1, sum_x2, sum_y])\n",
    "eqn2 = np.array([sum_x1, sum_x1x1, sum_x1x2, sum_x1y])\n",
    "eqn3 = np.array([sum_x2, sum_x1x2, sum_x2x2, sum_x2y])\n",
    "\n",
    "eqn1, eqn2, eqn3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Solve for β0, β1, and β2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([     8,     25,     16, 397000]),\n",
       " array([     25,      87,      55, 1281100]),\n",
       " array([    0,     5,     4, 23700]))"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Eliminate β0 from eqn3.\n",
    "eqn3 = eqn3 - 2*eqn1\n",
    "\n",
    "eqn1, eqn2, eqn3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([     8,     25,     16, 397000]),\n",
       " array([      0,     -71,     -40, -323800]),\n",
       " array([    0,     5,     4, 23700]))"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Eliminate β0 from eqn2.\n",
    "eqn2 = 25*eqn1 - 8*eqn2\n",
    "\n",
    "eqn1, eqn2, eqn3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([     8,     25,     16, 397000]),\n",
       " array([      0,     -71,     -40, -323800]),\n",
       " array([    0,     0,    84, 63700]))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Eliminate β1 from eqn3.\n",
    "eqn3 = 5*eqn2 + 71*eqn3\n",
    "\n",
    "eqn1, eqn2, eqn3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "758.3333333333334"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "β2 = 63700/84\n",
    "β2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4133.333333333334"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "β1 = (323800 - 40*β2)/71\n",
    "β1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "35191.666666666664"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "β0 = (397000 - 25*β1 - 16*β2)/8\n",
    "β0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "β0 = 35,191.67\n",
      "β1 =  4,133.33\n",
      "β2 =    758.33\n"
     ]
    }
   ],
   "source": [
    "print(f'β0 = {β0:9,.2f}')\n",
    "print(f'β1 = {β1:9,.2f}')\n",
    "print(f'β2 = {β2:9,.2f}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([35191.66666667,  4133.33333333,   758.33333333])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "A = np.array([[ 8, 25, 16],\n",
    "              [25, 87, 55],\n",
    "              [16, 55, 36]])\n",
    "\n",
    "b = np.array([397_000, 1_281_100, 817_700])\n",
    "\n",
    "solution = np.linalg.solve(A, b)\n",
    "solution"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Predict home prices"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "def home_price(β0, β1, β2, x1, x2):\n",
    "    \"\"\"\n",
    "    Estimate the price of a house.\n",
    "    @param β0, β1, β2 the regression coefficients.\n",
    "    @param x1 the number of bedrooms\n",
    "    @param x2 the number of bathrooms\n",
    "    @return the estimated price.\n",
    "    \"\"\"\n",
    "    return β0 + β1*x1 + β2*x2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimated price for a house with 2 bedrooms and 1 bathrooms is $44,216.67\n"
     ]
    }
   ],
   "source": [
    "x1 = 2  # bedrooms\n",
    "x2 = 1  # bathrooms\n",
    "\n",
    "y_hat = home_price(β0, β1, β2, x1, x2)\n",
    "print(f'Estimated price for a house with {x1} bedrooms and {x2} bathrooms is ${y_hat:,.2f}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Estimated price for a house with 5 bedrooms and 3 bathrooms is $58,133.33\n"
     ]
    }
   ],
   "source": [
    "x1 = 5  # bedrooms\n",
    "x2 = 3  # bathrooms\n",
    "\n",
    "y_hat = home_price(β0, β1, β2, x1, x2)\n",
    "print(f'Estimated price for a house with {x1} bedrooms and {x2} bathrooms is ${y_hat:,.2f}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "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": [
    "%matplotlib inline\n",
    "import LeastSquaresLine as lsl\n",
    "\n",
    "lsl.show_least_squares_line(\"Home Prices vs. Number of Bedrooms\", \n",
    "                            \"Number of Bedrooms\", \"Price\", x1s, ys)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "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": [
    "%matplotlib inline\n",
    "import LeastSquaresLine as lsl\n",
    "\n",
    "lsl.show_least_squares_line(\"Home Prices vs. Number of Bathrooms\", \n",
    "                            \"Number of Bathrooms\", \"Price\", x2s, ys)"
   ]
  },
  {
   "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.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
