diff --git a/1_Linear_regression.ipynb b/1_Linear_regression.ipynb deleted file mode 100644 index a39ce3f..0000000 --- a/1_Linear_regression.ipynb +++ /dev/null @@ -1,422 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "name": "1. Linear regression.ipynb", - "version": "0.3.2", - "provenance": [], - "collapsed_sections": [], - "include_colab_link": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - } - }, - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "view-in-github", - "colab_type": "text" - }, - "source": [ - "[View in Colaboratory](https://colab.research.google.com/github/scumabo/CompressionQuality/blob/master/1_Linear_regression.ipynb)" - ] - }, - { - "metadata": { - "id": "wYipv8uCOMd7", - "colab_type": "code", - "colab": { - "resources": { - "http://localhost:8080/nbextensions/google.colab/files.js": { - "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7Ci8vIE1heCBhbW91bnQgb2YgdGltZSB0byBibG9jayB3YWl0aW5nIGZvciB0aGUgdXNlci4KY29uc3QgRklMRV9DSEFOR0VfVElNRU9VVF9NUyA9IDMwICogMTAwMDsKCmZ1bmN0aW9uIF91cGxvYWRGaWxlcyhpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IHN0ZXBzID0gdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKTsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIC8vIENhY2hlIHN0ZXBzIG9uIHRoZSBvdXRwdXRFbGVtZW50IHRvIG1ha2UgaXQgYXZhaWxhYmxlIGZvciB0aGUgbmV4dCBjYWxsCiAgLy8gdG8gdXBsb2FkRmlsZXNDb250aW51ZSBmcm9tIFB5dGhvbi4KICBvdXRwdXRFbGVtZW50LnN0ZXBzID0gc3RlcHM7CgogIHJldHVybiBfdXBsb2FkRmlsZXNDb250aW51ZShvdXRwdXRJZCk7Cn0KCi8vIFRoaXMgaXMgcm91Z2hseSBhbiBhc3luYyBnZW5lcmF0b3IgKG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgeWV0KSwKLy8gd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIGFzeW5jaHJvbm91cyBzdGVwcyBhbmQgdGhlIFB5dGhvbiBzaWRlIGlzIGdvaW5nCi8vIHRvIHBvbGwgZm9yIGNvbXBsZXRpb24gb2YgZWFjaCBzdGVwLgovLyBUaGlzIHVzZXMgYSBQcm9taXNlIHRvIGJsb2NrIHRoZSBweXRob24gc2lkZSBvbiBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcCwKLy8gdGhlbiBwYXNzZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgc3RlcCBhcyB0aGUgaW5wdXQgdG8gdGhlIG5leHQgc3RlcC4KZnVuY3Rpb24gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpIHsKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIGNvbnN0IHN0ZXBzID0gb3V0cHV0RWxlbWVudC5zdGVwczsKCiAgY29uc3QgbmV4dCA9IHN0ZXBzLm5leHQob3V0cHV0RWxlbWVudC5sYXN0UHJvbWlzZVZhbHVlKTsKICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5leHQudmFsdWUucHJvbWlzZSkudGhlbigodmFsdWUpID0+IHsKICAgIC8vIENhY2hlIHRoZSBsYXN0IHByb21pc2UgdmFsdWUgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gdGhlIG5leHQKICAgIC8vIHN0ZXAgb2YgdGhlIGdlbmVyYXRvci4KICAgIG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSA9IHZhbHVlOwogICAgcmV0dXJuIG5leHQudmFsdWUucmVzcG9uc2U7CiAgfSk7Cn0KCi8qKgogKiBHZW5lcmF0b3IgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIGJldHdlZW4gZWFjaCBhc3luYyBzdGVwIG9mIHRoZSB1cGxvYWQKICogcHJvY2Vzcy4KICogQHBhcmFtIHtzdHJpbmd9IGlucHV0SWQgRWxlbWVudCBJRCBvZiB0aGUgaW5wdXQgZmlsZSBwaWNrZXIgZWxlbWVudC4KICogQHBhcmFtIHtzdHJpbmd9IG91dHB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIG91dHB1dCBkaXNwbGF5LgogKiBAcmV0dXJuIHshSXRlcmFibGU8IU9iamVjdD59IEl0ZXJhYmxlIG9mIG5leHQgc3RlcHMuCiAqLwpmdW5jdGlvbiogdXBsb2FkRmlsZXNTdGVwKGlucHV0SWQsIG91dHB1dElkKSB7CiAgY29uc3QgaW5wdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaW5wdXRJZCk7CiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gZmFsc2U7CgogIGNvbnN0IG91dHB1dEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvdXRwdXRJZCk7CiAgb3V0cHV0RWxlbWVudC5pbm5lckhUTUwgPSAnJzsKCiAgY29uc3QgcGlja2VkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBpbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHsKICAgICAgcmVzb2x2ZShlLnRhcmdldC5maWxlcyk7CiAgICB9KTsKICB9KTsKCiAgY29uc3QgY2FuY2VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7CiAgaW5wdXRFbGVtZW50LnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsKTsKICBjYW5jZWwudGV4dENvbnRlbnQgPSAnQ2FuY2VsIHVwbG9hZCc7CiAgY29uc3QgY2FuY2VsUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICBjYW5jZWwub25jbGljayA9ICgpID0+IHsKICAgICAgcmVzb2x2ZShudWxsKTsKICAgIH07CiAgfSk7CgogIC8vIENhbmNlbCB1cGxvYWQgaWYgdXNlciBoYXNuJ3QgcGlja2VkIGFueXRoaW5nIGluIHRpbWVvdXQuCiAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9LCBGSUxFX0NIQU5HRV9USU1FT1VUX01TKTsKICB9KTsKCiAgLy8gV2FpdCBmb3IgdGhlIHVzZXIgdG8gcGljayB0aGUgZmlsZXMuCiAgY29uc3QgZmlsZXMgPSB5aWVsZCB7CiAgICBwcm9taXNlOiBQcm9taXNlLnJhY2UoW3BpY2tlZFByb21pc2UsIHRpbWVvdXRQcm9taXNlLCBjYW5jZWxQcm9taXNlXSksCiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdzdGFydGluZycsCiAgICB9CiAgfTsKCiAgaWYgKCFmaWxlcykgewogICAgcmV0dXJuIHsKICAgICAgcmVzcG9uc2U6IHsKICAgICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICAgIH0KICAgIH07CiAgfQoKICBjYW5jZWwucmVtb3ZlKCk7CgogIC8vIERpc2FibGUgdGhlIGlucHV0IGVsZW1lbnQgc2luY2UgZnVydGhlciBwaWNrcyBhcmUgbm90IGFsbG93ZWQuCiAgaW5wdXRFbGVtZW50LmRpc2FibGVkID0gdHJ1ZTsKCiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7CiAgICBjb25zdCBsaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpJyk7CiAgICBsaS5hcHBlbmQoc3BhbihmaWxlLm5hbWUsIHtmb250V2VpZ2h0OiAnYm9sZCd9KSk7CiAgICBsaS5hcHBlbmQoc3BhbigKICAgICAgICBgKCR7ZmlsZS50eXBlIHx8ICduL2EnfSkgLSAke2ZpbGUuc2l6ZX0gYnl0ZXMsIGAgKwogICAgICAgIGBsYXN0IG1vZGlmaWVkOiAkewogICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZERhdGUgPyBmaWxlLmxhc3RNb2RpZmllZERhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbi9hJ30gLSBgKSk7CiAgICBjb25zdCBwZXJjZW50ID0gc3BhbignMCUgZG9uZScpOwogICAgbGkuYXBwZW5kQ2hpbGQocGVyY2VudCk7CgogICAgb3V0cHV0RWxlbWVudC5hcHBlbmRDaGlsZChsaSk7CgogICAgY29uc3QgZmlsZURhdGFQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7CiAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpOwogICAgICB9OwogICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7CiAgICB9KTsKICAgIC8vIFdhaXQgZm9yIHRoZSBkYXRhIHRvIGJlIHJlYWR5LgogICAgbGV0IGZpbGVEYXRhID0geWllbGQgewogICAgICBwcm9taXNlOiBmaWxlRGF0YVByb21pc2UsCiAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgYWN0aW9uOiAnY29udGludWUnLAogICAgICB9CiAgICB9OwoKICAgIC8vIFVzZSBhIGNodW5rZWQgc2VuZGluZyB0byBhdm9pZCBtZXNzYWdlIHNpemUgbGltaXRzLiBTZWUgYi82MjExNTY2MC4KICAgIGxldCBwb3NpdGlvbiA9IDA7CiAgICB3aGlsZSAocG9zaXRpb24gPCBmaWxlRGF0YS5ieXRlTGVuZ3RoKSB7CiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZpbGVEYXRhLmJ5dGVMZW5ndGggLSBwb3NpdGlvbiwgTUFYX1BBWUxPQURfU0laRSk7CiAgICAgIGNvbnN0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoZmlsZURhdGEsIHBvc2l0aW9uLCBsZW5ndGgpOwogICAgICBwb3NpdGlvbiArPSBsZW5ndGg7CgogICAgICBjb25zdCBiYXNlNjQgPSBidG9hKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgY2h1bmspKTsKICAgICAgeWllbGQgewogICAgICAgIHJlc3BvbnNlOiB7CiAgICAgICAgICBhY3Rpb246ICdhcHBlbmQnLAogICAgICAgICAgZmlsZTogZmlsZS5uYW1lLAogICAgICAgICAgZGF0YTogYmFzZTY0LAogICAgICAgIH0sCiAgICAgIH07CiAgICAgIHBlcmNlbnQudGV4dENvbnRlbnQgPQogICAgICAgICAgYCR7TWF0aC5yb3VuZCgocG9zaXRpb24gLyBmaWxlRGF0YS5ieXRlTGVuZ3RoKSAqIDEwMCl9JSBkb25lYDsKICAgIH0KICB9CgogIC8vIEFsbCBkb25lLgogIHlpZWxkIHsKICAgIHJlc3BvbnNlOiB7CiAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgIH0KICB9Owp9CgpzY29wZS5nb29nbGUgPSBzY29wZS5nb29nbGUgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYiA9IHNjb3BlLmdvb2dsZS5jb2xhYiB8fCB7fTsKc2NvcGUuZ29vZ2xlLmNvbGFiLl9maWxlcyA9IHsKICBfdXBsb2FkRmlsZXMsCiAgX3VwbG9hZEZpbGVzQ29udGludWUsCn07Cn0pKHNlbGYpOwo=", - "ok": true, - "headers": [ - [ - "content-type", - "application/javascript" - ] - ], - "status": 200, - "status_text": "" - } - }, - "base_uri": "https://localhost:8080/", - "height": 106 - }, - "outputId": "00e6de64-be8a-41fa-d771-3f775bffd8a6" - }, - "cell_type": "code", - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import matplotlib.pyplot as plt\n", - "import io\n", - "from sklearn.linear_model import LinearRegression\n", - "%matplotlib inline\n", - "\n", - "from google.colab import files\n", - "uploaded = files.upload()" - ], - "execution_count": 1, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " Upload widget is only available when the cell has been executed in the\n", - " current browser session. Please rerun this cell to enable.\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - }, - { - "output_type": "stream", - "text": [ - "Saving ex1data1.txt to ex1data1 (1).txt\n", - "Saving ex1data2.txt to ex1data2 (1).txt\n" - ], - "name": "stdout" - } - ] - }, - { - "metadata": { - "id": "k6YqmZr2Owu1", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "def initialize_parameters(m):\n", - " \"\"\"\n", - " Argument:\n", - " m -- number of features (dimensions)\n", - " \n", - " Returns:\n", - " parameters -- dictionary containing:\n", - " W -- weight matrix (1, m)\n", - " b -- bias (scalar)\n", - " \"\"\"\n", - " np.random.seed(1)\n", - " \n", - " W = np.random.randn(1, m) * 0.01\n", - " b = 0\n", - " \n", - " parameters = {\"W\" : W,\n", - " \"b\" : b}\n", - " \n", - " return parameters" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "K98-YkQbOxe7", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "def forward_prop(X, parameters):\n", - " \"\"\"\n", - " Argument:\n", - " X -- data (number of features (m), number of examples(n))\n", - " parameters -- W and b\n", - " \n", - " Returns:\n", - " Y_hat -- current regression\n", - " \"\"\"\n", - " W = parameters[\"W\"]\n", - " b = parameters[\"b\"]\n", - " \n", - " Y_hat = np.dot(W, X) + b\n", - " \n", - " assert(Y_hat.shape == (1, X.shape[1]))\n", - " \n", - " return Y_hat" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "Ke4J7N-UOzPD", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "def l2_cost(Y_hat, Y):\n", - " \"\"\"\n", - " Argument:\n", - " Y_hat -- predict values (1, number of examples)\n", - " Y -- true values (1, number of examples)\n", - " \n", - " Returns:\n", - " l2 (MSE) cost\n", - " \"\"\"\n", - " return np.mean((Y_hat - Y) ** 2)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "4vwerBxGO0i7", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "def backward_prop(X, Y, Y_hat):\n", - " \"\"\"\n", - " Argument:\n", - " X -- data (number of features (m), number of examples(n))\n", - " Y -- true values (1, number of examples(n))\n", - " Y_hat -- predict values (1, number of examples(n))\n", - " \"\"\"\n", - " n = Y.shape[1]\n", - " \n", - " dW = (1 / n) * 2 * np.dot((Y_hat - Y), X.T)\n", - " db = np.mean(2 * (Y_hat - Y), keepdims = True)\n", - " \n", - " assert(dW.shape == (1, X.shape[0]))\n", - " assert(db.shape == (1, 1))\n", - " \n", - " return dW, db" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "0bufozfqO138", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "def update_parameters(parameters, dW, db, learning_rate):\n", - " \"\"\"\n", - " Argument:\n", - " parameters -- W and b\n", - " \n", - " Return:\n", - " parameters\n", - " \"\"\"\n", - " parameters[\"W\"] = parameters[\"W\"] - learning_rate * dW\n", - " parameters[\"b\"] = parameters[\"b\"] - learning_rate * db\n", - " \n", - " return parameters" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "oS6HzXa0O3Oz", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "def linear_regression_model(X, Y, learning_rate = 0.0075, num_iterations = 1000, print_cost = False):\n", - " \n", - " np.random.seed(1)\n", - " (m, n) = (X.shape[0], X.shape[1])\n", - " costs = []\n", - " \n", - " parameters = initialize_parameters(m)\n", - " \n", - " for i in range(num_iterations):\n", - " Y_hat = forward_prop(X, parameters)\n", - " cost = l2_cost(Y_hat, Y)\n", - " dW, db = backward_prop(X, Y, Y_hat)\n", - " parameters = update_parameters(parameters, dW, db, learning_rate)\n", - " \n", - " if print_cost and i % 10 == 0:\n", - " print(\"Cost after iteration {}: {}\".format(i, np.squeeze(cost)))\n", - " \n", - " costs.append(cost)\n", - " \n", - " # plot the cost\n", - "# plt.plot(np.squeeze(costs))\n", - "# plt.ylabel('cost')\n", - "# plt.xlabel('iterations')\n", - "# plt.title(\"learning rate = \" + str(learning_rate))\n", - "# plt.show()\n", - " \n", - " return parameters" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "C2FbyDlOPDw7", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": [ - "## Univariate data" - ] - }, - { - "metadata": { - "id": "t4hEa4gbPFOD", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "data = pd.read_csv('ex1data1.txt', header=None).values\n", - "X = data[:, [0]]\n", - "Y = data[:, [1]]\n", - "\n", - "parameters = linear_regression_model(X.T, Y.T, learning_rate = 0.0075, num_iterations = 1500, print_cost = False)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "sTD2pzsrQD6a", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": [ - "## Compare with Scikit-learn implementation" - ] - }, - { - "metadata": { - "id": "0mxn1ax8QFg8", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 280 - }, - "outputId": "7453a37e-22dc-4d2e-94c2-de1ad6f0e83e" - }, - "cell_type": "code", - "source": [ - "xx = np.arange(5, 23)\n", - "yy = parameters[\"W\"] * xx + parameters[\"b\"]\n", - "\n", - "plt.scatter(X, Y)\n", - "plt.plot(xx, yy.T, label='My Linear regression')\n", - "\n", - "# Compare with Scikit-learn Linear regression \n", - "regr = LinearRegression()\n", - "regr.fit(X, Y)\n", - "plt.plot(xx, (regr.intercept_+regr.coef_*xx).T, label='Linear regression (Scikit-learn GLM)')\n", - "\n", - "plt.xlim(4,24)\n", - "plt.xlabel('Population of City in 10,000s')\n", - "plt.ylabel('Profit in $10,000s')\n", - "plt.legend(loc=4);" - ], - "execution_count": 9, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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\nu+76CQ8//CAdO3biggu6Y67ViImLi+P++/+HBx64n5iYaPr0UWRkZNK16wX8+c9PER+fgNls5mc/\nexCbzVZn2+7dnu6kjh07cdVV13DffXfjdhvMmnU1HTp0DCh2cf5MlUkwHGVnFzc6uA/XHvHavTNt\nWJewGuIoX02bVqjjNAyDn/3sXh588Nd06dLV5+NCHac3Gzasp2vXbnTs2IlnnnmSCRPGMmrUpFCH\n5Vc4Xktvmql7x+cNrYiezWNzuFi/0/stA6lyKYLl9OlT3HHHLQwfPqLehB+uDMPgoYce4N5776Ko\nqIgZM2aEOiTRhEI9eieoCktsnrVsvcgtKievqJyO6YnNHJWIdB07duKVVxaFOozzNnLkaEaOPDdn\nMiYmBpCKsJEiolv6bdvEkpkS73P/yk3Hz/vYUvtGCNESRXRLPzbawrCL2rNi3RGv+7cfzKuqsR8o\nqX0jhGjJIj5LzRrf0+e+81nIpLL2TfVyzSs3nWDJ6gONjFQIIYIv4pN+Rko86cneSyI0tFyCLH8o\nhGjpIj7px8VENdlCJrL8oYBzo3Nqe+65v3Dq1MkQRNS8Xn/9NXbu3N6oY+zfv4+HH34QgNWrV3LP\nPbezYMHdzJ9/M1988anfc69YsYznn//fGvu+/vprPvjgXQC+/HKl1+dfd90srNbGz/Svj9Pp5F//\nep7582/m3nvv4u67b2PDhvVV+0eOHFnnOStWLOOyyyZht5+r5VVUVMSkSaNYsWIZa9d+w3PP/aVJ\n4ovoPv1KlbNVa5dLaOgsVln+UNTn/vv/J9QhNItbbrmt0cf485+f5rHHnsZut/P3v/8vr7++hISE\nRAoKCvif/7mPiROnVIwa8n7uY8eO1tk3YcIELrpoCACLFi2sKt7W3BYv/g9Waykvv/w6JpOJY8eO\n8LOf3ctrry0mObmtz+clJ7flu+/WVq2nsGbNatq18xS7Gzt2PMuXf8iePbu46KL+jYqvVST9pprF\nWrn8obfaN7L8oViw4G5+8Yv/x5dfrqK0tIRjx45y8uQJfvrT/2H06LGsWbO6TjnikpIS/t//+xll\nZWWUl5fz858/SL9+A5g37xpGjRpLamoqP/zhHVXnqL79iiuu4umnH8fpdGA2m/nlLx+hQ4cOLFr0\nGitXfk6nTp1xOp3Mm3cTW7du5tSpk5w+fYq//e0FXnrpX2zf/j1ut4trr72B6dMvY8OG9bz44j+I\njY0jNTWNRx99gi1bNvHqqy9gsURXbfvjH59g0qSpjBw5uqo0s91u5847f8SIEaOYO3c2V199LWvX\nfoPdbue55/5BQsK5odHbtn1PWloaHTp0oLi4mPLyMmw2OwkJiaSkpPDyy68DcObMaZ544lHcbjcd\nOnTk4Yd/xx/+8DiTJk2tcd3/9a/niYuLo1evC9i2bRdpaWkcOLCPhx56kKee+hPe5ORke712b765\niK++WoXb7Wb06LHMn383L7/8QtW1mz//bj788N06Za+rW7r0AxYufLNqJna3bt15++2PiIqqP92O\nHj2WL774tCrpr179BcOHn/tWcO21N/DOO29VlKw+f60i6VdqinIJTfWtQTSN9w8sZ2vWjjrbLWYT\nLl9rW/oxpN1Aru19ZaPiyso6y5///H+sX7+Ojz56j8GDh7Bw4ct1yhH37NmFK6+czYQJk9i8eSNv\nvLGQJ5/8E06nk1GjxtRZcKT69qef/j3z5t3E8OEj+e67b1m48CV+/OP7eP/9d3jzzfcoLS1l3rxr\nmTfvpornOvjHP15i27atnD17hr///UXsdjvz59/MhAmTeO+9JSxY8HMGDx7CmjWrKSws4L33lvCr\nX/2KCy5QVdsqffHFp8TExPD88/8mJyebBQvu4a233sflctGtW3duvPFWHn3012zatJEJEyZVPW/L\nlo0MHuxpkSclJXHVVdfygx9cUzE/YAxTp04nNjaOf//7H8ybdxPjxk3kH/94jr1791Db6tUryco6\ny29/+zjffPMFADfeeCtvvLHQZ8IHePHFf9a5dr/85W8A+Mc/XsJsNnPDDVczd+6NNa7dli2bvJa9\nrlRSUkJMTAyJiTXLcvhL+ABKXcTixa9jtZZSXl6Ow+EgLS29av+gQYN5+unf+z2OP60q6TcFqX0j\nAjFo0MUAtGvXjpKSEg4fPsTZs2f4xS8WAFBaWsKZM2cYMeJi1qxZxZtvvo7D4SAuLq7qGP36ef8a\nX7l9587tHDt2lIULX8btdpOSksqJE8fp2bMXsbFxxMbG1egKqPx5x45t7Nq1gwULPMnKMNzk5OQw\nefI0/vSnp7n00suYNm0G6ekZTJ48jUcffZQpUy6t2lZJ6z0MGTIUgIyMTGJioikqKgSoSuqZme0p\nLa1ZzTYnJ5tLLhle9fs999zLVVddw3//u45PP/2YN95YyCuvLGLfvr1VXWY/+cn9AHz44btVzzt8\n+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\nSUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": { - "tags": [] - } - } - ] - }, - { - "metadata": { - "id": "ZCwjsZ_NSJs8", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "path = 'ex1data2.txt'\n", - "data = pd.read_csv(path, header=None).values\n", - "X = data[:, 0:-1]\n", - "Y = data[:, [-1]]\n", - "X = (X - np.mean(X)) / np.std(X)\n", - "\n", - "parameters = linear_regression_model(X.T, Y.T, learning_rate = 0.0075, num_iterations = 1000, print_cost = False)" - ], - "execution_count": 0, - "outputs": [] - }, - { - "metadata": { - "id": "5RhrCHVuTUKz", - "colab_type": "code", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 50 - }, - "outputId": "b7f3321e-d4eb-461b-a440-ed3a5077d49c" - }, - "cell_type": "code", - "source": [ - "regr = LinearRegression()\n", - "regr.fit(X, Y)\n", - "print(\"my weights = \" + str(parameters[\"W\"]))\n", - "print(\"sklearn weights = \" + str(regr.coef_))" - ], - "execution_count": 13, - "outputs": [ - { - "output_type": "stream", - "text": [ - "my weights = [[ 153649.26395906 -102174.44153009]]\n", - "sklearn weights = [[ 159125.15353818 -9988017.38933274]]\n" - ], - "name": "stdout" - } - ] - }, - { - "metadata": { - "id": "n5oSMLsuUDly", - "colab_type": "text" - }, - "cell_type": "markdown", - "source": [ - "teswt" - ] - }, - { - "metadata": { - "id": "ju_cLJ9DUEeM", - "colab_type": "code", - "colab": {} - }, - "cell_type": "code", - "source": [ - "" - ], - "execution_count": 0, - "outputs": [] - } - ] -} \ No newline at end of file