{ "cells": [ { "cell_type": "markdown", "id": "53ab8504-7300-46d9-87c3-742952d747ef", "metadata": {}, "source": [ "# Perceptron. Regresión lineal simple. Ejemplo básico" ] }, { "cell_type": "markdown", "id": "a0e2e0d8-3a6b-472f-a4e0-bc20f86e8c60", "metadata": {}, "source": [ "## Importamos las librerías" ] }, { "cell_type": "code", "execution_count": 1, "id": "49095cd8-5a67-4fff-aba1-d29f56edba32", "metadata": {}, "outputs": [], "source": [ "# Para este ejemplo, necesitamos numpy sí o sí.\n", "import numpy as np\n", "\n", "# Utilizamos estas 2 librerías sólo para visualizar los datos.\n", "# En condiciones normales no las usaremos.\n", "import matplotlib.pyplot as plt\n", "from mpl_toolkits.mplot3d import Axes3D" ] }, { "cell_type": "markdown", "id": "3f28025c-eb87-457d-a330-7ec44c7a5458", "metadata": {}, "source": [ "## Generamos los datos (aleatorios)" ] }, { "cell_type": "code", "execution_count": 2, "id": "561f815f-ac18-4307-b93e-56d2f2b9de86", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1000, 2)\n" ] } ], "source": [ "# Generamos 1000 observaciones\n", "observations = 1000\n", "\n", "np.random.seed(123)\n", "\n", "# Usaremos 2 variables como datos de entrada. Podemos verlas como x1 y x2 de lo visto en la presentación\n", "# Las nombraremos x y z\n", "# Generamos los datos de manera aleatoria a través de una distribución uniforme. Necesitamos 3 argumentos; low, high, size.\n", "# El tamaño de xs (x size) y zs (z size) es el de las observaciones por 1. En este caso: 1000 x 1.\n", "xs = np.random.uniform(low=-10, high=10, size=(observations,1))\n", "zs = np.random.uniform(-10, 10, (observations,1))\n", "\n", "# Combinamos las 2 dimensiones de entrada en una matriz de entrada\n", "inputs = np.column_stack((xs,zs))\n", "\n", "# Comprobamos si las dimensiones de los valores de entrada que deberán ser 1000x2\n", "print (inputs.shape)" ] }, { "cell_type": "markdown", "id": "37e7ffcd-ff5d-4269-8e29-c3395c147128", "metadata": {}, "source": [ "## Generamos los datos de la variable objetivo" ] }, { "cell_type": "code", "execution_count": 3, "id": "9ffd99e8-2f3b-44d3-a4ea-d687532cacbc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1000, 1)\n" ] } ], "source": [ "# Usaremos la siguiente función lineal:\n", "# f(x,z) = 2x - 3z + 5 + \n", "np.random.seed(123)\n", "noise = np.random.uniform(-1, 1, (observations,1))\n", "\n", "# Generamos las salidas, de acuerdo a la funcion\n", "# Donde los pesos son 2 y -3 y el bias es 5\n", "targets = 2*xs - 3*zs + 5 + noise\n", "\n", "# Comprobamos las dimensiones de targets, que deberían ser de 1000x1\n", "print (targets.shape)" ] }, { "cell_type": "markdown", "id": "2529e3ae-d186-4d3f-8240-1ab91ac0de06", "metadata": {}, "source": [ "## Pintamos los datos" ] }, { "cell_type": "code", "execution_count": 4, "id": "54a5cf64-e683-4fa0-960a-6f4f4b9d0c47", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Necesitamos que los datos tengan las dimensiones correctas\n", "xs = xs.reshape(observations,)\n", "zs = zs.reshape(observations,)\n", "targets = targets.reshape(observations,)\n", "\n", "\n", "# Declaramos el objeto imagen\n", "fig = plt.figure()\n", "\n", "# Metodo para crear un plot 3d\n", "ax = fig.add_subplot(111, projection='3d')\n", "\n", "# Elegimos los ejes\n", "ax.plot(xs, zs, targets)\n", "\n", "# Definimos las etiquetas\n", "ax.set_xlabel('xs')\n", "ax.set_ylabel('zs')\n", "ax.set_zlabel('Targets')\n", "\n", "# A través de esta variable podemos modificar el ángulo de visión.\n", "# Prueba con diferentes valores\n", "ax.view_init(azim= 200)\n", "\n", "# Pintamos\n", "plt.show()\n", "\n", "# Devolvemos los datos a sus dimensiones originales.\n", "# El cambio era sólo para pintarlos.\n", "targets = targets.reshape(observations,1)\n", "xs = xs.reshape(observations,1)\n", "zs = zs.reshape(observations,1)" ] }, { "cell_type": "markdown", "id": "f947864a-dfe8-4c45-b022-40fa41eb76c7", "metadata": {}, "source": [ "## Inicialización de las variables" ] }, { "cell_type": "code", "execution_count": 63, "id": "158d6261-1509-43b9-bab9-e8724b455fde", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.03929384]\n", " [-0.04277213]]\n", "[-0.05462971]\n" ] } ], "source": [ "# Inicializamos los pesos y bias de manera aletoria, a través de init_range\n", "# Valores altos en init_range evitarán que el algoritmo sea capaz de aprender.\n", "np.random.seed(123)\n", "init_range = 0.1\n", "\n", "# Los pesos tienen unas dimesniones de k x m, donde k es el número de variables de entrada y and m es el número de variables de salida\n", "# En nuestro caso, la matriz de pesos es de 2x1 (2 variables de entrada, 'x' y 'z' y una variable de salida 'y')\n", "weights = np.random.uniform(low=-init_range, high=init_range, size=(2, 1))\n", "\n", "# El bías, sólo tendrá una dimensión, puesto que sólo hay una variable de salida. Por tanto, será un escalar\n", "biases = np.random.uniform(low=-init_range, high=init_range, size=1)\n", "\n", "print (weights)\n", "print (biases)" ] }, { "cell_type": "markdown", "id": "d998a48e-28ce-4a40-b1b7-2e93982316e0", "metadata": {}, "source": [ "## Definimos el ratio de aprendizaje" ] }, { "cell_type": "code", "execution_count": 64, "id": "c891340a-86ff-4723-aeb2-28cf9f2dc590", "metadata": {}, "outputs": [], "source": [ "# Ratios demasiado altos harán que nuestra red no aprenda y demasiado bajos, que no alcance el objetivo para las repeticiones definidas.\n", "# Juega con este ratio para ver los resultados\n", "learning_rate = 0.02" ] }, { "cell_type": "markdown", "id": "1aebc477-355e-47b8-8b20-acee36003ed0", "metadata": {}, "source": [ "## Entrenamos el modelo" ] }, { "cell_type": "code", "execution_count": 60, "id": "04a142b8-9fa0-47b1-bf3f-f40bce988696", "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "248.80400694112734\n", "23247.677931057544\n", "2296309.3024600297\n", "227452576.6208836\n", "22571798846.474556\n", "2243082831097.779\n", "223136674956256.84\n", "2.2213965001732784e+16\n", "2.2127072462974682e+18\n", "2.204958788157397e+20\n", "2.197902141816231e+22\n", "2.1913550799180022e+24\n", "2.1851842311112535e+26\n", "2.1792919794633083e+28\n", "2.1736068767607404e+30\n", "2.1680766257252445e+32\n", "2.162662944760952e+34\n", "2.1573378097056832e+36\n", "2.1520807033462846e+38\n", "2.146876602468877e+40\n", "2.1417145046760256e+42\n", "2.13658635023383e+44\n", "2.1314862330227205e+46\n", "2.1264098230696062e+48\n", "2.121353943926398e+50\n", "2.1163162633732955e+52\n", "2.111295067059089e+54\n", "2.1062890928391605e+56\n", "2.1012974095352526e+58\n", "2.0963193282054345e+60\n", "2.0913543372067374e+62\n", "2.0864020546705342e+64\n", "2.081462193721461e+66\n", "2.0765345370227627e+68\n", "2.071618918147179e+70\n", "2.0667152079431515e+72\n", "2.0618233045568347e+74\n", "2.0569431261296536e+76\n", "2.0520746054539447e+78\n", "2.0472176860616154e+80\n", "2.0423723193616105e+82\n", "2.0375384625448864e+84\n", "2.0327160770511374e+86\n", "2.0279051274466258e+88\n", "2.0231055806028635e+90\n", "2.0183174050955063e+92\n", "2.0135405707643756e+94\n", "2.0087750483914335e+96\n", "2.0040208094650574e+98\n", "1.9992778260074876e+100\n", "1.994546070448503e+102\n", "1.989825515532938e+104\n", "1.9851161342529473e+106\n", "1.9804178997983987e+108\n", "1.975730785520531e+110\n", "1.9710547649053143e+112\n", "1.966389811553919e+114\n", "1.961735899168372e+116\n", "1.957093001541036e+118\n", "1.9524610925468535e+120\n", "1.9478401461376465e+122\n", "1.943230136337897e+124\n", "1.93863103724162e+126\n", "1.9340428230100416e+128\n", "1.929465467869858e+130\n", "1.9248989461119232e+132\n", "1.9203432320902458e+134\n", "1.9157983002212297e+136\n", "1.9112641249830624e+138\n", "1.906740680915243e+140\n", "1.9022279426181868e+142\n", "1.897725884752913e+144\n", "1.893234482040767e+146\n", "1.8887537092631794e+148\n", "1.8842835412614573e+150\n", "1.8798239529365916e+152\n", "1.875374919249078e+154\n", "1.870936415218746e+156\n", "1.8665084159246051e+158\n", "1.86209089650468e+160\n", "1.8576838321558746e+162\n", "1.853287198133806e+164\n", "1.8489009697526784e+166\n", "1.844525122385129e+168\n", "1.8401596314620898e+170\n", "1.8358044724726468e+172\n", "1.8314596209639026e+174\n", "1.8271250525408362e+176\n", "1.822800742866166e+178\n", "1.8184866676602082e+180\n", "1.8141828027007485e+182\n", "1.8098891238228983e+184\n", "1.8056056069189607e+186\n", "1.8013322279382984e+188\n", "1.7970689628871942e+190\n", "1.7928157878287163e+192\n", "1.788572678882588e+194\n", "1.7843396122250508e+196\n", "1.7801165640887297e+198\n", "1.7759035107624985e+200\n" ] } ], "source": [ "# Vamos a iterar 100 veces a lo largo de nuestro set de entrenamiento que funciona bien para el ratio de entrenamiento de 0.02\n", "for i in range (100):\n", " \n", " # Generamos el modelo lineal basado en: y = xw + b\n", " # np.dot permite la multiplicación de matrices\n", " outputs = np.dot(inputs,weights) + biases\n", " # Los deltas, son las diferencias entre los targets y los outputs\n", " # Los deltas en este caso son un vector de 1000x1\n", " deltas = outputs - targets\n", " \n", " # La idea es iterar para conseguir reducir el error cuadrático medio\n", " \n", " loss = np.sum(deltas ** 2)/2 / observations\n", " \n", " # Printamos el error cuadrático medio\n", " print (loss)\n", " \n", " # Otro truco que vamos a usar, es escalar los deltas en base a las observaciones\n", " # Ésto nos ayuda a seleccionar mejor el ratio de aprendizaje, ya que estará\n", " # en la misma escala (propoción) que el error cuadrático medio\n", " deltas_scaled = deltas / observations\n", " \n", " # Para terminar, aplicamos el descenso del gradiente para poder encontrar el mínimo local\n", " # Las dimensiones de los pesos son 2x1, el ratio de entrenamiento 1x1 (escalar), inputs 1000x2 y los\n", " # deltas escalados 1000x1.\n", " # Para poder aplicar el procedimiento, debemos transponer los inputs\n", " weights = weights - learning_rate * np.dot(inputs.T,deltas_scaled)\n", " biases = biases - learning_rate * np.sum(deltas_scaled)\n", " \n", " # The weights are updated in a linear algebraic way (a matrix minus another matrix)\n", " # The biases, however, are just a single number here, so we must transform the deltas into a scalar.\n", " # The two lines are both consistent with the gradient descent methodology. " ] }, { "cell_type": "markdown", "id": "61f5ea24-9aa0-4f4f-840d-53e91132d105", "metadata": {}, "source": [ "## Pintamos los pesos y los biases y comprobamos sin son correctos" ] }, { "cell_type": "code", "execution_count": 61, "id": "65dc077e-28d2-479e-9620-77150de44312", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-1.12553812e+100]\n", " [ 2.89955129e+100]] [5.87897093e+96]\n" ] } ], "source": [ "# Cuando hemos declarado f(x,z), los pesos eran 2 y -3, mientras que el bias era 5.\n", "# Deberíamos obtener datos iguales\n", "print (weights, biases)\n", "\n", "# Vemos que CASI convergen, por lo que son necesarias más iteraciones." ] }, { "cell_type": "markdown", "id": "36ccf6bb-60ef-45f0-9720-cbec208499ef", "metadata": {}, "source": [ "## Pintamos los outputs vs los targets" ] }, { "cell_type": "code", "execution_count": 62, "id": "44466612-fb9a-41be-ad50-e41dbeeb100a", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Cuanto más cercanos sea el gráfico a una línea de 45 grados, más cercanos son los valores output y target.\n", "# Ésto es un ejercicio académico para entender el procedimiento puesto que no se realiza habitualmente.\n", "\n", "plt.plot(outputs,targets)\n", "plt.xlabel('outputs')\n", "plt.ylabel('targets')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.13" } }, "nbformat": 4, "nbformat_minor": 5 }