Deuxième exemple - Comparaison avec/sans contrainte
Cet exemple compare une spline cubique sans contrainte et une spline cubique avec contrainte de monotonie.
Le code complet
import numpy as np
from BsplineQuantRegpy import SplineCubicQuant
import matplotlib.pyplot as plt
print("test_basic_fit")
x = np.linspace(0, 1, 30)
#y = x + 0.5*np.sin(10*np.pi*x) + 0.05*np.random.randn(30)
y = x*(1-x) + 0.05*np.random.randn(30)
x_eval = np.linspace(0, 1, 100)
knots = np.quantile(x, np.linspace(0, 1, 6))
result = SplineCubicQuant(x, y, knots, tau=0.5)
y_eval = result(x_eval)
print(" test_monotonicity")
knots = np.quantile(x, np.linspace(0, 1, 6))
result_m = SplineCubicQuant(x, y, knots, tau=0.5, monot=1)
y_eval_m = result_m(x_eval)
plt.plot(x,y,"*r")
plt.plot(x_eval,y_eval,color='grey')
plt.plot(x_eval,y_eval_m,color='black')
plt.show()
Explication
Données : - 30 points sur l’intervalle [0, 1] - La fonction cible est \(x(1-x)\) avec du bruit
Deux ajustements : - Sans contrainte : Spline cubique standard (SplineCubicQuant sans paramètre de contrainte) - Avec contrainte : Spline cubique avec monot=1 (croissante)
Comparaison visuelle : - Points de données en rouge - Spline sans contrainte en gris - Spline avec contrainte en noir
Résultat
Le graphique montre comment la contrainte de monotonie force la courbe à rester croissante, contrairement à la spline sans contrainte qui peut présenter des oscillations.
Modification possible
Vous pouvez tester d’autres contraintes en modifiant le paramètre monot : - monot=-1 : décroissante - convex=1 : convexe - convex=-1 : concave