2009-02-09 23 views
17

Ich habe eine Reihe von Daten, in der Regel in Form a, b, c, ..., yEinfache mehrdimensionale Kurvenanpassung

wobei y = f (a, b, c ...)

Die meisten von ihnen sind drei und vier Variablen und haben 10k - 10M Datensätze. Meine allgemeine Annahme ist, dass sie in der Natur algebraisch sind, so etwas wie:

y = P1 a^E1 + P2 b^E2 + P3 c^E3

Leider meine letzte statistische Analyse Klasse vor 20 Jahren war. Was ist der einfachste Weg, um eine gute Annäherung an f zu erhalten? Open-Source-Tools mit einer sehr minimalen Lernkurve (d. H. Etwas, wo ich in ungefähr einer Stunde eine annehmbare Annäherung erhalten könnte) wären ideal. Vielen Dank!

+5

In Bezug auf den Titel, was ist einfach über mehrdimensionale Kurvenanpassung? :-) –

+0

http://www.prz.rzeszow.pl/~janand/Theory_of_LSM.pdf – jfs

+1

Orthogonale Entfernung Regression könnte für das Problem verwendet werden. – jfs

Antwort

2

Die Grundlagen der Datenanpassung beinhalten die Annahme einer allgemeinen Form einer Lösung, Erraten einiger Anfangswerte für Konstanten und dann Iterieren, um den Fehler der erratenen Lösung zu minimieren, um eine spezifische Lösung zu finden, normalerweise im Sinne der kleinsten Quadrate.

Suchen Sie in R oder Octave für Open Source-Tools. Sie sind beide zur Analyse der kleinsten Quadrate fähig, mit mehreren Tutorials nur eine Google-Suche entfernt.

Edit: Octave Code für die Koeffizienten für eine zweite Ordnung

x = 0:0.1:10; 
y = 5.*x.^2 + 4.*x + 3; 

% Add noise to y data 
y = y + randn(size(y))*0.1; 

% Estimate coefficients of polynomial 
p = polyfit(x,y,2) 

Auf meinem Rechner Polynom Abschätzen, erhalte ich:

ans = 

    5.0886 3.9050 2.9577 
+0

Danke, ich habe ... deshalb habe ich gesagt "sehr minimale Lernkurve"! Diese sind ausgezeichnete statistische Sprachen für allgemeine Zwecke, haben aber eine ziemlich heftige Lernkurve (IMHO). – user64258

+0

Ich sehe. Ich würde denken, dass es mit einfachen Funktionen nicht zu lange dauern sollte, um mit beiden Werkzeugen Schritt zu halten, oder sogar in Python oder Perl. –

+0

Ich würde denken, dass sie relativ einfach sind (Ich fügte Detail zu der Frage hinzu), und ich habe bereits eine Stunde oder so auf Google verbracht, weshalb ich hier gedreht habe ;-) – user64258

0

Wenn Sie eine Vermutung in Form von f haben , [*] benötigen Sie einen Minimierer, um die optimalen Parameter zu finden. The tools Scottie T suggests würde funktionieren, wie ROOT und viele andere.

Wenn Sie keine Ahnung haben, welche Form f annehmen könnte, sind Sie tatsächlich in großen Schwierigkeiten.


[*] Das heißt, Sie wissen, dass

f = f (x, y, z, w, ..., p1, p2, p3 ...)

wo die p s sind Parameter und die Koordinaten sind x, y ...

3

es ist ein Werkzeug für die Montage von 1D- und 2D-Kurven bei zunzun.com, aber ich glaube nicht, dass über zwei Variablen geht. Ebenso unterstützt Matlab nicht mehr als zwei passende Dimensionen (soweit ich weiß) und es ist sicherlich nicht kostenlos.

Andernfalls können Sie möglicherweise einen Teil Ihrer Lösung in der Numerical Recipes finden.

Aber wie andere Poster angedeutet haben, werden Sie wahrscheinlich zumindest eine Grundidee Ihres Funktionsmodells benötigen (das hoffentlich linear oder linearisiert sein kann). In diesem Fall haben Sie eine viel größere Auswahl an Lösungen Ihre Entsorgung)

+0

NR wäre einer der leistungsfähigsten Pfade, aber wahrscheinlich keine minimale Lernkurve. –

+0

Ich stimme zu. Aber ich glaube nicht, dass dies ein Problem ist, bei dem es einen einfachen Ausweg gibt. – Kena

1

Wissen Sie, auf welche Macht Sie Ihr Polynom begrenzen wollen?

Wenn es keine Grenze gibt, dann können Sie immer eine genaue Übereinstimmung für N Punkte erhalten, indem Sie es mit einem Polynom vergleichen, das N Koeffizienten hat.Dazu steckst du N verschiedene Punkte in deine Gleichung ein und erhältst N Gleichungen und N Unbekannte (die Koeffizienten), die du dann entweder mit einer einfachen High School Algebra oder einer Matrix für die Unbekannten lösen kannst.

+0

+1, ich habe irgendwo gelesen, dass dünn besetzte Gitterdaten verwendet werden können, um die gleiche polynomische Genauigkeit mit weniger Knoten zu erreichen als bei regulären Gitterdaten. Weißt du, wie ist das möglich? – owari

11

Falls es sinnvoll ist, ist hier eine Numpy/Scipy (Python) Vorlage zu tun, was Sie wollen:

from numpy import array 
from scipy.optimize import leastsq 

def __residual(params, y, a, b, c): 
    p0, e0, p1, e1, p2, e2 = params 
    return p0 * a ** e0 + p1 * b ** e1 + p2 * c ** e2 - y 

# load a, b, c 
# guess initial values for p0, e0, p1, e1, p2, e2 
p_opt = leastsq(__residual, array([p0, e0, p1, e1, p2, e2]), args=(y, a, b, c)) 
print 'y = %f a^%f + %f b^%f %f c^%f' % map(float, p_opt) 

Wenn Sie wirklich wollen, zu verstehen, was los ist, aber Sie haben werden investieren Sie die Zeit, um die Lernkurve für ein Werkzeug oder eine Programmierumgebung zu skalieren - ich glaube wirklich, dass es keinen Weg gibt. Leute schreiben im Allgemeinen keine spezialisierten Tools, um Dinge wie 3-Term-Power-Regressionen ausschließlich zu tun.

+0

scipy.odr (orthogonale Abstandsregression) könnte nützlich sein, wenn a, b, c keine unendliche Genauigkeit haben (das kleinste Quadrat nimmt eine unendliche Genauigkeit für Koordinaten an). – jfs

+0

Sicherlich erfordert die Funktion einige Beispielausgabe zu minimieren, d. H. Einige Probe y Werte gegeben eine Reihe von a, b, c Werte? – Brendan

0

Kurze Antwort: es ist nicht so einfach. Betrachten Sie einen nicht-parametrischen Ansatz für Datenuntergruppen.

Es gibt 2 Hauptprobleme, über die Sie entscheiden müssen (1) Interessieren Sie sich tatsächlich für die Parameter der Funktion, dh Ihre P1, E1, ..., oder würden Sie nur die mittlere Funktion schätzen (2) Müssen Sie wirklich die Funktion auf allen Daten schätzen?

Das erste, was ich erwähnen werde, ist, dass Ihre angegebene Funktion nichtlinear ist (in den zu schätzenden Parametern), so dass gewöhnliche kleinste Quadrate nicht funktionieren. Nehmen wir an, Sie haben eine lineare Funktion angegeben. Sie hätten immer noch ein Problem mit den 10M-Werten. Die lineare Regression kann mithilfe der QR-Faktorisierung auf effiziente Weise durchgeführt werden, aber Sie haben immer noch einen O (p * n^2) -Algorithmus, wobei p die Anzahl der Parameter ist, die Sie zu schätzen versuchen. Wenn Sie die nichtlineare mittlere Funktion schätzen wollen, wird sie viel schlechter.

Die einzige Möglichkeit, in einem so großen Datensatz etwas schätzen zu können, ist die Verwendung einer Teilmenge zur Durchführung der Schätzung. Grundsätzlich wählen Sie nach dem Zufallsprinzip eine Teilmenge und verwenden diese, um die Funktion zu schätzen.

Wenn Sie sich nicht um Ihre Parameterwerte kümmern und nur die mittlere Funktion schätzen möchten, werden Sie wahrscheinlich besser mit einer nichtparametrischen Schätzmethode arbeiten.

Hoffentlich hilft das.

leif