¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Ajustar una recta por mínimos cuadrados

Después de esta lección: Puedo ajustar una recta a unos puntos minimizando el error cuadrático medio.

Lección de 70 min2 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

Ajustar una recta es buscar la más cercana

Ajustar una recta a unos puntos es buscar la recta que queda más cerca de todos ellos. El método de mínimos cuadrados mide esa cercanía sumando el cuadrado de cada error.

Es el modelo de aprendizaje automático más sencillo, y se resuelve con el descenso del gradiente de la lección anterior.

Al final de esta lección

Nota

Puedo ajustar una recta a unos puntos minimizando el error cuadrático medio.

Palabras clave

PalabraQué significaEjemplo
Recta de ajustela recta w * x + b que mejor sigue a los puntos
Errorlo que predice la recta menos el dato real
Error cuadrático mediola media de los errores al cuadrado
Mínimos cuadradosbuscar la recta de menor error cuadrático medio
Parámetroun número que el modelo ajustaw, b

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El error cuadrático medio mide el mal ajuste

Para cada punto, el error es lo que predice la recta menos el dato real. Se eleva al cuadrado para que ningún error negativo anule a uno positivo, y para que los errores grandes pesen más.

La media de esos cuadrados es el error cuadrático medio. Cuanto menor, mejor ajusta la recta.

Ejemplo resuelto: el error de una recta

Semana xPedidos yRecta 0,6 * x + 2,2ErrorError al cuadrado
122,80,80,64
243,4-0,60,36
354,0-1,01,00
444,60,60,36
555,20,20,04
Media0,48

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

El descenso ajusta dos números a la vez

Los números que se mueven son dos: la pendiente w y la ordenada b. El error es una función de los dos, así que usas el gradiente de la lección 3.

Cada paso corrige w y b a la vez, en contra de su derivada parcial. La de w es 2 por la media de error por x. La de b es 2 por la media del error.

Ajusta la recta con el descenso

Código: python
# Pedidos semanales, en decenas, de las cinco primeras semanas.
semanas = [1, 2, 3, 4, 5]
pedidos = [2, 4, 5, 4, 5]

w = 0.0
b = 0.0
tasa = 0.02
n = len(semanas)

for paso in range(5000):
    grad_w = 0
    grad_b = 0
    for i in range(n):
        error = w * semanas[i] + b - pedidos[i]
        grad_w = grad_w + 2 * error * semanas[i] / n
        grad_b = grad_b + 2 * error / n
    w = w - tasa * grad_w
    b = b - tasa * grad_b

print("w:", round(w, 2), "b:", round(b, 2))
# Cambia 5000 por 50 y ejecuta otra vez.
# ¿Qué pasa con w y con b?

Ejemplo resuelto: cuántos pasos hacen falta

PasoswbQué ves
10,530,16Apenas ha empezado
500,970,85Va en camino, pero w pasa de 0,6
5000,622,14Casi ha llegado
50000,62,2Ya no cambia

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error muy común

Advertencia

Mucha gente cree que el descenso da una recta distinta a la fórmula exacta. Con una tasa adecuada y pasos de sobra llega al mismo resultado. Si no coinciden, hay pocos pasos o la tasa es mala.

Para una recta existe una respuesta exacta

Para cada punto, mide cuánto se aleja x de su media y cuánto se aleja y de la suya. La pendiente es la suma de esos dos alejamientos multiplicados, dividida entre la suma de los de x al cuadrado.

La ordenada es la media de y menos la pendiente por la media de x. Con los pedidos, la suma de productos es 6 y la de cuadrados, 10. Entonces w es 0,6 y b es 4 - 0,6 * 3 = 2,2.

La recta exacta de los cinco puntos

Comando
docker exec jupyter python3 -c "import numpy as np; print(np.polyfit([1,2,3,4,5],[2,4,5,4,5],1).round(3))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una recta con los días de lluvia

Comando
docker exec jupyter python3 -c "import numpy as np,csv; d=[r for r in csv.DictReader(open('hires.csv')) if r['weather']=='rainy']; x=[float(r['rain_mm']) for r in d]; y=[float(r['hires']) for r in d]; print(len(d), np.polyfit(x,y,1).round(1))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos: cambia la tasa

En el código del ajuste, prueba la tasa 0.1 con 5000 pasos. Antes de ejecutar, escribe qué esperas: llegar, ir más lento o divergir.

Después busca la tasa más alta con la que todavía llegas a w = 0,6 y b = 2,2.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.