Regressionsgerade bei semilog und loglog

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
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hallo Alle,

ich bin gerade ein wenig am verzweifeln mit ner Regressionsgerade auf Logarithmischer Auflösung...

Ich hab mich versucht an diesem Beispiel zu halten: http://www.scipy.org/Cookbook/LinearRegression

Auf meinem Beispiel angewendet sähe das ungefähr so aus:

Code: Alles auswählen

#!/usr/bin/python

from matplotlib import pyplot as pl
from pylab import *
from scipy import stats,polyval, polyfit, linspace


y = array([1, 0.6, 0.1, 0.06, 0.01, 0.006])
x = array([27.4, 28.4, 26, 26.2, 18.2, 15])

n = len(y)
t = linspace(min(y), max(y), n)

grad, inter, r, p, std_err = stats.linregress(x,y)

pl.semilogx(y,x,'o')
(ar,br) = polyfit(t, x, 1)
xr = polyval([ar,br],t)
plot(y,xr, 'r.-')


show()

Aber irgendwie ist das alles nur keine Gerade...

Kann da mal jemand drüber schauen?
Ich denke es hängt mit dem log zusammen und muss später noch Grafiken mit loglog Achsen machen...
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Schau Dir mal an was Du da fittest: x gegen y. Und was plottest Du? log10(x) gegen y. Und was erwartest Du? Ggf. solltest Du für den Fit auch logarithmierte Daten verwenden. Das dürfte schon helfen.

Und schließlich solltest Du ein bißchen aufräumen:
- Keine Sternchenimporte.
- Nicht matplotlib und pylab in einem Skript verwendet (früher oder später kommst Du zwischen den verschiedenen Interfaces einfach durcheinander).
- Und die Daten etwas aufräumen - ich jedenfalls habe eine Zeit lang gebraucht, bis ich verstanden habe was *tatsächlich* x und y ist.

HTH,
Christian
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hi CM,
ja, also ich muss eigentlich nur 2 Grafiken erstellen und ich bin ein wenig zu Eitel um Excel zu benutzen... Würde es eben gerade mal schnell aus Übung heraus in Python machen...

Wegen den *importen, das hab ich so aus dem Beispiel übernommen, weil ich nicht wusste welcher Befehl da jetzt genau aus welchem paket kommt, sonst mach ich das auch nicht....

Den Fehler den ich mache verstehe ich allerdings nicht ganz...
Ich denke eben über die logarithmierten Daten nach, gibt es da Funktionen in denen ich einfach ein Array logarithmieren kann? Muss ich es überhaupt mit dem array machen?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

So funktioniert die die lineare Regression:

Code: Alles auswählen

#!/usr/bin/python

from matplotlib import pyplot as pl
from numpy import array, polyval, polyfit

t = array([1, 0.6, 0.1, 0.06, 0.01, 0.006])
xn = array([27.4, 28.4, 26, 26.2, 18.2, 15])

pl.semilogx(t, xn, 'o')
polynoms = polyfit(t, xn, 1)
xr = polyval(polynoms, t)

pl.semilogx(t, xr, 'r.-')

pl.show() 
Damit hast du eine Gerade (die natürlich logarithmisch skaliert nicht wie eine Gerade aussieht).
Um nun eine logarithmisch skalierte Gerade zu bekommen, beachte den Hinweis von CM ;)

Edit: zu deiner letzten Frage:

Code: Alles auswählen

from numpy import log10
(Jetzt habe ich aber fast alles verraten ;) )

Edit2: Ich verrate natürlich nicht aus Bosheit nicht die gesamte Lösung, sondern damit du etwas dabei lernst :)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Und wenn Du Dir die Korrelationskoeffizienten zwischen logarithmierten und nicht logarithmierten Daten anschaust, siehst Du, daß das Logarithmieren der Daten vorm Plotten gar nicht so schlecht wäre ...
Allerdings sehen die Daten nicht wirklich dolle aus für eine logarithmische Auftragung. Da kann man alles Mögliche interpretieren :roll: - nun, damit muß man manchmal leben ...
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Ja, ich weiß dass die Daten echt nicht toll sind, aber wenn die Professorin da eine Gerade haben will soll sie es haben...

Aber ich bekomm es irgendnwie nich auf die reihe wie ich es richtig machen muss...

Wenn ich die Daten vorher logarithmiere muss ich dann aber normal plotten?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Ich bin mal nicht so, da ich sehe, dass du dir Gedanken gemacht hast. ;)
So, wie du das dir vorgestellt hast, würde es so aussehen:

Code: Alles auswählen

#!/usr/bin/python

from matplotlib import pyplot as pl
from numpy import log10, array, polyval, polyfit

t = log10(array([1, 0.6, 0.1, 0.06, 0.01, 0.006]))
xn = array([27.4, 28.4, 26, 26.2, 18.2, 15])

pl.plot(t, xn, 'o')
polynoms = polyfit(t, xn, 1)
xr = polyval(polynoms, t)

pl.plot(t, xr, 'r.-')

pl.show() 
Damit ist es ja nicht mehr so schön skaliert. Du kannst das auch nur vor dem Fitten logarithmieren, dann bleibt es schön skaliert:

Code: Alles auswählen

#!/usr/bin/python

from matplotlib import pyplot as pl
from numpy import log10, array, polyval, polyfit

t = array([1, 0.6, 0.1, 0.06, 0.01, 0.006])
xn = array([27.4, 28.4, 26, 26.2, 18.2, 15])

pl.semilogx(t, xn, 'o')
polynoms = polyfit(log10(t), xn, 1)
xr = polyval(polynoms, log10(t))

pl.semilogx(t, xr, 'r.-')

pl.show()
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Also ich musste diese doofen Grafiken eben schnell fertig machen, und ich hab mich dann tatsächlich auf Excel herabgelassen :-( Musste leider schnell gehen...

Aber die sehen nicht so toll aus wie die von matplotlib...

Dank Dir das Du mir die Lösung geschrieben hast, ich hab echt nicht verstanden, welchen Wert ich wie Logarithmieren muss...

Muss mir mal die Werte jeweils ausgeben lassen und mal in Ruhe nachvollziehen..

Danke nochmals...
Antworten