70. Funciones en inteligencia artificial

70.1 Introducción

La inteligencia artificial utiliza funciones para convertir datos en decisiones. Una función puede asignar una puntuación, clasificar una entrada, medir un error, activar una neurona artificial o elegir la mejor acción posible.

Aunque los sistemas modernos pueden ser muy complejos, muchas ideas básicas se entienden mejor como funciones que reciben información y devuelven un resultado calculado.

70.2 Entrada, función y salida

Un modelo de IA puede verse como una función: recibe datos de entrada y produce una salida.

salida = modelo(entrada)

function clasificadorSimple(edad) {
  return edad >= 18 ? "adulto" : "menor";
}

console.log(clasificadorSimple(16));
console.log(clasificadorSimple(22));

Este ejemplo no aprende por sí solo, pero muestra la estructura básica de una función de decisión.

70.3 Funciones de decisión

Una función de decisión transforma datos en una categoría o acción. Puede usar reglas simples o cálculos más elaborados.

function recomendarAccion(energia, peligro) {
  if (peligro > 70) {
    return "huir";
  }

  if (energia < 30) {
    return "descansar";
  }

  return "explorar";
}

console.log(recomendarAccion(80, 20));
console.log(recomendarAccion(20, 10));
console.log(recomendarAccion(90, 90));

70.4 Puntuación de opciones

En lugar de decidir directamente, una función puede asignar una puntuación a cada opción. Luego se elige la opción con mayor puntaje.

function puntuarProducto(producto) {
  return producto.calidad * 0.7 - producto.precio * 0.3;
}

const productos = [
  { nombre: "A", calidad: 90, precio: 40 },
  { nombre: "B", calidad: 75, precio: 20 },
  { nombre: "C", calidad: 95, precio: 80 }
];

const ordenados = [...productos].sort((a, b) => puntuarProducto(b) - puntuarProducto(a));
console.log("Mejor opción:", ordenados[0]);

70.5 Producto punto

Muchos modelos calculan una combinación ponderada de variables. El producto punto multiplica cada característica por un peso y suma los resultados.

function productoPunto(a, b) {
  let total = 0;

  for (let i = 0; i < a.length; i++) {
    total += a[i] * b[i];
  }

  return total;
}

const caracteristicas = [0.8, 0.4, 0.9];
const pesos = [2.0, -1.0, 1.5];

console.log(productoPunto(caracteristicas, pesos));

70.6 Modelo lineal

Un modelo lineal combina características con pesos y agrega un sesgo. Es una de las bases de muchos algoritmos de IA.

function modeloLineal(x, pesos, sesgo) {
  let total = sesgo;

  for (let i = 0; i < x.length; i++) {
    total += x[i] * pesos[i];
  }

  return total;
}

const entrada = [5, 2];
const pesos = [1.2, -0.7];
const sesgo = 0.5;

console.log(modeloLineal(entrada, pesos, sesgo));

70.7 Función escalón

La función escalón convierte un valor numérico en una decisión binaria. Fue una de las primeras ideas usadas en neuronas artificiales simples.

function escalon(valor) {
  return valor >= 0 ? 1 : 0;
}

console.log(escalon(-2.5));
console.log(escalon(0.1));

70.8 Función sigmoide

La sigmoide transforma cualquier número real en un valor entre 0 y 1. Puede interpretarse como una probabilidad aproximada.

function sigmoide(x) {
  return 1 / (1 + Math.exp(-x));
}

for (const valor of [-3, -1, 0, 1, 3]) {
  console.log(valor, sigmoide(valor).toFixed(4));
}

70.9 Clasificación binaria

Una clasificación binaria decide entre dos clases. Se puede usar una puntuación y un umbral.

function sigmoide(x) {
  return 1 / (1 + Math.exp(-x));
}

function clasificar(probabilidad, umbral) {
  return probabilidad >= umbral ? "positivo" : "negativo";
}

const puntuacion = 1.4;
const probabilidad = sigmoide(puntuacion);

console.log("Probabilidad:", probabilidad.toFixed(3));
console.log("Clase:", clasificar(probabilidad, 0.5));

70.10 Función de pérdida

Una función de pérdida mide qué tan lejos está una predicción del valor real. Entrenar un modelo consiste en reducir esa pérdida.

function errorCuadratico(real, predicho) {
  return (real - predicho) ** 2;
}

console.log(errorCuadratico(10, 8));
console.log(errorCuadratico(10, 9.5));

70.11 Error medio

Para evaluar varias predicciones se calcula el promedio de los errores individuales.

function errorCuadraticoMedio(reales, predichos) {
  let total = 0;

  for (let i = 0; i < reales.length; i++) {
    total += (reales[i] - predichos[i]) ** 2;
  }

  return total / reales.length;
}

const reales = [3, 5, 7];
const predichos = [2.8, 5.4, 6.5];

console.log(errorCuadraticoMedio(reales, predichos));

70.12 Ajuste de un peso

Un modelo aprende ajustando parámetros. En un ejemplo muy simple, un peso puede corregirse según el error de predicción.

function predecir(x, peso) {
  return x * peso;
}

function ajustarPeso(peso, x, real, tasaAprendizaje) {
  const predicho = predecir(x, peso);
  const error = real - predicho;
  return peso + tasaAprendizaje * error * x;
}

let peso = 0.5;

for (let i = 1; i <= 5; i++) {
  peso = ajustarPeso(peso, 2, 10, 0.05);
  console.log("Iteración", i, "peso:", peso.toFixed(4), "predicción:", predecir(2, peso).toFixed(4));
}

70.13 Vecino más cercano

Un método simple de clasificación es buscar el dato conocido más parecido al nuevo dato. La similitud puede medirse con distancia.

function distancia(a, b) {
  const dx = a.x - b.x;
  const dy = a.y - b.y;
  return Math.sqrt(dx * dx + dy * dy);
}

function vecinoMasCercano(punto, ejemplos) {
  return ejemplos.reduce((mejor, actual) => {
    return distancia(punto, actual) < distancia(punto, mejor) ? actual : mejor;
  });
}

const ejemplos = [
  { x: 1, y: 1, clase: "A" },
  { x: 8, y: 7, clase: "B" },
  { x: 2, y: 3, clase: "A" }
];

console.log(vecinoMasCercano({ x: 3, y: 2 }, ejemplos));

70.14 Similitud de textos simple

Una función puede comparar textos contando palabras compartidas. Es una idea básica detrás de algunos sistemas de búsqueda y recomendación.

function palabras(texto) {
  return texto.toLowerCase().split(/\s+/);
}

function similitudSimple(a, b) {
  const conjuntoA = new Set(palabras(a));
  const conjuntoB = new Set(palabras(b));
  let comunes = 0;

  for (const palabra of conjuntoA) {
    if (conjuntoB.has(palabra)) {
      comunes++;
    }
  }

  return comunes / Math.max(conjuntoA.size, conjuntoB.size);
}

console.log(similitudSimple("modelo de datos", "datos para modelo"));

70.15 Recomendación por puntuación

Un recomendador simple puede calcular una puntuación según preferencias del usuario y características de cada elemento.

function puntuarPelicula(usuario, pelicula) {
  return usuario.accion * pelicula.accion +
         usuario.comedia * pelicula.comedia +
         usuario.drama * pelicula.drama;
}

const usuario = { accion: 0.8, comedia: 0.2, drama: 0.5 };
const peliculas = [
  { titulo: "Rápida", accion: 1, comedia: 0, drama: 0.2 },
  { titulo: "Ligera", accion: 0.1, comedia: 1, drama: 0.1 },
  { titulo: "Intensa", accion: 0.4, comedia: 0, drama: 1 }
];

const recomendadas = [...peliculas].sort((a, b) => puntuarPelicula(usuario, b) - puntuarPelicula(usuario, a));
console.log(recomendadas[0]);

70.16 Funciones heurísticas

Una heurística estima qué tan buena es una opción sin explorar todas las posibilidades. Se usa en juegos, planificación y búsqueda de caminos.

function distanciaManhattan(a, b) {
  return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);
}

const posicion = { x: 2, y: 3 };
const meta = { x: 8, y: 5 };

console.log("Estimación:", distanciaManhattan(posicion, meta));

70.17 Elegir la mejor acción

Un agente puede evaluar acciones posibles y elegir la que tenga mayor utilidad.

function utilidad(accion) {
  return accion.recompensa - accion.riesgo * 2 - accion.costo;
}

const acciones = [
  { nombre: "atacar", recompensa: 10, riesgo: 4, costo: 1 },
  { nombre: "defender", recompensa: 5, riesgo: 1, costo: 1 },
  { nombre: "explorar", recompensa: 8, riesgo: 2, costo: 2 }
];

const mejor = [...acciones].sort((a, b) => utilidad(b) - utilidad(a))[0];
console.log(mejor.nombre, utilidad(mejor));

70.18 Softmax

Softmax convierte puntuaciones en una distribución de probabilidades. Las puntuaciones más altas reciben mayor probabilidad.

function softmax(valores) {
  const max = Math.max(...valores);
  const exponentes = valores.map(valor => Math.exp(valor - max));
  const suma = exponentes.reduce((total, valor) => total + valor, 0);
  return exponentes.map(valor => valor / suma);
}

console.log(softmax([1.2, 0.7, 2.1]));

70.19 Matriz de confusión simple

Para evaluar un clasificador binario se pueden contar aciertos y errores: verdaderos positivos, falsos positivos, verdaderos negativos y falsos negativos.

function matrizConfusion(reales, predichos) {
  const matriz = { vp: 0, fp: 0, vn: 0, fn: 0 };

  for (let i = 0; i < reales.length; i++) {
    if (reales[i] === 1 && predichos[i] === 1) matriz.vp++;
    if (reales[i] === 0 && predichos[i] === 1) matriz.fp++;
    if (reales[i] === 0 && predichos[i] === 0) matriz.vn++;
    if (reales[i] === 1 && predichos[i] === 0) matriz.fn++;
  }

  return matriz;
}

console.log(matrizConfusion([1, 0, 1, 0, 1], [1, 1, 1, 0, 0]));

70.20 Exactitud

La exactitud indica qué proporción de predicciones fueron correctas.

function exactitud(reales, predichos) {
  let aciertos = 0;

  for (let i = 0; i < reales.length; i++) {
    if (reales[i] === predichos[i]) {
      aciertos++;
    }
  }

  return aciertos / reales.length;
}

console.log(exactitud(["A", "B", "A"], ["A", "A", "A"]));

70.21 Funciones puras y pruebas

Las funciones usadas en IA conviene que sean fáciles de probar. Una función pura devuelve siempre el mismo resultado para la misma entrada y no modifica datos externos.

function normalizar(valor, minimo, maximo) {
  return (valor - minimo) / (maximo - minimo);
}

console.log(normalizar(50, 0, 100));
console.log(normalizar(50, 0, 100));

Esta propiedad facilita depurar modelos, métricas y transformaciones de datos.

70.22 Aplicaciones en programación

Las funciones en inteligencia artificial aparecen en:

  • Clasificadores de texto, imágenes o señales.
  • Sistemas de recomendación.
  • Agentes que eligen acciones.
  • Modelos predictivos.
  • Búsqueda de caminos y planificación.
  • Evaluación de modelos mediante métricas.

70.23 Errores comunes

Al programar funciones relacionadas con IA conviene evitar estos problemas:

  • Confundir una puntuación con una probabilidad.
  • Evaluar un modelo solo con un ejemplo.
  • Usar datos de entrenamiento como si fueran datos nuevos.
  • No normalizar variables con escalas muy distintas.
  • Interpretar una decisión del modelo sin revisar sus entradas.
  • Mezclar reglas del problema con código difícil de probar.

70.24 Conclusión

La inteligencia artificial puede entenderse como una combinación de funciones: algunas transforman datos, otras calculan puntuaciones, otras miden errores y otras toman decisiones.

Dominar estas funciones básicas ayuda a comprender mejor modelos más avanzados y a construir programas que razonan, recomiendan, clasifican o predicen de forma controlada.

Volver al índice