2017-10-02 1 views
1

Ich möchte M = 2 Sätze von N = 3 Beobachtungen (X, Y) mit scipy.odr in einem einzigen Anpassungsschritt, von dem ich erwarte 2*M Best-Fit-Werte (Steigung und Schnittpunktschätzungen) erhalten in jedem der M Sätze von Beobachtungen). Aus dem Lesen der scipy.odr Dokumentation und einiger verwandter Stackoverflow-Fragen scheint es, dass dies möglich sein sollte, aber wenn ich versuche, das folgende minimale Beispiel zu verwenden, konvergiert die Anpassung nicht (Reason(s) for Halting: NP < 1 or NP > N).Mehrdimensionale ODR-Anpassung

Ich beginne mit einer einigermaßen guten Näherung der besten Werte beta Werte. Irgendwelche Ideen warum das so kläglich scheitert?

from pylab import * 
from scipy import odr 

x = array([[1.0,2.0,3.0],[1.1,2.1,3.1]]) 
y = array([[1.1,2.3,3.1],[5.9,7.0,8.2]]) 
sx = x*0 + .1 
sy = y*0 + .1 

def f(B, x): 
    out = x * 0 
    for k in range(x.shape[0]) : 
     out[k,:] = B[2*k] * x[k,:] + B[2*k+1] 
    return out 

result = odr.ODR(
    odr.RealData(x, y, sx = sx, sy = sy), 
    odr.Model(f), beta0 = array([1.,0.,1.,5.]) 
    ).run() 

result.pprint() 

Antwort

0

Die Fehlermeldung hat nichts mit Ihren Startwerten zu tun. Ich bin mir nicht sicher, ob der ODR mit diesen Daten umgehen kann, da es praktisch x,y,z ist. Meine Interpretation ist, dass es die Mitglieder von x und y zählt, die N=2 sind (Arrays, aber nichtsdestoweniger) und vergleicht dies mit Ihren freien Parametern, die NP=4 ist, also NP>N.