Skip to content

Instantly share code, notes, and snippets.

@kiwamizamurai
Created January 10, 2020 01:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kiwamizamurai/35b960c7875d96ea795c915933633a4c to your computer and use it in GitHub Desktop.
Save kiwamizamurai/35b960c7875d96ea795c915933633a4c to your computer and use it in GitHub Desktop.
biased-matrix-factorization.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "biased-matrix-factorization.ipynb",
"provenance": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/kiwamizamurai/35b960c7875d96ea795c915933633a4c/biased-matrix-factorization.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "DHuftFltl9Dr",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 212
},
"outputId": "c9ae8894-3657-4a12-ff92-2503ce9ba521"
},
"source": [
"!wget http://files.grouplens.org/datasets/movielens/ml-100k.zip"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"--2020-01-10 01:24:37-- http://files.grouplens.org/datasets/movielens/ml-100k.zip\n",
"Resolving files.grouplens.org (files.grouplens.org)... 128.101.65.152\n",
"Connecting to files.grouplens.org (files.grouplens.org)|128.101.65.152|:80... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 4924029 (4.7M) [application/zip]\n",
"Saving to: ‘ml-100k.zip’\n",
"\n",
"\rml-100k.zip 0%[ ] 0 --.-KB/s \rml-100k.zip 17%[==> ] 843.38K 3.76MB/s \rml-100k.zip 100%[===================>] 4.70M 15.4MB/s in 0.3s \n",
"\n",
"2020-01-10 01:24:38 (15.4 MB/s) - ‘ml-100k.zip’ saved [4924029/4924029]\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "bkVr-55bmrIu",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 461
},
"outputId": "2aa0b434-925f-460c-8814-b07cf6c4228c"
},
"source": [
"!unzip ml-100k.zip"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Archive: ml-100k.zip\n",
" creating: ml-100k/\n",
" inflating: ml-100k/allbut.pl \n",
" inflating: ml-100k/mku.sh \n",
" inflating: ml-100k/README \n",
" inflating: ml-100k/u.data \n",
" inflating: ml-100k/u.genre \n",
" inflating: ml-100k/u.info \n",
" inflating: ml-100k/u.item \n",
" inflating: ml-100k/u.occupation \n",
" inflating: ml-100k/u.user \n",
" inflating: ml-100k/u1.base \n",
" inflating: ml-100k/u1.test \n",
" inflating: ml-100k/u2.base \n",
" inflating: ml-100k/u2.test \n",
" inflating: ml-100k/u3.base \n",
" inflating: ml-100k/u3.test \n",
" inflating: ml-100k/u4.base \n",
" inflating: ml-100k/u4.test \n",
" inflating: ml-100k/u5.base \n",
" inflating: ml-100k/u5.test \n",
" inflating: ml-100k/ua.base \n",
" inflating: ml-100k/ua.test \n",
" inflating: ml-100k/ub.base \n",
" inflating: ml-100k/ub.test \n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "1q4jDGW5mfHq",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "8ccc0a17-addb-438a-d5c6-4017f1b309bf"
},
"source": [
"cd ml-100k"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
"/content/ml-100k\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "t7LDzQUOmr7O",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 70
},
"outputId": "36dfd505-afcf-43af-cd1a-94519a9e99be"
},
"source": [
"!ls"
],
"execution_count": 4,
"outputs": [
{
"output_type": "stream",
"text": [
"allbut.pl u1.base u2.test u4.base u5.test ub.base\tu.genre u.occupation\n",
"mku.sh\t u1.test u3.base u4.test ua.base ub.test\tu.info\t u.user\n",
"README\t u2.base u3.test u5.base ua.test u.data\tu.item\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "xRbOy-nGms2Q",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"sns.set()\n",
"\n",
"plt.rcParams[\"figure.figsize\"] = (18, 9)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "UoUBJJYQnB9J",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 406
},
"outputId": "c6275535-51a2-458c-8aa1-5e6076ab0d90"
},
"source": [
"samples = pd.read_csv('./u.data', sep = '\\t', header=None)\n",
"\n",
"samples = samples.iloc[:500, :3]\n",
"samples.columns = ['user', 'item', 'rate']\n",
"\n",
"samples['user'] = samples['user'] - 1\n",
"samples['item'] = samples['item'] - 1\n",
"\n",
"samples"
],
"execution_count": 6,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>user</th>\n",
" <th>item</th>\n",
" <th>rate</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>195</td>\n",
" <td>241</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>185</td>\n",
" <td>301</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>21</td>\n",
" <td>376</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>243</td>\n",
" <td>50</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>165</td>\n",
" <td>345</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>495</th>\n",
" <td>69</td>\n",
" <td>430</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>496</th>\n",
" <td>220</td>\n",
" <td>474</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>497</th>\n",
" <td>71</td>\n",
" <td>181</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>498</th>\n",
" <td>24</td>\n",
" <td>356</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>499</th>\n",
" <td>289</td>\n",
" <td>49</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>500 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" user item rate\n",
"0 195 241 3\n",
"1 185 301 3\n",
"2 21 376 1\n",
"3 243 50 2\n",
"4 165 345 1\n",
".. ... ... ...\n",
"495 69 430 3\n",
"496 220 474 4\n",
"497 71 181 5\n",
"498 24 356 4\n",
"499 289 49 5\n",
"\n",
"[500 rows x 3 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "4kRcqlM-nEt5",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 444
},
"outputId": "92c046e8-3f6a-40ee-f44c-48e111337825"
},
"source": [
"pivot_table = samples.pivot_table(index=[\"user\"], columns=[\"item\"], values=\"rate\").fillna(0)\n",
"print(pivot_table.shape)\n",
"pivot_table.head(10)"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"(195, 358)\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th>item</th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>6</th>\n",
" <th>9</th>\n",
" <th>10</th>\n",
" <th>11</th>\n",
" <th>13</th>\n",
" <th>14</th>\n",
" <th>15</th>\n",
" <th>16</th>\n",
" <th>19</th>\n",
" <th>20</th>\n",
" <th>22</th>\n",
" <th>24</th>\n",
" <th>25</th>\n",
" <th>28</th>\n",
" <th>31</th>\n",
" <th>32</th>\n",
" <th>39</th>\n",
" <th>46</th>\n",
" <th>47</th>\n",
" <th>49</th>\n",
" <th>50</th>\n",
" <th>53</th>\n",
" <th>55</th>\n",
" <th>59</th>\n",
" <th>60</th>\n",
" <th>61</th>\n",
" <th>63</th>\n",
" <th>64</th>\n",
" <th>65</th>\n",
" <th>67</th>\n",
" <th>68</th>\n",
" <th>70</th>\n",
" <th>76</th>\n",
" <th>77</th>\n",
" <th>78</th>\n",
" <th>...</th>\n",
" <th>954</th>\n",
" <th>958</th>\n",
" <th>959</th>\n",
" <th>978</th>\n",
" <th>983</th>\n",
" <th>1013</th>\n",
" <th>1015</th>\n",
" <th>1016</th>\n",
" <th>1017</th>\n",
" <th>1027</th>\n",
" <th>1034</th>\n",
" <th>1041</th>\n",
" <th>1046</th>\n",
" <th>1048</th>\n",
" <th>1059</th>\n",
" <th>1066</th>\n",
" <th>1078</th>\n",
" <th>1080</th>\n",
" <th>1085</th>\n",
" <th>1090</th>\n",
" <th>1097</th>\n",
" <th>1109</th>\n",
" <th>1114</th>\n",
" <th>1133</th>\n",
" <th>1136</th>\n",
" <th>1146</th>\n",
" <th>1152</th>\n",
" <th>1180</th>\n",
" <th>1183</th>\n",
" <th>1196</th>\n",
" <th>1210</th>\n",
" <th>1216</th>\n",
" <th>1223</th>\n",
" <th>1239</th>\n",
" <th>1266</th>\n",
" <th>1294</th>\n",
" <th>1335</th>\n",
" <th>1392</th>\n",
" <th>1443</th>\n",
" <th>1450</th>\n",
" </tr>\n",
" <tr>\n",
" <th>user</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.0</td>\n",
" <td>3.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>...</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>10 rows × 358 columns</p>\n",
"</div>"
],
"text/plain": [
"item 0 1 2 3 4 6 ... 1266 1294 1335 1392 1443 1450\n",
"user ... \n",
"0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"4 0.0 3.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"5 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"6 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"7 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"9 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"10 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"12 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"13 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"14 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 0.0\n",
"\n",
"[10 rows x 358 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cWDLGVrx_70C",
"colab_type": "text"
},
"source": [
"# Make Sample Data"
]
},
{
"cell_type": "code",
"metadata": {
"id": "v3kS6cisnlnx",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 141
},
"outputId": "501f7397-abac-484e-8ab9-a12eb4d54111"
},
"source": [
"n_feature = 3\n",
"\n",
"# X = pivot_table.copy()\n",
"X = np.array([\n",
" [5, 3, 0, 1],\n",
" [4, 0, 0, 1],\n",
" [1, 1, 0, 5],\n",
" [1, 0, 0, 4],\n",
" [0, 1, 5, 4],\n",
" ])\n",
"n_user, n_item = X.shape\n",
"\n",
"beta = np.random.randn(n_user)\n",
"gamma = np.random.randn(n_item)\n",
"lambdaa = 0.5\n",
"U = np.random.randn(n_user, n_feature)\n",
"V = np.random.randn(n_item, n_feature)\n",
"\n",
"print('X shape: {}'.format(X.shape))\n",
"print('beta shape: {}\\ngamma shape: {}'.format(n_user, n_item))\n",
"print('U shape: {}\\nV shape: {}\\n'.format(U.shape, V.shape))\n",
"print('X = UV.T factorization shape: ', X.shape == np.dot(U, V.T).shape)"
],
"execution_count": 122,
"outputs": [
{
"output_type": "stream",
"text": [
"X shape: (5, 4)\n",
"beta shape: 5\n",
"gamma shape: 4\n",
"U shape: (5, 3)\n",
"V shape: (4, 3)\n",
"\n",
"X = UV.T factorization shape: True\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "M1U-zwg2__vV",
"colab_type": "text"
},
"source": [
"# Simple Matric factorization"
]
},
{
"cell_type": "code",
"metadata": {
"id": "LOo-a1Irt0bz",
"colab_type": "code",
"colab": {}
},
"source": [
"def costMF(U, V):\n",
" term1 = np.sum(np.square(X - np.dot(U, V.T)))\n",
" term2 = lambdaa * (np.sum(np.square(U)) + np.sum(np.square(V)))\n",
" return term1 + term2"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "th7eIMcFyuPr",
"colab_type": "code",
"colab": {}
},
"source": [
"def updateMF(U, V):\n",
" for i in range(n_item):\n",
" V[i, :] = np.dot(np.dot(np.linalg.inv(np.dot(U.T, U) + lambdaa * np.eye(U.shape[1])), U.T), X[:, i])\n",
" for j in range(n_user):\n",
" U[j, :] = np.dot(np.dot(np.linalg.inv(np.dot(V.T, V) + lambdaa * np.eye(V.shape[1])), V.T), X[j, :])"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "t5G3VLLU5oD7",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "03509153-e4af-401b-843b-7e474ae4a473"
},
"source": [
"costsMF = [costMF(U, V)]\n",
"\n",
"for i in range(200):\n",
" updateMF(U, V)\n",
" cos = costMF(U, V)\n",
" if cos >= costsMF[-1]:\n",
" print('[x] Finish i = {}'.format(i))\n",
" break\n",
" else:\n",
" costsMF.append(costMF(U, V))"
],
"execution_count": 125,
"outputs": [
{
"output_type": "stream",
"text": [
"[x] Finish i = 71\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "jzK9z99CP3CN",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 105
},
"outputId": "21e2ec21-8ed9-44d7-e06d-4adb7f4c4971"
},
"source": [
"np.dot(U, V.T)"
],
"execution_count": 126,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 4.93560331, 2.02358221, 0.15237351, 1.02868305],\n",
" [ 3.21753834, 1.23691032, -0.26642454, 0.97267364],\n",
" [ 1.17013188, 0.53821735, 0.22271437, 4.63728933],\n",
" [ 0.85185738, 0.36341508, 0.0323311 , 3.70080335],\n",
" [-0.00975703, 1.03815228, 4.51092651, 3.83451025]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 126
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "pczXFrRgDkR7",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "b82cd627-1982-4439-e4cc-737ca5c810db"
},
"source": [
"print('loss: {}'.format(np.sum(np.square(X - np.dot(U, V.T)))))"
],
"execution_count": 127,
"outputs": [
{
"output_type": "stream",
"text": [
"loss: 4.131561211398095\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "86F-wDGb9s-n",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 557
},
"outputId": "d3250815-b99f-4157-9190-cd7fb73b6635"
},
"source": [
"# costs\n",
"plt.plot(costsMF)"
],
"execution_count": 128,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f6199dded30>]"
]
},
"metadata": {
"tags": []
},
"execution_count": 128
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 1296x648 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "c1_eLyMIAEhY",
"colab_type": "text"
},
"source": [
"# Biased Matric factorization"
]
},
{
"cell_type": "code",
"metadata": {
"id": "lerYKemetuVs",
"colab_type": "code",
"colab": {}
},
"source": [
"beta = np.random.randn(n_user)\n",
"gamma = np.random.randn(n_item)\n",
"U = np.random.randn(n_user, n_feature)\n",
"V = np.random.randn(n_item, n_feature)\n",
"\n",
"one_user = np.ones(n_user)\n",
"one_item = np.ones(n_item)\n",
"\n",
"hat_U = np.concatenate((one_user.reshape(-1, 1), beta.reshape(-1, 1), U), axis=1)\n",
"hat_V = np.concatenate((gamma.reshape(-1, 1), one_item.reshape(-1, 1), V), axis=1)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "bxSntwd0MMlF",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 176
},
"outputId": "f0bcd5c0-cf21-4514-a330-5eb63dc3bb00"
},
"source": [
"print(hat_U)\n",
"\n",
"print(hat_V)"
],
"execution_count": 137,
"outputs": [
{
"output_type": "stream",
"text": [
"[[ 1. -1.15065033 1.01308119 1.04538452 0.70316386]\n",
" [ 1. 0.86752606 1.13036732 0.90384742 0.91970583]\n",
" [ 1. -1.91792303 0.0321524 2.53870512 1.33196684]\n",
" [ 1. 0.53519502 0.22238202 -1.18181462 1.92549906]\n",
" [ 1. 0.09584161 0.75557181 1.20926627 1.10331569]]\n",
"[[-0.8638065 1. 0.03618497 -1.42730747 -1.09314764]\n",
" [-0.27557586 1. 0.2575256 1.21177731 0.65734748]\n",
" [ 0.59072321 1. -0.47351687 -0.74679276 0.43298341]\n",
" [ 0.09875326 1. 0.8108629 0.43472573 1.67518043]]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "b5jUquptOW8_",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "fdf7d7a3-fa13-482a-fb8d-2d2c201417fd"
},
"source": [
"costsBMF = [costMF(hat_U, hat_V)]\n",
"\n",
"for i in range(300):\n",
" updateMF(hat_U, hat_V)\n",
" cos = costMF(hat_U, hat_V)\n",
" if cos >= costsBMF[-1]:\n",
" print('[x] Finish i = {}'.format(i))\n",
" break\n",
" else:\n",
" costsBMF.append(costMF(hat_U, hat_V))"
],
"execution_count": 138,
"outputs": [
{
"output_type": "stream",
"text": [
"[x] Finish i = 73\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "7euSUkxCPb5i",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 105
},
"outputId": "2386db7c-098e-43a7-a3b8-7ef9436f8b27"
},
"source": [
"np.dot(hat_U[:, 2:], hat_V[:, 2:].T)"
],
"execution_count": 139,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 3.34920464, 1.06645389, 0.48025515, -0.31955312],\n",
" [ 2.98144296, 0.36714769, -0.67249588, 0.36164518],\n",
" [ 0.05037349, -0.19572705, 0.43497868, 3.65848993],\n",
" [ 0.30380142, -0.28840132, -0.04180511, 3.05830237],\n",
" [-0.59891925, 1.22013202, 3.72190143, 3.22115403]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 139
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3MNTbqMqGSbA",
"colab_type": "text"
},
"source": [
"Item Feature Vector and User Feature Vector"
]
},
{
"cell_type": "code",
"metadata": {
"id": "RAlW59rLGWvr",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 87
},
"outputId": "77ccca0b-2bba-4c50-be0b-ffb82695254a"
},
"source": [
"print('Item Feature Vector\\n', hat_V[:, 0])\n",
"\n",
"print('User Feature Vector\\n', hat_U[:, 1])"
],
"execution_count": 140,
"outputs": [
{
"output_type": "stream",
"text": [
"Item Feature Vector\n",
" [1.09118654 0.49346829 0.40893345 1.08034459]\n",
"User Feature Vector\n",
" [-1.0080449 0.4084778 -0.68597783 -0.11658306 0.5991514 ]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "AY07Q-n0Rytp",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 105
},
"outputId": "29779138-49c2-4c9c-e052-6ee22895e7b0"
},
"source": [
"np.dot(hat_U[:, 2:], hat_V[:, 2:].T) + hat_V[:, 0]"
],
"execution_count": 141,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 4.44039118, 1.55992218, 0.8891886 , 0.76079147],\n",
" [ 4.0726295 , 0.86061598, -0.26356244, 1.44198976],\n",
" [ 1.14156003, 0.29774124, 0.84391213, 4.73883452],\n",
" [ 1.39498796, 0.20506697, 0.36712834, 4.13864696],\n",
" [ 0.49226729, 1.71360031, 4.13083487, 4.30149862]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 141
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "PZ0LpzT1S51r",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 105
},
"outputId": "90ea47a1-8056-470e-9f89-73b34d87bc24"
},
"source": [
"((np.dot(hat_U[:, 2:], hat_V[:, 2:].T) + hat_V[:, 0]).T + hat_U[:, 1]).T"
],
"execution_count": 142,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([[ 3.43234629, 0.55187729, -0.1188563 , -0.24725343],\n",
" [ 4.4811073 , 1.26909378, 0.14491536, 1.85046756],\n",
" [ 0.4555822 , -0.38823659, 0.1579343 , 4.05285669],\n",
" [ 1.27840491, 0.08848392, 0.25054529, 4.0220639 ],\n",
" [ 1.09141869, 2.31275171, 4.72998627, 4.90065001]])"
]
},
"metadata": {
"tags": []
},
"execution_count": 142
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "2GUirLjjE8F3",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "73792ed2-ed39-4244-f3ec-afe2df4c3f6d"
},
"source": [
"print('loss: {}'.format(np.sum(np.square(X - ((np.dot(hat_U[:, 2:], hat_V[:, 2:].T) + hat_V[:, 0]).T + hat_U[:, 1]).T))))"
],
"execution_count": 143,
"outputs": [
{
"output_type": "stream",
"text": [
"loss: 19.699773060662118\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "8GuFTvOAO7_G",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 557
},
"outputId": "5d684dce-7ab7-45f1-a0cd-6181f527efbd"
},
"source": [
"# costs\n",
"plt.plot(costsBMF)"
],
"execution_count": 144,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7f6199d4f048>]"
]
},
"metadata": {
"tags": []
},
"execution_count": 144
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nQ5+242H2AAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1296x648 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ln1N4Bv7FqiS",
"colab_type": "text"
},
"source": [
"Conmpare the costs between Simple MF and Biased MF"
]
},
{
"cell_type": "code",
"metadata": {
"id": "o_49T0xgPFOt",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 557
},
"outputId": "bdbda5e8-1218-4332-b1cb-3a8569d8db6c"
},
"source": [
"plt.plot(costsMF, label='SMF')\n",
"plt.plot(costsBMF, label='BMF')\n",
"plt.legend(loc=1, prop={'size': 20})"
],
"execution_count": 145,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f6199d2c7b8>"
]
},
"metadata": {
"tags": []
},
"execution_count": 145
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nos5Up5r7qctnPnbKTNVPPdZVkaIQWAAAAJAUzTF8f8Tt23em3z9my9vL2rUr8sgjTwzls3uPfCe7\n77o+xQnLU5/2EymWr0m5fM3c44o1KZY9K0X5zMyoaZo8vnMmj++czq4nZ7NzHz9zx7uLr6dne/up\nYN+KIothQ1WVc49lkapceF6mmj9WV+X8ublryyIpyyJlMRdUlGVSFsXisbIoUjztWFFk/tokKVIW\nSVEUKebrKObPLT6mWKyxmH8y/9b59zzt/NPOPe1hrwDlmdcUWbHihOzcuWeffy4L1zzzzck+I5ni\nh1/+0PcOMMfZXygkKjp0J608MX//gyfHXQYjpOfto+fto+fto+ftc7g9X7l8Ks89fdUQKzo+lWWR\nNWuW7/e8kGGAhhkyJEn3oW9l+gv/X5onHknz5N8/82RRpFj6rGcGDwtBxAkrUkwtTaZOSDF1YlJN\n7fcfmrPdfnbvmc10t5+Z2V5m5x+nZ596Pd3tZWb+9cz8+W6vn16/WXzs9Z72vN+k1+unO3+81587\n3u836TdJ02/Sb+Z/5o/1+02axWNJv5l73TSZ/2ly/PyXAQAAHG+qssj/8VsvzdITOuMu5ZgiZBih\nYYcMT9d0Z9Ls3JH+zu3p73x0/vn84xOPptm1I+nvZyqhqBYDh2LqxBSdE5OnP++ckKLuJFUnRVUn\n1cLzTlLVKcpOUneSsp67rqznjhdV5sYRqsyNIFQp5h/nfsqkKOeODerPYSF4SPNU+DAfRPTn/9Oe\ne5gLJRb+a18MKZrMP86FGz/82c98vfApycLDs1Yvy44du54ZeCx87zOOZe9j+/mevc8f8PTe1x/B\nh43kb9nx81f5oJ61elke27Fr3GUwQnrePnrePnrePnrePofb82UndvKsFUuGWNHx6WAhgz0ZjlNF\nPZVi1SkpV52yz/NN00+z+wdpdm5Ps2dnmtkn08zM/WTmycXXc8/3pNn9ePqPP5QsHO91M7R/FRbF\nXAhRlE97PvdYpJgLI1LsdW5uzUDxtGUP5fyMf5nFNRMpnvbexUUPz1jisPD+xSUJxQ89PlXovo8/\n7XObqSrLZnr7OLeP3/mHP/dwjGTfi8P7jjbvxTG1pM6a/ex3wmTS8/bR8/bR8/bR8/Y5kp4Pe0FN\nceJJWfLT/zhFPTl3CBQyTKiiKFMse1ay7FlH9P6maeYmIXqzaXqzc6FDbzbN/OPTjze92blrm17m\n1jb00jRzjwvHm/njaZ722DRz1zXN4uunHueez/1f/v7c5y6MHTT9hSqfunb+ebPwfO6XeOqap36x\np9779NdPf99TFy+ML+z1/oWJhn6qNN3eD3320z7/h54eUXBz2MNGR/Idh/+GY3MwYTRVdZ+s0u8d\n3v4lHN/0vH30vH30vH30vH2OxZ4Xvdmn/ftmMggZ2KeiKJJqfhlEThx3OcesUS6R4dih7+2j5+2j\n5+2j5+2j5+2j56MxuMXxAAAAQKsJGQAAAICBEDIAAAAAAyFkAAAAAAZCyAAAAAAMhJABAAAAGAgh\nAwAAADAQQgYAAABgIIQMAAAAwEAIGQAAAICBEDIAAAAAAyFkAAAAAAZCyAAAAAAMhJABAAAAGAgh\nAwAAADAQQgYAAABgIIQMAAAAwEAIGQAAAICBEDIAAAAAA1GPu4ADKcti3CUctuOxZo6OnreTvreP\nnrePnrePnrePnrePnh+9g/0ZFk3TNCOqBQAAAJhglksAAAAAAyFkAAAAAAZCyAAAAAAMhJABAAAA\n+P/bu5uQKPs1juM/RxnFKMdR1CkhKRAmg4QEVyVNQS0sBDchuTJaGGKFlGWvvkRTEEUKLWoZtbEk\nLXqBoUVSNmEtBiFCwsZmsnzDt1KY+T+LhzPwnLM4i3PncO75flZz/2fzg4vrmuGa+2YswZIBAAAA\nAABYgiUDAAAAAACwBEsGAAAAAABgCZYMAAAAAADAEiwZAAAAAACAJTKSHcAuvnz5otbWVs3Ozsrl\ncsnv96ukpCTZsWAhv9+v58+f69u3b+rv71dpaakkam9XMzMzOnnypL5+/Sqn06mNGzeqvb1dbrdb\nHz9+1Pnz57W8vKwNGzbo2rVrysvLS3ZkWKCxsVHj4+NyOBzKzs7WuXPn5PV66fMU0N3drVu3biXm\nO31ubz6fT06nU5mZmZKklpYW7dixg7rb2PLysi5fvqw3b94oMzNT5eXl6ujoYL7b1Pj4uI4ePZq4\nnp+f18LCgt69e0fNV4OBJerr601fX58xxpi+vj5TX1+f5ESwWjAYNJFIxOzatct8+vQpcU7t7Wlm\nZsa8ffs2cX3lyhVz+vRpE4vFzJ49e0wwGDTGGNPT02NaW1uTFRMWm5ubS7x++fKlqampMcbQ53YX\nCoVMQ0NDYr7T5/b375/lxhjqbnMdHR2mq6vLxONxY4wxP3/+NMYw31NFZ2enuXTpkjGGmq8GHpew\nwNTUlEZGRlRdXS1Jqq6u1sjIiKanp5OcDFaqqKiQx+P5xxm1ty+Xy6XKysrEdXl5uSKRiEKhkDIz\nM1VRUSFJOnjwoJ49e5asmLDY2rVrE68XFhaUlpZGn9vcysqK2tvbdfHixcQZfZ6aqLt9LS4uqq+v\nT83NzUpLS5Mk5efnM99TxMrKivr7+1VbW0vNVwmPS1ggGo2qsLBQ6enpkqT09HQVFBQoGo3K7XYn\nOR3+JGqfGuLxuO7fvy+fz6doNKr169cn3nO73YrH44lb7vD/r62tTYODgzLG6M6dO/S5zd28eVMH\nDhxQcXFx4ow+Tw0tLS0yxmj79u06ceIEdbexcDgsl8ul7u5uDQ0Nac2aNWpublZWVhbzPQUEAgEV\nFhaqrKxMoVCImq8C7mQAgP+io6ND2dnZOnToULKjYBV0dXXp1atXOn78uK5evZrsOPiDPnz4oFAo\npLq6umRHwSq7d++eHj9+rN7eXhlj1N7enuxI+INisZjC4bC2bNmihw8fqqWlRU1NTVpaWkp2NKyC\n3t5e1dbWJjtGSmHJYAGPx6OJiQnFYjFJfw+yHz9+/Met9bAfam9/fr9fY2NjunHjhhwOhzwejyKR\nSOL96elpORwOfuWyoZqaGg0NDamoqIg+t6lgMKjR0VHt3r1bPp9P379/V0NDg8bGxuhzm/tX/zqd\nTtXV1Wl4eJj5bmMej0cZGRmJW+S3bdum3NxcZWVlMd9tbmJiQsFgUPv375fEd/fVwpLBAnl5efJ6\nvRoYGJAkDQwMyOv1cstNCqD29nb9+nWFQiH19PTI6XRKkrZu3arfv3/r/fv3kqQHDx5o3759yYwJ\niywuLioajSauA4GAcnJy6HMbO3LkiF6/fq1AIKBAIKCioiLdvXtXhw8fps9tbGlpSfPz85IkY4ye\nPn0qr9fLfLcxt9utyspKDQ4OSvr7n8GmpqZUUlLCfLe5R48eqaqqSrm5uZL47r5a0owxJtkh7GB0\ndFStra2am5vTunXr5Pf7tWnTpmTHgoU6Ozv14sULTU5OKjc3Vy6XS0+ePKH2NvX582dVV1erpKRE\nWVlZkqTi4mL19PRoeHhYFy5c+MdfnOXn5yc5Mf5Xk5OTamxs1K9fv+RwOJSTk6NTp06prKyMPk8R\nPp9Pt2/fVmlpKX1uY+FwWE1NTYrFYorH49q8ebPOnj2rgoIC6m5j4XBYZ86c0ezsrDIyMnTs2DFV\nVVUx321u7969amtr086dOxNn1PzPY8kAAAAAAAAsweMSAAAAAADAEiwZAAAAAACAJVgyAAAAAAAA\nS7BkAAAAAAAAlmDJAAAAAAAALMGSAQAAAAAAWIIlAwAAAAAAsARLBgAAAAAAYIm/AObjRjixHSSh\nAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 1296x648 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ajK08HL98__y",
"colab_type": "text"
},
"source": [
"## Reference\n",
"\n",
"$\\texttt{https://www.cs.cmu.edu/~mgormley/courses/10601-s17/slides/}$\n",
"\n",
"$\\texttt{https://activisiongamescience.github.io/2016/01/11/Implicit-Recommender-Systems-Biased-Matrix-Factorization/}$\n",
"\n",
"$\\texttt{http://mines.humanoriented.com/classes/2010/fall/csci568/portfolio_exports/sphilip/pear.html}$\n",
"\n",
"$\\texttt{http://rf00.hatenablog.com/entry/2018/05/20/194121}$\n",
"\n",
"$\\texttt{https://math.stackexchange.com/questions/1072451/analytic-solution-for-matrix-factorization-using-alternating-least-squares}$\n",
"\n",
"$\\texttt{http://yifanhu.net/PUB/cf.pdf}$\n",
"\n",
"$\\texttt{https://math.stackexchange.com/questions/1072451/analytic-solution-for-matrix-factorization-using-alternating-least-squares}$"
]
},
{
"cell_type": "code",
"metadata": {
"id": "lOedLZFqHNor",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment