Referencia: Chapra 17.1.2 p 469. Burden 8.1 p499
Criterio de ajuste a una línea recta por mínimos cuadrados
Una aproximación de la relación entre los puntos xi, yi por medio de un polinomio de grado 1, busca minimizar la suma de los errores residuales de los datos.
Se busca el valor mínimo para los cuadrados de las diferencias entre los valores de yi con la línea recta.
para que el error acumulado sea mínimo, se deriva respecto a los coeficientes de la recta a0 y a1 y se iguala a cero,
simplificando,
que es un conjunto de dos ecuaciones lineales simultaneas con dos incógnitas a0 y a1, los coeficientes del sistema de ecuaciones son las sumatorias que se obtienen completando la siguiente tabla:
xi | yi | xiyi | xi2 | yi2 |
---|---|---|---|---|
x0 | y0 | x0y0 | x02 | y02 |
… | … | |||
… | … | |||
∑ xi | ∑ yi | ∑ xiyi | ∑ xi2 | ∑ yi2 |
cuya solución es:
usando la media de los valores en cada eje para encontrar a0
Coeficiente de correlación
El coeficiente de correlación se puede obtener con las sumatorias anteriores usando la siguiente expresión:
En un ajuste perfecto, Sr = 0 y r = r2 = 1, significa que la línea explica
el 100% de la variabilidad de los datos.
Aunque el coeficiente de correlación ofrece una manera fácil de medir la bondad del ajuste, se deberá tener cuidado de no darle más significado del que ya tiene.
El solo hecho de que r sea “cercana” a 1 no necesariamente significa que el ajuste sea “bueno”. Por ejemplo, es posible obtener un valor relativamente alto de r cuando la relación entre y
y x
no es lineal.
Los resultados indicarán que el modelo lineal explicó r2 % de la incertidumbre original
Algoritmo en Python
Siguiendo con los datos propuestos del ejemplo en Chapra 17.1 p470:
xi = [1, 2, 3, 4, 5, 6, 7] yi = [0.5, 2.5, 2., 4., 3.5, 6, 5.5]
Aplicando las ecuaciones para a0 y a1 se tiene el siguiente resultado para los datos de prueba:
f = 0.839285714285714*x + 0.0714285714285712 coef_correlación r = 0.9318356132188194 coef_determinación r2 = 0.8683176100628931 86.83% de los datos está descrito en el modelo lineal >>>
con las instrucciones:
# mínimos cuadrados, regresión con polinomio grado 1 import numpy as np import sympy as sym import matplotlib.pyplot as plt # INGRESO xi = [1, 2, 3, 4, 5, 6, 7] yi = [0.5, 2.5, 2., 4., 3.5, 6, 5.5] # PROCEDIMIENTO xi = np.array(xi,dtype=float) yi = np.array(yi,dtype=float) n = len(xi) # sumatorias y medias xm = np.mean(xi) ym = np.mean(yi) sx = np.sum(xi) sy = np.sum(yi) sxy = np.sum(xi*yi) sx2 = np.sum(xi**2) sy2 = np.sum(yi**2) # coeficientes a0 y a1 a1 = (n*sxy-sx*sy)/(n*sx2-sx**2) a0 = ym - a1*xm # polinomio grado 1 x = sym.Symbol('x') f = a0 + a1*x fx = sym.lambdify(x,f) fi = fx(xi) # coeficiente de correlación numerador = n*sxy - sx*sy raiz1 = np.sqrt(n*sx2-sx**2) raiz2 = np.sqrt(n*sy2-sy**2) r = numerador/(raiz1*raiz2) # coeficiente de determinacion r2 = r**2 r2_porcentaje = np.around(r2*100,2) # SALIDA # print('ymedia =',ym) print(' f = ',f) print('coef_correlación r = ', r) print('coef_determinación r2 = ', r2) print(str(r2_porcentaje)+'% de los datos') print(' está descrito en el modelo lineal') # grafica plt.plot(xi,yi,'o',label='(xi,yi)') # plt.stem(xi,yi,bottom=ym,linefmt ='--') plt.plot(xi,fi, color='orange', label=f) # lineas de error for i in range(0,n,1): y0 = np.min([yi[i],fi[i]]) y1 = np.max([yi[i],fi[i]]) plt.vlines(xi[i],y0,y1, color='red', linestyle ='dotted') plt.legend() plt.xlabel('xi') plt.title('minimos cuadrados') plt.show()
Coeficiente de correlación con Numpy
Tambien es posible usar la librería numpy para obtener el resultado anterior,
>>> coeficientes = np.corrcoef(xi,yi) >>> coeficientes array([[1. , 0.93183561], [0.93183561, 1. ]]) >>> r = coeficientes[0,1] >>> r 0.9318356132188195