2012-04-13 6 views
0

Ich habe eine einzelne Funktion, die ich an eine Reihe von verschiedenen Datensätzen anpassen möchte, alle mit der gleichen Anzahl von Punkten. Zum Beispiel könnte ich ein Polynom für alle Zeilen eines Bildes anpassen wollen. Gibt es einen effizienten und vektorisierten Weg, dies mit scipy oder anderen Paketen zu tun, oder muss ich auf eine einzelne Schleife zurückgreifen (oder Multiprocessing verwenden, um es ein wenig zu beschleunigen)?Gleichzeitige Anpassung an N Datensätze in Python

Antwort

0

können Sie numpy.linalg.lstsq verwenden:

import numpy as np 

# independent variable 
x = np.arange(100) 

# some sample outputs with random noise 
y1 = 3*x**2 + 2*x + 4 + np.random.randn(100) 
y2 = x**2 - 4*x + 10 + np.random.randn(100) 

# coefficient matrix, where each column corresponds to a term in your function 
# this one is simple quadratic polynomial: 1, x, x**2 
a = np.vstack((np.ones(100), x, x**2)).T 

# result matrix, where each column is one set of outputs 
b = np.vstack((y1, y2)).T 

solutions, residuals, rank, s = np.linalg.lstsq(a, b) 

# each column in solutions is the coefficients of terms 
# for the corresponding output 
for i, solution in enumerate(zip(*solutions),1): 
    print "y%d = %.1f + (%.1f)x + (%.1f)x^2" % ((i,) + solution) 


# outputs: 
# y1 = 4.4 + (2.0)x + (3.0)x^2 
# y2 = 9.8 + (-4.0)x + (1.0)x^2 
+0

Dank! Funktioniert diese Methode nur für Polynome oder ist es möglich, sie mit beliebigen Funktionen zu verwenden? – astrofrog

+0

@astrofrog: Sie können jede Funktion setzen. z.B. 'a = np.vstack ((np.exp (x), x)). T 'wird versuchen,' A * e^x + B * x 'anzupassen. Konstruieren Sie Ihre Spalten entsprechend. – Avaris

Verwandte Themen