# L'objectif est défini sur le jeu de données complet et fixe.
x = X.squeeze().astype(float)
y = y.astype(float)
# Erreur quadratique moyenne J.
def mse(theta0, theta1, x, y):
yhat = theta0 + theta1 * x
return np.mean((y - yhat) ** 2)
# Minimum exact des moindres carrés sur le jeu de données complet.
full_data_model = LinearRegression().fit(X, y)
theta_star = np.array([
full_data_model.intercept_,
full_data_model.coef_[0],
])
# Grille pour θ0∈[0,100] et θ1∈[0,20].
t0_vals = np.linspace(0, 100, 200)
t1_vals = np.linspace(0, 20, 200)
T0, T1 = np.meshgrid(t0_vals, t1_vals)
J = np.empty_like(T0, dtype=float)
for i in range(T0.shape[0]):
for j in range(T0.shape[1]):
J[i, j] = mse(T0[i, j], T1[i, j], x, y)
# Séquence illustrative de paramètres qui se termine au minimum.
traj = np.array([
(0.000, 0.000),
(10.000, 2.000),
(20.000, 4.000),
(30.000, 7.000),
theta_star,
])
traj_J = np.array([mse(t0, t1, x, y) for (t0, t1) in traj])
# À gauche : hypothèses choisies. À droite : leurs valeurs dans l'espace des paramètres.
fig = plt.figure(figsize=(12, 4.8))
# Panneau de gauche : hypothèses dans l'espace entrée-sortie
ax1 = fig.add_subplot(1, 2, 1)
order = np.argsort(x)
ax1.scatter(x, y, s=18, alpha=0.75, label="données")
ax1.axhline(y.mean(), color="gray", ls="--", lw=1, label=r"$\bar y$")
for k, (t0, t1) in enumerate(traj):
yline = t0 + t1 * x
ax1.plot(
x[order], yline[order],
lw=2 if k == len(traj) - 1 else 1.2,
alpha=1.0 if k == len(traj) - 1 else 0.85,
label=fr"$\theta_0={t0:.3f},\ \theta_1={t1:.3f}$"
)
ax1.set_xlabel("Durée de l'éruption (min)")
ax1.set_ylabel("Temps d'attente jusqu'à la prochaine éruption (min)")
ax1.set_title("Hypothèses choisies dans l'espace entrée-sortie")
ax1.legend(fontsize=8, loc="best")
# Panneau de droite : objectif dans l'espace des paramètres
ax2 = fig.add_subplot(1, 2, 2, projection='3d')
vmin = np.percentile(J, 5)
vmax = np.percentile(J, 95)
surf = ax2.plot_surface(
T0, T1, J, rstride=3, cstride=3,
cmap="viridis", linewidth=0, antialiased=False,
vmin=vmin, vmax=vmax, alpha=0.6
)
# Superposer la séquence illustrative.
ax2.plot(traj[:,0], traj[:,1], traj_J, color='crimson', marker='o', lw=2, label="séquence illustrative")
ax2.set_xlabel(r'$\theta_0$')
ax2.set_ylabel(r'$\theta_1$')
ax2.set_zlabel(r'$J(\theta)$ (EQM)')
ax2.set_title("Objectif dans l'espace des paramètres")
ax2.legend(loc="best", fontsize=8)
ax2.view_init(elev=30, azim=-60)
fig.colorbar(surf, ax=ax2, shrink=0.7, pad=0.05, label="EQM")
plt.tight_layout()
plt.show()