2013-10-03 19 views
30

Mam kilka punktów i próbuję dopasować krzywą dla tych punktów. Wiem, że istnieje funkcja scipy.optimize.curve_fit, ale nie rozumiem dokumentacji, tj. Jak korzystać z tej funkcji.python numpy/scipy curve fitting

Moje punkty: np.array([(1, 1), (2, 4), (3, 1), (9, 3)])

Czy ktoś może wyjaśnić, jak to zrobić?

+0

Jaką krzywiznę chcesz dopasować? wielomian? – jabaldonedo

+0

tak, wielomian – Bob

+0

Więc spójrz na moją odpowiedź, czy to najprostsze podejście przy użyciu numpy – jabaldonedo

Odpowiedz

58

Proponuję zacząć od prostego wielomianu pasuje, scipy.optimize.curve_fit stara się dopasować funkcję f że trzeba wiedzieć, do zbioru punktów.

Jest to prosta 3 stopień dopasowania wielomianowego pomocą numpy.polyfit i poly1d pierwszy przeprowadza najmniejszych kwadratów dopasowania wielomianowego i drugi oblicza nowe punkty:

import numpy as np 
import matplotlib.pyplot as plt 

points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)]) 
# get x and y vectors 
x = points[:,0] 
y = points[:,1] 

# calculate polynomial 
z = np.polyfit(x, y, 3) 
f = np.poly1d(z) 

# calculate new x's and y's 
x_new = np.linspace(x[0], x[-1], 50) 
y_new = f(x_new) 

plt.plot(x,y,'o', x_new, y_new) 
plt.xlim([x[0]-1, x[-1] + 1 ]) 
plt.show() 

enter image description here

+0

Działa to tylko dla danego zestawu danych.Ale kiedy zmieniam punkty, w większości przypadków jest tylko krzywa między dwoma punktami. Czemu? – Dmitri

+0

Działa z każdym zbiorem danych, o ile podasz poprawnie dane, czyli dwie tablice o tym samym rozmiarze, na przykład: 'x = np.array ([1, 2, 3, 4, 5, 6])' i 'y = np.array ([0.2, 1, 1.2, 3, 0.8, 1.1])' – jabaldonedo

+0

Rysuje tylko krzywą między dwiema liniami z następującym zbiorem danych: x = np.array ([0,, 1., - 1., .5]) y = np.array ([0, 1., .9, .7]) – Dmitri

37

Najpierw musisz oddzielić swoją numpy tablicę na dwie oddzielne tablice zawierające wartości xiy.

x = [1, 2, 3, 9] 
y = [1, 4, 1, 3] 

curve_fit wymaga również funkcji, która zapewnia odpowiedni rodzaj dopasowania. Na przykład, dopasowanie liniowe użyłby funkcji takich jak

def func(x, a, b): 
    return a*x + b 

scipy.optimize.curve_fit(func, x, y) zwróci numpy tablicę zawierającą dwie tablice: pierwsza będzie zawierała wartości a i b, który najlepiej pasuje do danych, a drugi będzie kowariancji optymalnych parametrów dopasowania.

Oto przykład dopasowania liniowego do podanych danych.

import numpy as np 
from scipy.optimize import curve_fit 

x = np.array([1, 2, 3, 9]) 
y = np.array([1, 4, 1, 3]) 

def fit_func(x, a, b): 
    return a*x + b 

params = curve_fit(fit_func, x, y) 

[a, b] = params[0] 

Ten kod zwróci a = 0.135483870968 i b = 1.74193548387

Oto działka z twoich punktów i dopasowania liniowego ... co jest wyraźnie zły, ale można zmienić funkcję dopasowania do uzyskania niezależnie od typu pasuje ci się.

enter image description here

+0

możesz podać również przykład? – Bob

5

pytona krzywej biblioteki montażu Pyeq2, licencja BSD, jest dostępna w repozytorium kodu Google pod adresem:

https://github.com/zunzun/pyeq2

Pochodzi z wielu przykładów w tym programowania równoległego i funkcji zdefiniowanych przez użytkownika, można spróbować go za darmo w internecie pod adresem:

http://zunzun.com

jestem autorem, więc jeśli masz jakieś pytania napisz do mnie bezpośrednio za pomocą adres e-mail [email protected] - Zrobię co w mojej mocy, aby pomóc i przygotować się do pracy z przykładami.

+0

Łącze zunzun jest wyłączone .... –

+2

Moja wizja stała się zbyt słaba, aby strona działała , chociaż wciąż potrafię czytać prawym okiem na obecny czas. Jeśli chcesz użyć oryginalnego kodu witryny na swoim własnym serwerze, jest on teraz na github na https://github.com/zunzun/zunzunsite3 (Python 3) lub https://github.com/zunzun/zunzunsite (Python 2). –