Skip to content

Instantly share code, notes, and snippets.

@Jargon4072
Last active June 24, 2020 06:45
Show Gist options
  • Save Jargon4072/29c976793f5a3b1fd50fff1595d38743 to your computer and use it in GitHub Desktop.
Save Jargon4072/29c976793f5a3b1fd50fff1595d38743 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Linear regression Implementation from scratch\n",
"\n",
"Data used is obtaines from https://people.sc.fsu.edu/~jburkardt/datasets/regression/x01.txt\n",
"data csv can also be found here: https://drive.google.com/file/d/1KCgwg7ZEHDhyhRB7SaTECCI8ybq82Z52/view\n",
"\n",
"this implementation is focused on learning and understanding Cost Function and Gradient descent for linear regression.\n",
"\n",
"More tuning and improvements can be done. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"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>Index</th>\n",
" <th>Brain Weight</th>\n",
" <th>Body Weight</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>3.385</td>\n",
" <td>44.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>0.480</td>\n",
" <td>15.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1.350</td>\n",
" <td>8.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>465.000</td>\n",
" <td>423.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>36.330</td>\n",
" <td>119.5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Index Brain Weight Body Weight\n",
"0 1 3.385 44.5\n",
"1 2 0.480 15.5\n",
"2 3 1.350 8.1\n",
"3 4 465.000 423.0\n",
"4 5 36.330 119.5"
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
" \n",
"data = pd.read_csv('./x01.csv')\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"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>Brain Weight</th>\n",
" <th>Body Weight</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>3.385</td>\n",
" <td>44.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.480</td>\n",
" <td>15.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.350</td>\n",
" <td>8.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>465.000</td>\n",
" <td>423.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>36.330</td>\n",
" <td>119.5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Brain Weight Body Weight\n",
"0 3.385 44.5\n",
"1 0.480 15.5\n",
"2 1.350 8.1\n",
"3 465.000 423.0\n",
"4 36.330 119.5"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data=data.drop(\"Index\",axis=1)\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"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>Brain_weight</th>\n",
" <th>Body_weight</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>3.385</td>\n",
" <td>44.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.480</td>\n",
" <td>15.5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1.350</td>\n",
" <td>8.1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>465.000</td>\n",
" <td>423.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>36.330</td>\n",
" <td>119.5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Brain_weight Body_weight\n",
"0 3.385 44.5\n",
"1 0.480 15.5\n",
"2 1.350 8.1\n",
"3 465.000 423.0\n",
"4 36.330 119.5"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.columns=[\"Brain_weight\",\"Body_weight\"]\n",
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"X=data[\"Brain_weight\"]\n",
"y=data[\"Body_weight\"]"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"\n",
"from sklearn.model_selection import train_test_split \n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/5, random_state=0)\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"from numpy import *"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"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>Brain_weight</th>\n",
" <th>Body_weight</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>62.00</td>\n",
" <td>1320.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>55.50</td>\n",
" <td>175.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>33</th>\n",
" <td>35.00</td>\n",
" <td>56.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43</th>\n",
" <td>52.16</td>\n",
" <td>440.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49</th>\n",
" <td>0.28</td>\n",
" <td>1.9</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Brain_weight Body_weight\n",
"30 62.00 1320.0\n",
"41 55.50 175.0\n",
"33 35.00 56.0\n",
"43 52.16 440.0\n",
"49 0.28 1.9"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfpoint = pd.DataFrame({'Brain_weight': X_train, 'Body_weight': y_train})\n",
"dfpoint.head()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# y = mx + b\n",
"# m is slope, b is y-intercept\n",
"def compute_error_for_line_given_points(b, m, points):\n",
" totalError = 0\n",
" for i in range(0, len(points)):\n",
" x = points[i, 0]\n",
" y = points[i, 1]\n",
" totalError += (y - (m * x + b)) ** 2\n",
" return totalError / float(len(points))\n",
"\n",
"def step_gradient(b_current, m_current, points, learningRate):\n",
" b_gradient = 0\n",
" m_gradient = 0\n",
" N = float(len(points))\n",
" for i in range(0, len(points)):\n",
" x = points[i, 0]\n",
" y = points[i, 1]\n",
" b_gradient += -(2/N) * (y - ((m_current * x) + b_current))\n",
" m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current))\n",
" new_b = b_current - (learningRate * b_gradient)\n",
" new_m = m_current - (learningRate * m_gradient)\n",
" return [new_b, new_m]\n",
"\n",
"def gradient_descent_runner(points, starting_b, starting_m, learning_rate, num_iterations):\n",
" b = starting_b\n",
" m = starting_m\n",
" for i in range(num_iterations):\n",
" b, m = step_gradient(b, m, array(points), learning_rate)\n",
" return [b, m]\n",
"\n",
"def run_lr(res):\n",
" #points = genfromtxt(\"./x01.csv\", delimiter=\",\")\n",
" points=dfpoint\n",
" learning_rate = 0.000001\n",
" initial_b = 0 # initial y-intercept guess\n",
" initial_m = 0 # initial slope guess\n",
" num_iterations = 1000\n",
" print (\"Starting gradient descent at b = {0}, m = {1}, error = {2}\".format(initial_b, initial_m, compute_error_for_line_given_points(initial_b, initial_m, array(points))))\n",
" print (\"Running...\")\n",
" [b, m] = gradient_descent_runner(points, initial_b, initial_m, learning_rate, num_iterations)\n",
" print (\"After {0} iterations b = {1}, m = {2}, error = {3}\".format(num_iterations, b, m, compute_error_for_line_given_points(b, m, array(points))))\n",
" print(b)\n",
" print(m)\n",
" res.append(b)\n",
" res.append(m)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Starting gradient descent at b = 0, m = 0, error = 69741.70002083335\n",
"Running...\n",
"After 1000 iterations b = 0.1037659425421265, m = 1.4380982734212167, error = 38857.61335587545\n",
"0.1037659425421265\n",
"1.4380982734212167\n",
"[0.1037659425421265, 1.4380982734212167]\n"
]
}
],
"source": [
"res=[]\n",
"run_lr(res)\n",
"print(res)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"test=array(X_test)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"529.0 760.8577525823658\n",
"0.12 0.2763377353526725\n",
"4.235 6.194112130480979\n",
"85.0 122.34211918334555\n",
"0.92 1.426816354089646\n",
"1.35 2.045198611660769\n",
"4.05 5.928063949898053\n",
"0.10400000000000001 0.25332816297793304\n",
"2.5 3.699011626095168\n",
"10.0 14.484748676754293\n",
"36.33 52.34987621593493\n",
"0.10099999999999999 0.24901386815766935\n",
"[760.8577525823658, 0.2763377353526725, 6.194112130480979, 122.34211918334555, 1.426816354089646, 2.045198611660769, 5.928063949898053, 0.25332816297793304, 3.699011626095168, 14.484748676754293, 52.34987621593493, 0.24901386815766935]\n"
]
}
],
"source": [
"def model_output(hx):\n",
" for i in range(len(test)):\n",
" xa=test[i]\n",
" print(xa, end=\" \")\n",
" y=res[1]*xa+res[0]\n",
" print(y)\n",
" hx.append(y)\n",
"\n",
"hx=[]\n",
"model_output(hx)\n",
"print(hx)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"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 matplotlib.pyplot as plt\n",
"x=data[\"Brain_weight\"]\n",
"y_orig=data[\"Body_weight\"]\n",
"viz_train = plt\n",
"viz_train.scatter(X_test, y_test, color='red')\n",
"viz_train.plot(X_test, hx, color='blue')\n",
"viz_train.title(' hθ(x) VS x plot for θ₀ = 0 and θ₁ = 1')\n",
"viz_train.xlabel('x')\n",
"viz_train.ylabel('hθ(x)')\n",
"viz_train.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.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment