• Register

Vpliv parametra s pri scipy.interpolate.UnivariateSpline

+6 votes
168 views

Izmislil sem si funkcijo y in preizkušal vpliv parametra s pri aproksimaciji z UnivariateSpline. Dogaja se nekaj nenavadnega, namreč s moram močno povečati (50 000), da je opazna sprememba v gladkosti krivulje. Tudi število vozlov se ne spreminja, kot bi pričakovali. Zanima me, zakaj se gladkost ne spreminja že z zelo majhno spremembo s, kot se to dogaja v profesorjevi kodi (očitna razlika pri s=0, s=0.1, s=0.8...)

from scipy.interpolate import UnivariateSpline

x = np.linspace(0,15,40)
y = 0.5*x**3-6*x**2+2 - np.random.rand(len(x))*200
plt.plot(x,y,'ko')
s=[0,0.5,2,50000]
x_vec= np.linspace(0, 15, 200)

for i in s:
    krivulja = UnivariateSpline(x,y,k=3, s=i)
    plt.plot(x_vec,krivulja(x_vec),label=f's={i}')
    vozli = len(krivulja.get_knots())
    print(f'Število vozlov pri s = {i} je {vozli}')

plt.legend()

asked Apr 14, 2017 by kobalac (3,400 points)

1 Answer

+3 votes
 
Best answer

V vašem primeru gre za ponesrečeno izbiro podatkov.

Za lažje razumevanje si najprej poglejmo definicijo oz. omejitve parametra s:

sum((w[i] * (y[i]-spl(x[i])))**2, axis=0) <= s

Kot vidite gre za vsoto kvadratov razlik, zato bo velikost amplitude funkcije močno vplivala na vrednosti vsote kvadratov razlik. Če izberete majhno vrednost parametra s, potem bo potrebnih veliko zlepkov, da se vaši izbiri pogoja s zadosti, saj je vrednost s relativno majhna glede na podatke.

Kot ste ugotovili je ena od rešitev izbira dovolj velikega števila s, druga pa je, da vaše podatke ustrezno normirate na manjše vrednosti oz. spremenite funkcijo.

Podoben primer:
x = np.linspace(0,15,40)
y = 0.0005*x**3-0.006*x**2+2 - np.random.rand(len(x))*0.2
s=[0,0.1,0.5​]
 
 

 

Lahko si pomagate tudi z utežjo w. Primer:

for i in s:
    krivulja = UnivariateSpline(x,y,k=3, s=i, w=1/1000*np.ones_like(y))
    plt.plot(x_vec,krivulja(x_vec),label=f's={i}')
    vozli = len(krivulja.get_knots())
    print(f'Število vozlov pri s = {i} je {vozli}')

plt.legend()

Kar za vašo prvotno krivuljo vrne:

 

answered Apr 14, 2017 by Luka Knez (3,600 points)
selected Apr 14, 2017 by dgorjup
...