In [1]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from semana2_datos import *
Cargamos los cuatro conjuntos de datos como arreglos numpy. Los datos reales corresponden a mediciones verificadas con algún instrumento. En la práctica esto no se realiza frecuentemente, por lo que es necesario usar estadística para realizar predicciones.
Obsérvese que a las X's se les añade una columna con unos dado que asumimos $x_0 \equiv 1$. Esto con el fin de hacer regresión lineal más adelante.
In [2]:
X_1 = np.array([[1,x] for x, y in data_1])
Y_1 = np.array([y for x, y in data_1])
X_2 = np.array([[1,x] for x, y in data_2])
Y_2 = np.array([y for x, y in data_2])
X_3 = np.array([[1,x] for x, y in data_3])
Y_3 = np.array([y for x, y in data_3])
X_4 = np.array([[1,x] for x, y in data_4])
Y_4 = np.array([y for x, y in data_4])
X_real = np.array([[1,x] for x, y in data_real])
Y_real = np.array([y for x, y in data_real])
In [3]:
# data_1
x_1 = np.array([x for _, x in X_1])
plt.scatter(x_1, Y_1)
Out[3]:
In [6]:
# data_1
W_1 = np.matmul(np.matmul(np.linalg.inv(np.matmul(X_1.T,
X_1)), X_1.T), Y_1)
f1 = lambda X: W_1[1]*X + W_1[0]
print('Los pesos aprendidos son\nw0: {}\nw1: {}'.format(W_1[0], W_1[1]))
Ahora, graficamos la recta contra los datos de entrenamiento
In [5]:
# data_1
plt.scatter(x_1, Y_1)
lower = min(x_1)
upper = max(x_1)
sample_x1 = np.linspace(lower, upper, num=len(x_1))
plt.plot(sample_x1, f1(sample_x1), color='r')
Out[5]:
Ejercicios:
data_2, data_3 y data_4 usando el módulo correspondiente de Scikit-Learn.data_3 y data_4 deberán de aparecer en el mismo plano con distinción de color.
In [7]:
# Polynomial regression
x_1 = np.expand_dims(x_1, axis=1)
poly = PolynomialFeatures(3)
features = poly.fit_transform(x_1)
In [8]:
features.shape
Out[8]:
In [9]:
lin_reg = LinearRegression()
lin_reg.fit(features, Y_1)
Out[9]:
In [10]:
sample_x1 = np.expand_dims(sample_x1, axis=1)
In [11]:
sample_x1_poly = poly.fit_transform(sample_x1)
y1_poly = lin_reg.predict(sample_x1_poly)
plt.scatter(x_1, Y_1)
plt.plot(sample_x1, y1_poly, color='g')
Out[11]:
In [12]:
# Ridge para x_1
ridge = Ridge(alpha=2.5)
ridge.fit(features, Y_1)
Out[12]:
In [13]:
y1_ridge = ridge.predict(sample_x1_poly)
plt.scatter(x_1, Y_1)
plt.plot(sample_x1, y1_ridge, color='r')
Out[13]:
In [14]:
# Expected prediction
def E(f_x):
return float(sum(f_x)) / float(len(f_x))
In [15]:
x_real = np.array([x for _, x in X_real])
exp_pred_1 = E(f1(x_real))
avg_y_real = E(Y_real)
avg_y_real - exp_pred_1
Out[15]:
In [ ]:
# data 1
f1 = W_1[1]*sample_x1 + W_1[0]
f1_to_2 = f1 ** 2
E11 = E(f1_to_2)
E_f1 = E(f1)
E12 = E_f1 ** 2
In [ ]:
E11 - E12
In [ ]: