Regresión Lineal en Python

La regresión lineal es un método que hace ajuste a un hiperplano afín respectivo. En el caso 2D se tiene una linea recta y es el que se va a presentar en este articulo.

$${\large \begin{equation*} Y = \beta_{0} + \beta_{1}X_{1} + \beta_{2}X_{2} + \cdots +\beta_{n}X_{n} \end{equation*}}$$

Donde $\beta_{0}, \beta_{1}, \beta_{2}, \cdots ,\beta_{n}$ son los parámetros de la regresión lineal para un hiperplano afín

Ahora trataremos la regresión lineal por medio de dos casos correspondientes por medio de la siguiente data que se muestra a continuación:

 N de Datos  Datos $X$  Datos $Y$  Datos $X^2$  Datos $X \cdot Y$ 
Dato 104.7500
Dato 214.614.6
Dato 324.448.8
Dato 434912
Dato 543.851615.4
Dato 663.53621
Dato 773.14921.7
Dato 8938127
Dato 9152.522537.5
Dato 1022248444
$\sum$6935.7905192


También se puede definir un coeficiente llamado coeficiente de correlación lineal el cual tiene la finalidad de medir el grado de relación de las dos variables correspondiente. La ecuación del coeficiente de correlación lineal es igual a:

$$ {\large \begin{equation*} \rho = \frac{Cov(X, Y)}{\sqrt{Var(X)} \cdot \sqrt{Var(Y)}} \end{equation*} }$$

Donde el coeficiente de correlación lineal tiene un rango de valores $[-1, 1]$
  • Si $\rho = 1$ hay correlación lineal positiva perfecta
  • Si $0 < \rho  < 1$ hay correlación lineal positiva
  • Si $\rho = 0$ no hay correlación lineal positiva 
  • Si $ -1 < \rho < 0$ hay correlación lineal negativa
  • Si $\rho = -1$ hay correlación lineal negativa perfecta

Regresión Lineal de un Conjunto de Puntos (X, Y)


Regresión Lineal por Mínimos Cuadrados


El método de mínimos cuadrados es una técnica del análisis numérico que nos permite realizar una regresión lineal de un conjunto de puntos determinados. Si tratamos el método de mínimos cuadrados en un plano entonces la regresión seria una recta que tiene por ecuación y = mx + b respectivamente. 

Ahora para calcular la pendiente y el intercepto de la recta se hace usa de las ecuaciones que nos brinda el método de los mínimos cuadrados las cuales son las siguientes:

$${\large \begin{align*} m &= \frac{\sum X \sum Y - N\sum (X \cdot Y)}{(\sum X )^2 - N\sum X^2} \\ \\ b &= \frac{\sum X \sum (X \cdot Y) - \sum Y \sum X^2}{(\sum X )^2 - N\sum X^2} \end{align*} }$$

Donde X representan a los puntos en las abscisas y Y representan a los puntos de las ordenadas respectivamente. Por consiguiente la ecuación de la recta por el método de los mínimos cuadrados esta dada por la siguiente ecuación

$${\large \begin{equation*} y = \left( \frac{\sum X \sum Y - N\sum (X \cdot Y)}{(\sum X )^2 - N\sum X^2} \right)x +   \frac{\sum X \sum (X \cdot Y) - \sum Y \sum X^2}{(\sum X )^2 - N\sum X^2} \end{equation*} }$$

Código Fuente Para La Regresión Lineal por Mínimos Cuadrados

import numpy as np
import matplotlib.pyplot as plt

fig=plt.figure(figsize=(12,6))

X = np.array([0, 1, 2, 3, 4, 6, 7, 9, 15, 22])
Y = np.array([4.75, 4.6, 4.4,  4,  3.85, 3.5, 3.1, 3, 2.5, 2])

N = len(X)
prom_X=np.mean(X)
prom_Y=np.mean(Y)
sum_X = np.sum(X)
pot_X = np.sum(X*X)
sum_Y = np.sum(Y)
prod_XY = np.sum(X*Y)
VarX = np.sqrt(np.sum( (X - prom_X)**2 ))
VarY = np.sqrt(np.sum( (Y - prom_Y)**2 ))
Cov_X_Y = np.sum( (X-prom_X)*(Y-prom_Y) )

m = (sum_X*sum_Y - N*prod_XY)/((sum_X)**2 - N*pot_X)
b = (sum_X*prod_XY - pot_X*sum_Y)/((sum_X)**2 - N*pot_X)
r = Cov_X_Y / (VarX * VarY)

Z = m*X + b 

print("La pendiente es igual a: {}".format(m))
print("El intercepto es igual a: {}".format(b))
print("El coeficiente de correlación lineal es igual a: {}".format(r))

plt.title("Regresión Lineal por Mínimos Cuadrados", fontsize=20)
plt.xlabel("Eje X", fontsize=20)
plt.ylabel("Eje Y", fontsize=20)
plt.plot(X,Y, 'ro', markersize=10)
plt.plot(X,Z, color='k', lw=2, label="Y = {:.3f}X + {:.3f}".format(m,b))
plt.legend(loc='best', fontsize=15)

plt.show()

Regresión Lineal por Mínimos Cuadrados para la Data.



Regresión Lineal por el Método Matricial

La regresión lineal por el método matricial es un caso particular de la regresión polinómica en el cual la matriz de Vandermonde tiene solo dos columnas correspondientes debido a que la recta de la regresión lineal pide calcular dos parámetros correspondientes los cuales son la pendiente de la recta y el intercepto de la recta respectivamente.

$${\large \begin{align*} Y &= M \cdot C \\ \begin{bmatrix} Y_{1} \\ Y_{2} \\ Y_{3} \\ \vdots \\ Y_{n} \end{bmatrix} &= \begin{bmatrix} 1 & X_{1} \\ 1 & X_{2} \\ 1 & X_{3} \\ \vdots & \vdots \\ 1 & X_{n} \end{bmatrix} \cdot \begin{bmatrix} b \\ m \end{bmatrix} \end{align*}}$$

Donde: 
b es el intercepto de la recta.
m es la pendiente de la recta.

Para obtener los parámetros de la regresión lineal se hace uso del algebra lineal.

$${\large \begin{align*} Y &= M \cdot C \\ M^{t} \cdot Y &= M^{t} \cdot M \cdot C \\ C &= (M^{t} \cdot M)^{-1} \cdot M^{t} \cdot Y \end{align*} }$$

Código Fuente Para La Regresión Lineal por el Método Matricial

import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import inv

fig=plt.figure(figsize=(12,6))

X = np.array([0, 1, 2, 3, 4, 6, 7, 9, 15, 22])
Y = np.array([4.75, 4.6, 4.4,  4,  3.85, 3.5, 3.1, 3, 2.5, 2])

M = np.vander(X, 2, increasing=True)
Mt = np.transpose(M)
I = inv(np.dot(Mt, M))
prom_X=np.mean(X)
prom_Y=np.mean(Y)
VarX = np.sqrt(np.sum( (X - prom_X)**2 ))
VarY = np.sqrt(np.sum( (Y - prom_Y)**2 ))
Cov_X_Y = np.sum( (X-prom_X)*(Y-prom_Y) )

C = np.dot(np.dot(I , Mt), Y)
Z = C[1]*X + C[0]
r = Cov_X_Y / (VarX * VarY)

print("La pendiente es igual a: {}".format(C[1]))
print("El intercepto es igual a: {}".format(C[0]))
print("El coeficiente de correlación lineal es igual a: {}".format(r))
plt.title("Regresión Lineal por el Método Matricial", fontsize=20)
plt.xlabel("Eje X", fontsize=20)
plt.ylabel("Eje Y", fontsize=20)
plt.plot(X,Y, 'ro', markersize=10)
plt.plot(X,Z, color='k', lw=2, label="Y = {:.3f}X + {:.3f}".format(C[1],C[0]))
plt.legend(loc='best', fontsize=15)

plt.show()

Regresión Lineal por el Método Matricial para la Data.



Comentarios