{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Ciencia de datos 2022\n", "\n", "## Alan Reyes-Figueroa" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Factoración no negativa de matrices (NNMF)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En este experimento ilustramos cómo funciona un sistema de recomendación (*toy example*)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "from sklearn.decomposition import NMF\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "X1 = np.array([[0,1,0,1,2,2],\n", " [2,3,1,1,2,2],\n", " [1,1,1,0,1,1],\n", " [0,2,3,4,1,1],\n", " [0,0,0,0,1,0]])\n", "\n", "X2 = np.array([[0,1,0,1,2,2],\n", " [2,3,0,1,2,2],\n", " [1,1,0,0,1,1],\n", " [0,2,3,4,1,1],\n", " [0,0,0,0,1,0],\n", " [0,0,2,0,2,2],\n", " [2,1,0,2,0,1],\n", " [0,3,1,1,1,0],\n", " [0,3,2,2,1,0]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Experimento 1" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "names = ['Alice', 'Bob', 'Cadú', 'Didier', 'Ely', 'Fabi']\n", "D1 = pd.DataFrame(X1, columns=names)\n", "D1.index = ['Vegetales', 'Frutas', 'Dulces', 'Pan', 'Café']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AliceBobCadúDidierElyFabi
Vegetales010122
Frutas231122
Dulces111011
Pan023411
Café000010
\n", "
" ], "text/plain": [ " Alice Bob Cadú Didier Ely Fabi\n", "Vegetales 0 1 0 1 2 2\n", "Frutas 2 3 1 1 2 2\n", "Dulces 1 1 1 0 1 1\n", "Pan 0 2 3 4 1 1\n", "Café 0 0 0 0 1 0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D1" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NMF(n_components=3)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k = 3 # número de clústers\n", "\n", "nmf = NMF(k) # NNMF\n", "nmf.fit(D1) # training u optimización" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(5, 3) (3, 6)\n" ] } ], "source": [ "H = nmf.components_\n", "W = nmf.transform(D1)\n", "print(W. shape, H.shape)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "W = pd.DataFrame(np.round(W, 4), columns=np.arange(0, k))\n", "W.index = D1.index" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012
Vegetales0.00300.03722.7447
Frutas1.92720.15250.4676
Dulces0.97360.00030.0000
Pan0.00032.65691.1803
Café0.00000.00000.5900
\n", "
" ], "text/plain": [ " 0 1 2\n", "Vegetales 0.0030 0.0372 2.7447\n", "Frutas 1.9272 0.1525 0.4676\n", "Dulces 0.9736 0.0003 0.0000\n", "Pan 0.0003 2.6569 1.1803\n", "Café 0.0000 0.0000 0.5900" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "W" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0 1 2
Vegetales0.0030000.0372002.744700
Frutas1.9272000.1525000.467600
Dulces0.9736000.0003000.000000
Pan0.0003002.6569001.180300
Café0.0000000.0000000.590000
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# mostramos W con mapa de colores\n", "\n", "WW = W.style.background_gradient(cmap=plt.cm.Blues)\n", "display(WW)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Vegetales Frutas Dulces Pan Café
Vegetales1.000000-0.359096-0.509614-0.0534740.999941
Frutas-0.3590961.0000000.986015-0.912763-0.348930
Dulces-0.5096140.9860151.000000-0.831921-0.500231
Pan-0.053474-0.912763-0.8319211.000000-0.064326
Café0.999941-0.348930-0.500231-0.0643261.000000
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(W.T.corr().style.background_gradient(cmap=plt.cm.seismic))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "H = pd.DataFrame(np.round(nmf.components_, 3), columns=D1.columns)\n", "#H.index = ['Veggies', 'Meat lovers', 'Bread eaters', 'Yogurth pickers']\n", "H.index = ['Fruits pickers', 'Bread eaters', 'Veggies']" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Alice Bob Cadú Didier Ely Fabi
Fruits pickers1.0360001.3440000.5510000.2630000.8850000.898000
Bread eaters0.0000000.6020001.1240001.3590000.0340000.068000
Veggies0.0000000.3470000.0000000.3370000.7670000.691000
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "HH = H.style.background_gradient(cmap=plt.cm.Blues)\n", "display(HH)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Experimento 2" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "D2 = pd.DataFrame(X2, columns=names)\n", "D2.index = ['Vegetales', 'Frutas', 'Dulces', 'Pan', 'Café', 'Carnes', 'Lácteos', 'Pastas', 'Salsa']" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AliceBobCadúDidierElyFabi
Vegetales010122
Frutas230122
Dulces110011
Pan023411
Café000010
Carnes002022
Lácteos210201
Pastas031110
Salsa032210
\n", "
" ], "text/plain": [ " Alice Bob Cadú Didier Ely Fabi\n", "Vegetales 0 1 0 1 2 2\n", "Frutas 2 3 0 1 2 2\n", "Dulces 1 1 0 0 1 1\n", "Pan 0 2 3 4 1 1\n", "Café 0 0 0 0 1 0\n", "Carnes 0 0 2 0 2 2\n", "Lácteos 2 1 0 2 0 1\n", "Pastas 0 3 1 1 1 0\n", "Salsa 0 3 2 2 1 0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "D2" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NMF(n_components=7)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k = 7\n", "nmf = NMF(k)\n", "nmf.fit(D2)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(9, 7) (7, 6)\n" ] } ], "source": [ "H = nmf.components_\n", "W = nmf.transform(D2)\n", "print(W. shape, H.shape)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "W = pd.DataFrame(np.round(W, 4), columns=np.arange(0, k))\n", "W.index = D2.index" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123456
Vegetales1.00390.00000.00012.02910.00000.00000.8849
Frutas4.17580.00001.16581.05560.00000.42430.8808
Dulces1.56750.00000.58290.53990.00000.22300.0000
Pan0.39191.96770.00040.98470.00010.00001.4617
Café0.00000.00000.00000.00000.00000.57010.0000
Carnes0.00000.00190.00000.00671.58390.00390.0000
Lácteos0.00000.00001.16640.00180.00000.00001.7724
Pastas4.43930.65600.00000.00000.00000.41420.1860
Salsa3.64871.31200.00000.00000.00000.43390.3788
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6\n", "Vegetales 1.0039 0.0000 0.0001 2.0291 0.0000 0.0000 0.8849\n", "Frutas 4.1758 0.0000 1.1658 1.0556 0.0000 0.4243 0.8808\n", "Dulces 1.5675 0.0000 0.5829 0.5399 0.0000 0.2230 0.0000\n", "Pan 0.3919 1.9677 0.0004 0.9847 0.0001 0.0000 1.4617\n", "Café 0.0000 0.0000 0.0000 0.0000 0.0000 0.5701 0.0000\n", "Carnes 0.0000 0.0019 0.0000 0.0067 1.5839 0.0039 0.0000\n", "Lácteos 0.0000 0.0000 1.1664 0.0018 0.0000 0.0000 1.7724\n", "Pastas 4.4393 0.6560 0.0000 0.0000 0.0000 0.4142 0.1860\n", "Salsa 3.6487 1.3120 0.0000 0.0000 0.0000 0.4339 0.3788" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "W" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0 1 2 3 4 5 6
Vegetales1.0039000.0000000.0001002.0291000.0000000.0000000.884900
Frutas4.1758000.0000001.1658001.0556000.0000000.4243000.880800
Dulces1.5675000.0000000.5829000.5399000.0000000.2230000.000000
Pan0.3919001.9677000.0004000.9847000.0001000.0000001.461700
Café0.0000000.0000000.0000000.0000000.0000000.5701000.000000
Carnes0.0000000.0019000.0000000.0067001.5839000.0039000.000000
Lácteos0.0000000.0000001.1664000.0018000.0000000.0000001.772400
Pastas4.4393000.6560000.0000000.0000000.0000000.4142000.186000
Salsa3.6487001.3120000.0000000.0000000.0000000.4339000.378800
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "WW = W.style.background_gradient(cmap=plt.cm.Blues)\n", "display(WW)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Vegetales Frutas Dulces Pan Café Carnes Lácteos Pastas Salsa
Vegetales1.0000000.4130370.3882990.263646-0.313655-0.311727-0.0211650.1876200.122146
Frutas0.4130371.0000000.958917-0.192280-0.207433-0.339042-0.0491660.9038130.820137
Dulces0.3882990.9589171.000000-0.314498-0.150372-0.324727-0.2164950.8510100.755354
Pan0.263646-0.192280-0.3144981.000000-0.378907-0.3787360.162200-0.0784110.094285
Café-0.313655-0.207433-0.150372-0.3789071.000000-0.165325-0.251052-0.108854-0.129648
Carnes-0.311727-0.339042-0.324727-0.378736-0.1653251.000000-0.253360-0.223278-0.275210
Lácteos-0.021165-0.049166-0.2164950.162200-0.251052-0.2533601.000000-0.287974-0.298005
Pastas0.1876200.9038130.851010-0.078411-0.108854-0.223278-0.2879741.0000000.977065
Salsa0.1221460.8201370.7553540.094285-0.129648-0.275210-0.2980050.9770651.000000
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(W.T.corr().style.background_gradient(cmap=plt.cm.seismic))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "H = pd.DataFrame(np.round(H, 4), columns=D2.columns)\n", "#H.index = ['Veggies', 'Meat lovers', 'Bread eaters', 'Yogurth pickers']\n", "#H.index = ['Fruits pickers', 'Bread eaters', 'Veggies']\n", "#H.index = ['Veggies', 'Meat lovers', 'Bread eaters', 'Yogurth pickers']\n", "#H.index = ['Veggies', 'Meat lovers', 'Bread eaters', 'Yogurth pickers']\n", "H.index = ['Italians', 'Fruit pickers', 'Meat lovers', 'Yogurth pickers', 'Bread eaters', 'Veggies', '?']" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Alice Bob Cadú Didier Ely Fabi
Italians0.0000000.5742000.0000000.0015000.0589000.000000
Fruit pickers0.0000000.5577001.5245001.1943000.0184000.000000
Meat lovers1.7154000.1627000.0000000.0000000.0000000.813600
Yogurth pickers0.0000000.0093000.0000000.0000000.9567000.973700
Bread eaters0.0000000.0000001.2599000.0000001.2544001.259700
Veggies0.0004000.0000000.0000000.0000001.7542000.000000
?0.0000000.4571000.0000001.1284000.0000000.026800
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "HH = H.style.background_gradient(cmap=plt.cm.Blues)\n", "display(HH)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# otra forma de visualizar los pesos de cada persona en cada categoría\n", "plt.figure()\n", "#plt.imshow(H, cmap=plt.cm.jet)\n", "H.T.plot()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "approX = W.values @ H.values\n", "reconstructed = pd.DataFrame(np.round(approX, 3), columns=D2.columns)\n", "reconstructed.index = D2.index" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AliceBobCadúDidierElyFabi
Vegetales0.0001.0000.0001.0002.0002.000
Frutas2.0003.0000.0001.0002.0002.000
Dulces1.0001.0000.0000.0021.0001.000
Pan0.0012.0003.0004.0001.0010.998
Café0.0000.0000.0000.0001.0000.000
Carnes0.0000.0011.9980.0022.0002.002
Lácteos2.0011.0000.0002.0000.0020.998
Pastas0.0003.0001.0001.0001.0000.005
Salsa0.0003.0002.0002.0001.0000.010
\n", "
" ], "text/plain": [ " Alice Bob Cadú Didier Ely Fabi\n", "Vegetales 0.000 1.000 0.000 1.000 2.000 2.000\n", "Frutas 2.000 3.000 0.000 1.000 2.000 2.000\n", "Dulces 1.000 1.000 0.000 0.002 1.000 1.000\n", "Pan 0.001 2.000 3.000 4.000 1.001 0.998\n", "Café 0.000 0.000 0.000 0.000 1.000 0.000\n", "Carnes 0.000 0.001 1.998 0.002 2.000 2.002\n", "Lácteos 2.001 1.000 0.000 2.000 0.002 0.998\n", "Pastas 0.000 3.000 1.000 1.000 1.000 0.005\n", "Salsa 0.000 3.000 2.000 2.000 1.000 0.010" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Sistema de recomendación\n", "\n", "display(reconstructed)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Error en función de k" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "Hs = []\n", "Ws = []\n", "Xs = []\n", "errs = []\n", "\n", "for k in range(1, 1+D2.shape[1]):\n", " nmf = NMF(k)\n", " nmf.fit(D2)\n", " H = nmf.components_\n", " W = nmf.transform(D2)\n", " X = W @ H\n", " err = ((D2.values - X)**2).sum()\n", " \n", " Hs.append(H)\n", " Ws.append(W)\n", " Xs.append(X)\n", " errs.append(err)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(np.arange(1,1+D2.shape[1]), errs /np.prod(D2.shape))\n", "plt.xlabel(k)\n", "plt.ylabel('MSE')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NMF(n_components=6)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k = 6\n", "nmf = NMF(k)\n", "nmf.fit(D2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "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.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }