Wann würdet ihr das Modul decimal verwenden!?

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
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich will gerade eine Regressionsgerade berechnen und arbeite mit Gleitkommazahlen (noch), so dass ich für ganz simple Aufgaben keine so simplen Ergebnisse erhalte:

Code: Alles auswählen

>>> liste_x = [1,2,3,4,5]
>>> liste_y = [1,2,3,4,5]
>>> regressionsgerade(liste_x, liste_y)
(0.9999999999999998, 8.881784197001252e-16)
Ich arbeite mit statistischen Hilfsmitteln und will für eine Reihe von Messwerten jetzt gern Standardsachen - mit Python - berechnen lassen.

Ich frage mal ganz blöd:
1.) Würdet ihr mit Gleitkommazahlen rechnen und vielleicht runden oder zum Modul Decimal wechseln?
2.) Würdet ihr alle Berechnungen in Decimal durchführen lassen - ich schreibe ein Modul, um statistische Berechnungen vornehmen zu können.
3.) Welche Präzision würdet ihr - falls ihr das Modul nutzt - setzen!?

Ich habe aktuell keine Python-Programmierer um mich herum, mit denen ich mich austauschen könnte. Ich hoffe, dass ich mit den Fragen nicht zur Last falle.

Die Einarbeitung in R (usw.) ist momentan zeitlich nicht zu schaffen und nicht zu vertreten, weil ich im Kern kaum etwas in dem Bereich machen möchte. Ich muss gerade mal Median, Mittelwert und Regressionsgerade kalkulieren...

Quellcode der Funktion, die wiederum weitere Funktionen aus dem Modul lädt:

Code: Alles auswählen

def regressionsgerade(liste_x, liste_y):
    # Ermittelt m, Steigung der Geraden
    # und       b, Schnittpunkt mit der y-Achse
    mw_x = mittelwert(liste_x)
    mw_y = mittelwert(liste_y)
    s_x  = standardabweichung(liste_x)
    s_y  = standardabweichung(liste_y)
    r    = korrelationskoeffizient(liste_x, liste_y)

    # Berechne Steigung m 
    m = r * (s_y / s_x)

    # Berechne Schnittpunkt y 
    b = mw_y - m * mw_x
    
    return m, b
BlackJack

@pixewakb: Decimal würde ich nur für Finanzrechnungen verwenden und wenn ich mehr Stellen brauche als `float` zur Verfügung stellt. Regressionsgeraden würde ich mit `float` berechnen. Tun doch alle anderen auch. Und welche Präzision das hängt vom konkreten Problem ab. Oft ist es ja auch nur ”gefühlte” Präzision, denn man muss erst einmal in Bereiche kommen wo `float` ungenauer wird als die Messfehler in den Eingangsdaten, denn nur dann macht es Sinn die Anzahl der Dezimalstellen zu erhöhen.

Runden im Sinne von die `round()`-Funktion benutzen würde ich bei `float` auch nicht, denn das ist ja ebenfalls nicht genau. Wenn Du in der Anzeige auf eine bestimmte Anzahl von Nachkommastellen beschränken möchtest, dann macht man das über die Formatierung als Zeichenkette:

Code: Alles auswählen

In [12]: '{0:.3f} {1:.3f}'.format(0.9999999999999998, 8.881784197001252e-16)
Out[12]: '1.000 0.000'
Edit: Wobei es das doch auch schon fertig gibt. Grundlegende Sachen im `statistics`-Modul in der Standardbibliothek von Python 3 und als Backport für Python 2. Und natürlich Numpy & Co.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich darf da mal nachfragen:
Decimal würde ich nur für Finanzrechnungen verwenden
Warum da? (Es könnte sein, dass ich meine Werte mal rechtfertigen muss. Manche Leute können ihren Bereich und ihre Messwerte sehr hochhängen...)

statistics hatte ich schon mal gesehen, bietet aber nicht viel. Bei Numpy habe ich Sorge was die Einarbeitungszeit betrifft; Statistik hatte ich schon längere Zeit nicht mehr gemacht. Da lese ich mich immer noch ein.
BlackJack

@pixewakb: Weil man bei Finanzrechnung tatsächlich manchmal vorgegeben ist auf wieviele Stellen genau gerechnet werden muss und runden muss man auch *und* weil das nicht immer das runden ist was `round()` macht. Desweiteren kann Decimal so Sachen wie 0.1 halt auch tatsächlich darstellen und nicht nur ungefähr.

Wenn Du Deine Ergebnisse rechtfertigen musst, dann müsstest Du Dich mit den verschiedenen Fehler beschäftigen die grundsätzlich beim Rechnen mit endlicher Genauigkeit auftreten können, was auch Decimal betrifft, und wie sich diese Fehler in Deinen Formeln fortsetzen. Dann kannst Du bestimmen in welchem Bereich die Rechenfehler in Deinen Formeln maximal sein können. Da berücksichtigst Du dann noch die Toleranzen bei den Messungen und wenn der Bereich der Fehler am Ende zu gross ist, dann musst Du Dir etwas überlegen. Und kannst so dann auch bei Decimal die Anzahl der signifikanten Stellen ausrechnen die man braucht um in einen akzeptablen Fehlerwertebereich zu kommen.

Die Einarbeitungszeit in Numpy oder vielleicht auch Pandas steht hier der Zeit zum selber schreiben und damit eventuellen Fehlern im Programm entgegen.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@pixewakbe: Statistik hat doch immer inhärent einen Fehler, der bei ungefähr 1/n liegt, weil z.B. ein Zahlenwert mehr oder weniger den Mittelwert um diese Größenordung ändern kann. Float hat eine Genauigkeit von ungefähr 15 Stellen, bevor Du also nicht eine Billion Werte hast, brauchst Du Dir über die Genauigkeit von Deiner Statistik keine Gedanken machen.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

pixewakb hat geschrieben:Es könnte sein, dass ich meine Werte mal rechtfertigen muss. Manche Leute können ihren Bereich und ihre Messwerte sehr hochhängen...
An der Uni habe ich von einem Fall gehört, wo ein Student in einer Seminar- oder Diplomarbeit das "Durchhängen" von Hochspannungsleitungen berechnet hat. Das Ergebnis hat er mit einer Genauigkeit von 1/1000 mm angegeben und hat dafür Punktabzug bekommen, da er das Problem offensichtlich nicht voll verstanden hatte.
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Ich bin kein Statistiker und hatte das nur am Rande (Umfragen, dann Standardabweichung, Glockenkurve, rechts- und linksschief). Im Moment arbeite ich mich vorsichtshalber auch in Statistik etwas ein, um die Grundlagen zu verstehen. Solange ich mich da nicht total blamiere...

Danke für die Rückmeldungen. Auch hier wird es etwas dauern, bis ich das verdaut habe.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

MagBen hat geschrieben:An der Uni habe ich von einem Fall gehört, wo ein Student in einer Seminar- oder Diplomarbeit das "Durchhängen" von Hochspannungsleitungen berechnet hat. Das Ergebnis hat er mit einer Genauigkeit von 1/1000 mm angegeben und hat dafür Punktabzug bekommen, da er das Problem offensichtlich nicht voll verstanden hatte.
Oder frei nach Gauß: "Der Mangel an mathematischer Bildung gibt sich durch nichts so auffallend zu erkennen wie durch maßlose Schärfe im Zahlenrechnen."
Antworten