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

examples/quick_start2.py
    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

  1. Données : - 30 points sur l’intervalle [0, 1] - La fonction cible est \(x(1-x)\) avec du bruit

  2. Deux ajustements : - Sans contrainte : Spline cubique standard (SplineCubicQuant sans paramètre de contrainte) - Avec contrainte : Spline cubique avec monot=1 (croissante)

  3. 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