• Register

optimize.curve_fit ne aproksimira podatkov dobro

+6 votes
589 views

Množico točk želim aproksimirati z eksponentno funkcijo s pomočjo scipy.optimize.curve_fit, vendar se na noben način noče prilegati podatkom.

Koda:

sol = np.array(
[[ 1,0],
[ 1.01980832,  0.39481252],
[ 1.07890065,  0.78768961],
[ 1.17764629,  1.18948508],
[ 1.31737599,  1.60853543],
[ 1.50011402,  2.05028766],
[ 1.72825805,  2.51662497],
[ 2.00417572,  3.00486913],
[ 2.32968483,  3.50645203],
[ 2.70538475,  4.00527984]])

plt.plot(sol[:, 0], sol[:, 1], 'ro')

def aprox(x, a, b, c):
    return a * b**x + c

p0 = np.array([4, 2.2, -4]) 
popt, pcov = curve_fit(aprox, sol[:, 0], sol[:, 1], p0, maxfev=10000)
res = aprox(x,popt[0], popt[1], popt[2])
plt.plot(sol[:, 0], res)
asked Jan 3, 2016 by Nik Mohorko (300 points)

1 Answer

+2 votes
 
Best answer

Vaši podatki, ne delujejo kot eksponentna funkcija, ampak kot logaritemska funkcija. Ste mogoče zamenjali x in y os (plt.plot(sol[:, 0], sol[:, 1], 'ro'))?

EDIT: Odgovor na komentar

Poizkusite z katero drugo funkcijo za aproksimacijo. Npr. tale bolj spominja na logaritem:

def aprox(x, a, b, c):
    return a*(x**b) + c

Sicer pa probajte še z kakšno drugo funkcijo, npr. z kubičnimi zlepki.

answered Jan 3, 2016 by blaz (41,550 points)
selected Jan 5, 2016 by blaz
x in y osi sta ok, je pa res bolj podobno logaritemski . Sem probal še s to in je podoben rezultat. Se mi zdi da je problem v tem, da bi moral v funkcijo curve_fit podati bolj natančen initial guess za parametre, ampak nevem kako bi jih dobil.
sem odgovoril na komentar
...