Seite 1 von 1

Python Gauss Fit

Verfasst: Donnerstag 29. Oktober 2009, 10:38
von phygirl
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?

Re: Python Gauss Fit

Verfasst: Donnerstag 29. Oktober 2009, 10:40
von Hyperion
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?)

Verfasst: Donnerstag 29. Oktober 2009, 11:05
von phygirl
Es sind einfach zwei Spalten in einer Ascii Tabelle. X und Y. Und dann jeweils durch Leerzeichen getrennt.

Verfasst: Donnerstag 29. Oktober 2009, 11:24
von Hyperion
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!

Verfasst: Donnerstag 29. Oktober 2009, 11:35
von phygirl
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.

Verfasst: Donnerstag 29. Oktober 2009, 12:01
von ms4py
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)

Verfasst: Donnerstag 29. Oktober 2009, 12:25
von phygirl
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.

Verfasst: Donnerstag 29. Oktober 2009, 12:29
von ms4py
Poste dann mal einen Auschnitt deiner Datei, wenn du mit ``numpy.loadtxt``nichts anfangen kannst.

Verfasst: Donnerstag 29. Oktober 2009, 12:42
von phygirl
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'

Verfasst: Donnerstag 29. Oktober 2009, 12:45
von ms4py
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! :?

Verfasst: Donnerstag 29. Oktober 2009, 12:51
von Hyperion
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!

Verfasst: Donnerstag 29. Oktober 2009, 12:55
von phygirl
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

Verfasst: Donnerstag 29. Oktober 2009, 12:59
von ms4py

Code: Alles auswählen

from pylab import *
X, data = loadtxt('data2.txt', unpack=True)
plot(X, data)
show()

Verfasst: Donnerstag 29. Oktober 2009, 13:19
von phygirl
Aber das plottet doch das ganze nur und macht keinen gauss Fit oder?

Verfasst: Donnerstag 29. Oktober 2009, 13:47
von Hyperion
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.

Verfasst: Donnerstag 29. Oktober 2009, 15:40
von phygirl

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?

Verfasst: Donnerstag 29. Oktober 2009, 15:45
von Hyperion
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?

Verfasst: Donnerstag 29. Oktober 2009, 15:48
von ms4py
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.

Verfasst: Donnerstag 29. Oktober 2009, 16:16
von phygirl
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

Verfasst: Donnerstag 29. Oktober 2009, 19:34
von ms4py

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.