diff --git a/ALS.ipynb b/ALS.ipynb index 4a3710b..0b73f91 100644 --- a/ALS.ipynb +++ b/ALS.ipynb @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 1, "metadata": { "collapsed": true, "deletable": true, @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 183, "metadata": { "collapsed": false, "deletable": true, @@ -36,33 +36,89 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[-0.74999998 -0.05000765]\n", - " [ 0.78267947 0.74945032]\n", - " [-0.79017803 0.31069952]]\n", - "[[-0.76619522 1.24072827 0.80256836 -1.44095286 0.88351898]\n", - " [ 1.70313438 -2.10460196 1.57452137 -0.70528595 -0.87542303]]\n" - ] + "data": { + "text/plain": [ + "array([[ 5., 5., 0., 4., 1., 0., 0., 0., 0., 1., 5., 5., 4.,\n", + " 5., 0., 5., 4., 5., 0.],\n", + " [ 4., 0., 4., 5., 0., 2., 0., 1., 1., 1., 4., 0., 5.,\n", + " 5., 5., 0., 5., 0., 0.],\n", + " [ 0., 0., 0., 2., 0., 1., 0., 0., 0., 0., 0., 1., 0.,\n", + " 1., 1., 0., 0., 0., 0.],\n", + " [ 0., 1., 0., 0., 0., 4., 5., 0., 4., 5., 0., 0., 1.,\n", + " 0., 0., 0., 1., 1., 0.],\n", + " [ 1., 0., 1., 0., 5., 0., 4., 4., 5., 0., 1., 0., 0.,\n", + " 0., 1., 0., 1., 1., 1.]])" + ] + }, + "execution_count": 183, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "## Y = A*B\n", + "user_movie_ratings = [\n", + " (1, 1, 5),\n", + " (1, 2, 4),\n", + " (1, 5, 1),\n", + " (2, 1, 5),\n", + " (2, 4, 1),\n", + " (3, 5, 1),\n", + " (3, 2, 4),\n", + " (4, 3, 2),\n", + " (4, 1, 4),\n", + " (4, 2, 5),\n", + " (5, 1, 1),\n", + " (5, 5, 5),\n", + " (6, 2, 2),\n", + " (6, 4, 4),\n", + " (6, 3, 1),\n", + " (7, 5, 4),\n", + " (7, 4, 5),\n", + " (8, 2, 1),\n", + " (8, 5, 4),\n", + " (9, 4, 4),\n", + " (9, 5, 5),\n", + " (9, 2, 1),\n", + " (10, 2, 1),\n", + " (10, 1, 1),\n", + " (10, 4, 5),\n", + " (11, 1, 5),\n", + " (11, 2, 4),\n", + " (11, 5, 1),\n", + " (12, 1, 5),\n", + " (12, 3, 1),\n", + " (13, 1, 4),\n", + " (13, 2, 5),\n", + " (13, 4, 1),\n", + " (14, 1, 5),\n", + " (14, 2, 5),\n", + " (14, 3, 1),\n", + " (15, 2, 5),\n", + " (15, 3, 1),\n", + " (15, 5, 1),\n", + " (16, 1, 5),\n", + " (17, 1, 4),\n", + " (17, 2, 5),\n", + " (17, 4, 1),\n", + " (17, 5, 1),\n", + " (18, 1, 5),\n", + " (18, 5, 1),\n", + " (18, 4, 1),\n", + " (19, 5, 1),\n", + "]\n", "\n", - "M = 3\n", - "N = 5\n", - "K = 2\n", + "user_max_id = np.amax(user_movie_ratings, axis=0)[0]\n", + "movie_max_id = np.amax(user_movie_ratings, axis=1)[0]\n", "\n", - "A_true = np.mat(np.random.randn(M, K))\n", - "B_true = np.mat(np.random.randn(K, N))\n", - "print A_true\n", - "print B_true" + "A = np.zeros((movie_max_id, user_max_id))\n", + "for i in user_movie_ratings:\n", + " A[i[1] - 1][i[0] - 1] = i[2]\n", + "A" ] }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 190, "metadata": { "collapsed": false, "deletable": true, @@ -72,61 +128,36 @@ { "data": { "text/plain": [ - "[]" + "array([[ 1., 1., 0., 1., 1., 0., 0., 0., 0., 1., 1., 1., 1.,\n", + " 1., 0., 1., 1., 1., 0.],\n", + " [ 1., 0., 1., 1., 0., 1., 0., 1., 1., 1., 1., 0., 1.,\n", + " 1., 1., 0., 1., 0., 0.],\n", + " [ 0., 0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 1., 0.,\n", + " 1., 1., 0., 0., 0., 0.],\n", + " [ 0., 1., 0., 0., 0., 1., 1., 0., 1., 1., 0., 0., 1.,\n", + " 0., 0., 0., 1., 1., 0.],\n", + " [ 1., 0., 1., 0., 1., 0., 1., 1., 1., 0., 1., 0., 0.,\n", + " 0., 1., 0., 1., 1., 1.]])" ] }, - "execution_count": 111, + "execution_count": 190, "metadata": {}, "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAG35JREFUeJzt3XuQVOWd//H3d7iTiSQaHd1BwXBZhRVQK6ClMI3DXdRF\nsVBQsl4ilYrA/n4pI0llw2j9anfVbFWipsoYzVbwEkkADV5QhKWhTNWPzapcFFFI1Bj4CW4GcWGG\n+/f3x9PK0DPM9Myc7tN9+vOq6vJ09zOnv+k6+fTDc87zHHN3REQkmSriLkBERPJHIS8ikmAKeRGR\nBFPIi4gkmEJeRCTBFPIiIgnWZsibWQ8zW29mb5rZ22b2zy20qTGzT83sjczjh/kpV0RE2qNrWw3c\n/aCZjXX3BjPrAvzezC5z999nNV3n7lfnp0wREemInIZr3L0hs9kj8zd7WmhmURUlIiLRyCnkzazC\nzN4EPgbS7r6lhWaXmtkGM3vRzIZEWqWIiHSItWdZAzM7BVgJ3O3ua5u8XgkcywzpTAZ+6u6DI69W\nRETapV0hD2Bm/wQ0uPu/tdLmfeBid6/Pel0L5YiIdIC7d2hIPJera75mZn0y272A8cCGrDZVTbZH\nEn48Tgj4JoXqEdFj4cKFsdeQpIe+T32XxfrojDavrgHOAn5lZkb4UXjC3Veb2ZyQ2f4oMN3Mvg0c\nBhqBGZ2qSkREIpHLJZSbgYtaeP3nTbZ/Bvws2tJERKSzNOO1hKVSqbhLSBR9n9HRd1k82n3itVMf\nZuaF/DwRkSQwMzxfJ15FRKR0KeRFRBJMIS8ikmAKeRGRBFPIi4gkmEJeRCTBFPIiIgmmkBcRSTCF\nvIhIginkRUQSTCEvIpJgCnkRkQRTyIuIJJhCXkQkwRTyIiIJppAXEUkwhbyISIIp5EVEEkwhLyKS\nYAp5EZEEU8iLiCRYmyFvZj3MbL2ZvWlmb5vZP5+k3YNmts3MNpjZiOhLFRGR9uraVgN3P2hmY929\nwcy6AL83s8vc/feftzGzycAAdx9kZqOAR4BL8le2iIjkIqfhGndvyGz2yPzNnqwm1wCLMm3XA33M\nrKqlfe3d27FCRUSk/drsyQOYWQXwOjAAeMTdt2Q1qQY+avJ8R+a1Xdn7qq6Gr30Nhg8/8fH1r0OF\nzhCIiEQqp5B392PAhWZ2CrDSzGrcfW1HPvC7362jvh527YL330+xYUOKjRuhvh4uuCAE/rBh4b8X\nXABf/nJHPkVEpHSl02nS6XQk+zJ3b98fmP0T0ODu/9bktUeANe6+OPN8K1Dj7ruy/tZP9nl79sCm\nTeGxcWN4bNkCZ53VvNffrx+YtfN/qYhIiTIz3L1DqddmyJvZ14DD7r7XzHoBrwD3uPvqJm2mAN9x\n9yvN7BLgJ+7e7MRrayHfkiNHYNu246G/cWP4Efif/zne2//88Xd/B71757xrEZGSke+QvwD4FWCE\nk65PuPuPzWwO4O7+aKbdw8AkYD9wi7u/0cK+2hXyJ/Pf/31ij3/jRnj3XTjnnOOh//mPQN++6vWL\nSGnLa8hHKaqQb8nhw7B164k9/o0bw+vZvf4hQ6Bnz7yUISISOYV8K3btOrHHv3EjbN8OAwY0D/8z\nz1SvX0SKj0K+nQ4ehHfeaR7+FRUnhv6wYXD++dC9e9wVi0g5U8hHwB127mwe/B98AIMHN7/C5/TT\n465YRMqFQj6PGhvh7bebh3/v3s2He/72b6FrTjMPRERyp5AvMHf4859PPMG7cSP85S9heCd7yOfU\nU+OuWERKmUK+SOzbB2+9dWKPf/Nm6NOn+XDPwIHQpUvcFYtIKVDIF7Fjx8K4fvZwz+7dMHToidf0\nDxsWfhBERJpSyJegzz47cahn06bwr4DTT2/e6z/3XC3eJlLOFPIJcfQo/PGPzXv9e/YcX7zt88cF\nF0BlZdwVi0ghKOQTrr4+jO03Df4tW8KyzdnLOGjxNpHkUciXoSNH4L33mi/etn9/y4u39eoVd8Ui\n0lEKefnCJ580X7ztvfdCD79pj3/48PAvAfX6RYqfQl5adejQ8cXbmv4AHDnS/CTvkCHQo0fcFYtI\nUwp56ZCPP25+kvePfwyLt2WH/5lnxl2tSPlSyEtkDhxoefG2rl2bD/ecd54WbxMpBIW85JU77NjR\nfK3+Dz9svnjbsGFavE0kagp5iUVDQ/PF2zZtCou3ZQ/3DB6sxdtEOkohL0XDPfTws6/w2bnz+OJt\nTYd8vvrVuCsWKX4KeSl6+/Y1n9C1eXMI+exe/4ABWrxNpCmFvJSkY8fg/febn+T95JPji7c1Hes/\n5ZS4KxaJh0JeEmXv3uPDPZ//9623oKqq+TIOWrxNyoFCXhLv6NFwA/bsXv/evS0v3valL8VdsUh0\nFPJSturrm5/kfecd6Nu3+Ro+55yjZRykNOU15M2sL7AIqAKOAb9w9wez2tQAvwP+lHlpmbv/nxb2\npZCXvDtyBN59t/l1/Y2NzYN/6FAt3ibFL98hfyZwprtvMLNK4HXgGnff2qRNDfBdd7+6jX0p5CU2\nn3zSfLjnvfegf3+4+GK4/374m7+Ju0qR5joT8m1OT3H3j4GPM9v7zOwdoBrYmtVU/xCWonb66TBu\nXHh87tChMLyzeDGMGQOrV4cVO0WSol1zEM2sPzACWN/C25ea2QZgB3CXu2/pdHUieda9+/GhmzPO\ngJqaEPQDBsRdmUg0cg75zFDNEmC+u+/Levt14Bx3bzCzycBzwOCW9lNXV/fFdiqVIpVKtbNkkfz4\nx38MSzKkUrByZZihKxKHdDpNOp2OZF85XV1jZl2BF4AV7v7THNq/D1zs7vVZr2tMXoreokWwYAGs\nWBF6+CJxy+uYfMYvgS0nC3gzq3L3XZntkYQfj/qW2ooUu9mzwxU3EybACy/AN74Rd0UiHddmyJvZ\nZcAsYLOZvQk48AOgH+Du/igw3cy+DRwGGoEZ+StZJP+uvx569oQrr4Rly+Dyy+OuSKRjNBlKpBWv\nvgqzZsEzz8AVV8RdjZSrzgzXaNUPkVaMHw+//S3ccAO89FLc1Yi0n0JepA01NbB8OfzDP4ShG5FS\nonv1iOTgkkvg5ZfDGP2BAzBzZtwVieRGIS+So4suglWrwlU3Bw7ArbfGXZFI2xTyIu0wdCisWROW\nRmhogDvvjLsikdYp5EXaafBgWLsWamvDypZ33RV3RSInp5AX6YBzz4V164736H/0I61VL8VJIS/S\nQX37hh79+PGhR/8v/6Kgl+KjSyhFOqGqKozRv/oqzJ8fbk4uUkwU8iKddNppYXni//ovmDMn3I9W\npFgo5EUi8JWvhOWJt2+Hb34z3IJQpBgo5EUiUlkZlj7461/DMgiHDsVdkYhCXiRSvXrBc8+Fnvy1\n14ZJUyJxUsiLRKxHj7Co2Ze/DFOnwv79cVck5UwhL5IH3brBk0/C2WfDpEnw2WdxVyTlSiEvkidd\nusDjj8MFF4RJU/W6V5rEQCEvkkcVFfCzn8Ho0eGmI7t3x12RlBuFvEiemcGPfwxXXw2pFOzcGXdF\nUk60rIFIAZjBvfeGq2/GjAmTp/r1i7sqKQcKeZEC+v73oXfvcLepVatg4MC4K5KkU8iLFNj8+aFH\nn0qFNW/OPz/uiiTJFPIiMbjjjhD0V1wRbis4fHjcFUlSKeRFYnLzzdCzZ7id4AsvwDe+EXdFkkRt\nXl1jZn3N7D/M7G0z22xm807S7kEz22ZmG8xsRPSliiTP9dfDY4+FG4S/9lrc1UgS5XIJ5RHgf7v7\nUOBS4Dtmdl7TBmY2GRjg7oOAOcAjkVcqklBXXQVPPQXTpoWrbkSi1GbIu/vH7r4hs70PeAeozmp2\nDbAo02Y90MfMqiKuVSSxxo+HpUvhxhvDSpYiUWnXZCgz6w+MANZnvVUNfNTk+Q6a/xCISCvGjIHn\nn4dbboFly+KuRpIi5xOvZlYJLAHmZ3r0HVJXV/fFdiqVIpVKdXRXIokzalS42mbKlLBM8cyZcVck\ncUin06TT6Uj2Ze7ediOzrsALwAp3/2kL7z8CrHH3xZnnW4Ead9+V1c5z+TyRcvf22+Gqm3vvhdtu\ni7saiZuZ4e4duk18rsM1vwS2tBTwGcuB2ZliLgE+zQ54Ecnd0KHhBuH33gsPPxx3NVLK2hyuMbPL\ngFnAZjN7E3DgB0A/wN39UXd/ycymmNl2YD9wSz6LFikHgwfD2rVQWwuNjXDXXXFXJKUop+GayD5M\nwzUi7bZjRwj6G2+EH/0oLHYm5aUzwzWa8SpS5KqrQ49+/HhoaIB//VcFveRO68mLlICqqjBGv3o1\nzJsHx47FXZGUCoW8SIk47bQQ8m+8AXPmwNGjcVckpUAhL1JC+vSBV16B7dth9mw4ciTuiqTYKeRF\nSkxlZVj6oL4eZsyAQ4firkiKmUJepAT16gXPPRfG5qdNC7NjRVqikBcpUT16wG9+A6ecAlOnwv79\ncVckxUghL1LCunWDJ5+Es8+GSZPgs8/irkiKjUJepMR16QKPPw7DhsG4cWGsXuRzCnmRBKioCGvc\njBkDY8fC7t1xVyTFQiEvkhBm8MADcM01UFMDO3fGXZEUAy1rIJIgZmHlyl69Qq9+9Wro1y/uqiRO\nCnmRBPr+96F379CjX7UKBg6MuyKJi0JeJKHmzw89+lQKXn0Vzj8/7ookDgp5kQS7444Q9FdcEW4r\nOHx43BVJoSnkRRLu5puhZ89wO8Hnn4eRI+OuSApJIS9SBq6/PgT91KmwbBlcfnncFUmh6BJKkTJx\n1VXw1FNw7bXhqhspDwp5kTIyfjwsWRJuJfjii3FXI4WgkBcpM2PGhLH5W2+FpUvjrkbyTWPyImVo\n1Khwtc2UKWGZ4lmz4q5I8kUhL1KmLrwwTJSaMCEE/W23xV2R5INCXqSMDR0K6XRYvbKhAebOjbsi\niVqbY/Jm9riZ7TKzTSd5v8bMPjWzNzKPH0Zfpojky6BBsHYt/OQncP/9cVcjUculJ//vwEPAolba\nrHP3q6MpSUQKrX9/WLcOamtDj37hwrDYmZS+Nnvy7v4asKeNZjocREpcdXXo0S9bBgsWgHvcFUkU\norqE8lIz22BmL5rZkIj2KSIFVlUFa9aEyVLz5oUbhUtpi+LE6+vAOe7eYGaTgeeAwSdrXFdX98V2\nKpUilUpFUIKIROW000LIT5kSFjj7+c/DLQalcNLpNOl0OpJ9mefwbzIz6wc87+7Dcmj7PnCxuze7\n06SZeS6fJyLx27cPrr4azjoLfvUr6Kpr8WJjZrh7h4bFcx2uMU4y7m5mVU22RxJ+OHQrYZESV1kZ\nlj6or4cZM+DQobgrko5osydvZk8DKeA0YBewEOgOuLs/ambfAb4NHAYagf/l7utPsi/15EVKzMGD\ncMMNIeSXLAnr00thdaYnn9NwTVQU8iKl6fBhmD0bdu+G5cvhS1+Ku6LyUojhGhEpY926wZNPhpuC\nT5wIn30Wd0WSK4W8iOSkSxd47LFwC8Ha2jBWL8VPIS8iOauogIcfhpoaGDs2DN9IcVPIi0i7mMED\nD8Df/30I+507465IWqMrX0Wk3czgnnvClTZjxoTJU/36xV2VtEQhLyIdtmAB9O4devSrVsHAgXFX\nJNkU8iLSKfPmQc+ekErBypUwRKtXFRWFvIh02h13hB59bS2sWAEjRsRdkXxOIS8ikbjpptCjnzgx\n3Ch85Mi4KxJQyItIhKZPD0E/dSosXQqjR8ddkegSShGJ1NSp8NRTcO214WSsxEshLyKRGz8+3GFq\n5sywkqXERyEvInkxenQYm7/11jB0I/HQmLyI5M2oUfDKKzB5Mhw4ALNmxV1R+VHIi0hejRgRZsRO\nmACNjXD77XFXVF4U8iKSd0OGhBuEjxsXgn7u3LgrKh8KeREpiEGDYO3aMGGqsRG+9724KyoPCnkR\nKZj+/WHduhD0DQ2wcGFY7EzyRyEvIgVVXR169OPHh6C/7z4FfT7pEkoRKbiqKkinwzj93Llw7Fjc\nFSWXQl5EYnHqqWFG7JtvhgXOjh6Nu6JkUsiLSGz69AnX0f/pTzB7Nhw+HHdFyaOQF5FYVVaGpQ/2\n7IEZM+DQobgrSpY2Q97MHjezXWa2qZU2D5rZNjPbYGZaSVpE2qVXL3j22bA9bVq4xFKikUtP/t+B\niSd708wmAwPcfRAwB3gkotpEpIz06AGLF4chnKlTYd++uCtKhjZD3t1fA/a00uQaYFGm7Xqgj5lV\nRVOeiJSTbt3giSfCTcEnTYK9e+OuqPRFMSZfDXzU5PmOzGsiIu3WpQs89lhY82bcOKivj7ui0lbw\nyVB1dXVfbKdSKVKpVKFLEJEiV1EBDz0Ulj4YOxZefRXOOCPuqgonnU6TTqcj2Ze5e9uNzPoBz7v7\nsBbeewRY4+6LM8+3AjXuvquFtp7L54mIALhDXR385jfhmvrqMh0jMDPcvUPzgnMdrrHMoyXLgdmZ\nQi4BPm0p4EVE2ssM7rkHvvlNGDMGPvww7opKT5vDNWb2NJACTjOzPwMLge6Au/uj7v6SmU0xs+3A\nfuCWfBYsIuVnwQLo3TsE/erVMHBg3BWVjpyGayL7MA3XiEgn/OIXoWe/cmVYo75cdGa4RqtQikjJ\n+Na3wsSp2lpYsSJcgSOtU8iLSEm56Sbo2RMmTgw3Ch85Mu6KiptCXkRKzvTpoUc/dSosXQqjR8dd\nUfHSAmUiUpKuvBKefhquuy5cXiktU8iLSMkaNy705GfODCtZSnMKeREpaaNHwwsvwK23wpIlcVdT\nfDQmLyIlb+TIcPORyZPhwIFwclYChbyIJMKIEWGi1IQJIehvvz3uioqDQl5EEmPIkHBz8HHjoKEB\n5s2Lu6L4KeRFJFEGDYJ168KEqcZGuPvuuCuKl0JeRBKnXz9Yu/Z4j76uLix2Vo4U8iKSSNXVIejH\njw89+vvuK8+g1yWUIpJYZ5wRxujXrIG5c+HYsbgrKjyFvIgk2qmnhhmxGzaEBc6OHo27osJSyItI\n4vXpAy+/DB98ADffDIcPx11R4SjkRaQsVFaGmbGffgozZsDBg3FXVBgKeREpG716wbPPhu1p08IJ\n2aRTyItIWenRAxYvhq98JaxkuW9f3BXll0JeRMpOt27wxBNw7rkwaRLs3Rt3RfmjkBeRstSlS7hn\n7IgRYdJUfX3cFeWHQl5EylZFBTz0EIwdC6kU7N4dd0XR04xXESlrZmE2bO/eUFMTrqmvro67qugo\n5EWk7JmF9W169QpBv3p1WP8mCXIarjGzSWa21czeM7Nma7qZWY2ZfWpmb2QeP4y+VBGR/Lr7bpg/\nH8aMgW3b4q4mGm325M2sAngYqAV2An8ws9+5+9aspuvc/eo81CgiUjBz54Ye/dixsHJlWKO+lOUy\nXDMS2ObuHwKY2TPANUB2yJfh+m4ikkS33x6CvrYWVqwIV+CUqlyGa6qBj5o8/0vmtWyXmtkGM3vR\nzEr8t09Eyt2sWfDwwzBxIvznf8ZdTcdFdeL1deAcd28ws8nAc8DglhrW1dV9sZ1KpUilUhGVICIS\nreuug549YepUWLoURo8uzOem02nS6XQk+zJ3b72B2SVAnbtPyjxfALi739fK37wPXOzu9Vmve1uf\nJyJSbFatghtvhF//OkycKjQzw907NCSey3DNH4CBZtbPzLoDNwDLswqoarI9kvDjkdD5YyJSbsaN\ng2XLYObMsJJlKWkz5N39KHAnsBJ4G3jG3d8xszlmdkem2XQze8vM3gR+AszIW8UiIjEYPToE/G23\nwZIlcVeTuzaHayL9MA3XiEiJ27ABJk+GBx6Am24qzGd2ZrhGM15FRNphxIgwI3bChLAe/be+FXdF\nrVPIi4i005AhkE6HsfrGRpg3L+6KTk4hLyLSAQMHwtq1YcJUY2NYEqEYKeRFRDqoX78Q9OPGQUND\nWOTMimzuv0JeRKQTqqtD0I8fH4L+/vuLK+h10xARkU464wxYsyaM0995Jxw7FndFxynkRUQicOqp\nYWbsxo3hipujR+OuKFDIi4hEpE8fePll+OADuPlmOHw47ooU8iIikaqsDDNj9+6FGTPg4MF461HI\ni4hErFcvePbZcAJ22rRwiWVcFPIiInnQvTssXgxf/SpceSXs2xdPHQp5EZE86doVFi2Cr3893Hxk\n797C16CQFxHJoy5d4NFH4aKLwuzYv/61sJ+vkBcRybOKCnjwQbjiinCD8N27C/fZmvEqIlIAZnDf\nfdC7N4wZE1ayrG7pbtkRU8iLiBSIWVjfpmnQ9++f389UyIuIFNj3vheCvqYmzJIdNCh/n6WQFxGJ\nwZ13Qs+eYYx+5cqwRn0+KORFRGJy++1h4lRtLbz0Elx4YfSfoZAXEYnRrFmhRz9pEixfDqNGRbt/\nhbyISMyuuy4E/VVXwZIl4aRsVHSdvIhIEbjySvj1r2H69HAyNio5hbyZTTKzrWb2npm1eCdDM3vQ\nzLaZ2QYzGxFdiSIi5aG2FpYuhZkzw0qWUWgz5M2sAngYmAgMBW40s/Oy2kwGBrj7IGAO8Eg05Ulr\n0ul03CUkir7P6Oi77LjRo0PA33Yb/Pa3nd9fLj35kcA2d//Q3Q8DzwDXZLW5BlgE4O7rgT5mVtX5\n8qQ1+j9StPR9RkffZeeMHBkuq5w3D558snP7yuXEazXwUZPnfyEEf2ttdmRe29Wp6kREytTw4WFG\n7IQJnduPTryKiBSpIUPCzcE7w9y99QZmlwB17j4p83wB4O5+X5M2jwBr3H1x5vlWoMbdd2Xtq/UP\nExGRFrm7deTvchmu+QMw0Mz6Af8PuAG4MavNcuA7wOLMj8Kn2QHfmSJFRKRj2gx5dz9qZncCKwnD\nO4+7+ztmNie87Y+6+0tmNsXMtgP7gVvyW7aIiOSizeEaEREpXXk58arJU9Fq6/s0sxoz+9TM3sg8\nfhhHnaXAzB43s11mtqmVNjo2c9DWd6njsn3MrK+Z/YeZvW1mm81s3knate/4dPdIH4Qfju1AP6Ab\nsAE4L6vNZODFzPYo4P9GXUdSHjl+nzXA8rhrLYUHcDkwAth0kvd1bEb3Xeq4bN/3eSYwIrNdCbwb\nRXbmoyevyVPRyuX7BNBJ7Ry4+2vAnlaa6NjMUQ7fJei4zJm7f+zuGzLb+4B3CPONmmr38ZmPkG9p\n8lR2oSebPCXN5fJ9Alya+efbi2aWp9sPlAUdm9HScdkBZtaf8K+k9Vlvtfv41FLDyfA6cI67N2TW\nEXoOGBxzTSI6LjvAzCqBJcD8TI++U/LRk98BnNPked/Ma9ltzm6jjQRtfp/uvs/dGzLbK4BuZnZq\n4UpMFB2bEdFx2X5m1pUQ8E+4++9aaNLu4zMfIf/F5Ckz606YPLU8q81yYDZ8MaO2xclTAuTwfTYd\nkzOzkYRLY+sLW2ZJMU4+Vqxjs31O+l3quOyQXwJb3P2nJ3m/3cdn5MM1rslTkcrl+wSmm9m3gcNA\nIzAjvoqLm5k9DaSA08zsz8BCoDs6Ntutre8SHZftYmaXAbOAzWb2JuDADwhX1nX4+NRkKBGRBNMq\nlCIiCaaQFxFJMIW8iEiCKeRFRBJMIS8ikmAKeRGRBFPIi4gkmEJeRCTB/j+SJ5em+lYJ9AAAAABJ\nRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ - "Y = A_true*B_true + 0.01 * np.random.randn(M, N)\n", - "\n", - "U,S,VT = np.linalg.svd(Y)\n", + "RANK = 5\n", + "U = np.random.rand(movie_max_id, RANK)\n", + "M = np.random.rand(RANK, user_max_id)\n", "\n", - "plt.plot(S)" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[-0.74646574 1.2404609 0.80147564 -1.43755358 0.88762876]\n", - " [ 1.6909715 -2.11632333 1.58069405 -0.68904013 -0.88817398]]\n", - "[[-0.76619522 1.24072827 0.80256836 -1.44095286 0.88351898]\n", - " [ 1.70313438 -2.10460196 1.57452137 -0.70528595 -0.87542303]]\n" - ] - } - ], - "source": [ - "B = np.linalg.pinv(A_true)*Y\n", - "print(B)\n", - "print(B_true)" + "W = np.copy(A)\n", + "W[W!=0] = 1\n", + "W" ] }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 191, "metadata": { "collapsed": false, "deletable": true, @@ -137,178 +168,98 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[ 0.75468432 0.09570988]\n", - " [ 1.2271405 -0.89352063]\n", - " [ 1.0929551 -0.13919028]]\n", - "[[ 1.93657925 1.25404367 -0.18884194 -0.21987335 -0.69236316]\n", - " [ 1.02234524 -1.07801519 -0.36108822 -0.24760247 -0.46300585]]\n" + "344.265171421\n", + "211.098239596\n", + "140.910095498\n", + "110.929470103\n", + "97.9878261018\n", + "91.0196535429\n", + "86.1914536527\n", + "82.13538932\n", + "78.2587791135\n", + "74.2569605764\n", + "69.9623381193\n", + "65.2918738966\n", + "60.2283664907\n", + "54.8133269715\n", + "49.1412078715\n", + "43.3496425643\n", + "37.6038255018\n", + "32.0762319182\n", + "26.9250846948\n", + "22.2757422192\n", + "18.2084932642\n", + "14.7546015326\n", + "11.9004315286\n", + "9.5976382527\n", + "7.77625363847\n", + "6.35743433961\n", + "5.26355916256\n", + "4.42472626052\n", + "3.78187078912\n", + "3.28736653652\n", + "2.90410718825\n", + "2.60388757833\n", + "2.36563010292\n", + "2.17375354383\n", + "2.01680733118\n", + "1.88639216663\n", + "1.77633835622\n", + "1.6820956015\n", + "1.60028705282\n", + "1.52838662463\n" ] } ], "source": [ - "A = np.mat(np.random.randn(M, K))\n", - "B = np.mat(np.random.randn(K, N))\n", - "print A\n", - "print B" + "eta = 0.02\n", + "for i in range(40):\n", + " error = np.sum(np.power(W * (A - U.dot(M)), 2))\n", + " print(error)\n", + " dU = -(W * (A - U.dot(M))).dot(M.T)\n", + " U = U - eta * dU\n", + " dM = -U.T.dot(W * (A - U.dot(M)))\n", + " M = M - eta * dM" ] }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 192, "metadata": { - "collapsed": false, - "deletable": true, - "editable": true + "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "\n", - "0.iteration\n", - "error 34.0132382171\n", - "error 0.364141221241\n", - "error 0.000247868162967\n", - "\n", - "1.iteration\n", - "error 0.000247868162967\n", - "error 0.000235472189778\n", - "error 0.000235471778204\n", - "\n", - "2.iteration\n", - "error 0.000235471778204\n", - "error 0.00023547177819\n", - "error 0.00023547177819\n" + "[ 5. 0. 0. 0. 0.]\n", + "[ 5. 4.3 1.4 4.2 3.5]\n" ] } ], "source": [ - "def calcError(A, B, Y):\n", - " Y_est = A * B\n", - " E = Y - Y_est\n", - " err = np.sum(np.power(np.array(E), 2))\n", - " return err\n", - "\n", - "for e in range(3):\n", - " print(\"\\n{}.iteration\".format(e))\n", - " err = calcError(A, B, Y)\n", - " print(\"error {}\".format(err))\n", - " \n", - " B = np.linalg.pinv(A) * Y\n", - " \n", - " err = calcError(A, B, Y)\n", - " print(\"error {}\".format(err))\n", - " \n", - " A = (np.linalg.pinv(B.T) * Y.T).T\n", - "\n", - " err = calcError(A, B, Y)\n", - " print(\"error {}\".format(err))" + "i = 15\n", + "print(A[:,i])\n", + "print(U.dot(M).round(1)[:,i])" ] }, { "cell_type": "code", - "execution_count": 118, - "metadata": { - "collapsed": false, - "deletable": true, - "editable": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[ 1.49271901 0.09591168]\n", - " [ 2.09648248 1.1766208 ]\n", - " [-0.30242095 -0.70817388]]\n", - "[[-0.2627704 -0.89251764 -1.7932561 0.24007537 -1.60292735]\n", - " [-0.96798084 0.84358299 0.06379516 -1.01190793 -0.42444443]]\n", - "\n", - "0.iteration\n", - "error 66.5609466777\n", - "error 3.6454822564\n", - "error 0.000534182173417\n", - "\n", - "1.iteration\n", - "error 0.000534182173417\n", - "error 0.000235482602798\n", - "error 0.000235471778584\n", - "\n", - "2.iteration\n", - "error 0.000235471778584\n", - "error 0.00023547177819\n", - "error 0.00023547177819\n" - ] - } - ], - "source": [ - "A = np.mat(np.random.randn(M, K))\n", - "B = np.mat(np.random.randn(K, N))\n", - "print A\n", - "print B\n", - "\n", - "def calcError(A, B, Y):\n", - " Y_est = A * B\n", - " E = Y - Y_est\n", - " err = np.sum(np.power(np.array(E), 2))\n", - " return err\n", - "\n", - "for e in range(3):\n", - " print(\"\\n{}.iteration\".format(e))\n", - " err = calcError(A, B, Y)\n", - " print(\"error {}\".format(err))\n", - " \n", - " B = np.linalg.pinv(A) * Y\n", - " \n", - " err = calcError(A, B, Y)\n", - " print(\"error {}\".format(err))\n", - " \n", - "# A = Y * B.I\n", - " A = (np.linalg.pinv(B.T) * Y.T).T\n", - "\n", - " err = calcError(A, B, Y)\n", - " print(\"error {}\".format(err))" - ] - }, - { - "cell_type": "code", - "execution_count": 106, + "execution_count": null, "metadata": { - "collapsed": false, + "collapsed": true, "deletable": true, "editable": true }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[1 3]\n", - " [2 7]]\n", - "[[1]\n", - " [2]]\n", - "[[ 7]\n", - " [16]]\n" - ] - } - ], - "source": [ - "A = np.mat(([1, 3], [2, 7]))\n", - "B = np.mat(([1], [2]))\n", - "W = A * B\n", - "print A\n", - "print B\n", - "print W" - ] + "outputs": [], + "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true, - "deletable": true, - "editable": true + "collapsed": true }, "outputs": [], "source": [] diff --git a/Alternating_least_square.ipynb b/Alternating_least_square.ipynb new file mode 100644 index 0000000..95e8a40 --- /dev/null +++ b/Alternating_least_square.ipynb @@ -0,0 +1,1608 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "# Alternating Least Square" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from matplotlib import pylab as plt\n", + "import time\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-1.21484324 -0.04838232]\n", + " [-0.28746379 -1.26890843]\n", + " [-2.33077118 -0.86539365]]\n", + "[[ 2.5809738 -0.36618532 -1.59245333 0.52606297 -0.45481611]\n", + " [-0.73261514 -0.03034256 -0.94484371 -0.32557128 0.31137637]]\n" + ] + } + ], + "source": [ + "## Y = A*B\n", + "\n", + "M = 3\n", + "N = 5\n", + "K = 2\n", + "\n", + "A_true = np.mat(np.random.randn(M, K))\n", + "B_true = np.mat(np.random.randn(K, N))\n", + "print(A_true)\n", + "print(B_true)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[-3.10003294, 0.4463258 , 1.98029488, -0.62333215, 0.53746517],\n", + " [ 0.18768502, 0.14376695, 1.65669281, 0.26189609, -0.26436493],\n", + " [-5.38165887, 0.87975244, 4.52930607, -0.9443851 , 0.79060916]])" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Y = A_true * B_true\n", + "Y" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 2.5809738 , -0.36618532, -1.59245333, 0.52606297, -0.45481611],\n", + " [-0.73261514, -0.03034256, -0.94484371, -0.32557128, 0.31137637]])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "B = A_true.I * Y\n", + "B" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 2.81930616, -1.16777074, -0.75075461, 4.11140669],\n", + " [-2.23243292, 1.67940427, -1.45611726, 2.4167917 ],\n", + " [-0.47924649, 0.7240146 , -0.42121213, 2.9992647 ],\n", + " [-0.26453334, -0.03093931, -0.10407464, -2.18723647]])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "U * M" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 0.61990172, 1.14702424, 0.72399525, -0.83033268, 0.49684847,\n", + " -1.19278353, 0.24295516, 0.08382553, 0.02033281, -0.93687543],\n", + " [ 0.5324797 , -0.3902074 , -0.79594402, -1.20434216, -0.75490146,\n", + " 0.55632023, 1.66170454, -1.76342203, 0.21643463, -0.24178323],\n", + " [-0.99396494, 0.62709088, -0.05774733, -0.78453276, -1.06070693,\n", + " -1.07044867, 0.62747602, 0.53446778, -0.44097795, -0.23960225],\n", + " [ 0.94572044, -0.44020372, -0.73421287, -0.19860962, 1.24212543,\n", + " 1.19974624, -0.06604063, -0.81539128, -0.22041883, -0.30599612]])" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "U" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[-0.13002397, -0.34584708, 0.48927543, 0.34997509],\n", + " [-0.74952918, -1.1954488 , -0.34901751, 0.98857112],\n", + " [ 1.55863349, 0.53371217, -0.64006659, 0.2568413 ],\n", + " [ 1.19896162, -1.43919556, 0.02838537, -0.089313 ],\n", + " [ 1.48640297, -0.45115731, -0.24884043, -0.62280481],\n", + " [-0.45781105, 0.46390734, 0.19706631, -1.60131805],\n", + " [ 1.71681563, -0.09823042, -0.33815042, 0.9298259 ],\n", + " [ 1.00524998, 0.10167474, 1.2740006 , -0.77658219],\n", + " [ 0.23882929, -0.34020008, 0.66169194, 0.134848 ],\n", + " [-1.95961244, 0.38834324, -0.16421577, -0.78590332]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "U = A * M.I" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "M = U.I * A" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 1.07011144, -0.4519106 , -0.08838942, -1.78034151, -1.99311797,\n", + " -1.74226411, 0.83524173, 1.21926452, 1.04893798, -1.18776432],\n", + " [ 2.77651471, -0.90313191, -0.55161375, -4.07060103, -4.85962699,\n", + " -4.2271474 , 1.8674498 , 3.18092834, 2.74723607, -2.88458133],\n", + " [ 2.57404251, -1.35642107, 0.10966667, -4.83110653, -5.10596288,\n", + " -4.48417314, 2.30875886, 2.91539424, 2.49745384, -3.05424027]])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "U" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[-0.14210157, -0.28420314, 0.53678994, 0.25258681],\n", + " [-0.26210432, -0.52420863, 0.29818929, -0.22601934],\n", + " [ 0.39708113, 0.79416226, -0.67224602, 0.12191624],\n", + " [-0.41963405, -0.8392681 , 0.17595793, -0.66331017],\n", + " [-0.10805474, -0.21610949, -0.39244521, -0.60855469],\n", + " [-0.11938126, -0.23876253, -0.30243527, -0.5411978 ],\n", + " [ 0.24739988, 0.49479976, -0.16488726, 0.32991249],\n", + " [-0.18273735, -0.3654747 , 0.64554941, 0.28007471],\n", + " [-0.16996895, -0.3399379 , 0.57615962, 0.23622172],\n", + " [-0.07805965, -0.15611929, -0.21160209, -0.36772138]])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 1., 2., 3., 5.],\n", + " [ 2., 4., 8., 12.],\n", + " [ 3., 6., 7., 13.]])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "U * M" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### Example: Documents vs Words" + ] + }, + { + "cell_type": "code", + "execution_count": 234, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "A = np.mat([\n", + " # colums: words, rows: documents\n", + " # the, a, sparse, love, war, gun\n", + " [21, 22, 0, 70, 10, 6],\n", + " [22, 21, 0, 70, 10, 6],\n", + " [20, 23, 0, 0, 10, 6],\n", + " [22, 24, 65, 0, 10, 6],\n", + " [21, 22, 65, 0, 10, 6],\n", + "])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 118.04858064, 95.16309661, 26.47771342, 1.10092841,\n", + " 0.4861085 ])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.linalg.svd(A)[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 118.04858064, 95.16309661, 26.47771342, 1.10092841,\n", + " 0.4861085 ])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.linalg.svd(A)[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 118.04858064, 95.16309661, 26.47771342, 1.10092841,\n", + " 0.4861085 ])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.linalg.svd(A)[1]" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m np.linalg.svd(A)[0][0] np.linalg.svd(A)[1][0]\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "np.linalg.svd(A)[0][0] np.linalg.svd(A)[1][0]" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 24.98898798, 25.96960455, 30.65397044, 42.46979635,\n", + " 11.68439831, 7.01063899],\n", + " [ 24.98319204, 25.96358117, 30.64686056, 42.45994591,\n", + " 11.68168824, 7.00901294],\n", + " [ 7.42352669, 7.71484034, 9.10643392, 12.61658404,\n", + " 3.47110667, 2.082664 ],\n", + " [ 19.64914502, 20.42021575, 24.10358959, 33.39451714,\n", + " 9.18758443, 5.51255066],\n", + " [ 19.1944605 , 19.94768852, 23.54582847, 32.62176239,\n", + " 8.97498218, 5.38498931]])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.linalg.svd(A)[0][:,0] * np.linalg.svd(A)[1][0] * np.linalg.svd(A)[2][0]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "def reconstruct(A, k=1):\n", + " return np.linalg.svd(A)[0][:,:k] * np.diag(np.linalg.svd(A)[1][:k]) * np.linalg.svd(A)[2][:k]" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 24.98898798, 25.96960455, 30.65397044, 42.46979635,\n", + " 11.68439831, 7.01063899],\n", + " [ 24.98319204, 25.96358117, 30.64686056, 42.45994591,\n", + " 11.68168824, 7.00901294],\n", + " [ 7.42352669, 7.71484034, 9.10643392, 12.61658404,\n", + " 3.47110667, 2.082664 ],\n", + " [ 19.64914502, 20.42021575, 24.10358959, 33.39451714,\n", + " 9.18758443, 5.51255066],\n", + " [ 19.1944605 , 19.94768852, 23.54582847, 32.62176239,\n", + " 8.97498218, 5.38498931]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reconstruct(A, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 22.45010659, 22.65481625, -0.88700814, 69.20222934,\n", + " 10.49270475, 6.29562285],\n", + " [ 22.44317119, 22.64730516, -0.90827382, 69.20437661,\n", + " 10.48945983, 6.2936759 ],\n", + " [ 7.63386117, 7.98945509, 11.71945688, 10.40192665,\n", + " 3.56983292, 2.14189975],\n", + " [ 22.88259678, 24.64184191, 64.27334036, -0.65119796,\n", + " 10.70529364, 6.42317618],\n", + " [ 22.41444781, 24.15173536, 63.54830798, -1.28218261,\n", + " 10.48637148, 6.29182289]])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reconstruct(A, 2)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 2.15279357e+01, 2.15331217e+01, -1.24088240e-02,\n", + " 6.99784719e+01, 1.00142686e+01, 6.00856115e+00],\n", + " [ 2.14724193e+01, 2.14665184e+01, 1.24004347e-02,\n", + " 7.00215126e+01, 9.98581907e+00, 5.99149144e+00],\n", + " [ 1.99905206e+01, 2.30196393e+01, 2.33961920e-04,\n", + " 6.38133216e-04, 9.98065437e+00, 5.98839262e+00],\n", + " [ 2.21195642e+01, 2.37137172e+01, 6.49970108e+01,\n", + " -8.91092457e-03, 1.03094208e+01, 6.18565248e+00],\n", + " [ 2.08806483e+01, 2.22860783e+01, 6.50029842e+01,\n", + " 8.90188988e-03, 9.69061313e+00, 5.81436788e+00]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reconstruct(A, 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### SINGULAR VALUE DECOMPOSITION" + ] + }, + { + "cell_type": "code", + "execution_count": 235, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "rows, cols: (6, 11)\n" + ] + } + ], + "source": [ + "A = np.mat([\n", + " [5, 0, 5, 3, 0, 0, 1, 0, 0, 1, 0],\n", + " [4, 5, 0, 4, 3, 0, 2, 1, 0, 0, 2],\n", + " [5, 4, 4, 4, 0, 0, 1, 0, 1, 0, 1],\n", + " [0, 1, 0, 0, 0, 3, 0, 0, 0, 3, 0],\n", + " [1, 0, 0, 1, 1, 5, 4, 0, 3, 5, 0],\n", + " [0, 1, 1, 0, 1, 4, 5, 5, 4, 0, 4]\n", + "])\n", + "shape = A.shape\n", + "print(\"rows, cols: \", shape)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(matrix([[-0.37770698, 0.3668459 , 0.35582859, 0.54372574, -0.25276058,\n", + " -0.48643802],\n", + " [-0.47808234, 0.26586112, -0.34578263, -0.65784554, -0.26685458,\n", + " -0.27788018],\n", + " [-0.49655631, 0.43355096, 0.02103743, 0.091733 , 0.44317579,\n", + " 0.60016922],\n", + " [-0.12090558, -0.18971996, 0.35361987, -0.27074126, 0.727388 ,\n", + " -0.47111255],\n", + " [-0.38879129, -0.49257202, 0.58400825, -0.20947981, -0.35540889,\n", + " 0.30814159],\n", + " [-0.46522008, -0.57284785, -0.53597124, 0.38210469, 0.11439913,\n", + " -0.09518034]]),\n", + " array([ 14.5279703 , 10.68614277, 6.87089724, 5.35101615,\n", + " 2.43855306, 1.71909515]),\n", + " matrix([[ -4.59282127e-01, -3.41600546e-01, -2.98732730e-01,\n", + " -3.73105583e-01, -1.57507093e-01, -2.86864125e-01,\n", + " -3.93151513e-01, -1.93019580e-01, -2.42553531e-01,\n", + " -1.84773241e-01, -2.28084256e-01],\n", + " [ 4.27923984e-01, 2.15320130e-01, 2.80324301e-01,\n", + " 3.18694415e-01, -2.50639080e-02, -4.98160232e-01,\n", + " -3.27752330e-01, -2.43153977e-01, -3.12138491e-01,\n", + " -2.49404685e-01, -1.24096993e-01],\n", + " [ 1.57942671e-01, -2.65920841e-01, 1.93180221e-01,\n", + " 5.13052710e-02, -1.43985689e-01, 2.67361867e-01,\n", + " -9.58422734e-02, -4.40355707e-01, -5.39700634e-02,\n", + " 6.31173674e-01, -4.09613573e-01],\n", + " [ 6.28724975e-02, -5.25308124e-01, 6.48038675e-01,\n", + " -1.57493963e-01, -3.36555093e-01, -6.18955419e-02,\n", + " 7.33266137e-02, 2.34100944e-01, 1.85331594e-01,\n", + " -2.45915363e-01, 5.68977350e-02],\n", + " [ -1.93045285e-01, 5.24990580e-01, 2.55602143e-01,\n", + " -1.67478741e-01, -4.27127676e-01, 3.53781963e-01,\n", + " -4.89197409e-01, 1.25132025e-01, -6.78493895e-02,\n", + " 6.24792526e-02, 1.50524984e-01],\n", + " [ -1.36538760e-01, 2.58847269e-01, -7.36978111e-02,\n", + " 8.02653042e-02, -3.61049991e-01, -1.47374665e-01,\n", + " 1.83023905e-01, -4.38475947e-01, 6.65392275e-01,\n", + " -2.08870192e-01, -1.95633438e-01],\n", + " [ -3.89792049e-01, 3.07148703e-01, 4.86349420e-01,\n", + " -3.20549454e-01, 3.04787117e-01, -1.67862457e-01,\n", + " 4.13381949e-01, -2.13775926e-01, -2.45352969e-01,\n", + " 6.54795560e-02, -1.10863413e-01],\n", + " [ 1.62651374e-01, 1.93882703e-01, -1.01411404e-01,\n", + " -2.63279539e-01, -1.81299739e-01, -5.00251057e-01,\n", + " 4.80152762e-02, 5.12382606e-01, 1.37668212e-01,\n", + " 4.35623490e-01, -3.15707398e-01],\n", + " [ -1.59317170e-02, -2.57038701e-02, 1.95997059e-01,\n", + " -1.44610576e-01, 6.22480417e-01, -4.51250690e-02,\n", + " -5.20188010e-01, 4.04309738e-05, 5.25324711e-01,\n", + " 5.36930257e-02, -2.82085697e-02],\n", + " [ -5.71133597e-01, -1.03219167e-01, 1.29896404e-01,\n", + " 6.65564933e-01, -4.06604917e-02, -2.57336895e-01,\n", + " -8.22521187e-02, 1.55757149e-01, 3.44018952e-02,\n", + " 2.91743283e-01, 1.34549525e-01],\n", + " [ 1.27640600e-01, -6.64910420e-02, -4.50837235e-02,\n", + " -2.47670950e-01, -1.13432941e-01, -3.17275097e-01,\n", + " -9.21030889e-03, -3.38360210e-01, 5.31620413e-02,\n", + " 3.39438778e-01, 7.54828132e-01]]))" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "U, S, V = np.linalg.svd(A)\n", + "(U, S, V)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "def reconstruct(U, S, V, rank):\n", + " return U[:,:rank] * np.diag(S[:rank]) * V[:rank]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 2.52022607, 1.87447007, 1.63924083, 2.04734815, 0.86429116,\n", + " 1.57411404, 2.15734651, 1.05915939, 1.33096782, 1.01390912,\n", + " 1.25157034],\n", + " [ 3.18997431, 2.37260913, 2.07486788, 2.59142944, 1.09397591,\n", + " 1.9924337 , 2.73065977, 1.34063023, 1.68467155, 1.28335473,\n", + " 1.58417425],\n", + " [ 3.31324076, 2.46429109, 2.15504458, 2.69156702, 1.13624914,\n", + " 2.06942499, 2.83617747, 1.39243464, 1.74977035, 1.33294591,\n", + " 1.64538964],\n", + " [ 0.80673486, 0.60002568, 0.52472782, 0.65536467, 0.2766632 ,\n", + " 0.50388046, 0.6905756 , 0.33904133, 0.42604834, 0.32455653,\n", + " 0.40063288],\n", + " [ 2.59418541, 1.92947886, 1.6873465 , 2.10743027, 0.88965492,\n", + " 1.62030849, 2.22065667, 1.09024181, 1.37002682, 1.04366361,\n", + " 1.28829932],\n", + " [ 3.10415171, 2.3087768 , 2.01904595, 2.52171 , 1.06454374,\n", + " 1.93882956, 2.6571945 , 1.30456211, 1.63934739, 1.24882754,\n", + " 1.54155386]])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reconstruct(U, S, V, 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "def calcError(A, rA):\n", + " return np.sum(np.power(A - rA, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "with rank 1, coverrage: 0.3493, error= 198.9381\n", + "with rank 2, coverrage: 0.6062, error= 84.7444\n", + "with rank 3, coverrage: 0.7714, error= 37.5352\n", + "with rank 4, coverrage: 0.9000, error= 8.9018\n", + "with rank 5, coverrage: 0.9587, error= 2.9553\n" + ] + } + ], + "source": [ + "S_sum = np\n", + "for i in range(1, len(S)):\n", + " rA = reconstruct(U, S, V, i)\n", + " percentage = S[:i].sum() / S.sum()\n", + " error = calcError(A, rA)\n", + " print(\"with rank {}, coverrage: {:0.4f}, error= {:0.4f}\".format(i, percentage, error))" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 4.76683441, 0.54004518, 5.09591696, 2.96389163, -0.56519073,\n", + " 0.09482103, 0.85152402, -0.28954052, 0.5146028 , 0.86384615,\n", + " -0.07081608],\n", + " [ 3.80915299, 5.46528385, 0.13112467, 3.92935798, 2.54957687,\n", + " 0.1598185 , 1.76909111, 0.87196726, 0.27370728, -0.05912012,\n", + " 2.00449791],\n", + " [ 5.34949911, 3.1655735 , 3.79980637, 4.098182 , 0.83411276,\n", + " -0.23028137, 1.33984485, 0.31716553, 0.38680822, 0.14797959,\n", + " 1.0391709 ],\n", + " [ 0.23183774, 0.27842236, -0.51306741, 0.36207533, 0.46521826,\n", + " 2.2531138 , 1.01595449, -0.57707206, 0.65924225, 2.7200146 ,\n", + " -0.42543837],\n", + " [ 0.90501881, 0.31788284, 0.26056569, 0.81233044, 0.82107262,\n", + " 5.38468497, 3.47906843, 0.3407214 , 2.58872133, 5.16479343,\n", + " 0.23408938],\n", + " [ 0.0315125 , 0.89589788, 0.91663636, 0.0598546 , 1.06007864,\n", + " 3.87719199, 5.16641771, 4.89334691, 4.12780202, -0.05160592,\n", + " 3.92599796]])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "reconstruct(U, S, V, 4)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[5, 0, 5, 3, 0, 0, 1, 0, 0, 1, 0],\n", + " [4, 5, 0, 4, 3, 0, 2, 1, 0, 0, 2],\n", + " [5, 4, 4, 4, 0, 0, 1, 0, 1, 0, 1],\n", + " [0, 1, 0, 0, 0, 3, 0, 0, 0, 3, 0],\n", + " [1, 0, 0, 1, 1, 5, 4, 0, 3, 5, 0],\n", + " [0, 1, 1, 0, 1, 4, 5, 5, 4, 0, 4]])" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(6, 11)" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1., 0., 1., 1., 0., 0., 1., 0., 0., 1., 0.],\n", + " [ 1., 1., 0., 1., 1., 0., 1., 1., 0., 0., 1.],\n", + " [ 1., 1., 1., 1., 0., 0., 1., 0., 1., 0., 1.],\n", + " [ 0., 1., 0., 0., 0., 1., 0., 0., 0., 1., 0.],\n", + " [ 1., 0., 0., 1., 1., 1., 1., 0., 1., 1., 0.],\n", + " [ 0., 1., 1., 0., 1., 1., 1., 1., 1., 0., 1.]])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mask = np.ones(A.shape)\n", + "mask[A==0] = 0\n", + "mask" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "collapsed": true, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "A_true = np.mat(np.random.randn(6, 5))\n", + "B_true = np.mat(np.random.randn(5, 11))" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "9952.3552777548921" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "B_true = A.I * A\n", + "A_true = A * B_true.I\n", + "calcError(A, A_true * B_true)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "9952.3552777548921" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "B_true = A.I * A\n", + "A_true = A * B_true.I\n", + "calcError(A, A_true * B_true)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[5, 0, 5, 3, 0, 0, 1, 0, 0, 1, 0],\n", + " [4, 5, 0, 4, 3, 0, 2, 1, 0, 0, 2],\n", + " [5, 4, 4, 4, 0, 0, 1, 0, 1, 0, 1],\n", + " [0, 1, 0, 0, 0, 3, 0, 0, 0, 3, 0],\n", + " [1, 0, 0, 1, 1, 5, 4, 0, 3, 5, 0],\n", + " [0, 1, 1, 0, 1, 4, 5, 5, 4, 0, 4]])" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 269, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [], + "source": [ + "\n", + "A = np.random.random((10, 20))" + ] + }, + { + "cell_type": "code", + "execution_count": 270, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "((10, 4), (4, 20))" + ] + }, + "execution_count": 270, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rank = 4\n", + "U1 = np.mat(np.random.randn(A.shape[0], rank))\n", + "M1 = np.mat(np.random.randn(rank, A.shape[1]))\n", + "U1.shape, M1.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 424, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.014291763305664062 0.0787419623936\n" + ] + }, + { + "data": { + "image/png": "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\nmQHw/wF77BFabWGrmwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "U = np.copy(U1)\n", + "M = np.copy(M1)\n", + "errors = []\n", + "start = time.time()\n", + "for i in range(200):\n", + " U = np.linalg.solve(M.dot(M.T), M.dot(A.T)).T\n", + " M = np.linalg.solve(U.T.dot(U), U.T.dot(A))\n", + " if i % 50 == 0:\n", + " e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + " errors.append(e)\n", + "elapsed = time.time() - start\n", + "e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + "errors.append(e)\n", + "print(elapsed, errors[-1])\n", + "plt.plot(errors)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "deletable": true, + "editable": true + }, + "source": [ + "### Stochastic Gradient Descent" + ] + }, + { + "cell_type": "code", + "execution_count": 451, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4.065443992614746 0.0793941976917\n" + ] + }, + { + "data": { + "image/png": "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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "U = np.copy(U1)\n", + "M = np.copy(M1)\n", + "eta = 0.2\n", + "MAX_ITERATION = 20000\n", + "errors = []\n", + "start = time.time()\n", + "for i in range(MAX_ITERATION):\n", + " if i % 200 == 0:\n", + " eta = eta * 0.9\n", + " for j in range(A.shape[0]):\n", + "# u_ind = np.random.randint(0, A.shape[0])\n", + " u_ind = j\n", + " m_ind = np.random.randint(0, A.shape[1])\n", + " a_i = A[u_ind, m_ind]\n", + " u_i = U[u_ind,:]\n", + " m_i = M[:,m_ind]\n", + "\n", + " err = a_i - u_i.dot(m_i) \n", + " dU = - err * m_i.T\n", + " dM = - u_i.T.dot(err)\n", + "\n", + " U[u_ind,:] = U[u_ind,:] - eta * dU\n", + " M[:,m_ind] = M[:,m_ind] - eta * dM\n", + " if i % 400 == 0:\n", + " e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + " errors.append(e)\n", + "elapsed = time.time() - start\n", + "e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + "errors.append(e)\n", + "print(elapsed, errors[-1])\n", + "plt.plot(errors)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 452, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "k\n", + "1.0532281398773193 0.131717052629\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8XGd97/HPb0a7ZG2WbMvyIq9xnDg4iWNCsxBCA05C\nY9qG4pT2wmXJLWBooe1tctub0kDLbSl0uU1vCZRCW0IIgYJbEkIggSRksRXHSbxb3i0v2qx9l373\njzlyZFkzIzujGR3l+3699NKcM4/m/OZY+ebRc57zjLk7IiIyvUQyXYCIiKSewl1EZBpSuIuITEMK\ndxGRaUjhLiIyDSncRUSmIYW7iMg0pHAXEZmGFO4iItNQVqYOXFFR4TU1NZk6vIhIKL344otN7l6Z\nrF3Gwr2mpoba2tpMHV5EJJTM7PBE2mlYRkRkGlK4i4hMQwp3EZFpSOEuIjINKdxFRKYhhbuIyDSk\ncBcRmYZCF+5bDrXwpR/voX9wONOliIhMWaEL962HT/P3T9QxOKxwFxGJJ3Thbhb7PqzP9RYRiSt0\n4R4J0t1d6S4iEk/own2Eeu4iIvGFLtxHeu4o3EVE4gpduL825q50FxGJJ3ThfmbMPcN1iIhMZaEL\nd/XcRUSSC2G4j8yWyXAhIiJT2ITC3czWmdkeM6szs7vGef5vzGxb8LXXzFpTX2pwrOC7pkKKiMSX\n9GP2zCwK3AfcBBwDtpjZJnffOdLG3T81qv0ngMsnoVZAY+4iIhMxkZ77WqDO3Q+4ez/wILA+Qfs7\ngG+lorjxaMxdRCS5iYR7NXB01PaxYN85zGwhsAh44vWXNr7IyDR3ZbuISFypvqC6AXjY3YfGe9LM\n7jSzWjOrbWxsvKADWDDqrp67iEh8Ewn3emD+qO15wb7xbCDBkIy73+/ua9x9TWVl5cSrHMXUcxcR\nSWoi4b4FWGZmi8wsh1iAbxrbyMxWAGXAc6kt8ZzjAAp3EZFEkoa7uw8CG4HHgF3AQ+6+w8zuNbPb\nRjXdADzokzxH8cyYu+bLiIjElXQqJIC7PwI8MmbfPWO2P5O6suLTeu4iIsmF7g7VkXnuuqAqIhJf\n6MJ9hLJdRCS+0IW7PolJRCS58IZ7husQEZnKQhfuWn5ARCS50IW7lh8QEUkudOGOlh8QEUkqdOGu\nnruISHKhC3ctPyAiklzowl3LD4iIJBe6cNfyAyIiyYUw3HUTk4hIMuEL9+C7eu4iIvGFLtxH7lDV\nPaoiIvGFLtw15i4iklzowj2iqZAiIkmFLtxfG3NXuouIxBO+cFfPXUQkqRCGe+y7pkKKiMQXunDX\neu4iIsmFLty1nruISHKhC3etCikiklzowl3ruYuIJBe6cH9tVUgREYlnQuFuZuvMbI+Z1ZnZXXHa\n/IaZ7TSzHWb2QGrLPOs4gGbLiIgkkpWsgZlFgfuAm4BjwBYz2+TuO0e1WQbcDVzj7qfNbNZkFawx\ndxGR5CbSc18L1Ln7AXfvBx4E1o9p8xHgPnc/DeDuDakt8zV2Zsx9so4gIhJ+Ewn3auDoqO1jwb7R\nlgPLzewXZva8ma0b74XM7E4zqzWz2sbGxgsqWDcxiYgkl6oLqlnAMuAG4A7gK2ZWOraRu9/v7mvc\nfU1lZeUFHUirQoqIJDeRcK8H5o/anhfsG+0YsMndB9z9ILCXWNinnNZzFxFJbiLhvgVYZmaLzCwH\n2ABsGtPm+8R67ZhZBbFhmgMprPMM9dxFRJJLGu7uPghsBB4DdgEPufsOM7vXzG4Lmj0GNJvZTuBJ\n4A/dvXlSCtaqkCIiSSWdCgng7o8Aj4zZd8+oxw58OviaVFrPXUQkudDdoWpaFVJEJKkQhnvsu6ZC\niojEF7pw15i7iEhyoQt3jbmLiCQXunBXz11EJLnQhbs+iUlEJLnQhruyXUQkvhCG+8hUSKW7iEg8\noQv3iJYfEBFJKnThPrKeu4ZlRETiC124R3RBVUQkqdCFu5YfEBFJLoThHvuu5QdEROILXbjrJiYR\nkeRCF+5afkBEJLnQhbt67iIiyYUu3NFsGRGRpEIX7iNTIUVEJL7QhfvIVEj13EVE4gtduEe0cJiI\nSFKhC/eR5Qe0toyISHzhC/eRnrvuURURiSu84a5sFxGJa0LhbmbrzGyPmdWZ2V3jPP8BM2s0s23B\n14dTX2rMa/Pcle4iIvFkJWtgZlHgPuAm4Biwxcw2ufvOMU2/7e4bJ6HGs+sJvmvMXUQkvon03NcC\nde5+wN37gQeB9ZNbVny6Q1VEJLmJhHs1cHTU9rFg31i/bmavmNnDZjY/JdWNQx+QLSKSXKouqP4n\nUOPulwGPA98Yr5GZ3WlmtWZW29jYeEEH0nruIiLJTSTc64HRPfF5wb4z3L3Z3fuCza8CV473Qu5+\nv7uvcfc1lZWVF1IvEOu964KqiEh8Ewn3LcAyM1tkZjnABmDT6AZmVjVq8zZgV+pKPFfETGPuIiIJ\nJJ0t4+6DZrYReAyIAl9z9x1mdi9Q6+6bgE+a2W3AINACfGASa8bQmLuISCJJwx3A3R8BHhmz755R\nj+8G7k5tafFFzDTmLiKSQOjuUAXA1HMXEUkklOEeMTRdRkQkgVCGu2HquYuIJBDKcI+Y7lAVEUkk\nlOFuZlpbRkQkgZCGu9ZzFxFJJJzhjoZlREQSCWW4RyKm5QdERBIIZbjH7lDNdBUiIlNXKMM9doeq\n0l1EJJ5QhruZeu4iIomENNw15i4ikkg4wx3NlhERSSSU4R4xLT8gIpJIKMPdtPyAiEhCoQz3iJYf\nEBFJKJThDlp+QEQkkVCGeySiYRkRkURCGe6GpkKKiCQSynCP6CYmEZGEQhru+oBsEZFEQhnu+oBs\nEZHEQhnukdindYiISByhDPfYkr9KdxGReCYU7ma2zsz2mFmdmd2VoN2vm5mb2ZrUlXiuiJmmQoqI\nJJA03M0sCtwH3AysBO4ws5XjtJsB/C7wQqqLPPdY6rmLiCQykZ77WqDO3Q+4ez/wILB+nHafBf4S\n6E1hfeMyzZYREUloIuFeDRwdtX0s2HeGmV0BzHf3HyZ6ITO708xqzay2sbHxvIs98zqgm5hERBJ4\n3RdUzSwCfAn4/WRt3f1+d1/j7msqKysv+JhafkBEJLGJhHs9MH/U9rxg34gZwKXAz8zsEHA1sGky\nL6oaWs9dRCSRiYT7FmCZmS0ysxxgA7Bp5El3b3P3Cnevcfca4HngNnevnZSKiS0/oGgXEYkvabi7\n+yCwEXgM2AU85O47zOxeM7ttsgscl9ZzFxFJKGsijdz9EeCRMfvuidP2htdfVmIR0wVVEZFEQnuH\nqrJdRCS+UIZ7bFVIpbuISDyhDHczGB7OdBUiIlNXSMNdPXcRkUTCGe7ok5hERBIJZbhrPXcRkcRC\nGe5aFVJEJLFQhrs+Q1VEJLFQhrt67iIiiYU03PVJTCIiiYQz3NHyAyIiiYQy3LUqpIhIYqEMdzOt\n5y4ikkgow728MIcTrb0amhERiSOU4b5mYRnNXf0caOrKdCkiIlNSOMO9phyA2kMtGa5ERGRqCmW4\nL6kspLwwh80HT2e6FBGRKSmU4W5mrFlYRu1h9dxFRMYTynAHWLuonMPN3TS092a6FBGRKSfU4Q7w\n/W31Ga5ERGTqCW24r6ou4e0rZvHFH+/loGbNiIicJbThbmb8xa+tIjcrwh9+52WG9OkdIiJnhDbc\nAWYX5/GZ2y6h9vBp/u25Q5kuR0RkyphQuJvZOjPbY2Z1ZnbXOM//jpm9ambbzOwZM1uZ+lLH96uX\nV/OWxTP5x5/tp29wKF2HFRGZ0pKGu5lFgfuAm4GVwB3jhPcD7r7K3VcDfwV8KeWVxq+Pj71tCQ0d\nfdz9vVc1PCMiwsR67muBOnc/4O79wIPA+tEN3L191GYhaV608dqlFXzyxqV8b2s9//784XQeWkRk\nSppIuFcDR0dtHwv2ncXMPm5m+4n13D+ZmvImxsz41E3LuW5ZBV94bA+nNPddRN7gUnZB1d3vc/cl\nwB8BfzJeGzO708xqzay2sbExVYceeW0+u/5S+oeG+cQDL7H7ZHvyHxIRmaYmEu71wPxR2/OCffE8\nCLx7vCfc/X53X+PuayorKyde5QTVVBTyhdsv48Ujp1n3t0/zB995WcsCi8gb0kTCfQuwzMwWmVkO\nsAHYNLqBmS0btXkrsC91JZ6f9aur+fkf3sAHr1nEwy8e4+vPHuJ0V3+myhERyYik4e7ug8BG4DFg\nF/CQu+8ws3vN7Lag2UYz22Fm24BPA++ftIonYF5ZAf/rlhVcWl3Mn/3nTt78Fz/l6X2pHQYSEZnK\nLFPDFmvWrPHa2tpJPUbvwBAvHWnlTzdt50hLNxvftpSNNy5L/oMiIlOUmb3o7muStQv1HarJ5GVH\necuSmfzLf1/L9csq+esf7+XKzz7Oj7afyHRpIiKTalqH+4jq0nz+8X1X8Ikbl1KYm8VHv7lV8+FF\nZFp7Q4Q7QFY0wu+/4yIe+73rufGiWfzJ97fz8Qe28mxdE209A5kuT0Qkpd4w4T4iPyfKl3/7Sj52\nwxKe2tPIb371BW74wpO8cqwVgLbuAa1RIyKhN60vqCbT3NnHj3ac5O9+so/Gzj5Wzy9lx/F2amYW\n8MFrFvHOS+ZQVphDW88AjR19LJ1VlNF6RUQmekH1DR3uI9q6B/jHn9Xx090NVJXkse1IKx19g2RH\njfzsKO29g2RFjK+8fw1vu2hWpssVkTcwhfvrMDTs7D7ZzndfrKezb4ATbb08va8JgKsXl7PhqgX8\nypvmAtDS1U/ljNxMlisibyAK9xTr6hvkgReO8PVnD1Hf2sPckjz6h5ymzj5mF+dSM7OQO9Yu4K3L\nK2ntGWBheQGRiGW6bBGZZhTuk8TdeXT7Sf7jpXoKcqLMmpHLV54+eE67i2bP4G0rZrGoooCDTd0s\nnVVEU2cf6y6ZQ01F4VltB4eGyYq+4a5ti8gFULin0ZZDLcwtzefJ3Q3Ut/ZQVZLHV54+wNGWnnPa\nFuREuWVVFdlRY2DI6ekf4ql9jSyfPYNrllbwK5dVUZKfzcyiXKLq+YvIGAr3DOsfHKa9d4Dn9jdT\nOSOXho4+Lp1bzBcf38vz+5uJRIzsiNHU1U//4PA5P1+Um8Ws4lyuXFDGvoZO3nVZFXNL8ynMzeLa\npRUKfpE3KIV7SIysWFmQG6Wjd5D/fPk4Q8POoeYuntrbxJGW7nN+Zn55Piurilm/upq1i8qJmvHo\n9pPcuqqKgtwom7Yd57rlFcyakZfutyMik0zhPg0MDA3zjWcPcfOqKjYfbCYaiWDA97YeY8fxdho6\n+uL+7Iy8LP7gHRfxW1cvVC9fZBpRuE9z/YPD/HTXKRo6+mjvGaCsMIf9jZ3sPtHBVTVlbD3SyjN1\nTVxVU8bFVcUMu7OgvIDS/ByOtHQztzSfxZWFzCnOO+cCr4hMXRMN96x0FCOpl5MV4eZVVXGfd3e+\nu7WeP/3Bdnaf6ACgo2/wnHZmcPWimfQNDjGvrID3rJlHYW4Wq+eVaiqnSIip5z7NDQ07Ixnd1T/E\n8dYe+gaG2XyohaqSPLYePs3mQy0U5ESpa+iiqTM21PPW5ZVcXFXMrauqWDWv5MzrdfcPUpCjPoFI\npmhYRs5bT/8Qf/3jPfzzM6/N28/PjvKR6xeTlx3h8Z2neOVYG/e8ayUr5xZz6dwS8nOiuDtm6uWL\npIPCXS7YqfZeHn31BL+8cjYf/kYtu0/GhnUqinIpLcimrqETgBVzZvDuy6v512cP8aHrFvPBa2pw\nR8M5IpNI4S4p0drdz8/3NrKyqpiq0nzys6Pc/9QBvlN7lANNXWe1rZyRS0l+Nu9dM5/rl1cyuziX\n0oIc+gaHGBhyinI1nCPyeincZdIdbu7iSEs3uVlRvrX5CHtPdXCyrZfmYO5+TjTC/PJ8Gjv6yMmK\n8r/fdTGHm7vp7h+itCCbW1dVMa8sX0M6IudB4S4Z4e7UNXTyTF0Tu0900NLdz6n2Xl451namzcjS\nCxDr7V+zZCar55dS39rDvLIC3vfmBVprRyQOhbtMKe29A+w63s6KqmKK87Kob+3hB9uO84u6Jnae\naKe1e4CsiDE47FSV5FFdms+Kqhmc7h7gsuoSfuvqhRRqWEdE4S7hMTzsHGjqYn55Ps/sa+Kh2qO0\ndg+w5VALDrjHhnhKCrIBKM7LYvnsGRxv7aG+tZc3Ly7nr29/E/k50cy+EZE0ULhL6B1t6WZmUQ57\nTnbwo+0nae+N3YTV2NHHnlPtLCgvoL1nkFfrY0M+ZQXZ3LhiNmtqyhh25wcvHefqxeV86qblGteX\naSOl4W5m64C/A6LAV939/4x5/tPAh4FBoBH4oLsfTvSaCndJlZ/sPMWeUx1sr2/j0e0nz3n+3avn\n8ptvXsiC8gKOt/Xwsz2NrLtkDivnFo/7epq3L1NZysLdzKLAXuAm4BiwBbjD3XeOavM24AV37zaz\njwI3uPt7E72uwl0mwzP7mqickcuz+5vIyYrQ0N7H/31iH8Pj/JrPLcljVnEerd39FOVlMa+0gJlF\nOfxo+0m+8J7LuHHF7PS/AZEkUhnubwE+4+7vDLbvBnD3z8dpfznwD+5+TaLXVbhLujR29LHzRDv7\nTnVwoKmLD/xSDf/wRB0Rg4NNXRTmZpEVjbDrRDuNwUqbWRHjkuoSFs0sYE5JPu978wKOnu7muf3N\nbLxxKblZGt+XzEhluN8OrHP3Dwfbvw282d03xmn/D8BJd//cOM/dCdwJsGDBgisPH044ciOSVsPD\nzsn2XvKzo3z+0V3sa+jkaEvPmfV2RiypLKSnf4i+wWE23riUU+19vP3iWVxVU56hyuWNJCPhbma/\nBWwE3uru8RcbRz13CY/dJ9vZeriV7KjR0NHHD185wcKZBTR29FF7+PSZdpfNK2H96mounVvM2kXl\nGreXSZHKJX/rgfmjtucF+8Ye8JeBP2YCwS4SJivmFLNizmsXXz/+tqVA7MLrYztOUlqQw/b6Nr63\ntZ7P/lfsUtTFVcVcvqCUS+eW8GtXVJOXrWEcSa+J9NyziF1QfTuxUN8C/Ka77xjV5nLgYWI9/H0T\nObB67jIdHW7u4kuP7+VH20+Slx2lrWeA2cW53LhiNjeumMXiykIWlhcQjRj9Q8Mau5fzluqpkLcA\nf0tsKuTX3P3PzexeoNbdN5nZT4BVwIngR464+22JXlPhLtOVuzM07EQjxjN1Tfz784f52Z5G+kZ9\nEPqM3Cx6B4fYcNUCPvH2pfq8W5kw3cQkMoV09g2yL5iL/7kf7qK6LJ9V1SX88JUTDLlTVZzHu940\nl1tXVXHZvBItnSxxKdxFpqjjrT2UFmRTkJPF/sZOvvzz/ew91cm2o61EI0Z21CgryOE9a+azvb6N\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "U = np.copy(U1)\n", + "M = np.copy(M1)\n", + "eta = 0.14\n", + "MAX_ITERATION = 40000\n", + "block_size = 4\n", + "errors = []\n", + "start = time.time()\n", + "for i in range(MAX_ITERATION):\n", + "# for j in range(0, A.shape[0] - block_size):\n", + "# u_ind = j\n", + " u_ind = np.random.randint(0, A.shape[0]-block_size)\n", + " m_ind = np.random.randint(0, A.shape[1]-block_size)\n", + " a_i = A[u_ind:u_ind+block_size, m_ind:m_ind+block_size]\n", + " u_i = U[u_ind:u_ind+block_size,:]\n", + " m_i = M[:,m_ind:m_ind+block_size]\n", + "\n", + " err = a_i - u_i.dot(m_i)\n", + " dU = - err.dot(m_i.T)\n", + " dM = - u_i.T.dot(err)\n", + "\n", + " U[u_ind:u_ind+block_size,:] = U[u_ind:u_ind+block_size,:] - eta * dU\n", + " M[:,m_ind:m_ind+block_size] = M[:,m_ind:m_ind+block_size] - eta * dM\n", + " if i % 100 == 0:\n", + " e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + " errors.append(e)\n", + "elapsed = time.time() - start\n", + "print('k')\n", + "e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + "errors.append(e)\n", + "print(elapsed, errors[-1])\n", + "plt.plot(errors)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 458, + "metadata": { + "collapsed": false, + "deletable": true, + "editable": true, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "k\n", + "4.646364212036133 0.379032177699\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "U = np.copy(U1)\n", + "M = np.copy(M1)\n", + "eta = 0.01\n", + "MAX_ITERATION = 12000\n", + "block_size = 1\n", + "errors = []\n", + "start = time.time()\n", + "for i in range(MAX_ITERATION):\n", + " for j in range(0, A.shape[0] - block_size):\n", + " u_ind = j\n", + " m_ind = np.random.randint(0, A.shape[1]-block_size)\n", + " a_i = A[u_ind:u_ind+block_size, m_ind:m_ind+block_size]\n", + " u_i = U[u_ind:u_ind+block_size,:]\n", + " m_i = M[:,m_ind:m_ind+block_size]\n", + " \n", + "# u_i = np.linalg.solve(m_i.dot(m_i.T), m_i.dot(a_i.T)).T\n", + " err = a_i - u_i.dot(m_i)\n", + " dU = - err.dot(m_i.T)\n", + " U[u_ind:u_ind+block_size,:] = U[u_ind:u_ind+block_size,:] - eta * dU\n", + "# U[u_ind:u_ind+block_size,:] = u_i\n", + " \n", + " for j in range(0, A.shape[1] - block_size):\n", + " u_ind = np.random.randint(0, A.shape[0]-block_size)\n", + " m_ind = j\n", + " a_i = A[u_ind:u_ind+block_size, m_ind:m_ind+block_size]\n", + " u_i = U[u_ind:u_ind+block_size,:]\n", + " m_i = M[:,m_ind:m_ind+block_size]\n", + "# m_i = np.linalg.solve(u_i.T.dot(u_i), u_i.T.dot(a_i))\n", + " err = a_i - u_i.dot(m_i)\n", + " dM = - u_i.T.dot(err)\n", + " M[:,m_ind:m_ind+block_size] = M[:,m_ind:m_ind+block_size] - eta * dM\n", + " \n", + " \n", + " if i % 2400 == 0:\n", + " e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + " errors.append(e)\n", + "elapsed = time.time() - start\n", + "print('k')\n", + "e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + "errors.append(e)\n", + "print(elapsed, errors[-1])\n", + "plt.plot(errors)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 462, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "ValueError", + "evalue": "could not broadcast input array from shape (4,10) into shape (4,1)", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0merr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0ma_i\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mU\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mU\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0mdM\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mU\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mT\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0merr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m \u001b[0mM\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mm_ind\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mm_ind\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mblock_size\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mM\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mm_ind\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mm_ind\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mblock_size\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0meta\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mdM\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mValueError\u001b[0m: could not broadcast input array from shape (4,10) into shape (4,1)" + ] + } + ], + "source": [ + "U = np.copy(U1)\n", + "M = np.copy(M1)\n", + "eta = 0.01\n", + "MAX_ITERATION = 12000\n", + "block_size = 1\n", + "errors = []\n", + "start = time.time()\n", + "for i in range(MAX_ITERATION):\n", + " for j in range(0, A.shape[0] - block_size):\n", + " u_ind = j\n", + " m_ind = np.random.randint(0, A.shape[1]-block_size)\n", + " a_i = A[u_ind:u_ind+block_size, :]\n", + " u_i = U[u_ind:u_ind+block_size,:]\n", + " \n", + " err = a_i - u_i.dot(M)\n", + " dU = - err.dot(M.T)\n", + " U[u_ind:u_ind+block_size,:] = U[u_ind:u_ind+block_size,:] - eta * dU\n", + "# U[u_ind:u_ind+block_size,:] = u_i\n", + " \n", + " for j in range(0, A.shape[1] - block_size):\n", + " u_ind = np.random.randint(0, A.shape[0]-block_size)\n", + " m_ind = j\n", + " a_i = A[:, m_ind:m_ind+block_size]\n", + " m_i = M[:,m_ind:m_ind+block_size]\n", + "\n", + " err = a_i - U.dot(U)\n", + " dM = - U.T.dot(err)\n", + " M[:,m_ind:m_ind+block_size] = M[:,m_ind:m_ind+block_size] - eta * dM\n", + " \n", + " \n", + " if i % 2400 == 0:\n", + " e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + " errors.append(e)\n", + "elapsed = time.time() - start\n", + "print('k')\n", + "e = np.sqrt(np.power(A - U.dot(M), 2).sum()) / (A.shape[0] + A.shape[1])\n", + "errors.append(e)\n", + "print(elapsed, errors[-1])\n", + "plt.plot(errors)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 431, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 6.93616054, -3.70703094, -0.34937645, -0.53202702, 0.6691046 ])" + ] + }, + "execution_count": 431, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "U.dot(M)[3,:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 457, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.00443189]])" + ] + }, + "execution_count": 457, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a_i" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 408, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.15421251, 0.50652959, 0.25934971, 0.8203848 , 0.6798117 ])" + ] + }, + "execution_count": 408, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "U.dot(M)[3,:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 441, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0.88991031, -1.11520329, 0.75238804, 2.13531994, 0.33131531,\n", + " 0.40815122, 0.08004733, 1.55620641, 0.0437635 , 0.64632387,\n", + " 0.76435717, -2.19905092, -0.7758741 , 1.16759714, -1.44449923,\n", + " 0.00943331, 1.15211436, -0.1773714 , 0.48856296, -0.06216587],\n", + " [ 0.0279215 , 1.8936256 , 0.17278202, -2.03120041, -0.83029699,\n", + " 0.24711855, -0.77822443, -0.0130944 , -0.80994036, 0.37938036,\n", + " -1.02142506, 1.35912663, -1.00546452, -0.1222818 , -0.61429996,\n", + " 2.02352052, -2.32272918, -1.40966399, 0.6990727 , -0.24108175],\n", + " [ 1.65758934, -1.5679221 , 0.83967987, -0.38427077, 0.84137448,\n", + " 2.04544519, 0.02173059, -0.05216779, -0.25287257, 0.98262751,\n", + " 0.41550207, -0.17672982, 1.24510027, 0.66171195, -0.81434485,\n", + " -0.88225348, 1.71814951, -0.37139128, 0.86622349, -0.54101977],\n", + " [-1.92895956, 0.20296416, 0.62142512, 0.23157709, 0.43959861,\n", + " -2.47030314, 1.03303486, 0.23278662, -0.88808655, 0.52651831,\n", + " 1.92479865, -0.64757968, -0.35915632, -0.98211636, 0.54844687,\n", + " 0.91761771, 0.58950098, -2.35283403, 0.17727504, -1.15965419]])" + ] + }, + "execution_count": 441, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "M" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.6.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/alternating.ipynb b/alternating.ipynb new file mode 100644 index 0000000..e3d1e99 --- /dev/null +++ b/alternating.ipynb @@ -0,0 +1,195 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import matplotlib as mpl\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "\n", + "\n", + "# W_true = np.random.randn(M,K)\n", + "# H_true = np.random.randn(K,N)\n", + "\n", + "# X = W_true.dot(H_true)\n", + "# X = X+0.01*np.random.randn(M,N)\n", + "X = np.array([[ 5., 5., 0., 4., 1., 0., 0., 0., 0., 1., 5., 0.],\n", + " [ 4., 0., 4., 5., 0., 2., 0., 1., 1., 1., 4., 5.],\n", + " [ 0., 0., 0., 2., 0., 1., 0., 0., 0., 0., 0., 0.],\n", + " [ 0., 1., 0., 0., 0., 4., 5., 0., 4., 5., 0., 1.],\n", + " [ 1., 0., 1., 0., 5., 0., 4., 4., 5., 0., 1., 1.]])\n", + "\n", + "M = X.shape[0]\n", + "N = X.shape[1]\n", + "K = 3" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "66.6787797434\n", + "0.000376521655613\n", + "7.43500743418e-05\n", + "1.61868332186e-05\n", + "3.53655769926e-06\n", + "7.73277340903e-07\n", + "1.69107631575e-07\n", + "3.69834292453e-08\n", + "8.08825172207e-09\n", + "1.76889847362e-09\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\nTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "Mask = (np.random.rand(M,N)<0.4)\n", + "\n", + "Mask = np.copy(X)\n", + "Mask[Mask!=0] = 1\n", + "Mask\n", + "\n", + "# W = np.random.randn(M,K)\n", + "# H = np.random.randn(K,N)\n", + "W = np.array([[ 0.18011451, 0.60299404, 0.3177374 ],\n", + " [ 0.65611746, 0.2221562 , 0.11995832],\n", + " [ 0.80116047, 0.82407141, 0.79099989],\n", + " [ 0.66004068, 0.55214108, 0.82858835],\n", + " [ 0.05662817, 0.99133845, 0.28844242]])\n", + "H = np.array([[ 0.12592786, 0.75672181, 0.30747259, 0.56041327, 0.54473678,\n", + " 0.89090891, 0.12236257, 0.3108339 , 0.46744222, 0.89925064,\n", + " 0.09402283, 0.9283946 ],\n", + " [ 0.21140259, 0.67445654, 0.14928717, 0.84047072, 0.16396425,\n", + " 0.03306015, 0.92158905, 0.18943411, 0.40587314, 0.50836581,\n", + " 0.78039105, 0.54416406],\n", + " [ 0.44876138, 0.67787687, 0.18120697, 0.23119679, 0.30702529,\n", + " 0.52461556, 0.62692945, 0.51883236, 0.63077754, 0.93171459,\n", + " 0.72034789, 0.63587984]])\n", + "\n", + "EPOCH = 1000\n", + "\n", + "eta = 0.05\n", + "\n", + "for i in range(EPOCH):\n", + " dW = -(Mask*(X-W.dot(H))).dot(H.T)\n", + " W = W - eta*dW\n", + " dH = -W.T.dot((Mask*(X-W.dot(H))))\n", + " H = H - eta*dH\n", + "\n", + " if (i%100 == 0):\n", + " print(0.5*np.sum((Mask*(X-W.dot(H)))**2))\n", + "\n", + "\n", + "plt.imshow(Mask, interpolation='nearest',cmap=plt.cm.gray_r)\n", + "plt.title('Mask')\n", + "plt.show()\n", + "\n", + "MX = X.copy()\n", + "MX[Mask==0] = np.nan\n", + "\n", + "plt.imshow(MX, interpolation='nearest')\n", + "plt.title('Observed Data')\n", + "plt.show()\n", + "plt.imshow(W.dot(H), interpolation='nearest')\n", + "plt.title('Approximation')\n", + "plt.show()\n", + "plt.imshow(X, interpolation='nearest')\n", + "plt.title('True')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.6.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/ar.ipynb b/ar.ipynb new file mode 100644 index 0000000..4b8b3aa --- /dev/null +++ b/ar.ipynb @@ -0,0 +1,207 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from matplotlib import pyplot as plt\n", + "%matplotlib inline\n" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "7" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Y = np.mat([1.2, 2.1, 1.0, 0.7, 0.0, -1.3, 1.9]).T\n", + "len(Y)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "X = np.hstack([\n", + " np.ones((len(Y)- 3, 1)),\n", + " Y[0:-3],\n", + " Y[2:-1]\n", + " ])\n", + "Y = Y[3:]" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 1. , 1.2, 1. ],\n", + " [ 1. , 2.1, 0.7],\n", + " [ 1. , 1. , 0. ],\n", + " [ 1. , 0.7, -1.3]])" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 0.7],\n", + " [ 0. ],\n", + " [-1.3],\n", + " [ 1.9]])" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Y" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "w = (X.T * X).I * X.T * Y" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 0.37014714],\n", + " [ 0.01269755],\n", + " [-0.61019074]])" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "w" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "w, e, r, s = np.linalg.lstsq(X, Y)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "matrix([[ 0.37014714],\n", + " [ 0.01269755],\n", + " [-0.61019074]])" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "w" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/bike-sharing-demand.ipynb b/bike-sharing-demand.ipynb index 9f72c04..57f6a3f 100644 --- a/bike-sharing-demand.ipynb +++ b/bike-sharing-demand.ipynb @@ -2,14 +2,20 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "Bogazici-SWE546-Spring2016 Final Project - Mustafa Atik" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "## Bike sharing demand competition\n", "I am just a beginner to kaggle competitions. After reading a few posts dealing with the famous titanic data, I felt confident to try to solve a problem on my own. Bike sharing problem is also famous but this time, I will not read the articles about it. After I am done with this problem, surely I will take a look at them. \n", @@ -29,7 +35,9 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [], "source": [ @@ -49,7 +57,9 @@ "cell_type": "code", "execution_count": 2, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -223,7 +233,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "### Field descriptions \n", "```\n", @@ -250,7 +263,9 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -289,7 +304,9 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": true + "collapsed": true, + "deletable": true, + "editable": true }, "outputs": [], "source": [ @@ -305,6 +322,8 @@ "execution_count": 5, "metadata": { "collapsed": false, + "deletable": true, + "editable": true, "scrolled": false }, "outputs": [ @@ -756,6 +775,8 @@ "execution_count": 6, "metadata": { "collapsed": false, + "deletable": true, + "editable": true, "scrolled": false }, "outputs": [ @@ -862,7 +883,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "### Inferences\n", "1. count is high between 6am and 8pm, especially at 7-8 and 17-18\n", @@ -874,14 +898,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "## Constructing an estimator" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "First, data is split into two sets as `training set` and `test set`." ] @@ -890,7 +920,9 @@ "cell_type": "code", "execution_count": 7, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -913,7 +945,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "### Choosing the right regressor" ] @@ -922,7 +957,9 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": true + "collapsed": true, + "deletable": true, + "editable": true }, "outputs": [], "source": [ @@ -933,7 +970,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "### Evaluation \n", "To evaluate proposed regressors, R² score, the coefficient of determination method is used. http://scikit-learn.org/stable/modules/model_evaluation.html#r2-score-the-coefficient-of-determination\n", @@ -948,7 +988,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "#### Support Vector Regressor" ] @@ -957,7 +1000,9 @@ "cell_type": "code", "execution_count": 9, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -979,7 +1024,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "#### Random Forest Regressor\n", "ID3 Algorithm -- Michael Crawford, \n", @@ -990,7 +1038,9 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -1017,14 +1067,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "We can compare random forest regressor(rfr) and svm regressor by looking at their scores. The random forest regressor looks like far better than the svm regressor. So, I choose rfr." ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "### Finding the optimum parameters for randomforest regressor\n", "To fine tune our randomforest regressor, we find the optimum parameters through grid searching. For each combination of parameters, a new instance of randomforest regressor will be created with that parameter set and its score will be calculated automatically. After grid searching, it is easy to find the best parameter combination to pass to our regressor." @@ -1034,7 +1090,9 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [], "source": [ @@ -1049,7 +1107,9 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -1080,14 +1140,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "As shown above, the optimum paramet set is `{n_estimators:100, bootstrap:True}`" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "### Preparing the final regressor and testing it" ] @@ -1096,7 +1162,9 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -1122,7 +1190,9 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -1152,7 +1222,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "### Making prediction on the test data" ] @@ -1161,7 +1234,9 @@ "cell_type": "code", "execution_count": 67, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -1262,7 +1337,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "## A better approach: predicting month by month (not completed yet)" ] @@ -1271,7 +1349,9 @@ "cell_type": "code", "execution_count": 64, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -1329,7 +1409,9 @@ "cell_type": "code", "execution_count": 619, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -1430,21 +1512,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.6.0" } }, "nbformat": 4, diff --git a/titanic-data-exploration.ipynb b/titanic-data-exploration.ipynb index ffb9b17..071f4c9 100644 --- a/titanic-data-exploration.ipynb +++ b/titanic-data-exploration.ipynb @@ -4,7 +4,9 @@ "cell_type": "code", "execution_count": 30, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [], "source": [ @@ -19,7 +21,9 @@ "cell_type": "code", "execution_count": 11, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -219,7 +223,9 @@ "cell_type": "code", "execution_count": 12, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -252,7 +258,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "## `Embarked` feature" ] @@ -261,7 +270,9 @@ "cell_type": "code", "execution_count": 13, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -293,7 +304,9 @@ "cell_type": "code", "execution_count": 14, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -325,7 +338,9 @@ "cell_type": "code", "execution_count": 15, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -357,7 +372,9 @@ "cell_type": "code", "execution_count": 16, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -391,7 +408,9 @@ "cell_type": "code", "execution_count": 17, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -421,14 +440,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "## `Sex` feature" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "First, let's have a look at which gender is dominant in the population by a countplot." ] @@ -437,7 +462,9 @@ "cell_type": "code", "execution_count": 18, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -469,7 +496,9 @@ "cell_type": "code", "execution_count": 19, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -499,7 +528,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "According to **sex vs. survived** chart, most of men did not survived while the majority of women did. The following chart also supports this claim by showing us that 70% of women survived." ] @@ -508,7 +540,9 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -538,14 +572,20 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "The inference is that this `sex` feature can be used in a classification task to determine whether a given person survived or not." ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "## Pclass feature\n", "This stands for `Passenger Class`. There are three classes as 1 = 1st; 2 = 2nd; 3 = 3rd. We can make a guess saying most probably the first class passengers survived thanks to their nobility. This guess is based on the domain knowledge; in that time classes among the people is more obvious and severe than now. Let's have a look at the data to see the truth." @@ -555,7 +595,9 @@ "cell_type": "code", "execution_count": 21, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -587,7 +629,9 @@ "cell_type": "code", "execution_count": 22, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -617,7 +661,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "deletable": true, + "editable": true + }, "source": [ "The chart above corrects the guess: unfortunatelly, passenger class plays a crucial role." ] @@ -626,7 +673,9 @@ "cell_type": "code", "execution_count": 23, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -658,7 +707,9 @@ "cell_type": "code", "execution_count": 24, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -680,7 +731,9 @@ "cell_type": "code", "execution_count": 31, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [], "source": [ @@ -721,7 +774,9 @@ "cell_type": "code", "execution_count": 32, "metadata": { - "collapsed": false + "collapsed": false, + "deletable": true, + "editable": true }, "outputs": [ { @@ -752,7 +807,9 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": true, + "deletable": true, + "editable": true }, "outputs": [], "source": [] @@ -760,21 +817,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.10" + "pygments_lexer": "ipython3", + "version": "3.6.0" } }, "nbformat": 4,