{ "cells": [ { "cell_type": "raw", "metadata": {}, "source": [ "As simple as it is, I started machine learning course (Ng's Coursera), and here is my implenetation of multivariable gradient descent algorithm in numpy. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "That's it , I used numpy matrixes not arrays, to avoid loops and indexing if possible, convergence is tested in the way that two consecutive values of cost function must differ less than 0.00001 - than main loop stops - in this example. This code is not nice, but I really don't see what to remove from it.I, also, don't like this conversion to float in gradient descent loop, but that's how numpy matrixes worked for me. I didn't test it on bigger dataset yet, but for very small input, looks fine:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def scaling(X):\n", " \"\"\"mean normalzation\"\"\"\n", " l = []\n", " for k in range(X.shape[1]):\n", " x = X[:,k]\n", " def f(e):\n", " tmp0 = sum(x) / len(x)\n", " tmp1 = max(x) - min(x)\n", " return (e - tmp0) / tmp1\n", " m = list(map(float, (list(map(f, x[:, 0])))))\n", " l.append(m)\n", " return np.matrix(l).transpose()\n", "\n", "\n", "l_cost_function = [] # lists to record data for debugging\n", "l_iterations = [] \n", "\n", "def m_g_d(A, y, alfa):\n", " \"\"\"computes gradient descent\"\"\"\n", " l = len(A)\n", " X = np.c_[np.ones(l), T1]\n", " tmp = np.matrix([0] * X.shape[1], dtype=np.float64)\n", " theta = np.matrix([0] * X.shape[1], dtype=np.float64)\n", " cnt = 0\n", " m = len(X)\n", " ma = alfa * (1 / m)\n", " delta = J_m(X, y, theta)\n", " print(delta)\n", " while delta > 0.00001:\n", " beg = J_m(X, y, theta)\n", " for j in range(X.shape[1]):\n", " tmp[:,j] = theta[:,j] - ma * ((((X * theta.transpose()) - y.transpose()).transpose()) * X[:,j])\n", " theta = tmp\n", " end = J_m(X, y, theta)\n", " l_cost_function.append(end)\n", " l_iterations.append(cnt)\n", " delta = abs(end - beg)\n", " cnt += 1\n", " return (theta, cnt, end)\n", "\n", "\n", "\n", "def J_m(A, y, theta):\n", " \"\"\"computes cost function \"\"\"\n", " n = len(A)\n", " return (1 / (2 * n)) * float(sum([x * x for x in A * theta.transpose() - y.transpose()]))\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.625\n", "CPU times: user 10.3 s, sys: 4 ms, total: 10.3 s\n", "Wall time: 10.3 s\n" ] }, { "data": { "image/png": "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\nnvfff58bbrgB7z0ffPABPXr0OGdMb7/9NocPH86SyEQrJRYiIjHu5z//OR07dsxyrF27diQnJzN/\n/nzuvffec153++238/7777NgwQI6duyYZUbI3LlzKVas2JnnvXr1oly5ckydOpVnnnmGIkWKAPDc\nc88xYsSIC8aYkJDAp59+CsA333wDQOXKlX9wXuXKlfn222/5/vvvz9zjbN988w3OuWyv/9e//pXl\n3Msuu+yc54ElOQDffvstx48fz/Y908+tUaPGef+d0UCJhYhImB05Alu25O09ateG+PjwvFfmBODE\niRMcOHCAq6++mrJly5KampptYpHT9zx06BDHjx+nadOmTJ8+nS1btpwZV3D//ffTrFmzC75fiRIl\nzuwfPXr0B/dIl966cvTo0WwTiwtdn/56+rkXuk8oMcUCJRYiImG2ZQuc1coedikpEK710I4dO8az\nzz7LjBkz2LFjx5lxFM459u/fn6v33LRpE8OGDeOdd97hwIEDZ46f/Z4JCQkkJCSE9N7pScbx48d/\n8NqxY8eynJOb6zNfW6JEiRzd52JjiiZKLEREwqx2bfvFn9f3CJd+/foxc+ZMBg4cSHJyMmXKlME5\nx1133ZWrwZb79++nefPmlC1blmeeeYarr76a4sWLk5KSwpAhQ7K85+HDhzl06NAF37NQoUJceuml\nQEbXQnqXSGbffPMN5cuXz7a1Iv167322119++eVZzl2+fPk5zwPOnFu+fHmKFSuW7XtmPjfaKbEQ\nEQmz+PjwtSbkh/nz5/PAAw/w3HPPnTl2/Phx/ve//+Xq/ZYvX86+fftYuHAhN95445njn3zyyQ/O\nHTduXMhjLC6//HIqVKjAunXrfnDe2rVradSo0Xnfq379+hQuXJh169bRqVOnM8e///570tLSuOuu\nu84ca9SoES+++CJbtmzJMoDz3XffxTl35l7OORo0aHDOmP7zn/9w9dVXx8TATVBiISIS8woVKvSD\nlonJkydz8uTJXL+f9z7Le3733XdMnTr1B+fmZowFQMeOHXn55ZfZsWPHmambS5cuZdu2bTz66KNZ\nzt26dSvx8fFcccUVgNXcaNWqFbNnz+a3v/3tmV/4L7/8MocPH85S9Kp9+/YMHDiQqVOnMnny5DPH\np02bRpUqVbjhhhvOHOvUqRNDhw4lNTX1zJTTrVu3smzZMn7zm99c8N8YLZRYiIjEuJ///OfMmjWL\n0qVLU7duXdasWcPSpUvPdD1klrmORXZuuOEGypUrR7du3ejfvz9gBaHOLgcOuRtjAVbgat68ebRo\n0YIBAwZw8OBBxo0bR8OGDXnggQeynFunTh1atGjBsmXLzhwbOXIkN954I82bN6dXr158+eWXTJgw\ngVtvvZVbbrnlzHlVqlThkUceYdy4cXz33Xc0adKEN998k9WrVzNnzpws/6a+ffvywgsv0LZtWwYP\nHkzhwoWZOHEilStXZtCgQVliWrVqFStXrsR7z549ezhy5AgjR44EoHnz5jlKtiKW9z7iHkAi4FNS\nUryISNBSUlJ8NP9M2r9/v+/Ro4evWLGiL126tG/btq3ftm2bv+qqq3z37t3PnLd8+XIfFxfnV6xY\ncebYU0895ePi4vx///vfLO+5Zs0af8MNN/iSJUv6qlWr+qFDh/q33377B9dfjE2bNvnWrVv7UqVK\n+fLly/tu3br53bt3/+C8uLg4f/PNN//g+OrVq33Tpk19fHy8v+yyy3z//v39oUOHznmv0aNH+6uu\nusoXL17cN2jQwM+dO/ec5+3YscN37tzZly1b1pcuXdq3b9/ef/LJJz84L/2/27keI0aMyPbfnJPv\nYvo5QKIP4He48znIPvObcy4RSElJSclSwUxEJAipqakkJSWhn0kStJx8F9PPAZK896n5GiAq6S0i\nIiJhpMRCREREwkaJhYiIiISNEgsREREJGyUWIiIiEjZKLERERCRslFiIiIhI2CixEBERkbCJ6JLe\nkyfDpElQpkzQkYiIwObNm4MOQWJcQfgORnRiMXMmLFoETz8Nv/wlFI7oaEUkWl166aXEx8dz3333\nBR2KCPHx8edcxyVSRPyv6rZtoW9f+MMfYOxYaNMGzrGOjYhInqlWrRqbN29m7969QYciwqWXXkq1\natWCDiNbEZ9YPP889O8Pjz4Kt90Gt9wC48dDgwZBRyYisaRatWoR/cNcJFJE/ODNX/wCEhNh2TJY\nsAC2b4dGjaBXL9i5M+joREREJLOITyzefhtOnbLuj/btYeNGmDgR5s+HGjVg5Eg4ciToKEVERAQi\nPLH45S9tO2RIxrGiRa1r5OOPrdVixAioVQtmz7YERERERIIT0YlF7962HTv2h6+VK2djLTZtgp/8\nBLp2heuug1Wr8jdGERERyRBSYuGcG+qcW+ucO+Cc2+Wce9M5V/MC1/zUOXfqrMdJ51zFC98P2rWz\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "y = np.matrix([2, 2, 2, 3], dtype=np.float64)\n", "T1 = np.matrix([[0.5, 0.5, 0.3], [0.5, 0.5, 1.1], [1, 1.2, 2.2], [1, 0.9, 2.1]], dtype=np.float64)\n", "T1 = scaling(T1)\n", "%time out = m_g_d(T1, y, 0.0001)\n", "plt.plot(l_iterations, l_cost_function, color=\"blue\", linewidth=1, label=\"alfa=0.0001\")\n", "plt.legend(loc=\"upper right\")\n", "plt.show()" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "If cost function is computed correctly (I believe yes), than that algorithm works fine, it's a bit slow for me, but I'm going to go deep into it and will let you know about it for sure! Thanks. Bye!" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "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" } }, "nbformat": 4, "nbformat_minor": 1 }