{"id":95633,"date":"2022-09-05T15:13:18","date_gmt":"2022-09-05T13:13:18","guid":{"rendered":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/"},"modified":"2020-12-05T05:28:27","modified_gmt":"2020-12-05T08:28:27","slug":"aprendizaje-automatico-con-javascript-parte-2","status":"publish","type":"post","link":"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/","title":{"rendered":"Machine Learning with JavaScript: Part 2"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_86 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Contenidos<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#%C2%BFComo-funciona-el-algoritmo-kNN\" >\u00bfC\u00f3mo funciona el algoritmo kNN?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#kNN-en-la-practica-%E2%80%93-Codigo\" >kNN en la pr\u00e1ctica \u2013 C\u00f3digo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#Instalar-las-bibliotecas\" >Instalar las bibliotecas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#Inicializar-la-biblioteca-y-cargar-los-datos\" >Inicializar la biblioteca y cargar los datos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#Datos-del-Vestido-una-vez-mas\" >Datos del Vestido (una vez m\u00e1s)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#Entrena-a-tu-modelo-y-luego-pruebalo\" >Entrena a tu modelo y luego pru\u00e9balo<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#Opcional-Comenzar-a-predecir\" >(Opcional) Comenzar a predecir<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#%C2%A1Todo-terminado\" >\u00a1Todo terminado!<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<div itemprop=\"articleBody\">\n<p>Las siglas <strong>kNN<\/strong> significa <strong>k-Nearest-Neighbours,<\/strong> que es un algoritmo de aprendizaje supervisado. Se puede utilizar para la clasificaci\u00f3n, as\u00ed como para problemas de regresi\u00f3n.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%C2%BFComo-funciona-el-algoritmo-kNN\"><\/span>\u00bfC\u00f3mo funciona el algoritmo kNN?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>kNN decide la clase del nuevo punto de datos bas\u00e1ndose en el n\u00famero m\u00e1ximo de vecinos que tiene el punto de datos que pertenecen a la misma clase.<\/p>\n<p>Si los vecinos de un nuevo punto de datos son los siguientes, <em>NY: 7, NJ: 0, IN: 4,<\/em> entonces la clase del nuevo punto de datos ser\u00e1 <em>NY.<\/em><\/p>\n<p>Digamos que trabajas en una oficina de correos y tu trabajo es organizar y distribuir cartas entre los carteros para minimizar el n\u00famero de viajes a los diferentes barrios. Y como s\u00f3lo estamos imaginando cosas, podemos asumir que s\u00f3lo hay siete vecindarios diferentes. Este es un tipo de problema de clasificaci\u00f3n. Necesitas dividir las letras en clases, donde las clases aqu\u00ed se refieren al <strong>Upper East Side, Downtown Manhattan,<\/strong> y as\u00ed sucesivamente.<\/p>\n<p>Si te gusta perder tiempo y recursos, puedes dar una carta de cada vecindario a cada cartero, y esperar que se conozcan en el mismo vecindario y descubran tu plan corrupto. Ese es el peor tipo de distribuci\u00f3n que se puede lograr.<\/p>\n<p>Por otro lado, puedes organizar las cartas en funci\u00f3n de qu\u00e9 direcciones est\u00e1n m\u00e1s cerca unas de otras.<\/p>\n<p>Podr\u00edas empezar con <em>\u00abSi est\u00e1 dentro de un rango de tres manzanas, d\u00e1selo al mismo cartero\u00bb<\/em>. Ese n\u00famero de bloques m\u00e1s cercanos es de donde viene <em>K<\/em>. Puedes seguir aumentando el n\u00famero de bloques hasta que llegues a una distribuci\u00f3n eficiente. Ese es el valor m\u00e1s eficiente de <em>k<\/em> para tu problema de clasificaci\u00f3n.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"kNN-en-la-practica-%E2%80%93-Codigo\"><\/span>kNN en la pr\u00e1ctica \u2013 C\u00f3digo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Como hicimos en el \u00faltimo tutorial, vamos a usar el m\u00f3dulo <strong>KNN<\/strong> de <strong>ml.js<\/strong> para entrenar a nuestro clasificador <strong>kNearestNeighbors.<\/strong> Cada problema de Aprendizaje de M\u00e1quina necesita datos, y vamos a usar el conjunto de datos <strong>IRIS<\/strong> en este tutorial.<\/p>\n<p>El conjunto de datos del iris consiste en 3 tipos diferentes de longitud de p\u00e9talos y s\u00e9palos de iris <strong>(Setosa, Versicolor<\/strong> y <strong>Virginica),<\/strong> junto con un campo que indica su tipo respectivo.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Instalar-las-bibliotecas\"><\/span>Instalar las bibliotecas<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n&#13;\n$ yarn add ml-knn csvtojson prompt&#13;\n&#13;\n<\/pre>\n<p>O si prefieres <strong>npm:<\/strong><\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n&#13;\nnpm install ml-knn csvtojson prompt&#13;\n&#13;\n<\/pre>\n<ul>\n<li><strong>ml-knn:<\/strong> <em>k<\/em> Vecinos m\u00e1s cercanos<\/li>\n<li><strong>csvtojson:<\/strong> Datos de an\u00e1lisis<\/li>\n<li><strong>en<\/strong> <strong>el momento oportuno:<\/strong> Para permitir que el usuario solicite predicciones<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Inicializar-la-biblioteca-y-cargar-los-datos\"><\/span>Inicializar la biblioteca y cargar los datos<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>El conjunto de datos Iris es proporcionado por la Universidad de California, Irvine y est\u00e1 disponible <a rel=\"nofollow noopener noreferrer\" target=\"_blank\" href=\"https:\/\/archive.ics.uci.edu\/ml\/machine-learning-databases\/iris\/iris.data\">aqu\u00ed<\/a>. Sin embargo, debido a la forma en que est\u00e1 organizado, tendr\u00e1s que copiar el contenido en el navegador (Seleccionar todo, Copiar) y pegarlo en un archivo llamado <strong>iris.csv.<\/strong> Puedes nombrarlo como quieras, excepto que la extensi\u00f3n debe ser <strong>.csv.<\/strong><\/p>\n<p>Ahora, inicializa la biblioteca y carga los datos.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nconst KNN = require('ml-knn');&#13;\nconst csv = require('csvtojson');&#13;\nconst prompt = require('prompt');&#13;\nlet knn;&#13;\n&#13;\nconst csvFilePath = 'iris.csv'; \/\/ Data&#13;\nconst names = ['sepalLength', 'sepalWidth', 'petalLength', 'petalWidth', 'type']; \/\/ para el\u00a0 header&#13;\n&#13;\nlet seperationSize; \/\/\u00a0Para separar los datos de entrenamiento y de prueba&#13;\n&#13;\nlet data = [],&#13;\nX = [],&#13;\ny = [];&#13;\n&#13;\nlet trainingSetX = [],&#13;\ntrainingSetY = [],&#13;\ntestSetX = [],&#13;\ntestSetY = [];&#13;\n<\/pre>\n<p>Los nombres de los encabezados se utilizan para la visualizaci\u00f3n y la comprensi\u00f3n. Se quitar\u00e1n m\u00e1s adelante.<\/p>\n<p>Adem\u00e1s, <strong>seperationSize<\/strong> se utiliza para dividir los datos en conjuntos de datos de formaci\u00f3n y de prueba.<\/p>\n<p>Hemos importado el paquete <strong>csvto.json,<\/strong> y ahora vamos a usar su m\u00e9todo <strong>fromFile<\/strong> para cargar los datos. (Ya que nuestros datos no tienen una fila de encabezado, estamos proporcionando nuestros propios nombres de encabezado.)<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\ncsv({noheader: true, headers: names})&#13;\n.fromFile(csvFilePath)&#13;\n.on('json', (jsonObj) =&gt; {&#13;\ndata.push(jsonObj); \/\/ Push each object to data Array&#13;\n})&#13;\n.on('done', (error) =&gt; {&#13;\nseperationSize = 0.7 * data.length;&#13;\ndata = shuffleArray(data);&#13;\ndressData();&#13;\n});&#13;\n<\/pre>\n<p>Estamos empujando cada fila a la variable de dates, y cuando el proceso ha terminado, estamos ajustando el <strong>seperationSize<\/strong> a <strong>0.7<\/strong> veces el n\u00famero de muestras en nuestro conjunto de datos. Ten en cuenta que, si el tama\u00f1o de las muestras de capacitaci\u00f3n es demasiado peque\u00f1o, es posible que el clasificador no funcione tan bien como lo har\u00eda con un conjunto m\u00e1s grande.<\/p>\n<p>Dado que nuestro conjunto de datos est\u00e1 ordenado con respecto a los tipos <strong>(console.log<\/strong> para confirmar), la funci\u00f3n <strong>shuffleArray<\/strong> se utiliza para, barajar el conjunto de datos para permitir la divisi\u00f3n. (Si no barajas, puedes terminar con un modelo que funcione bien para las dos primeras clases, pero que falle con la tercera.)<\/p>\n<p>As\u00ed es como se define.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n\/**&#13;\n* https:\/\/stackoverflow.com\/a\/12646864&#13;\n*\u00a0Ordenar al azar los elementos de la matriz en el lugar.&#13;\n* Usando el algoritmo de barajar de Durstenfeld.&#13;\n*\/&#13;\nfunction shuffleArray(array) {&#13;\nfor (var i = array.length - 1; i &gt; 0; i--) {&#13;\nvar j = Math.floor(Math.random() * (i + 1));&#13;\nvar temp = array[i];&#13;\narray[i] = array[j];&#13;\narray[j] = temp;&#13;\n}&#13;\nreturn array;&#13;\n}&#13;\n<\/pre>\n<h3><span class=\"ez-toc-section\" id=\"Datos-del-Vestido-una-vez-mas\"><\/span>Datos del Vestido (una vez m\u00e1s)<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nuestros datos est\u00e1n organizados de la siguiente manera:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n{&#13;\nsepalLength: \u20185.1\u2019,&#13;\nsepalWidth: \u20183.5\u2019,&#13;\npetalLength: \u20181.4\u2019,&#13;\npetalWidth: \u20180.2\u2019,&#13;\ntype: \u2018Iris-setosa\u2019&#13;\n}&#13;\n<\/pre>\n<p>Hay dos cosas que necesitamos hacer con nuestros datos antes de entregarlos al clasificador <strong>kNN:<\/strong><\/p>\n<ul>\n<li>Gira los valores de la cadena a flotantes. <strong>(parseFloat)<\/strong><\/li>\n<li>Convierte el tipo en clases numeradas.<\/li>\n<\/ul>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nfunction dressData() {&#13;\n&#13;\n\/**&#13;\n*\u00a0Hay tres tipos diferentes de flores de Iris que este conjunto&#13;\n&#13;\n*de datos clasificados:&#13;\n*&#13;\n* 1. Iris Setosa (Iris-setosa)&#13;\n* 2. Iris Versicolor (Iris-versicolor)&#13;\n* 3. Iris Virginica (Iris-virginica)&#13;\n*&#13;\n* Vamos a cambiar estas clases de Strings a n\u00fameros.&#13;\n* Tal que, un valor de tipo igual a&#13;\n* 0 significar\u00eda setosa,&#13;\n* 1 significar\u00eda versicolor, y&#13;\n* 3 significar\u00eda virginica&#13;\n*\/&#13;\n&#13;\nlet types = new Set(); \/\/\u00a0Para reunir clases \u00daNICAS&#13;\n&#13;\ndata.forEach((row) =&gt; {&#13;\ntypes.add(row.type);&#13;\n});&#13;\n&#13;\ntypesArray = [...types]; \/\/\u00a0Para grabar los diferentes tipos de clases.&#13;\n&#13;\ndata.forEach((row) =&gt; {&#13;\nlet rowArray, typeNumber;&#13;\n&#13;\nrowArray = Object.keys(row).map(key =&gt; parseFloat(row[key])).slice(0, 4);&#13;\n&#13;\ntypeNumber = typesArray.indexOf(row.type); \/\/\u00a0Convertir tipo (String) a tipo (Number)&#13;\n&#13;\nX.push(rowArray);&#13;\ny.push(typeNumber);&#13;\n});&#13;\n&#13;\ntrainingSetX = X.slice(0, seperationSize);&#13;\ntrainingSetY = y.slice(0, seperationSize);&#13;\ntestSetX = X.slice(seperationSize);&#13;\ntestSetY = y.slice(seperationSize);&#13;\n&#13;\ntrain();&#13;\n}&#13;\n<\/pre>\n<p>Si no est\u00e1s familiarizado con los <strong>Sets,<\/strong> son como sus contrapartes matem\u00e1ticas, ya que no pueden tener elementos duplicados, y sus elementos no tienen un \u00edndice. (A diferencia de los Arrays.)<\/p>\n<p>Y pueden ser f\u00e1cilmente convertidos a Arrays usando el operador de spread o usando el constructor de Set.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Entrena-a-tu-modelo-y-luego-pruebalo\"><\/span>Entrena a tu modelo y luego pru\u00e9balo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nfunction train() {&#13;\nknn = new KNN(trainingSetX, trainingSetY, {k: 7});&#13;\ntest();&#13;\n}&#13;\n<\/pre>\n<p>El m\u00e9todo de entrenamiento toma dos argumentos obligatorios, los datos de entrada, como la longitud del p\u00e9talo, la anchura del p\u00e9talo, y su clase real, como el <em>Iris-setosa,<\/em> y as\u00ed sucesivamente. Tambi\u00e9n toma un par\u00e1metro opcional de opciones, que es s\u00f3lo un objeto JS que se puede pasar para ajustar los par\u00e1metros internos del algoritmo. Estamos pasando el valor de <em>k<\/em> como una opci\u00f3n. El valor por defecto de <em>k<\/em> es<em> 5<\/em>.<\/p>\n<p>Ahora que nuestro modelo ha sido entrenado, veamos c\u00f3mo funciona en el equipo de pruebas. Principalmente, estamos interesados en el n\u00famero de errores de clasificaci\u00f3n que se producen. (Es decir, el n\u00famero de veces que predice que la entrada es algo, aunque en realidad sea otra cosa.)<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n&#13;\nfunction test() {&#13;\nconst result = knn.predict(testSetX);&#13;\nconst testSetLength = testSetX.length;&#13;\nconst predictionError = error(result, testSetY);&#13;\nconsole.log(`Test Set Size = ${testSetLength} and number of Misclassifications = ${predictionError}`);&#13;\npredict();&#13;\n}&#13;\n&#13;\n<\/pre>\n<p>El error se calcula de la siguiente manera. Usamos el humilde bucle for para hacer un bucle sobre el conjunto de datos, y ver si la salida pronosticada no es igual a la salida real. Es una clasificaci\u00f3n err\u00f3nea.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nfunction error(predicted, expected) {&#13;\nlet misclassifications = 0;&#13;\nfor (var index = 0; index &lt; predicted.length; index++) {&#13;\nif (predicted[index] !== expected[index]) {&#13;\nmisclassifications++;&#13;\n}&#13;\n}&#13;\nreturn misclassifications;&#13;\n}&#13;\n<\/pre>\n<h4><span class=\"ez-toc-section\" id=\"Opcional-Comenzar-a-predecir\"><\/span>(Opcional) Comenzar a predecir<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Es hora de tener algunas indicaciones y predicciones.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nfunction predict() {&#13;\nlet temp = [];&#13;\nprompt.start();&#13;\n&#13;\nprompt.get(['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'], function (err, result) {&#13;\nif (!err) {&#13;\nfor (var key in result) {&#13;\ntemp.push(parseFloat(result[key]));&#13;\n}&#13;\nconsole.log(`With ${temp} -- type = ${knn.predict(temp)}`);&#13;\n}&#13;\n});&#13;\n}&#13;\n<\/pre>\n<p>Si\u00e9ntete libre de omitir este paso, si no desea probar el modelo en una nueva entrada.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"%C2%A1Todo-terminado\"><\/span>\u00a1Todo terminado!<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Si t\u00fa seguiste todos los pasos, as\u00ed es como deber\u00eda verse tu index.js:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\nconst KNN = require('ml-knn');&#13;\nconst csv = require('csvtojson');&#13;\nconst prompt = require('prompt');&#13;\nlet knn;&#13;\nconst csvFilePath = 'iris.csv'; \/\/ Datos&#13;\nconst names = ['sepalLength', 'sepalWidth', 'petalLength', 'petalWidth', 'type']; \/\/ para el header&#13;\n&#13;\nlet seperationSize; \/\/\u00a0Para separar los datos de entrenamiento y de prueba&#13;\n&#13;\nlet data = [], X = [], y = [];&#13;\n&#13;\nlet trainingSetX = [], trainingSetY = [], testSetX = [], testSetY = [];&#13;\n&#13;\ncsv({noheader: true, headers: names})&#13;\n.fromFile(csvFilePath)&#13;\n.on('json', (jsonObj) =&gt; {&#13;\ndata.push(jsonObj); \/\/\u00a0Empujar cada objeto a la matriz de datos&#13;\n})&#13;\n.on('done', (error) =&gt; {&#13;\nseperationSize = 0.7 * data.length;&#13;\ndata = shuffleArray(data);&#13;\ndressData();&#13;\n});&#13;\n&#13;\nfunction dressData() {&#13;\n&#13;\nlet types = new Set(); \/\/\u00a0Para reunir clases \u00daNICAS&#13;\n&#13;\ndata.forEach((row) =&gt; {&#13;\ntypes.add(row.type);&#13;\n});&#13;\n&#13;\ntypesArray = [...types]; \/\/\u00a0Para grabar los diferentes tipos de clases.&#13;\n&#13;\ndata.forEach((row) =&gt; {&#13;\nlet rowArray, typeNumber;&#13;\n&#13;\nrowArray = Object.keys(row).map(key =&gt; parseFloat(row[key])).slice(0, 4);&#13;\n&#13;\ntypeNumber = typesArray.indexOf(row.type); \/\/\u00a0Para grabar los diferentes tipos de clases.&#13;\n&#13;\nX.push(rowArray);&#13;\ny.push(typeNumber);&#13;\n});&#13;\n&#13;\ntrainingSetX = X.slice(0, seperationSize);&#13;\ntrainingSetY = y.slice(0, seperationSize);&#13;\ntestSetX = X.slice(seperationSize);&#13;\ntestSetY = y.slice(seperationSize);&#13;\n&#13;\ntrain();&#13;\n}&#13;\n&#13;\nfunction train() {&#13;\nknn = new KNN(trainingSetX, trainingSetY, {k: 7});&#13;\ntest();&#13;\n}&#13;\n&#13;\nfunction test() {&#13;\nconst result = knn.predict(testSetX);&#13;\nconst testSetLength = testSetX.length;&#13;\nconst predictionError = error(result, testSetY);&#13;\nconsole.log(`Test Set Size = ${testSetLength} and number of Misclassifications = ${predictionError}`);&#13;\npredict();&#13;\n}&#13;\n&#13;\nfunction error(predicted, expected) {&#13;\nlet misclassifications = 0;&#13;\nfor (var index = 0; index &lt; predicted.length; index++) { if (predicted[index] !== expected[index]) { misclassifications++; } } return misclassifications; } function predict() { let temp = []; prompt.start(); prompt.get(['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'], function (err, result) { if (!err) { for (var key in result) { temp.push(parseFloat(result[key])); } console.log(`With ${temp} -- type = ${knn.predict(temp)}`); } }); } \/** * https:\/\/stackoverflow.com\/a\/12646864 * Randomize array element order in-place. * Using Durstenfeld shuffle algorithm. *\/ function shuffleArray(array) { for (var i = array.length - 1; i &gt; 0; i--) {&#13;\nvar j = Math.floor(Math.random() * (i + 1));&#13;\nvar temp = array[i];&#13;\narray[i] = array[j];&#13;\narray[j] = temp;&#13;\n}&#13;\nreturn array;&#13;\n}&#13;\n<\/pre>\n<p>Ejecuta el nodo <strong>index.js.<\/strong> Deber\u00eda mostrarte esto en pantalla:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">&#13;\n$ node index.js&#13;\n&#13;\nTest Set Size = 45 and number of Misclassifications = 2&#13;\nprompt: Sepal Length: 1.7&#13;\nprompt: Sepal Width: 2.5&#13;\nprompt: Petal Length: 0.5&#13;\nprompt: Petal Width: 3.4&#13;\nWith 1.7,2.5,0.5,3.4 -- type = 2&#13;\n<\/pre>\n<p>Bien hecho. Ese es tu algoritmo kNN en el trabajo.<\/p>\n<p>Un aspecto enorme del algoritmo kNN es el valor de k, y se le llama hiperpar\u00e1metro. Los hiperpar\u00e1metros son un, \u00abtipo de par\u00e1metros que no pueden ser aprendidos directamente del proceso de entrenamiento regular\u00bb. Estos par\u00e1metros expresan propiedades de \u00abnivel superior\u00bb del modelo, como su complejidad o la rapidez con la que debe aprenderse. Se llaman \u00abhiperpar\u00e1metros\u00bb.<\/p>\n<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Las siglas kNN significa k-Nearest-Neighbours, que es un algoritmo de aprendizaje supervisado. Se puede utilizar para la clasificaci\u00f3n, as\u00ed como para problemas de regresi\u00f3n. \u00bfC\u00f3mo funciona el algoritmo kNN? kNN&#8230;<\/p>","protected":false},"author":1,"featured_media":95634,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1374],"tags":[],"class_list":["post-95633","post","type-post","status-publish","format-standard","has-post-thumbnail","category-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.0 (Yoast SEO v28.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Aprendizaje autom\u00e1tico con JavaScript: Parte 2 - R Marketing Digital<\/title>\n<meta name=\"description\" content=\"Las siglas kNN significa k-Nearest-Neighbours, que es un algoritmo de aprendizaje supervisado. Se puede utilizar para la clasificaci\u00f3n, as\u00ed como para\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Aprendizaje autom\u00e1tico con JavaScript: Parte 2\" \/>\n<meta property=\"og:description\" content=\"Las siglas kNN significa k-Nearest-Neighbours, que es un algoritmo de aprendizaje supervisado. Se puede utilizar para la clasificaci\u00f3n, as\u00ed como para\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/\" \/>\n<meta property=\"og:site_name\" content=\"R Marketing Digital\" \/>\n<meta property=\"article:published_time\" content=\"2022-09-05T13:13:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"938\" \/>\n\t<meta property=\"og:image:height\" content=\"612\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"R Marketing Digital\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/\"},\"author\":{\"name\":\"R Marketing Digital\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\"},\"headline\":\"Aprendizaje autom\u00e1tico con JavaScript: Parte 2\",\"datePublished\":\"2022-09-05T13:13:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/\"},\"wordCount\":1093,\"image\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg\",\"articleSection\":[\"Javascript\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/\",\"name\":\"Aprendizaje autom\u00e1tico con JavaScript: Parte 2 - R Marketing Digital\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg\",\"datePublished\":\"2022-09-05T13:13:18+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\"},\"description\":\"Las siglas kNN significa k-Nearest-Neighbours, que es un algoritmo de aprendizaje supervisado. Se puede utilizar para la clasificaci\u00f3n, as\u00ed como para\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/javascript\\\/aprendizaje-automatico-con-javascript-parte-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg\",\"contentUrl\":\"https:\\\/\\\/rmarketingdigital.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg\",\"width\":938,\"height\":612,\"caption\":\"aprendizaje_automatico-938x612-1-3931045-4689488-jpg\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#website\",\"url\":\"https:\\\/\\\/rmarketingdigital.com\\\/\",\"name\":\"R Marketing Digital\",\"description\":\"Agencia SEO | Publicidad redes sociales | Community Management\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rmarketingdigital.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/rmarketingdigital.com\\\/#\\\/schema\\\/person\\\/7c0d9782b2977b840b3740f00c69a73e\",\"name\":\"R Marketing Digital\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g\",\"caption\":\"R Marketing Digital\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Aprendizaje autom\u00e1tico con JavaScript: Parte 2 - R Marketing Digital","description":"The acronym kNN stands for k-Nearest-Neighbors, which is a supervised learning algorithm. It can be used for classification as well as for","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/","og_locale":"en_US","og_type":"article","og_title":"Aprendizaje autom\u00e1tico con JavaScript: Parte 2","og_description":"Las siglas kNN significa k-Nearest-Neighbours, que es un algoritmo de aprendizaje supervisado. Se puede utilizar para la clasificaci\u00f3n, as\u00ed como para","og_url":"https:\/\/rmarketingdigital.com\/en\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/","og_site_name":"R Marketing Digital","article_published_time":"2022-09-05T13:13:18+00:00","og_image":[{"width":938,"height":612,"url":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg","type":"image\/jpeg"}],"author":"R Marketing Digital","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#article","isPartOf":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/"},"author":{"name":"R Marketing Digital","@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e"},"headline":"Aprendizaje autom\u00e1tico con JavaScript: Parte 2","datePublished":"2022-09-05T13:13:18+00:00","mainEntityOfPage":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/"},"wordCount":1093,"image":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#primaryimage"},"thumbnailUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg","articleSection":["Javascript"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/","url":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/","name":"Aprendizaje autom\u00e1tico con JavaScript: Parte 2 - R Marketing Digital","isPartOf":{"@id":"https:\/\/rmarketingdigital.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#primaryimage"},"image":{"@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#primaryimage"},"thumbnailUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg","datePublished":"2022-09-05T13:13:18+00:00","author":{"@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e"},"description":"The acronym kNN stands for k-Nearest-Neighbors, which is a supervised learning algorithm. It can be used for classification as well as for","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rmarketingdigital.com\/javascript\/aprendizaje-automatico-con-javascript-parte-2\/#primaryimage","url":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg","contentUrl":"https:\/\/rmarketingdigital.com\/wp-content\/uploads\/2020\/12\/aprendizaje_automa\u0301tico-938x612-1-3931045.jpg","width":938,"height":612,"caption":"aprendizaje_automatico-938x612-1-3931045-4689488-jpg"},{"@type":"WebSite","@id":"https:\/\/rmarketingdigital.com\/#website","url":"https:\/\/rmarketingdigital.com\/","name":"R Digital Marketing","description":"SEO Agency | Advertising social networks | Community Management","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rmarketingdigital.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/rmarketingdigital.com\/#\/schema\/person\/7c0d9782b2977b840b3740f00c69a73e","name":"R Digital Marketing","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c5599c203e0120b8ccbff4666af86f35f9b3dcad468a8bc6295313a3964a80be?s=96&d=mm&r=g","caption":"R Marketing Digital"}}]}},"_links":{"self":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/posts\/95633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/comments?post=95633"}],"version-history":[{"count":0,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/posts\/95633\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/media\/95634"}],"wp:attachment":[{"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/media?parent=95633"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/categories?post=95633"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rmarketingdigital.com\/en\/wp-json\/wp\/v2\/tags?post=95633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}