Regressionskurven

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

Hallo,

ich benötige etwas Austausch zu einem mathematischen Problem, da ich selbst noch nicht so genau weiß wonach ich suchen muss:

Mein Ziel ist es mit einem Programm ASCII-Daten einzulesen, um durch diese eine Regressionskurve zu legen. Nun habe ich bereits eifrig GOOGLE benutzt, um die Worte "Regressionskurve + Python" zu suchen. Dabei stieß ich immer auf lineare oder polynomische Ansätze. Letzteren habe ich auch einmal auf ein Beispiel angewendet:

Code: Alles auswählen

X       Y
2.57 	2.50 	
2.5 	2.8 	
2.0 	3.3 	
1.5 	3.45 	
1.0 	3.50 
Bitte nicht darüber wundern, dass die X-Werte absteigend sortiert sind. Ich habe mir ein kleines Programm geschrieben, welches eine kub. Kurve durch diese Daten legt. Mit dem Ergebnis bin ich nicht zufrieden, denn die Kurve wird unzureichend wiedergegeben. Das liegt insbesondere an dem Maximum, welches aus dem Polynom 2. Grades
herrührt.

Code: Alles auswählen

from math import *
import scipy, pylab
import scipy.optimize
import numpy as np
from numpy import linspace, polyfit, polyval
import matplotlib.pyplot as plt
import os

DataX = [1, 1.5, 2, 2.5, 2.57]
DataY = [3.5, 3.45, 3.3, 2.8, 2.5]

NOfPoints = 100

XNew = linspace(float(DataX[0]), float(DataX[-1]), NOfPoints)
PolyCoeffs = np.polyfit(DataX, DataY, 2)
Polynom    = np.poly1d(np.polyfit(DataX, DataY, 2))

x = list()
y = list()

for i in range(NOfPoints):
    xval = XNew[i]
    x.append( xval )
    y.append( Polynom(xval) )

plt.plot(DataX, DataY, '.-', x, y, '--')
plt.show()
Gibt es noch andere Ansätze, um Regressionskurven zu bilden? Wonach müsste ich da suchen? Gibt es diese dann auch bereits in Python verfügbar? Ich möchte eigentlich nicht komplett einen neuen Algorithmus zum Kurven-Fitten schreiben!

Vielen Dank.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

Was erwartest Du? Du hast 5 Punkte und eine gute Lösung für ein Polynom zweiten Grades. Wenn Du einen besseren Fit möchtest, solltest Du an Deinem Modell feilen - oder Fits wählen, die beliebige Punkte beliebig gut fitten, aber eben modellfrei.

Gruß,
Christian
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

Hallo Christian,

ich verstehe Deine Antwort nur halb:

- Du hast recht - mein Beispiel enthält nur 5 Punktepaare, was zugegebenermaßen wenig ist. Da ich allerdings mit Messdaten arbeite, kann es durchaus vorkommen, dass nicht so viele Daten vorliegen.
- Was meinst Du mit an meinem Modell feilen - wenn Du das Modell für den Curve-Fit meinst, dann ja bin ich offen für bessere Ansätze. Ich stehe da zur Zeit auf dem Schlau.

- Ich habe mir auch Beziersplines definiert und überlege, ob man diese irgendwie geschickt an die Daten anschmiegen könnte. HAbe aber noch keine Lösung.

VG.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wie soll ich Dir einen besseren Ansatz geben ohne zu wissen, um welche Art Daten es sich handelt? Dein bisheriges Modell ist ein Polynom 2. Grades, d. h. die Parameter, die Du fittest sind die Koeffizienten. Polynome höheren Grades lassen sich u. U. nicht mehr stabil fitten, sehen aber vielleicht "schöner" aus - und erklären weniger. Prinzipiell kannst auch auch andere Modelle bauen und nach Lösungen suchen. Spline Fits (gleich welcher Art) erklären meist wenig, da man hier auf ein Modell verzichtet. Man kann sie allerdings gut zum Interpolieren verwenden.

Schreibe uns doch mal, was Dein *eigentliches* Ziel ist und verzeih, wenn ich mich gleich ausklinke - ich habe 'ne Verabredung. Ein Ziel könnte sein: Du möchtest ein Modell finden, dass Deine Daten gut beschreibt. Oder: Du möchtest Datensätze vergleichen, hast ein Modell, aber ziemlich Streuung in den Daten. Etc. Mitunter ist es auch hilfreich die Art der Daten zu beschreiben - hier tummeln sich ziemlich verschiedene Leute.
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

Hi, also meine Ziele lassen sich wie folgt beschreiben:

- Mir steht ein Satz von Messdaten zur Verfügung. Diese Messdaten repräsentrieren eine Charakteristik. Aufgrund von MEssungenauigkeiten können die einzelnen Datenpunkte aber leicht verschoben sein, so, dass die lineare Verbindung aller Punkte keine richtig glatte Kurve ergibt. Außerdem sind die MEsspunkte nicht äquidistant verteilt!
- Ich möchte nun durch die Datenpunkte eine Ausgleichskurve legen, welche glatt ist, damit ich die Kurve numerisch differenzieren kann.
- Wie Christian bereits richtig bemerkt hat, habe ich zunächst mit Polynomen experimentiert. Ein Polynom 2er Ordnung beschreibt meine Kurve nicht gut genug. Das wird deutlich, da das Polynom insbesondere ein Maximum vorhersagt, welches in den Datenpunkten nicht in Erscheinung tritt.
- Höhere Polynome führen zu unphysikalischen Schwingungen. Ich habe auch mit mehr Datenpunkten experimentiert. Der CurveFit wird dadurch aber nicht besser!
- Noch eine Schwierigkeit: Aus meinen Datenpunkten wird ersichtlich, dass für größere X-Werte die MEsspunkte nicht mehr eindeutig einem X-Wert zugeordnet werden können. Das ist eine typische Eigenschaft meiner MEssungen und erschwert die Problematik. Hier ein deutliches Beispiel:

Code: Alles auswählen

X       Y
2.57 	1.50
2.57 	2.00
2.57 	2.50
2.5 	2.8
2.25 	3.12
2.0 	3.3
1.5 	3.45
1.25    3.49
1.0 	3.50
Antworten