Ich mache viele Iterationen von scipys "curve_fit" in einem go

Betrachten Sie die folgenden MWE

import numpy as np from scipy.optimize import curve_fit X=np.arange(1,10,1) Y=abs(X+np.random.randn(15,9)) def linear(x, a, b): return (x/b)**a coeffs=[] for ix in range(Y.shape[0]): print(ix) c0, pcov = curve_fit(linear, X, Y[ix]) coeffs.append(c0) XX=np.tile(X, Y.shape[0]) c0, pcov = curve_fit(linear, XX, Y.flatten()) 

Ich habe ein Problem, wo ich das grundsätzlich machen muss, aber statt 15 Iterationen ist es Tausende und es ist ziemlich langsam.

Gibt es eine Möglichkeit, all diese Iterationen sofort mit curve_fit ? Ich weiß, das Ergebnis aus der Funktion soll ein 1D-Array sein, so dass nur die Args wie folgt passieren

 c0, pcov = curve_fit(nlinear, X, Y) 

Wird nicht arbeiten. Auch ich denke, die Antwort muss in Abflachung Y , also kann ich ein abgeflachtes Ergebnis bekommen, aber ich kann einfach nichts bekommen, um zu arbeiten.

BEARBEITEN

Ich weiß das wenn ich so etwas mache

 XX=np.tile(X, Y.shape[0]) c0, pcov = curve_fit(nlinear, XX, Y.flatten()) 

Dann bekomme ich einen "mittleren" Wert der Koeffizienten, aber das ist nicht was ich will.

BEARBEITEN 2

Für die Aufzeichnung habe ich mit Jacques Kvams Setup gelöst, aber mit Numpy implementiert (wegen einer Beschränkung)

 lX = np.log(X) lY = np.log(Y) A = np.vstack([lX, np.ones(len(lX))]).T m, c=np.linalg.lstsq(A, lY.T)[0] 

Und dann ist m a und b :

 b=np.exp(-c/m) 

One Solution collect form web for “Ich mache viele Iterationen von scipys "curve_fit" in einem go”

Least Quadrate geben nicht das gleiche Ergebnis, weil das Rauschen durch Protokoll in diesem Fall umgewandelt wird. Wenn das Rauschen Null ist, geben beide Methoden das gleiche Ergebnis.

 import numpy as np from numpy import random as rng from scipy.optimize import curve_fit rng.seed(0) X=np.arange(1,7) Y = np.zeros((4, 6)) for i in range(4): b = a = i + 1 Y[i] = (X/b)**a + 0.01 * randn(6) def linear(x, a, b): return (x/b)**a coeffs=[] for ix in range(Y.shape[0]): print(ix) c0, pcov = curve_fit(linear, X, Y[ix]) coeffs.append(c0) 

coefs ist

 [array([ 0.99309127, 0.98742861]), array([ 2.00197613, 2.00082722]), array([ 2.99130237, 2.99390585]), array([ 3.99644048, 3.9992937 ])] 

Ich werde scikit-Learn's Umsetzung der linearen Regression verwenden, da ich glaube, dass Skalen gut.

 from sklearn.linear_model import LinearRegression lr = LinearRegression() 

Nehmen Sie Protokolle von X und Y

 lX = np.log(X)[None, :] lY = np.log(Y) 

Jetzt passen und überprüfen, dass Koeffizienten die gleichen wie vorher sind.

 lr.fit(lX.T, lY.T) lr.coef_ 

Was einen ähnlichen Exponenten gibt.

 array([ 0.98613517, 1.98643974, 2.96602892, 4.01718514]) 

Überprüfe nun den Divisor.

 np.exp(-lr.intercept_ / lr.coef_.ravel()) 

Das gibt einen ähnlichen Koeffizienten, man sieht die Methoden, die etwas in ihren Antworten divergieren.

 array([ 0.99199406, 1.98234916, 2.90677142, 3.73416501]) 
  • Melden Sie eine zweistufige KS-Statistik aus zwei vorberechneten Histogrammen
  • Alternativen zu scipy.interpolate.griddata, die nicht an ausgerichteten Punkten hängen
  • Das Anwenden von SVD wirft sofort einen Speicherfehler auf?
  • Passende hyperbolische und harmonische Funktionen mit Kurve
  • Hochleistungsvariable Unschärfe in sehr großen Bildern mit Python
  • Chi-Squared-Test in Python
  • Die Wahl der richtigen Art von Daten für das maschinelle Lernen
  • Scipy.optimize.curvefit () - Array darf keine infs oder NaNs enthalten
  • Schnelle Interpolation von Rasterdaten
  • Lösen eines Systems von Oden (mit wechselnden Konstanten!) Mit scipy.integrate.odeint?
  • Weibull-Parameter aus Daten bestimmen
  • Python ist die beste Programmiersprache der Welt.