Python Gauss Fit

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
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

Hallo, ich bin gerade dabei Python zu lernen und moechte nun Datenpunkte in einer Ascii Tabelle mit einer Gauss function fitten. Im Scipy cookbook habe ich folgende Anweisung gefunden.

Code: Alles auswählen

from pylab import *

gaussian = lambda x: 3*exp(-(30-x)**2/20.)

data = gaussian(arange(100))

plot(data)

X = arange(data.size)
x = sum(X*data)/sum(data)
width = sqrt(abs(sum((X-x)**2*data)/sum(data)))

max = data.max()

fit = lambda t : max*exp(-(t-x)**2/(2*width**2))

plot(fit(X))

show()
mein Problem ist aber ich weiss nicht genau, was ich aendern muss, wenn ich statt diesem gaussian(arange(100)) eine Tabelle einlesen moechte.
Kann mir da vielleicht jemand helfen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

phygirl hat geschrieben: mein Problem ist aber ich weiss nicht genau, was ich aendern muss, wenn ich statt diesem gaussian(arange(100)) eine Tabelle einlesen moechte.
Kann mir da vielleicht jemand helfen?
Wie sieht denn Deine "Tabelle" aus? (Datenstruktur?)
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

Es sind einfach zwei Spalten in einer Ascii Tabelle. X und Y. Und dann jeweils durch Leerzeichen getrennt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

phygirl hat geschrieben:Es sind einfach zwei Spalten in einer Ascii Tabelle. X und Y. Und dann jeweils durch Leerzeichen getrennt.
Und wie sieht die Struktur von data aus? Denn auf diese willst Du ja im Grunde genommen kommen!
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

Ich bin mir nicht sicher was du mit Struktur meinst.
Ich habe eine Tabelle und das sind Messungen von Spektrallinien. Und ich brauche am Ende von denen die Halbwertsbreite und die 'Flaeche'.
Jedenfalls kann man die Linien gut mit Gauss kurven approximieren.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

numpy.loadtxt(fname, dtype=<type 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False)¶

Load data from a text file.
Ist dir klar, dass diese Annäherung an die Gauss-Kurve nicht immer funktioniert? (Ist im Cookbook beschrieben)
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

ja das weiss ich. Aber ich habe doch eine Gauss Verteilung. Da bin ich mir ziemlich sicher.
Mein Problem ist einfach, dass Programm so unzuschreiben, dass es meine Datei benutzt und diese Gauss fittet.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Poste dann mal einen Auschnitt deiner Datei, wenn du mit ``numpy.loadtxt``nichts anfangen kannst.
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

die Datein sind 10 000 Zeilen lang.
Mein Problem ist das ich so gut wie keine Ahnung von python habe.
Ich dachte man mueste das

Code: Alles auswählen

data = gaussian(arange(100))
mit sowas wie

Code: Alles auswählen

f = open('test1.dat', 'r')
data = f.readlines()
f.close
oder

Code: Alles auswählen

data1 = asciidata.open('test.dat') 



ersetzen, damit er die Ascitabelle als Datensatz benuzt. Aber weiter bin ich nicht gekommen[/code]

Aber dann bekomme ich immer einen Fehler wie

Code: Alles auswählen

   X = arange(data.size)
AttributeError: 'AsciiData' object has no attribute 'size'
Zuletzt geändert von phygirl am Donnerstag 29. Oktober 2009, 12:46, insgesamt 1-mal geändert.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Dafür kannst numpy.loadtxt verwenden, sag ich jetzt zum dritten Mal!
http://docs.scipy.org/doc/numpy/referen ... adtxt.html
phygirl hat geschrieben:die Datein sind 10 000 Zeilen lang.
Dann poste halt mal ein paar Zeilen! :?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

phygirl hat geschrieben:Ich bin mir nicht sicher was du mit Struktur meinst.
Naja, wie sehen die Daten aus, die in data drin stehen? Ist das eine Liste, ein Tupel, eine verschachtelte Struktur, ...

Denn du musst ja wissen, wie Du die Daten aus der Textdatei aufbereiten musst, damit sie dann im weiteren Verlauf verarbeitet werden können. Daher muss man wissen, wie data aufgebaut ist!
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

8.08305e+03 5.18096e-01
8.08310e+03 5.65463e-01
8.08315e+03 6.09921e-01
8.08320e+03 5.58614e-01
8.08325e+03 5.42059e-01
8.08330e+03 5.22219e-01
8.08335e+03 5.47670e-01
8.08340e+03 5.46657e-01
8.08345e+03 4.82227e-01
8.08350e+03 5.09462e-01
8.08355e+03 5.36048e-01
8.08360e+03 4.99334e-01
8.08365e+03 5.22493e-01
8.08370e+03 5.44385e-01
8.08375e+03 5.20142e-01
8.08380e+03 5.38707e-01
8.08385e+03 5.45306e-01
8.08390e+03 4.93185e-01
8.08395e+03 4.98104e-01
8.08400e+03 4.85870e-01
8.08405e+03 4.77395e-01
8.08410e+03 5.07873e-01
8.08415e+03 4.91234e-01
8.08420e+03 4.92959e-01
8.08425e+03 5.10794e-01
8.08430e+03 5.02968e-01
8.08435e+03 5.78023e-01
8.08440e+03 5.21656e-01
8.08445e+03 5.46266e-01
8.08450e+03 5.71699e-01
8.08455e+03 5.65762e-01
8.08460e+03 5.39553e-01
8.08465e+03 5.04013e-01
8.08470e+03 5.26937e-01
8.08475e+03 5.37540e-01
8.08480e+03 5.43634e-01
8.08485e+03 5.42239e-01
8.08490e+03 5.27128e-01
8.08495e+03 5.36247e-01
8.08500e+03 5.56192e-01
8.08505e+03 5.43275e-01
8.08510e+03 5.55797e-01
8.08515e+03 5.73905e-01
8.08520e+03 5.57862e-01
8.08525e+03 5.63597e-01
8.08530e+03 5.28813e-01
8.08535e+03 5.28910e-01
8.08540e+03 5.80722e-01

bitte
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Code: Alles auswählen

from pylab import *
X, data = loadtxt('data2.txt', unpack=True)
plot(X, data)
show()
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

Aber das plottet doch das ganze nur und macht keinen gauss Fit oder?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

phygirl hat geschrieben:Aber das plottet doch das ganze nur und macht keinen gauss Fit oder?
Na, das sollte ja auch nur demonstrieren, wie man die Zahlenpaare aus der Datei parst. Wenn die Datenstruktur nun gleich ist, kannst Du das an Stelle von data bei Deinem Quelltext nehmen. Darauf wollte ich ja immer hinaus.
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

Code: Alles auswählen

from pylab import *

gaussian = lambda x: 3*exp(-(30-x)**2/20.)

data = gaussian(arange(100))

plot(data)

X = arange(data.size)
x = sum(X*data)/sum(data)
width = sqrt(abs(sum((X-x)**2*data)/sum(data)))

max = data.max()

fit = lambda t : max*exp(-(t-x)**2/(2*width**2))

plot(fit(X))

show()

Das is mein Code wie er im Moment aussieht. Und ich bekomme keine Fehlermeldungen mehr. Das Problem ist nur, das er als X-Achsen Werte nicht meine erste Spalten nimmt, sondern sie einfach sequentiell aufsteigen laesst.
Hast du dafuer vielleciht eine ERklaerung?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ist das nicht exakt der Code aus dem ersten Posting? *wunder*
Ich dachte Dein Problem war, wie Du Werte aus einer Textdatei anstelle der generierten nehmen kannst?
Welche Fehlermeldung hattest Du denn?

Zur aktuellen Frage kann ich nichts sagen, da ich kein matplotlib installiert habe hier und mich mit der Thematik nicht auskenne. Das erscheint mir aber wenih Python spezifisch zu sein...

Welches / welche Probleme willst Du denn eigentlich lösen? Sind wir mittlerweile bei zwei Problemen angekommen?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Wie wärs mit:

Code: Alles auswählen

from pylab import *
x, data = loadtxt('data2.txt', unpack=True)
tau = sum(x*data)/sum(data)
width = sqrt(abs(sum((x-tau)**2*data)/sum(data)))

height = data.max()

fit = lambda t : height*exp(-(t-tau)**2/(2*width**2))

plot(x, fit(x))

show()
Edit: Bessere Variablennamen, um das ganze mal lesbarer zu machen.
phygirl
User
Beiträge: 16
Registriert: Sonntag 23. August 2009, 12:01

stimmt das war die falsche Datei copy/paste :oops:

neuer Versuch

Code: Alles auswählen


import numpy, asciidata, pylab, matplotlib.pyplot
import matplotlib
from pylab import *


matplotlib.rc('text', usetex = True)
gaussian = lambda x: 3*exp(-(30-x)**2/20.)

X, data = loadtxt('test.dat', unpack=True) 


plot(data)

X = arange(data.size)
x = sum(X*data)/sum(data)
width = sqrt(abs(sum((X-x)**2*data)/sum(data)))

max = data.max()

fit = lambda t : max*exp(-(t-x)**2/(2*width**2))

plot(fit(X))

show()



Mein Problem ist: Ich habe mene Daten und moechte darueber einen Gauss Fitt plotten.
Das macht das Programm jetzt. Aber wenn ich nur die Daten plotte, laeuft meine X-Achse von 8000 bis 9000.
WEnn ich jetzt aber beide uebereinander plotte laueft das ganze von 0 bis 1000. Das ist seltsam. Wird sich auch noch loesen lassen
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Code: Alles auswählen

import numpy, asciidata, pylab, matplotlib.pyplot
import matplotlib
from pylab import *


matplotlib.rc('text', usetex = True)
gaussian = lambda x: 3*exp(-(30-x)**2/20.)

X, data = loadtxt('test.dat', unpack=True)


plot(X, data)

X = arange(data.size)
x = sum(X*data)/sum(data)
width = sqrt(abs(sum((X-x)**2*data)/sum(data)))

max = data.max()

fit = lambda t : max*exp(-(t-x)**2/(2*width**2))

plot(X, fit(X))

show()
Ist eigentlich nicht so schwer...
Erklärung ist wohl eh überflüssig, hab das Gefühl, dass du über keine der Antworten wirklich sinnvoll nachgedacht hast, sonst hättest du das Problem schon längst selber lösen können.
Antworten