{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# t-SNE\n", "t-Distributed Stochastic Neighbor Embedding (t-SNE)\n", "\n", "Buen vídeo básico de introducción al t-SNE\n", "https://www.youtube.com/watch?v=NEaUSP4YerM\n", "\n", "https://towardsdatascience.com/an-introduction-to-t-sne-with-python-example-5a3a293108d1\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## t-SNE\n", "\n", "Para probar el método, vamos a crear un *dataset* formado por **tres grupos** de puntos generados con distintas localizaciones y varianzas." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "\n", "C1 = np.random.normal(loc=0., scale=1., size=(10,3))\n", "I1 = np.ones(10, dtype=int)\n", "\n", "#C2 = np.random.normal(loc=2., scale=0.1, size=(10,3))\n", "C2 = np.random.normal(loc=5., scale=1., size=(10,3))\n", "I2 = np.ones(10, dtype=int)*2\n", "\n", "#C3 = np.random.normal(loc=5, scale=2, size=(10,3))\n", "C3 = np.random.normal(loc=10, scale=1., size=(10,3))\n", "I3 = np.ones(10, dtype=int)*3\n", "\n", "\n", "df1 = pd.DataFrame(data=C1, columns=[\"x\", \"y\", \"z\"])\n", "df1I = pd.DataFrame(data=I1, columns=[\"class\"])\n", "\n", "df2 = pd.DataFrame(data=C2, columns=[\"x\", \"y\", \"z\"])\n", "df2I = pd.DataFrame(data=I2, columns=[\"class\"])\n", "\n", "df3 = pd.DataFrame(data=C3, columns=[\"x\", \"y\", \"z\"])\n", "df3I = pd.DataFrame(data=I3, columns=[\"class\"])\n", "\n", "\n", "result1 = pd.concat([df1, df1I], axis = 1, ignore_index=True, sort=False)\n", "result2 = pd.concat([df2, df2I], axis = 1, ignore_index=True, sort=False)\n", "result3 = pd.concat([df3, df3I], axis = 1, ignore_index=True, sort=False)\n", "\n", "df = pd.concat([result1, result2, result3])\n", "df.columns = [\"x\",\"y\", \"z\",\"class\"]\n", "df = df.reset_index(drop=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Veamos los puntos de forma tabulada.\n" ] }, { "cell_type": "code", "execution_count": 2, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xyzclass
00.1665240.476437-0.7489051
1-0.260890-1.2101171.1117061
21.4833520.9803382.0138791
3-0.0085490.257644-1.5364491
4-1.467212-0.3702460.1765441
5-0.0359870.426323-1.1651891
6-1.0986470.3318151.9649181
7-0.272549-0.040916-0.3700121
82.6780830.933871-0.7287491
91.3146800.550044-1.2328731
105.0631464.6767586.0915722
114.0059994.8682965.8853382
124.3959325.6031125.0802072
135.9084655.1865506.9035192
143.1979145.8417064.2538572
155.0178074.3129433.9409992
163.8909636.2523705.8647532
174.6834455.9419644.8503342
184.6065646.2542844.9961002
193.9449454.6056395.8098572
2010.02733611.04174610.1275163
218.9232849.78534311.4442443
228.9834309.8072729.3746863
238.0871118.4509168.7207973
249.3628369.9862168.4721493
2510.0919249.3380939.7198243
268.93687111.35987210.3482143
2710.47432611.12625210.2605233
289.6034509.55327610.1021653
298.88836510.5220968.6168963
\n", "
" ], "text/plain": [ " x y z class\n", "0 0.166524 0.476437 -0.748905 1\n", "1 -0.260890 -1.210117 1.111706 1\n", "2 1.483352 0.980338 2.013879 1\n", "3 -0.008549 0.257644 -1.536449 1\n", "4 -1.467212 -0.370246 0.176544 1\n", "5 -0.035987 0.426323 -1.165189 1\n", "6 -1.098647 0.331815 1.964918 1\n", "7 -0.272549 -0.040916 -0.370012 1\n", "8 2.678083 0.933871 -0.728749 1\n", "9 1.314680 0.550044 -1.232873 1\n", "10 5.063146 4.676758 6.091572 2\n", "11 4.005999 4.868296 5.885338 2\n", "12 4.395932 5.603112 5.080207 2\n", "13 5.908465 5.186550 6.903519 2\n", "14 3.197914 5.841706 4.253857 2\n", "15 5.017807 4.312943 3.940999 2\n", "16 3.890963 6.252370 5.864753 2\n", "17 4.683445 5.941964 4.850334 2\n", "18 4.606564 6.254284 4.996100 2\n", "19 3.944945 4.605639 5.809857 2\n", "20 10.027336 11.041746 10.127516 3\n", "21 8.923284 9.785343 11.444244 3\n", "22 8.983430 9.807272 9.374686 3\n", "23 8.087111 8.450916 8.720797 3\n", "24 9.362836 9.986216 8.472149 3\n", "25 10.091924 9.338093 9.719824 3\n", "26 8.936871 11.359872 10.348214 3\n", "27 10.474326 11.126252 10.260523 3\n", "28 9.603450 9.553276 10.102165 3\n", "29 8.888365 10.522096 8.616896 3" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualicemos el conjunto de puntos tridimensional:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "x=%{x}
y=%{y}
z=%{z}
class=%{marker.color}", "legendgroup": "", "marker": { "color": [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ], "coloraxis": "coloraxis", "symbol": "circle" }, "mode": "markers", "name": "", "scene": "scene", "showlegend": false, "type": "scatter3d", "x": [ 0.16652387860594758, -0.2608902434900928, 1.4833522103358787, -0.008548760941757093, -1.467212117592112, -0.035987419038858624, -1.0986468724542815, -0.27254906589155536, 2.6780828615015526, 1.314679873948648, 5.063146457999919, 4.005999023153667, 4.395931525547244, 5.908464521261992, 3.197913550742225, 5.017806505615179, 3.8909630949581415, 4.68344477271979, 4.606563558924565, 3.944945027057519, 10.027336481659844, 8.923283518957852, 8.983429621610297, 8.087111128317403, 9.362836403915992, 10.0919242396883, 8.936870804633388, 10.474325691966218, 9.603450358829694, 8.888365219084601 ], "y": [ 0.47643696816216474, -1.2101174281954465, 0.9803381406887859, 0.25764429693980434, -0.37024550624264857, 0.4263227608204415, 0.3318153065945438, -0.04091643582434642, 0.9338712494216883, 0.5500438046695192, 4.676758180214114, 4.868296235190066, 5.603111579632022, 5.186550223472885, 5.841705933699554, 4.312943432524012, 6.252369616239119, 5.9419638058706035, 6.254284165853262, 4.60563945734466, 11.041746128763123, 9.785343358518299, 9.807272168058752, 8.450916279420028, 9.986215983783971, 9.338092675744338, 11.359871604702864, 11.126252079860826, 9.553276450052175, 10.522096449203058 ], "z": [ -0.7489053903863396, 1.1117060813673876, 2.0138793770895447, -1.5364487888214402, 0.17654384340294887, -1.1651890204296973, 1.9649181300846736, -0.37001183949357996, -0.7287489917100213, -1.2328729880675007, 6.091572216324824, 5.8853377305408365, 5.08020663887382, 6.903518990728926, 4.253856657603545, 3.9409992911168352, 5.864753136280636, 4.850334278164901, 4.996100431451521, 5.809857390611062, 10.127515927580278, 11.44424406907958, 9.374685579952175, 8.72079709249733, 8.47214893915191, 9.719824426152183, 10.348214473858453, 10.260523482005432, 10.102165144764712, 8.61689641753462 ] } ], "layout": { "coloraxis": { "colorbar": { "title": { "text": "class" } }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "legend": { "tracegroupgap": 0 }, "margin": { "t": 60 }, "scene": { "domain": { "x": [ 0, 1 ], "y": [ 0, 1 ] }, "xaxis": { "title": { "text": "x" } }, "yaxis": { "title": { "text": "y" } }, "zaxis": { "title": { "text": "z" } } }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import plotly.express as px\n", "import matplotlib.pyplot as plt\n", "\n", "fig = px.scatter_3d(df, x=\"x\", y=\"y\", z=\"z\", color=\"class\")\n", "fig.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q_points será nuestro conjunto de puntos tridimensionales y P_points será nuestro conjunto de puntos bidimensionales con los que intentaremos visualizar el primer conjunto." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "Q_points = df.values[:,0:3] # Tomamos las coordenadas de los puntos, no la clase\n", "P_points = np.random.uniform(0, 10, size=(30,2)) # Generamos puntos al azar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si visualizamos el conjunto de puntos bidimensional, veremos que está totalmente desordenado (está generado al azar)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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/uGz9heft7/4vP3TWJ+1tVaFhYXKzs6W49Q8k8L3EQvHcdSxY8cj/u/E8y3YmyI+b//wWfuLz9tffN7+aYzPuraRigOYvAkAADxDsQAAAJ6JuWKRlJSku+++W0lJSUFHaRb4vP3DZ+0vPm9/8Xn7J+jP2vfJmwAAIH7F3IgFAABouigWAADAMxQLAADgGYoFAADwTMwVi8cff1xdunRRcnKyBg4cqKVLlwYdKe5MnjxZAwYMUHp6utq2batLL71U69atCzpWs3H//ffLGKNx48YFHSVubdq0Sddee61at26tlJQU9e7dWx9++GHQseJONBrVxIkTlZubq5SUFB177LG6995767zXBOrn3Xff1fDhw5WdnS1jjF566aUqz1trddddd6lDhw5KSUnR4MGD9fnnnzd6rpgqFrNnz9aECRN09913a8WKFerbt6+GDBmibdu2BR0trixcuFCjR4/WkiVLNG/ePJWVlemCCy5QUVFR0NHi3rJly/Tkk0+qT58+QUeJW7t27dKgQYOUkJCguXPn6pNPPtFDDz2krKysoKPFnQceeEBTp07VY489pk8//VQPPPCA/vCHP+jRRx8NOlpcKCoqUt++ffX4449X+/wf/vAHPfLII3riiSf0wQcfKC0tTUOGDNG+ffsaN5iNISeffLIdPXp05dfRaNRmZ2fbyZMnB5gq/m3bts1KsgsXLgw6SlwrLCy0Xbt2tfPmzbNnnXWWvfXWW4OOFJduu+02e/rppwcdo1kYNmyYvfHGG6tsu/zyy+3IkSMDShS/JNk5c+ZUfu26rm3fvr198MEHK7ft3r3bJiUl2ZkzZzZqlpgZsSgtLdXy5cs1ePDgym2O42jw4MFavHhxgMniX0FBgSSpVatWASeJb6NHj9awYcOq/B2H915++WXl5eXpqquuUtu2bdWvXz899dRTQceKS6eddprmz5+v9evXS5JWrVqlRYsWaejQoQEni38bNmzQli1bqnw/yczM1MCBAxv9mOn7TcgO144dOxSNRtWuXbsq29u1a6fPPvssoFTxz3VdjRs3ToMGDVKvXr2CjhO3Zs2apRUrVmjZsmVBR4l7X331laZOnaoJEyboN7/5jZYtW6axY8cqMTFR119/fdDx4srtt9+uSCSibt26KRQKKRqNatKkSRo5cmTQ0eLeli1bJKnaY+aB5xpLzBQLBGP06NFas2aNFi1aFHSUuJWfn69bb71V8+bNU3JyctBx4p7rusrLy9N9990nSerXr5/WrFmjJ554gmLhseeff17PPfecZsyYoZ49e2rlypUaN26csrOz+azjWMycCmnTpo1CoZC2bt1aZfvWrVvVvn37gFLFtzFjxujVV1/V22+/7cmt7lG95cuXa9u2berfv7/C4bDC4bAWLlyoRx55ROFwWNFoNOiIcaVDhw7q0aNHlW3du3fXN998E1Ci+PXrX/9at99+u0aMGKHevXvruuuu0/jx4zV58uSgo8W9A8fFII6ZMVMsEhMTddJJJ2n+/PmV21zX1fz583XqqacGmCz+WGs1ZswYzZkzRwsWLFBubm7QkeLaeeedp9WrV2vlypWVj7y8PI0cOVIrV65UKBQKOmJcGTRo0CGXT69fv16dO3cOKFH8Ki4uluNUPcyEQiG5rhtQouYjNzdX7du3r3LMjEQi+uCDDxr9mBlTp0ImTJig66+/Xnl5eTr55JM1ZcoUFRUVadSoUUFHiyujR4/WjBkz9I9//EPp6emV5+MyMzOVkpIScLr4k56efsj8lbS0NLVu3Zp5LY1g/PjxOu2003Tffffp6quv1tKlSzVt2jRNmzYt6GhxZ/jw4Zo0aZI6deqknj176qOPPtLDDz+sG2+8MehocWHPnj364osvKr/esGGDVq5cqVatWqlTp04aN26cfv/736tr167Kzc3VxIkTlZ2drUsvvbRxgzXqNSeN4NFHH7WdOnWyiYmJ9uSTT7ZLliwJOlLckVTtY/r06UFHaza43LRxvfLKK7ZXr142KSnJduvWzU6bNi3oSHEpEonYW2+91Xbq1MkmJyfbY445xt555522pKQk6Ghx4e233672e/X1119vra245HTixIm2Xbt2NikpyZ533nl23bp1jZ6L26YDAADPxMwcCwAA0PRRLAAAgGcoFgAAwDMUCwAA4BmKBQAA8AzFAgAAeIZiAQAAPEOxAAAAnqFYAAAAz1AsAACAZygWAADAMxQLAADgmf8PIJ1PBWvNBlsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "P_index = np.concatenate((np.ones(10, dtype=int), np.ones(10, dtype=int)*2, np.ones(10, dtype=int)*3))\n", "plt.scatter(P_points[:,0], P_points[:,1], c=P_index)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Antes de seguir vamos a echarle un vistazo a las matrices de distancia." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaMAAAGkCAYAAACckEpMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAuR0lEQVR4nO3de3jU5Z3+8TsEMuQ4IYScIIFwFgIpIkQ8IErkYHVFaVfU7qL1UG1oFbbVpZeK2l6bVttq7VJpuxW2rYCHCihtsYISPBAsp1IUIolBgpAAwczkQBIg398f/sgSRZgPJjyQvF/XNZeS3MnzfPOdzJ3JTD4T5nmeJwAAHOrkegMAAFBGAADnKCMAgHOUEQDAOcoIAOAcZQQAcI4yAgA4RxkBAJyjjAAAzlFGAADnzpkymjt3rvr06aOuXbsqJydH7777rusttamHH35YYWFhLS6DBw92va1Wt2bNGl1zzTVKS0tTWFiYli5d2uL9nufpoYceUmpqqiIjI5Wbm6sdO3a42WwrOtVx33LLLZ87/5MmTXKz2VaUn5+vUaNGKTY2VklJSZoyZYqKiopaZOrr65WXl6fu3bsrJiZGU6dOVUVFhaMdt45QjnvcuHGfO+d33XWXox2feedEGT333HOaNWuW5syZo40bNyo7O1sTJ07Uvn37XG+tTQ0dOlR79+5tvrz11luut9TqamtrlZ2drblz557w/Y899pieeuopzZs3T+vWrVN0dLQmTpyo+vr6M7zT1nWq45akSZMmtTj/ixYtOoM7bBsFBQXKy8tTYWGhXnvtNR0+fFgTJkxQbW1tc2bmzJl65ZVX9MILL6igoEB79uzR9ddf73DXX14oxy1Jd9xxR4tz/thjjznasQPeOWD06NFeXl5e87+PHj3qpaWlefn5+Q531bbmzJnjZWdnu97GGSXJW7JkSfO/m5qavJSUFO/xxx9vfltVVZXn8/m8RYsWOdhh2/jscXue502fPt279tprneznTNq3b58nySsoKPA879Pz26VLF++FF15ozmzbts2T5K1du9bVNlvdZ4/b8zzvsssu8+655x53m3LsrL9n1NjYqA0bNig3N7f5bZ06dVJubq7Wrl3rcGdtb8eOHUpLS1Pfvn118803a9euXa63dEaVlpaqvLy8xbn3+/3Kyclp9+deklavXq2kpCQNGjRId999tyorK11vqdUFAgFJUkJCgiRpw4YNOnz4cItzPnjwYGVkZLSrc/7Z4z7m2WefVWJiorKysjR79mzV1dW52J4TnV1v4FQOHDigo0ePKjk5ucXbk5OTtX37dke7ans5OTlasGCBBg0apL179+qRRx7RpZdeqq1btyo2Ntb19s6I8vJySTrhuT/2vvZq0qRJuv7665WZmamSkhL94Ac/0OTJk7V27VqFh4e73l6raGpq0r333quLL75YWVlZkj495xEREYqPj2+RbU/n/ETHLUk33XSTevfurbS0NG3ZskX333+/ioqK9NJLLznc7Zlz1pdRRzV58uTm/x8+fLhycnLUu3dvPf/887rtttsc7gxnwrRp05r/f9iwYRo+fLj69eun1atXa/z48Q531nry8vK0devWdvlY6Ml80XHfeeedzf8/bNgwpaamavz48SopKVG/fv3O9DbPuLP+13SJiYkKDw//3LNpKioqlJKS4mhXZ158fLwGDhyo4uJi11s5Y46d345+7iWpb9++SkxMbDfnf8aMGVq+fLneeOMN9erVq/ntKSkpamxsVFVVVYt8eznnX3TcJ5KTkyNJ7eacn8pZX0YREREaOXKkVq1a1fy2pqYmrVq1SmPGjHG4szOrpqZGJSUlSk1Ndb2VMyYzM1MpKSktzn0wGNS6des61LmXpN27d6uysvKcP/+e52nGjBlasmSJXn/9dWVmZrZ4/8iRI9WlS5cW57yoqEi7du06p8/5qY77RDZv3ixJ5/w5D5nrZ1CEYvHixZ7P5/MWLFjgvf/++96dd97pxcfHe+Xl5a631mb+4z/+w1u9erVXWlrqvf32215ubq6XmJjo7du3z/XWWlV1dbW3adMmb9OmTZ4k7+c//7m3adMm76OPPvI8z/N+/OMfe/Hx8d6yZcu8LVu2eNdee62XmZnpHTp0yPHOv5yTHXd1dbX3ve99z1u7dq1XWlrqrVy50jv//PO9AQMGePX19a63/qXcfffdnt/v91avXu3t3bu3+VJXV9ecueuuu7yMjAzv9ddf99avX++NGTPGGzNmjMNdf3mnOu7i4mLv0Ucf9davX++VlpZ6y5Yt8/r27euNHTvW8c7PnHOijDzP8375y196GRkZXkREhDd69GivsLDQ9Zba1A033OClpqZ6ERERXs+ePb0bbrjBKy4udr2tVvfGG294kj53mT59uud5nz69+8EHH/SSk5M9n8/njR8/3isqKnK76VZwsuOuq6vzJkyY4PXo0cPr0qWL17t3b++OO+5oFz98neiYJXnz589vzhw6dMj79re/7XXr1s2LioryrrvuOm/v3r3uNt0KTnXcu3bt8saOHeslJCR4Pp/P69+/v/f973/fCwQCbjd+BoV5nuedufthAAB83ln/mBEAoP2jjAAAzlFGAADnKCMAgHOUEQDAOcoIAODcOVVGDQ0Nevjhh9XQ0OB6K2cUx81xdwQcd8c67s86p/7OKBgMyu/3KxAIKC4uzvV2zhiOm+PuCDjujnXcn3VO3TMCALRPlBEAwLmz7vWMmpqatGfPHsXGxiosLKzF+4LBYIv/dhQcN8fdEXDc7e+4Pc9TdXW10tLS1KnTye/7nHWPGe3evVvp6emutwEAaCVlZWWnfP2ms+6e0bGX1C4uLVNsiA/mvbnjgHmdwt1Vpvz7e+w/tZTvrzXl6xuOmPKpSfaXH99Z9okpv/v1V81rPPr4DFN+e8UhU/4vq3eY8pKUmGR7YPhrF2eY1xicGG3Kz3lxqykf2bWLKS9J6am260ifHrZjkKQX/1Zkyicl285FVr/uprwkTT+/pyl/z8JN5jVuze1ryl/ZL8mUX/+x7XtVkjbuqTHlN5VUmtcYn5UccrahrkY/u3ls8+36ybRZGc2dO1ePP/64ysvLlZ2drV/+8pcaPXr0KT/u2K/mYuPiQn5mSXSM/SmRvmjbDX+XyCbzGuFdjXnZ9tQ50n7DEe5rNOXDwiPMa0RG224AI6LCTflOEVGmvCSF+2xfq67GY5CkqBjbGtY9hZ9GGXWJjDHlfVH265T1fIR3ta0REWU7BkmKjrEVnvVcSPbreUysbU+RMbbbA0nyGb81OnetN69xOt8bn33I5UTa5AkMzz33nGbNmqU5c+Zo48aNys7O1sSJE7Vv3762WA4AcI5rkzL6+c9/rjvuuEO33nqrhgwZonnz5ikqKkrPPPNMWywHADjHtXoZNTY2asOGDcrNzf2/RTp1Um5urtauXfu5fENDg4LBYIsLAKBjafUyOnDggI4ePark5JYPciUnJ6u8vPxz+fz8fPn9/uYLz6QDgI7H+R+9zp49W4FAoPlSVlbmeksAgDOs1Z9Nl5iYqPDwcFVUVLR4e0VFhVJSUj6X9/l88vl8rb0NAMA5pNXvGUVERGjkyJFatWpV89uampq0atUqjRkzprWXAwC0A23yd0azZs3S9OnTdcEFF2j06NF68sknVVtbq1tvvbUtlgMAnOPapIxuuOEG7d+/Xw899JDKy8v1la98RStWrPjckxoAAJDacALDjBkzNGOGbSzM8d7ccSDkyQrjBvUwf/6aw4dN+WHJ9r/Q3lFpG3MT67NNIujjjzTlJWlxjG2iQkTEFPMakwd+/rHBkxmUYBth0imEv+b+rPOSbV+rsRmJ5jV6JdjWGDHENh5mdG+/KS9JQxNtfy3vyT6q8qPRvU353om2MQH9E42jTCT5OtsegbjmIvv4p6sHp5ryldW2STEZsfZJI5F9bLchMcbbHEm6dnDodypqqiP1XyFmnT+bDgAAyggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADjXZoNSv6zC3VXyRR8JKWsdeipJV2el2fLz1prXeGjCIFP+pW0Vpw4dZ8eBelNekpa9vMmU79HTPoT2xa17TPkp59kGq6573/Z1+pRtYvy2CvsrDmf3tA22XLJ0oyk/6T+vNOUl6YNPbENoX95s/9q+82aRKb/i0WtM+dueedeUl6RFd19kyl/Yyz6Edvn2vaZ8RpxtkO5v3tllykvSJ0HbbcLcG75iXqPxSFObZLlnBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnAvzPM9zvYnjBYNB+f1+XfXUG+oSGRPSx9w4MtW8zm/fts19Wn7XGPMaN8z/uyk/fXQvU75/Qmhfn+NV14c27++Y3/zdPqPt3ov7mPK/2/ixKX/zMPv5rmpoNOX7drd/bT86WGvKd+0cbsq/WnLAlJekcX26mfKnc9wHa2xf21lL/mnK/2LqcFNekh5fU2LK1zceNa/xgysGmPI/e/NDU/720emmvCSlxnU15e9caJuPKEnTxoS+r0O11bp/UrYCgYDi4uJOmuWeEQDAOcoIAOAcZQQAcI4yAgA4RxkBAJyjjAAAzlFGAADnKCMAgHOUEQDAOcoIAOAcZQQAcI4yAgA419n1Br5I+f5ahYc4829H5SHz539owiBT3jr0VJKeu3WUKf/n9/aa8q+X7jflJWnOvLdN+SlXZ5vXeN54HDMuzDDlf7hqhykvSZPPSzTln3+j2LxGj1ifKf/0HwtN+fVPft2Ul6SSAzWm/O2LNpnX+GB7hSm/+bGrTfnRD/3NlJeku/5lsCl/+6je5jV+vW6nKe/rYhuMe98LW0x5SWpqss29Xn7PJeY1dh2oCzlbWxP6/R3uGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOfO2tl09Q1HFK4jIWVjfbaZT5L00jbbPK3po3uZ17DOmvvq0FRTvqwy9BlRxxROzDLlp2WnmNeoO3LUlH9vX9CUn3VJX1NekgakxJg/xqqq/rApf+WVtnNx5GiTKS9Jg5NjTfmrspPNa4zq192U/9PWj035caPTTXlJ2vqxbSbfu0kHzWtkJdmuUwXbD9g+v/HrKtnnIy76x27zGkMTQ79O1TWEdhsucc8IAHAWaPUyevjhhxUWFtbiMniwbYIuAKBjaZNf0w0dOlQrV678v0U6n7W/DQQAnAXapCU6d+6slBT7Yw0AgI6pTR4z2rFjh9LS0tS3b1/dfPPN2rVr1xdmGxoaFAwGW1wAAB1Lq5dRTk6OFixYoBUrVujpp59WaWmpLr30UlVXV58wn5+fL7/f33xJT7c/cwYAcG5r9TKaPHmyvv71r2v48OGaOHGi/vKXv6iqqkrPP//8CfOzZ89WIBBovpSVlbX2lgAAZ7k2f2ZBfHy8Bg4cqOLi4hO+3+fzyeezPTceANC+tPnfGdXU1KikpESpqbY/6AQAdBytXkbf+973VFBQoJ07d+qdd97Rddddp/DwcN14442tvRQAoJ1o9V/T7d69WzfeeKMqKyvVo0cPXXLJJSosLFSPHj1aeykAQDvR6mW0ePHiVvk8qUmx6hwZHVK2jz/S/Pl3HKg35fsn2GebvV6635S3zppL7x5lykvS8F62WWUfHKw1rzE2wzZTa3ul7en8nTuFmfKSdLCm0ZQfnGD7OknSwUO2NSrTQ5/bJUn7qhtMeUnq1yO076FjRiT7zWuURduut0X7DpnyF2bGmfKS9M+9tjVKA/Y5j2N6JpjyKd1s368XZNivg0nREaZ8YdmJn+V8MuenhP4LtSOdQ88ymw4A4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnGvzF9c7XTvLPlG4L7TBk4tjbMMBJWnZy5tM+RuzrjOvMWfe26Z84cQsU9469FSSZl3W35TP+eEq8xqHLmsy5X/9ynZTftbUIaa8JG00DoS8YkA38xrrympM+fzJg0z5C3+40pSXpJFDkk35b17Qy7zG2N62ifzfnvNbU75w3q2mvCT96I+vm/LPBmznTpLybh5lyr+5frcpP26A7fZAkvrE2Qbj3vKrE78C98m8O35kyNkj9aEPWuaeEQDAOcoIAOAcZQQAcI4yAgA4RxkBAJyjjAAAzlFGAADnKCMAgHOUEQDAOcoIAOAcZQQAcC7M8zzP9SaOFwwG5ff75Rt2h8LCQ5s51//qKaexziFTflxOb/MaVtOyU0z5Dw6GPvfpmGdWfmjKr3twvHmNa39daMp3Drf9TDTj0j6mvCRZr+U/e6PEvEZlZZ0p39h41JT/9lcHmPKSVNtomxO49F3b/DRJ6tkjxpQ/fNS2p63b95vyknRgb6Upf/s025w5SXpvd8CUL1j2likfl55hyktSj5R4Uz4xMcq8Rkxkl5Czhw/V6G8zxysQCCguLu6kWe4ZAQCco4wAAM5RRgAA5ygjAIBzlBEAwDnKCADgHGUEAHCOMgIAOEcZAQCco4wAAM5RRgAA5ygjAIBzZ+2g1J+s+Icio2ND+pjJA20DRiXpxa17TPmJ/XqY13j+vb2m/AU9Tz5I8LP6xkeb8pL0aolt6OQb2+xDKpd960Jb/p8fm/LVjUdMeUlKivKZ8jm9u5vXONJk+1b6w8YyU75bVLgpL0kjk7uZ8pER9jVeKaow5T+stA0pvn5IsikvSQcbGkz5jR/XmNd46MqBpvyyrbbr+XndbbcHkmS8CuqZjfbBuLeO6BlytrY6qPEjejMoFQBwbqCMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOc6u97AF9lecUgRIc7iGpRgnys15TzbPLv/LtxlXmPGhRmm/Hv7gqb89kpbXpJ+/cp2U37IIPtMPuusuWuHhT7rSpK+/eI/TXlJmjAowZRftNk2N06S0v2Rpvy8l7eZ8ktmjjXlJanhcJMp/9Q7H5nXeGuz7XwvumuMKf/dP20x5SVpzqTBpvw3sv3mNQp22OY2Nhy1nYtfvL3TlJekQ8a5jY8av06SFNs19NqoDj8ccpZ7RgAA58xltGbNGl1zzTVKS0tTWFiYli5d2uL9nufpoYceUmpqqiIjI5Wbm6sdO3a01n4BAO2QuYxqa2uVnZ2tuXPnnvD9jz32mJ566inNmzdP69atU3R0tCZOnKj6+vovvVkAQPtkfsxo8uTJmjx58gnf53mennzyST3wwAO69tprJUm///3vlZycrKVLl2ratGlfbrcAgHapVR8zKi0tVXl5uXJzc5vf5vf7lZOTo7Vr157wYxoaGhQMBltcAAAdS6uWUXl5uSQpObnlKzMmJyc3v++z8vPz5ff7my/p6emtuSUAwDnA+bPpZs+erUAg0HwpK7M/pRYAcG5r1TJKSfn0b3cqKipavL2ioqL5fZ/l8/kUFxfX4gIA6FhatYwyMzOVkpKiVatWNb8tGAxq3bp1GjPG9oduAICOw/xsupqaGhUXFzf/u7S0VJs3b1ZCQoIyMjJ077336kc/+pEGDBigzMxMPfjgg0pLS9OUKVNac98AgHbEXEbr16/X5Zdf3vzvWbNmSZKmT5+uBQsW6L777lNtba3uvPNOVVVV6ZJLLtGKFSvUtWvX1ts1AKBdCfM8z3O9ieMFg0H5/X4l3/oHdYqICuljplxpn6+07v2KU4eO8983jjCv8d+FO035WZf0NeU7dwoz5SVpza4Dpnz/btHmNT6uOWTKv1Nqezr/r742zJSXpA/2VpvymyuqzGu8X1FnynePtv0sGB0R2qzG4w0wnr+PgrZjkKTecaF9nx7z09dLTPmLBnQ35SVpyTu2WZKjhyafOvQZo9JjTfmfLrHNIrx4hG1moyQNSbWd71c27jWvMWZgYsjZhroaPfmvFygQCJzy+QDOn00HAABlBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnDNP7T5TEpPiFO4LbejfecmRp7GCbTBiVUOjeYXJ54U+UFCSBqTEmPIHa+x72lhmGxjaL94+KDUpymfKTxiUYMpbh55K0sBU21DLokr7Gpndbcf9VnHAlJ91aaYpL0n+qC6m/PbKGvMa75RVmfJXZiWZ8h8eqDflJWlof9tw1UkD7cNYfeG2n+X7ZMSb8p1OYxBy1aEjpvwVQ23nQpLOTw39BVDrakIf7ss9IwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4NxZO5vuaxdnqGt0aPPExmbYZsBJ0raKMlO+b3fb3DhJev6NYvPHWAxOsM1bk6QrBnQz5X/2Rol5jYXTLzDlF222nYvGo1WmvGSfNXdNVpp5jbLKOlM+qnPoc7skafkH+0x5Sbqst23u35Qh9uNeWVJhyi/7h+04Hhg/wJSXpDW7Kk35Ze/tN6/xo0mDTPmrhtvmYY7P7GHKS1LncNs8u9l/3mZe44K00GfTWcbrcc8IAOAcZQQAcI4yAgA4RxkBAJyjjAAAzlFGAADnKCMAgHOUEQDAOcoIAOAcZQQAcI4yAgA4RxkBAJw7awelDk6MVlRMdEjZXgmR5s+f3TPKlP/oYK15jR6xPlO+qv6wKX/wUKMpL0nrympM+Urj8E9JOtLkmfLpftv5+/vuoCkvSZndbefCOvRUktK7265Tv1z7kSnf0x9hykvS4aYmU768qt68RuFO2xDaJH9XU35nwP69NyLZb8p/eLDBvEa4ZQqopOyk0AeMSlLjEdu5k6QDtbbbkLQE23VWkpKiQj9/NUdDv43inhEAwDnKCADgHGUEAHCOMgIAOEcZAQCco4wAAM5RRgAA5ygjAIBzlBEAwDnKCADgHGUEAHDurJ1NN+fFrQr3hTabbsSQJPPnX7J0oym/4r+mmNd4+o+FpvyVV2aZ8pXpR0x5ScqfPMiUz/l7mXmNP2y0fcy8l7eZ8nlTzjPlJemt4oApH9U53LyGddbcY1fbjuMrD7xqykvSlqxkU/5bozPMa8y8pI8pP+LW35jy3/2fO0x5SbrqJ6+b8oFK2/VDkuIjbdeRxStLTPmHbxxmykvSoG6xpvwz8/5iXmNT7uiQs0fqQ58ryD0jAIBz5jJas2aNrrnmGqWlpSksLExLly5t8f5bbrlFYWFhLS6TJk1qrf0CANohcxnV1tYqOztbc+fO/cLMpEmTtHfv3ubLokWLvtQmAQDtm/kxo8mTJ2vy5Mknzfh8PqWkpJz2pgAAHUubPGa0evVqJSUladCgQbr77rtVWVn5hdmGhgYFg8EWFwBAx9LqZTRp0iT9/ve/16pVq/STn/xEBQUFmjx5so4ePXrCfH5+vvx+f/MlPT29tbcEADjLtfpTu6dNm9b8/8OGDdPw4cPVr18/rV69WuPHj/9cfvbs2Zo1a1bzv4PBIIUEAB1Mmz+1u2/fvkpMTFRxcfEJ3+/z+RQXF9fiAgDoWNq8jHbv3q3Kykqlpqa29VIAgHOU+dd0NTU1Le7llJaWavPmzUpISFBCQoIeeeQRTZ06VSkpKSopKdF9992n/v37a+LEia26cQBA+2Euo/Xr1+vyyy9v/vexx3umT5+up59+Wlu2bNH//u//qqqqSmlpaZowYYJ++MMfyufztd6uAQDtSpjneZ7rTRwvGAzK7/cr+wevKLxraLPp/n1cH/M6CZG2Ht6+/5B5jX8f0cuUP3K0yZTfV91gykvSjD9sMOXvvmqAeY0u4WGm/OjUBFN+7ccHTXlJGtPTtsbyD/aZ14jobDvu+a+e+HHUL7L5R/bfLhSX15jyP3vzQ/MaJXttf47xxPXDTfl7XvyHKS9JFw22zau8+8Le5jXe3LnflF++1Zavqm005SXJ18U2L2/25f3Na4R3Cv16Xlsd1PgRvRUIBE75fABm0wEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc63+Sq+tJT01Vl0iY0LKDk2MNX/+Dz6xDZAc16ebeY2SA7Y1BifbjqNfj9AGyR5v5JBkU7620Ta8VZLG90k05RsO29YY0M1+3P6oLqb8Zb1tg1Ul6XCT7Ti2ZNnOhXXoqST1Twnte+iYCYPsx70+OsKUf/9AwJS/dIht6KkkJUTZbtp27Ks2rzE8Kd6U35RQa8oP62l/odFYn+3+xfZPbENuJWlUWveQs02NoZ8H7hkBAJyjjAAAzlFGAADnKCMAgHOUEQDAOcoIAOAcZQQAcI4yAgA4RxkBAJyjjAAAzlFGAADnztrZdH16RMsXFdoMMk+e+fO/vLnClJ/7teHmNW5ftMmUvyrbNqtsRLLflJekb17Qy5SfvXSreY2rB9qO46l3PjLlR2XY5q1J0vZK21y3KUPSzGuUV9Wb8t8anWHK/+zND015yT5r7rrhtuuHJMVF2L6XHnzpPVP+T9++yJSXpJ+usX2t/rz5A/MaT1w3zJQPD7N9/huG2a+DCTG2OYETn3jTvMa/XXY05Gx9begz/7hnBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOnbWDUl/8W5E6RUSFlP1odG/z53/nzSJT/uCkweY1PthuGyA5ql93U74sus6Ul6SxvXuY8j172IeSvlJkO+63Nn9syn8ta4QpL0nvlFWZ8itLbMcgSYU7Qx8KKUkzL+ljypfsDZrykrQ+2jY40zr0VJLGD7YNxr1x26umfPF+29dVkpa+Zvv+7tzFflO4ZHu5Kb/or9tMeX9X+55GpsaZ8tu37DSv8bLfF3L2SH1tyFnuGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOfCPM/zXG/ieMFgUH6/X8Nnv6zwrtEhfcwVI9LM61xvnKd1/8vvmdd46c4cU/5PW20z2nYebDDlJekXc21zwSZcN8a8RnJ8pCk/40LbbMHvn8a5uDIryZR/a8dB8xpJ/q6m/B9+95op/9a820x5SXr/QMCUf+IvO8xrFG/bbcrv+8O/m/IZ33relJeke28635T/xoh08xpPvFVqyu8L1pvy6/9pm30nSUeONJny7z46wbzGho8+CTlbW1Ot63P6KRAIKC7u5HPzuGcEAHDOVEb5+fkaNWqUYmNjlZSUpClTpqioqOV03Pr6euXl5al79+6KiYnR1KlTVVFhnwQMAOg4TGVUUFCgvLw8FRYW6rXXXtPhw4c1YcIE1db+35jwmTNn6pVXXtELL7yggoIC7dmzR9dff32rbxwA0H6YXjBjxYoVLf69YMECJSUlacOGDRo7dqwCgYB+97vfaeHChbriiiskSfPnz9d5552nwsJCXXjhha23cwBAu/GlHjMKBD59cDQhIUGStGHDBh0+fFi5ubnNmcGDBysjI0Nr16494edoaGhQMBhscQEAdCynXUZNTU269957dfHFFysrK0uSVF5eroiICMXHx7fIJicnq7z8xM8Myc/Pl9/vb76kp9uf1QIAOLeddhnl5eVp69atWrx48ZfawOzZsxUIBJovZWVlX+rzAQDOPfYXWZc0Y8YMLV++XGvWrFGvXr2a356SkqLGxkZVVVW1uHdUUVGhlJSUE34un88nny/011QHALQ/pntGnudpxowZWrJkiV5//XVlZma2eP/IkSPVpUsXrVq1qvltRUVF2rVrl8aMsf/xJACgYzDdM8rLy9PChQu1bNkyxcbGNj8O5Pf7FRkZKb/fr9tuu02zZs1SQkKC4uLi9J3vfEdjxozhmXQAgC9kKqOnn35akjRu3LgWb58/f75uueUWSdITTzyhTp06aerUqWpoaNDEiRP1q1/9qlU2CwBon87a2XQ3/c/bioiKCeljcvqcfObRifzi5aJTh47z7Lfsv2ac+os3Tflxo23PJLww037cF6Z1N+WvNx6DJM395ihT/sevfWDKXz7ENmdOkiqqD5vy3zy/p3mNnYHaU4eOMzjRdv7uWrzJlJekS41fqztH2+YESlLx/mpT/uafvmHK7/r1v5ryknTdb9eZ8tuK9pvX+PmtI035xZv2mvJzrhxoyktSUpzt8fesmUvNa3w1d3DI2ca6Gj1720XMpgMAnBsoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4NxZOyj11Y07FR0T2iBJX2d7p3YOt33MT1YXm9f4SrptEObWj2tMeX90hCkvSctW2YaSBg8GzWs8/b3LTfnUqEhTfubizaa8JA3tbxsQO9J47iRpRLLflJ8+921TftrEQaa8JPWIsb1+5s6DDeY1lr5mGzqc97VhpvybH1Sa8pK05I4cU/6hFbZjkKQc43Xkgl7dTPn56+2vel2yv86UH9PXdp2VpBFJ8SFna6uDuvL83gxKBQCcGygjAIBzlBEAwDnKCADgHGUEAHCOMgIAOEcZAQCco4wAAM5RRgAA5ygjAIBzlBEAwDnb4Koz6J6FmxTuiw4pe81FGebPf2Ev20ym+saj5jVuH9XblH836aApXxqwzaGSpGcDtvl3t08bZV5jo3HG3jeybedi9NBkU16SJg20zaZb9t5+8xofGue6BSoDpvzdF9quT5K0Y1+1Kf/nzbbZhZLUuYvtZuQbI9JN+d+8st2Ul+yz5h6dZJ/79+NVO0z5P/79Y1O+ZFeVKS9JYWFhpvwDuQPMa+yuCv12p+5o6Leb3DMCADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOfCPM/zXG/ieMFgUH6/Xz9Z8Q9FRseG9DFXD041r7N8+15T/sK0BPMar5Xahm1mJcWY8ulxUaa8JP1pW7kpv/7DT8xrPP9N23DVgh22r1N5bb0pL0lpMV1N+eFp8eY1wjvZhlT+qnCnKT8wMdKUl6ThSfGm/OncHCzZbrtOVTc0mfKX9rYN0pUk61H8s9w23FeS/nO8bcjo0n/aBqVmxNi/v48Yz9/LRfvMa9w8PC3kbE11UGOHpSsQCCguLu6kWe4ZAQCco4wAAM5RRgAA5ygjAIBzlBEAwDnKCADgHGUEAHCOMgIAOEcZAQCco4wAAM5RRgAA5zq73sAXubJfkmJiTz7L6JjK6gbz58+Is835+tmbH5rX8HUJN+ULth8w5VO62WdXvbl+tym/971t5jWWjQ59dpUkNRy1zSr76RL7nvpkxJvyVw1PNq+RnRTa9fWYxStLTPnzs+x72pRQa8qH28brSZIW/dV2PsZdlGnKL95UZ8pL0uPXDDHl//h329w4yT5rbsqwnqb8M+/uNOUlacse2/k+HR9Whb5GXU3o5457RgAA50xllJ+fr1GjRik2NlZJSUmaMmWKioqKWmTGjRunsLCwFpe77rqrVTcNAGhfTGVUUFCgvLw8FRYW6rXXXtPhw4c1YcIE1da2vNt2xx13aO/evc2Xxx57rFU3DQBoX0yPGa1YsaLFvxcsWKCkpCRt2LBBY8eObX57VFSUUlJSWmeHAIB270s9ZhQIBCRJCQktX3ju2WefVWJiorKysjR79mzV1X3xg1gNDQ0KBoMtLgCAjuW0n03X1NSke++9VxdffLGysrKa337TTTepd+/eSktL05YtW3T//ferqKhIL7300gk/T35+vh555JHT3QYAoB047TLKy8vT1q1b9dZbb7V4+5133tn8/8OGDVNqaqrGjx+vkpIS9evX73OfZ/bs2Zo1a1bzv4PBoNLT0093WwCAc9BpldGMGTO0fPlyrVmzRr169TppNicnR5JUXFx8wjLy+Xzy+Xynsw0AQDthKiPP8/Sd73xHS5Ys0erVq5WZeeo/Xtu8ebMkKTU19bQ2CABo/0xllJeXp4ULF2rZsmWKjY1VeXm5JMnv9ysyMlIlJSVauHChrrrqKnXv3l1btmzRzJkzNXbsWA0fPrxNDgAAcO4zldHTTz8t6dM/bD3e/PnzdcsttygiIkIrV67Uk08+qdraWqWnp2vq1Kl64IEHWm3DAID2x/xrupNJT09XQUHBl9rQMes//kSRMUdCymbE2me0/eadXab8zMv6mte474UtpnxWv+6m/AUZsaa8JI0bkHXq0HH+89f2WVfndbfNaPvF2ztN+YtH2GZ8SVKnTraha+Mze5jXaDxim7H38I3DTPnfF9rmCkrSsJ62c3HDMNtcQUnyd7U99PzHlcWm/EvfvcSUl6T568tM+ZJdVeY1Mi77/GPgJ2OdNffN0X1MeUnaffCQKf8vT75pXqNXfOiP8dfXhn77wWw6AIBzlBEAwDnKCADgHGUEAHCOMgIAOEcZAQCco4wAAM5RRgAA5ygjAIBzlBEAwDnKCADgHGUEAHDutF/pta1t3FMjX4jzTyP7hJs//yfBelM+Na6reY2mppMPlv2sHrG2FxlMio4w5SWpT1y0Kd8jJd68hvGwdagxtIG4x2Snd7MtIKnqkG2NzuG2waqSdKD2sCk/qJtt0K2vi/16Huuz/byZEGO/To1MtQ1jXWAcKJsUZ3/xzZL9daZ8WJj9fB85xeDoz9qyxzZ02Dr0VJJ6JUSa8o2NR81r1Bo+puFw6Oeae0YAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMC5MM8zDlhqY8FgUH6/Xzk//Ks6dw1tjtq4rGTzOlPPSzHlZzy/2bzGc7fnmPKL/rHblN8TtM1Ck6R5v/qrKZ8zabR5jcG94k35717Ux5S/+7nNprwkXTE0yZTfvCtgXiMtIcRhiv/fM/P+YsqvmnubKS9J2z8JmvJzX/3QvsaWnab8rgX/ZsoPuWeJKS9Jc745ypQf39d2/ZCk3/59lylf02CbA7dm48emvGSfNbf1x5PNa6wtrgw5W1tTrWtGZSoQCCgu7uQzDLlnBABwjjICADhHGQEAnKOMAADOUUYAAOcoIwCAc5QRAMA5yggA4BxlBABwjjICADhHGQEAnKOMAADOdXa9gS8yPitZXaNjQ8peO9g+KLXxSJMpP21MunmNXQfqTPmhiaEd7zHnp9h/lnh3/EhTPiayi3mNW0f0NOVju9quhmMGJpryknR+6smHNH7WBWm2vCQlRXU15Tfl2obQhncKM+UlaVRad1P+3y6zDdqUpJf9PlN+w0efmPJfzR1sykvSiKR4U353le17VZJuHp5myn9YVWvK94q3fV0lqdY4KNUy9PSYMf1Dv04Fg6HffnDPCADgHGUEAHCOMgIAOEcZAQCco4wAAM5RRgAA5ygjAIBzlBEAwDnKCADgHGUEAHDurBsH5HmeJKmhribkj6mpjjSvYx0HdKi22rxGbY2t6+sajpjyRzrbf5Y4Um8bSXK4i21PklRbHTTlq8MPm/KW68YxdTXhpvxpTN5RzdFGU956LqxfV0lqarR9i9efxvXcfBw1tjUaT+N8W79WdUftY5AijthGZdXV2EYO1dfavq6S1HDYdrtWW2MfOWQZ8VMd/PQ8HLtdP5kwL5TUGbR7926lp9vnwAEAzk5lZWXq1avXSTNnXRk1NTVpz549io2NVVhYyx9Pg8Gg0tPTVVZWprg4+yDLcxXHzXF3BBx3+ztuz/NUXV2ttLQ0dep08t/knHW/puvUqdMpGzQuLq7dnbRQcNwdC8fdsbTX4/b7/SHleAIDAMA5yggA4Nw5VUY+n09z5syRz2d/Bsi5jOPmuDsCjrtjHfdnnXVPYAAAdDzn1D0jAED7RBkBAJyjjAAAzlFGAADnKCMAgHOUEQDAOcoIAOAcZQQAcO7/AX9tS1+9W+hmAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "PM = np.zeros((30,30))\n", "QM = np.zeros((30,30))\n", "\n", "def distance(p1, p2):\n", " return np.sqrt(np.sum((p1 - p2)**2))\n", "\n", "for i, p in enumerate(P_points):\n", " PM[i] = [distance(p, j) for j in P_points]\n", " \n", "for i, q in enumerate(Q_points):\n", " QM[i] = [distance(q, j) for j in Q_points]\n", " \n", "plt.matshow(PM, cmap=plt.cm.Blues) # Representamos la matriz P\n", "plt.matshow(QM, cmap=plt.cm.Blues) # Representamos la matriz Q" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora nos hace falta definir una función para calcular la distancia entre puntos, otra para obtener la **función de distribución de probabilidad** y una última para calcular la divergencia de **Kullback-Leibler**." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import torch\n", "import math\n", "\n", "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", "\n", "distT_torch = torch.distributions.studentT.StudentT(df=1, loc=0, scale=1)\n", "\n", "def distance(p1, p2):\n", " return torch.sqrt(torch.sum((p1 - p2)**2) + 1e-6)\n", " \n", "def pdf(x):\n", " return torch.exp(distT_torch.log_prob(x))\n", "\n", "def KL(p, q):\n", " return torch.where(q > 0.1e-8, p * torch.log(p/q), torch.tensor([0.], dtype=torch.double, device=device)).sum()\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pasamos los puntos creados en Numpy a tensores de PyTorch P y Q. Los puntos P son los que tenemos que \"mover\", por eso requieren gradiente." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "device = 'cuda' if torch.cuda.is_available() else 'cpu'\n", "device = 'cpu'\n", "\n", "P = torch.tensor(P_points, requires_grad=True, dtype=torch.float, device=device)\n", "Q = torch.tensor(Q_points, dtype=torch.float, device=device)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch: 0 loss: 39.479583740234375\n", "Epoch: 10 loss: 15.956965446472168\n", "Epoch: 20 loss: 13.391416549682617\n", "Epoch: 30 loss: 12.188273429870605\n", "Epoch: 40 loss: 10.87851333618164\n", "Epoch: 50 loss: 10.16821575164795\n", "Epoch: 60 loss: 9.989543914794922\n", "Epoch: 70 loss: 9.744491577148438\n", "Epoch: 80 loss: 9.489737510681152\n", "Epoch: 90 loss: 8.615865707397461\n", "Epoch: 100 loss: 8.053683280944824\n", "Epoch: 110 loss: 7.864839553833008\n", "Epoch: 120 loss: 7.308864593505859\n", "Epoch: 130 loss: 6.854788780212402\n", "Epoch: 140 loss: 5.771241188049316\n", "Epoch: 150 loss: 4.689131736755371\n", "Epoch: 160 loss: 4.214322566986084\n", "Epoch: 170 loss: 4.072487831115723\n", "Epoch: 180 loss: 4.051445007324219\n", "Epoch: 190 loss: 4.03515625\n", "Epoch: 200 loss: 4.021659851074219\n", "Epoch: 210 loss: 4.013899803161621\n", "Epoch: 220 loss: 3.9985787868499756\n", "Epoch: 230 loss: 3.986757516860962\n", "Epoch: 240 loss: 3.977696180343628\n", "Epoch: 250 loss: 3.969468593597412\n", "Epoch: 260 loss: 3.959566116333008\n", "Epoch: 270 loss: 3.9487476348876953\n", "Epoch: 280 loss: 3.9359965324401855\n", "Epoch: 290 loss: 3.919861078262329\n", "Epoch: 300 loss: 3.9039435386657715\n", "Epoch: 310 loss: 3.8863189220428467\n", "Epoch: 320 loss: 3.8603057861328125\n", "Epoch: 330 loss: 3.8084962368011475\n", "Epoch: 340 loss: 3.7537732124328613\n", "Epoch: 350 loss: 3.695063591003418\n", "Epoch: 360 loss: 3.590381383895874\n", "Epoch: 370 loss: 3.4406182765960693\n", "Epoch: 380 loss: 3.263678789138794\n", "Epoch: 390 loss: 2.823730707168579\n", "Epoch: 400 loss: 2.2120273113250732\n", "Epoch: 410 loss: 0.6396467685699463\n", "Epoch: 420 loss: 0.5637612342834473\n", "Epoch: 430 loss: 0.5009985566139221\n", "Epoch: 440 loss: 0.4680554270744324\n", "Epoch: 450 loss: 0.4548220932483673\n", "Epoch: 460 loss: 0.43580907583236694\n", "Epoch: 470 loss: 0.436868280172348\n", "Epoch: 480 loss: 0.4374592900276184\n", "Epoch: 490 loss: 0.4361301362514496\n" ] } ], "source": [ "optimizer = torch.optim.RMSprop([P], lr=0.1)\n", "\n", "epochs = 500\n", "\n", "for k in range(epochs):\n", " \n", " PM = torch.tensor(np.zeros((len(P_points), len(P_points))), dtype=float, device=device)\n", " QM = torch.tensor(np.zeros((len(P_points), len(P_points))), dtype=float, device=device)\n", " \n", " for i, q_row in enumerate(Q):\n", " for j, q_column in enumerate(Q):\n", " QM[i, j] = distance(q_row, q_column)\n", " \n", " QD = pdf(QM)\n", " QD = torch.div(QD.t(), torch.sum(QD, dim=1)).t()\n", " \n", " for i, p in enumerate(P):\n", " for j, q in enumerate(P):\n", " PM[i, j] = distance(p, q)\n", "\n", " PD = pdf(PM)\n", " PD = torch.div(PD.t(), torch.sum(PD, dim=1)).t()\n", " \n", " loss = torch.tensor([0.], device=device)\n", " for pd, qd in zip(PD, QD):\n", " loss += KL(pd, qd)\n", " \n", " if k%10 == 0:\n", " print(\"Epoch:\", k, \"loss:\", loss.item())\n", " \n", "\n", " loss.backward() \n", " optimizer.step() \n", " optimizer.zero_grad()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualizamos el resultado:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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/uGz9heft7/4vP3TWJ+1tVaFhYXKzs6W49Q8k8L3EQvHcdSxY8cj/u/E8y3YmyI+b//wWfuLz9tffN7+aYzPuraRigOYvAkAADxDsQAAAJ6JuWKRlJSku+++W0lJSUFHaRb4vP3DZ+0vPm9/8Xn7J+jP2vfJmwAAIH7F3IgFAABouigWAADAMxQLAADgGYoFAADwTMwVi8cff1xdunRRcnKyBg4cqKVLlwYdKe5MnjxZAwYMUHp6utq2batLL71U69atCzpWs3H//ffLGKNx48YFHSVubdq0Sddee61at26tlJQU9e7dWx9++GHQseJONBrVxIkTlZubq5SUFB177LG6995767zXBOrn3Xff1fDhw5WdnS1jjF566aUqz1trddddd6lDhw5KSUnR4MGD9fnnnzd6rpgqFrNnz9aECRN09913a8WKFerbt6+GDBmibdu2BR0trixcuFCjR4/WkiVLNG/ePJWVlemCCy5QUVFR0NHi3rJly/Tkk0+qT58+QUeJW7t27dKgQYOUkJCguXPn6pNPPtFDDz2krKysoKPFnQceeEBTp07VY489pk8//VQPPPCA/vCHP+jRRx8NOlpcKCoqUt++ffX4449X+/wf/vAHPfLII3riiSf0wQcfKC0tTUOGDNG+ffsaN5iNISeffLIdPXp05dfRaNRmZ2fbyZMnB5gq/m3bts1KsgsXLgw6SlwrLCy0Xbt2tfPmzbNnnXWWvfXWW4OOFJduu+02e/rppwcdo1kYNmyYvfHGG6tsu/zyy+3IkSMDShS/JNk5c+ZUfu26rm3fvr198MEHK7ft3r3bJiUl2ZkzZzZqlpgZsSgtLdXy5cs1ePDgym2O42jw4MFavHhxgMniX0FBgSSpVatWASeJb6NHj9awYcOq/B2H915++WXl5eXpqquuUtu2bdWvXz899dRTQceKS6eddprmz5+v9evXS5JWrVqlRYsWaejQoQEni38bNmzQli1bqnw/yczM1MCBAxv9mOn7TcgO144dOxSNRtWuXbsq29u1a6fPPvssoFTxz3VdjRs3ToMGDVKvXr2CjhO3Zs2apRUrVmjZsmVBR4l7X331laZOnaoJEyboN7/5jZYtW6axY8cqMTFR119/fdDx4srtt9+uSCSibt26KRQKKRqNatKkSRo5cmTQ0eLeli1bJKnaY+aB5xpLzBQLBGP06NFas2aNFi1aFHSUuJWfn69bb71V8+bNU3JyctBx4p7rusrLy9N9990nSerXr5/WrFmjJ554gmLhseeff17PPfecZsyYoZ49e2rlypUaN26csrOz+azjWMycCmnTpo1CoZC2bt1aZfvWrVvVvn37gFLFtzFjxujVV1/V22+/7cmt7lG95cuXa9u2berfv7/C4bDC4bAWLlyoRx55ROFwWNFoNOiIcaVDhw7q0aNHlW3du3fXN998E1Ci+PXrX/9at99+u0aMGKHevXvruuuu0/jx4zV58uSgo8W9A8fFII6ZMVMsEhMTddJJJ2n+/PmV21zX1fz583XqqacGmCz+WGs1ZswYzZkzRwsWLFBubm7QkeLaeeedp9WrV2vlypWVj7y8PI0cOVIrV65UKBQKOmJcGTRo0CGXT69fv16dO3cOKFH8Ki4uluNUPcyEQiG5rhtQouYjNzdX7du3r3LMjEQi+uCDDxr9mBlTp0ImTJig66+/Xnl5eTr55JM1ZcoUFRUVadSoUUFHiyujR4/WjBkz9I9//EPp6emV5+MyMzOVkpIScLr4k56efsj8lbS0NLVu3Zp5LY1g/PjxOu2003Tffffp6quv1tKlSzVt2jRNmzYt6GhxZ/jw4Zo0aZI6deqknj176qOPPtLDDz+sG2+8MehocWHPnj364osvKr/esGGDVq5cqVatWqlTp04aN26cfv/736tr167Kzc3VxIkTlZ2drUsvvbRxgzXqNSeN4NFHH7WdOnWyiYmJ9uSTT7ZLliwJOlLckVTtY/r06UFHaza43LRxvfLKK7ZXr142KSnJduvWzU6bNi3oSHEpEonYW2+91Xbq1MkmJyfbY445xt555522pKQk6Ghx4e233672e/X1119vra245HTixIm2Xbt2NikpyZ533nl23bp1jZ6L26YDAADPxMwcCwAA0PRRLAAAgGcoFgAAwDMUCwAA4BmKBQAA8AzFAgAAeIZiAQAAPEOxAAAAnqFYAAAAz1AsAACAZygWAADAMxQLAADgmf8PIJ1PBWvNBlsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "\n", "final_points = P.cpu().detach().numpy()\n", "P_index = np.concatenate((np.ones(10, dtype=int), np.ones(10, dtype=int)*2, np.ones(10, dtype=int)*3))\n", "\n", "\n", "plt.scatter(P_points[:,0], P_points[:,1], c=P_index)\n", "plt.show()\n", "\n", "plt.scatter(final_points[:,0], final_points[:,1], c=P_index)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ejercicios\n", "\n", "1. Crea el conjunto tridimensional anterior con tres clases con el mismo centro y dispersión. De esa forma, las clases serán no separables. Mira a ver qué ocurre con su visualización con t-SNE.\n", "\n", "2. Calcula la visualización t-SNE usando el conjunto de datos IRIS." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3.10.7 64-bit", "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.10.7" }, "vscode": { "interpreter": { "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" } } }, "nbformat": 4, "nbformat_minor": 4 }