01 · Un objetivo diferente
Cuando no conviene atravesar todos los puntos
Interpolar exige que el modelo pase exactamente por cada dato. Esa condición es apropiada cuando los valores son exactos, pero las mediciones reales suelen contener ruido, redondeo o variaciones que el modelo no pretende explicar.
El ajuste busca una función sencilla que se acerque al conjunto completo. Para un modelo ŷ=f(x;θ), la diferencia vertical en el dato i es el residuo:
02 · Función objetivo
Por qué minimizar cuadrados
El criterio de mínimos cuadrados ordinarios es:
Elevar al cuadrado aporta tres propiedades útiles:
- los errores positivos y negativos no se cancelan;
- los residuos grandes reciben una penalización mayor;
- la función objetivo es derivable y, para modelos lineales en sus parámetros, conduce a un problema algebraico.
La última propiedad hace que el método sea eficiente. La segunda también explica su principal debilidad: un valor atípico puede ejercer mucha influencia.
03 · Modelo más simple
Ajustar una recta
Supongamos que queremos representar los datos mediante:
El parámetro a es la ordenada al origen y b es la pendiente. La función objetivo queda:
Un mínimo interior debe satisfacer que ambas derivadas parciales sean cero:
∂SSE/∂b=−2Σxᵢ[yᵢ−a−bxᵢ]=0
Al reorganizar aparecen las ecuaciones normales.
04 · Derivación
Las ecuaciones normales de la recta
aΣxᵢ+bΣxᵢ²=Σxᵢyᵢ
Podríamos resolver este sistema de dos ecuaciones. Sin embargo, al introducir las medias x̄ e ȳ obtenemos fórmulas más interpretables:
a = ȳ−bx̄
El numerador de b mide cómo varían juntas x e y; el denominador mide la variación de x. Si todos los valores de x son iguales, no existe una pendiente identificable.
05 · Cálculo manual
Una recta para cuatro mediciones
Tomemos los puntos (1,2), (2,3), (3,5) y (4,4). Sus medias son x̄=2.5 e ȳ=3.5.
| xᵢ | yᵢ | ŷᵢ=1.5+0.8xᵢ | rᵢ=yᵢ−ŷᵢ |
|---|---|---|---|
| 1 | 2 | 2.3 | −0.3 |
| 2 | 3 | 3.1 | −0.1 |
| 3 | 5 | 3.9 | 1.1 |
| 4 | 4 | 4.7 | −0.7 |
b=4/5=0.8, a=3.5−0.8·2.5=1.5
La recta ajustada es ŷ=1.5+0.8x. No atraviesa todos los puntos, pero sus parámetros minimizan el error cuadrático total.
06 · Condiciones del óptimo
Los residuos quedan equilibrados
Las dos ecuaciones obtenidas al derivar también pueden escribirse:
La primera dice que los residuos positivos y negativos suman cero. La segunda dice que no conservan una tendencia lineal con x. Geométricamente, el vector de residuos es perpendicular a las columnas utilizadas por el modelo.
Estas propiedades son comprobaciones útiles, pero no demuestran por sí solas que la recta sea un modelo adecuado. Un gráfico de residuos puede revelar curvatura, cambios de variabilidad o valores atípicos.
07 · Evaluar el ajuste
SSE, MSE, RMSE y R²
| Métrica | Definición | Interpretación |
|---|---|---|
| SSE | Σrᵢ² | Error cuadrático total; depende de la cantidad de datos. |
| MSE | SSE/m | Error cuadrático medio descriptivo. |
| RMSE | √MSE | Error típico en las mismas unidades que y. |
| R² | 1−SSE/SST | Fracción de variabilidad explicada respecto de usar ȳ. |
En el ejemplo, SSE=1.8, RMSE=√(1.8/4)≈0.671, SST=5 y R²=1−1.8/5=0.64.
08 · Implementación directa
Regresión lineal simple en JavaScript
function ajustarRecta(puntos) {
if (puntos.length < 2) throw new Error("Faltan datos");
const n = puntos.length;
const mediaX = puntos.reduce((s, [x]) => s + x, 0) / n;
const mediaY = puntos.reduce((s, [, y]) => s + y, 0) / n;
let numerador = 0;
let denominador = 0;
for (const [x, y] of puntos) {
numerador += (x - mediaX) * (y - mediaY);
denominador += (x - mediaX) ** 2;
}
if (denominador === 0) throw new Error("Todos los valores x son iguales");
const b = numerador / denominador;
const a = mediaY - b * mediaX;
const residuos = puntos.map(([x, y]) => y - (a + b * x));
const sse = residuos.reduce((s, r) => s + r * r, 0);
const sst = puntos.reduce((s, [, y]) => s + (y - mediaY) ** 2, 0);
return {
a, b, residuos, sse,
rmse: Math.sqrt(sse / n),
r2: sst === 0 ? (sse === 0 ? 1 : NaN) : 1 - sse / sst,
predecir: x => a + b * x
};
}
const modelo = ajustarRecta([[1, 2], [2, 3], [3, 5], [4, 4]]);
console.log(modelo.a, modelo.b, modelo.sse, modelo.r2);
// 1.5 0.8 1.8 0.64
Centrar las fórmulas alrededor de las medias evita restar sumas muy grandes y suele ser más estable que aplicar literalmente las ecuaciones normales escalares.
09 · Generalización
El problema matricial
Muchos modelos pueden escribirse como una combinación lineal de funciones conocidas:
Al colocar cada función base en una columna de la matriz de diseño A, obtenemos:
En una recta, las columnas son 1 y x. Para un polinomio de grado p, son 1,x,x²,…,xᵖ. En regresión múltiple pueden representar distintas variables de entrada.
La condición de perpendicularidad del residuo produce:
Estas son las ecuaciones normales generales.
10 · Cálculo confiable
Resolver sin empeorar el condicionamiento
Formar AᵀA es cómodo, pero aproximadamente eleva al cuadrado el número de condición de A. Si las columnas tienen escalas muy diferentes o casi dependen unas de otras, los coeficientes pueden perder precisión.
- QR: factoriza
A=QRy resuelveRc=Qᵀy; es la opción general habitual. - SVD: es más costosa, pero diagnostica rango deficiente y maneja problemas muy sensibles.
- Ecuaciones normales: pueden ser suficientes en problemas pequeños y bien condicionados, pero no deberían ser la elección automática.
11 · Ajuste polinómico
Una implementación educativa mediante QR
El siguiente código usa Gram-Schmidt modificado. Es adecuado para experimentar con pocos grados; bibliotecas numéricas profesionales emplean variantes más robustas basadas en reflexiones de Householder.
function minimosCuadradosQR(A, y) {
const m = A.length;
const n = A[0].length;
if (m < n) throw new Error("Se requieren al menos tantas filas como columnas");
const columnas = Array.from({ length: n }, (_, j) =>
A.map(fila => fila[j]));
const Q = Array.from({ length: n }, () => Array(m).fill(0));
const R = Array.from({ length: n }, () => Array(n).fill(0));
for (let j = 0; j < n; j++) {
const v = columnas[j].slice();
for (let i = 0; i < j; i++) {
R[i][j] = Q[i].reduce((s, q, k) => s + q * columnas[j][k], 0);
for (let k = 0; k < m; k++) v[k] -= R[i][j] * Q[i][k];
}
R[j][j] = Math.hypot(...v);
if (R[j][j] < 1e-12) throw new Error("Columnas dependientes");
Q[j] = v.map(valor => valor / R[j][j]);
}
const z = Q.map(columna =>
columna.reduce((s, q, i) => s + q * y[i], 0));
const c = Array(n).fill(0);
for (let i = n - 1; i >= 0; i--) {
let suma = z[i];
for (let j = i + 1; j < n; j++) suma -= R[i][j] * c[j];
c[i] = suma / R[i][i];
}
return c;
}
function ajustarPolinomio(puntos, grado) {
if (!Number.isInteger(grado) || grado < 0) throw new Error("Grado inválido");
const A = puntos.map(([x]) =>
Array.from({ length: grado + 1 }, (_, j) => x ** j));
const c = minimosCuadradosQR(A, puntos.map(([, y]) => y));
return {
coeficientes: c,
predecir: x => c.reduceRight((valor, coef) => coef + x * valor, 0)
};
}
const parabola = ajustarPolinomio([[-1, 2], [0, 1], [1, 2], [2, 5]], 2);
console.log(parabola.coeficientes); // aproximadamente [1, 0, 1]
12 · Complejidad del modelo
Más grado siempre reduce SSE, pero no siempre mejora
Al agregar una columna a la matriz de diseño, el modelo anterior sigue siendo una posibilidad poniendo el coeficiente nuevo en cero. Por eso el SSE de entrenamiento no puede aumentar al subir el grado.
Esto no implica que las predicciones sean mejores. Un polinomio demasiado flexible puede aprender fluctuaciones particulares de la muestra: es sobreajuste.
- Separá datos de entrenamiento y validación.
- Compará el error fuera de la muestra, no solo el SSE usado para ajustar.
- Preferí el modelo más simple que capture la estructura relevante.
- No extrapoles polinomios de grado alto sin una justificación fuerte.
13 · Diagnóstico
Qué buscar en los residuos
Mínimos cuadrados ordinarios describe bien una relación cuando la forma media está representada por el modelo y los errores se comportan razonablemente. Un gráfico de residuos contra predicciones o contra x ayuda a detectar:
- curvatura: falta un término o la familia del modelo es incorrecta;
- forma de embudo: la variabilidad cambia con el nivel;
- grupos: puede faltar una variable explicativa;
- puntos aislados: posibles valores atípicos o mediciones erróneas;
- secuencias: los errores pueden estar correlacionados en el tiempo.
Si las observaciones tienen precisiones conocidas y diferentes, se usan mínimos cuadrados ponderados. Si preocupan los valores atípicos, existen pérdidas robustas que penalizan menos los residuos extremos.
14 · Exploración interactiva
Laboratorio: grado, ruido y valores atípicos
Cambiá el grado del polinomio y desplazá el punto resaltado. La curva turquesa es el ajuste; la línea coral sobre cada muestra representa su residuo vertical.
Ajustar la tendencia sin perseguir cada punto
grado 1 · 11 datos
Una recta resume la tendencia sin atravesar todas las observaciones.
Preguntas para explorar
- Desplazá el punto resaltado y observá cuánto gira una recta por un único residuo grande.
- En la tendencia cuadrática, compará los grados uno y dos.
- Aumentá el grado hasta seis: el SSE baja, pero examiná las curvas cerca de los extremos.
- Buscá un caso donde R² mejore mientras la forma del ajuste se vuelve menos razonable.
15 · Comprensión
Confusiones frecuentes
«El mejor ajuste pasa por la mayor cantidad de puntos»
El criterio minimiza la suma de cuadrados. Una recta puede no atravesar ninguna muestra y aun así ser la óptima dentro de su familia.
«Los residuos son errores de programación»
Son diferencias entre observaciones y predicciones. Pueden representar ruido, variables omitidas o una forma de modelo incompleta.
«R²=0.9 significa 90 % de precisión»
R² compara variabilidad explicada con un modelo constante; no es un porcentaje universal de exactitud.
«El mayor grado con el menor SSE es siempre preferible»
El SSE de entrenamiento favorece modelos flexibles. La validación y el conocimiento del problema ayudan a elegir complejidad.
«Hay que calcular la inversa de AᵀA»
No. Resolver mediante QR o SVD suele ser más estable y evita formar una inversa innecesaria.
16 · Práctica guiada
Ejercicios
Ejercicio 1: residuo
Para el modelo ŷ=2+3x y el dato (2,9), calculá el residuo.
Ver solución
La predicción es ŷ=2+3·2=8. Entonces r=y−ŷ=9−8=1.
Ejercicio 2: propiedad de la media
Una recta con intercepto tiene x̄=4, ȳ=10 y pendiente b=1.5. Calculá a.
Ver solución
a=ȳ−bx̄=10−1.5·4=4.
Ejercicio 3: métricas
Si los residuos son [1,−2,1], calculá SSE y RMSE.
Ver solución razonada
SSE=1²+(−2)²+1²=6 y RMSE=√(6/3)=√2≈1.414.
Ejercicio 4: matriz de diseño
Escribí la fila de la matriz de diseño para x=2 en un polinomio de grado tres.
Ver solución
Las funciones base son 1,x,x²,x³, por lo que la fila es [1,2,4,8].
Ejercicio 5: residuos equilibrados
Comprobá con JavaScript que los residuos del ejemplo suman aproximadamente cero.
Ver una posible solución
const puntos = [[1, 2], [2, 3], [3, 5], [4, 4]];
const a = 1.5;
const b = 0.8;
const residuos = puntos.map(([x, y]) => y - (a + b * x));
const suma = residuos.reduce((acumulado, r) => acumulado + r, 0);
const sumaPonderada = residuos.reduce((acumulado, r, i) =>
acumulado + puntos[i][0] * r, 0);
console.log(residuos);
console.log(suma, sumaPonderada);
// [-0.3, -0.1, 1.1, -0.7]
// valores cercanos a 0 por el redondeo binario
17 · Síntesis
Ideas para recordar
- Ajustar aproxima una tendencia; interpolar obliga a atravesar todos los datos.
- Un residuo es la observación menos la predicción.
- Mínimos cuadrados minimiza la suma de residuos al cuadrado.
- La recta ajustada con intercepto pasa por el punto de medias.
- En el óptimo, los residuos son ortogonales a las columnas del modelo.
- RMSE conserva las unidades de la variable observada.
- R² necesita contexto y no demuestra causalidad ni capacidad de extrapolación.
- QR y SVD son preferibles a invertir las ecuaciones normales.
- Menor error de entrenamiento no garantiza mejor generalización.
En el próximo tema utilizaremos valores discretos para aproximar otra operación fundamental: la diferenciación numérica.