![AI JS](/newstech/sites/default/files/inline-images/aijs1.png)
Para crear un modelo de inteligencia artificial en JavaScript, hay varias bibliotecas y herramientas que pueden ayudarte, como TensorFlow.js, Brain.js, Neataptic, entre otras. En esta nota, te mostraré un ejemplo básico de cómo crear un modelo de redes neuronales en JavaScript puro sin utilizar ninguna biblioteca.
Para este ejemplo, crearemos un modelo de redes neuronales que pueda clasificar números en función de si son mayores o menores que cero. Seguiremos los siguientes pasos:
-
Recopilar los datos
-
Pre-procesar los datos
-
Crear el modelo
-
Entrenar el modelo
-
Evaluar el modelo
-
Hacer predicciones con el modelo
![AI JS](/newstech/sites/default/files/inline-images/aijs2.png)
Paso 1: Recopilar los datos Primero, necesitamos crear un conjunto de datos. Para este ejemplo, crearemos un conjunto de 100 números aleatorios entre -1 y 1 y asignaremos la etiqueta "1" si el número es mayor que cero y "0" si el número es menor o igual a cero. Para hacer esto, podemos usar la siguiente función:
function generarDatos() { const datos = []; for (let i = 0; i < 100; i++) { const x = Math.random() * 2 - 1; const y = x > 0 ? 1 : 0; datos.push({ x, y }); } return datos; }
Paso 2: Preprocesar los datos Para que nuestro modelo pueda aprender de los datos, necesitamos preprocesarlos. En este caso, simplemente normalizaremos los datos dividiéndolos por el valor máximo:
function normalizar(datos) { const max = Math.max(...datos.map(d => d.x)); return datos.map(d => ({ x: d.x / max, y: d.y })); }
Paso 3: Crear el modelo En este caso, crearemos un modelo con una sola capa oculta con 4 neuronas. El modelo tomará un número de entrada y devolverá un número de salida que indicará si el número es mayor o menor que cero. Para crear el modelo, podemos usar la siguiente función:
function crearModelo() { const modelo = { capaOculta: [ { pesos: [Math.random(), Math.random(), Math.random(), Math.random()] }, { pesos: [Math.random(), Math.random(), Math.random(), Math.random()] }, { pesos: [Math.random(), Math.random(), Math.random(), Math.random()] }, { pesos: [Math.random(), Math.random(), Math.random(), Math.random()] }, ], capaSalida: { pesos: [Math.random(), Math.random(), Math.random(), Math.random()] } }; return modelo; }
Paso 4: Entrenar el modelo Una vez que tenemos nuestro modelo, necesitamos entrenarlo con los datos que hemos recopilado. Para hacer esto, usaremos el algoritmo de retropropagación y la función de activación sigmoidal. Podemos usar la siguiente función para entrenar el modelo:
function entrenar(modelo, datos, epocas, tasaAprendizaje) { for (let i = 0; i < epocas; i++) { for (let j = 0; j < datos.length; j++) { const capaOculta = modelo.capaOculta.map(neurona => ({ activacion: sigmoidal(neurona.pesos.reduce((sum, peso, k) => sum + peso * datos[j].x[k], 0)) })); const salida = sigmoidal(modelo.capaSalida.pesos.reduce((sum, peso, k) => sum + peso * capaOculta.map(neurona => neurona.activacion)[k], 0)); const error = datos[j].y - salida; modelo.capaSalida.pesos = modelo.capaSalida.pesos.map((peso, k) => peso + tasaAprendizaje * error * capaOculta.map(neurona => neurona.activacion)[k]); modelo.capaOculta.forEach((neurona, k) => { neurona.pesos = neurona.pesos.map((peso, l) => peso + tasaAprendizaje * error * modelo.capaSalida.pesos[k] * capaOculta[l].activacion * (1 - capaOculta[l].activacion) * datos[j].x[k]); }); } } }
Esta función toma el modelo, los datos, el número de épocas y la tasa de aprendizaje como argumentos. En cada época, recorremos todos los datos de entrenamiento y actualizamos los pesos del modelo según la retropropagación del error. Después de cada época, nuestro modelo debería ser capaz de clasificar mejor los números en función de si son mayores o menores que cero.
Paso 5: Evaluar el modelo Para evaluar nuestro modelo, podemos crear un conjunto de datos de prueba y ver cuántos de ellos clasifica correctamente. Podemos usar la siguiente función para hacer esto:
function evaluarModelo(modelo, datos) { let aciertos = 0; for (let i = 0; i < datos.length; i++) { const capaOculta = modelo.capaOculta.map(neurona => ({ activacion: sigmoidal(neurona.pesos.reduce((sum, peso, k) => sum + peso * datos[i].x[k], 0)) })); const salida = sigmoidal(modelo.capaSalida.pesos.reduce((sum, peso, k) => sum + peso * capaOculta.map(neurona => neurona.activacion)[k], 0)); const prediccion = Math.round(salida); if (prediccion === datos[i].y) { aciertos++; } } return aciertos / datos.length; }
Esta función toma el modelo y un conjunto de datos como argumentos y devuelve la proporción de clasificaciones correctas en el conjunto de datos. Podemos usar esta función para evaluar nuestro modelo después de cada época y ver cómo mejora su precisión.
Paso 6: Ejecutar el modelo Finalmente, podemos ejecutar nuestro modelo en un conjunto de datos nuevo y ver cómo se comporta. Podemos crear un nuevo conjunto de datos usando la función generarDatos
y usar la función evaluarModelo
para ver cuántos de los datos el modelo clasifica correctamente.
const datosNuevos = generarDatos(100); const precisionInicial = evaluarModelo(modelo, datosNuevos); entrenar(modelo, datos, 1000, 0.1); const precisionFinal = evaluarModelo(modelo, datosNuevos); console.log(`Precisión inicial: ${precisionInicial}`); console.log(`Precisión final: ${precisionFinal}`);
![AI JS](/newstech/sites/default/files/inline-images/aijs3.png)