Trapez Verteilung abschneiden

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
mona19
User
Beiträge: 4
Registriert: Dienstag 4. Dezember 2018, 11:25

Hallo zusammen,

ich bin ein Neuling, was Python angeht, brauch es jedoch für eine Arbeit an der Uni. Darum hier meine Frage an euch:

Ist es möglich, eine Trapez Verteilung bei einem bestimmten Wert "abzuschneiden"?

Folgender Kontext:
Ich soll Werte in ein Modell eingeben können, die aus einer Trapez Verteilung zufällig gezogen werden (ich kenne zwei Werte, die jedoch mit einer Unsicherheit behaftet sind, daher die Trapez Verteilung). Dazu habe ich trapz von scipy.stats importiert und in meinen Code eingebaut:

Code: Alles auswählen

trapz.rvs(c, d, loc, scale)
Das funktioniert bisher ganz gut und ich kann die Verteilung auch problemlos plotten. Meine Frage betrifft nun Verteilungen, die Werte unter 0 oder über 1 generieren. Da ich mit loc den "Start" und mit scale die "Weite" der Verteilung bestimme, können auch Werte ausserhalb dieses Intervalls generiert werden. Das will ich vermeiden, da es in meinem Modell nicht möglich ist, Werte unter 0% oder über 100% zu erreichen.

Beispiel dazu:
Eine Kläranlage kann gewisse Partikel zu 88-93% aus dem Abwasser entfernen. Diese Werte haben eine Unsicherheit von 37% (folgt aus eigenem Bewertungsschema). Wenn ich mit diesen Werte eine Trapez Verteilung erstelle, werden Werte über 1 generiert (sprich über 100%), was aber in Realität nicht möglich ist, da nicht mehr als 100% entfernt werden können. Darum möchte ich, dass meine Trapez Verteilung bei 0% und bei 100% abgeschnitten wird, d.h. keine Werte unter 0 oder über 1 gezogen werden können.

Ist das irgendwie möglich?

Vielen Dank für eure Hilfe!!

Ach ja, ich nutze Spyder 3.3.1 (Python 2.7)
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Hi,

zum Verständnis:
- Die 88-93% sind Angaben zur Gründlichkeit/Vollständigkeit der Partikelentfernung?
- Was genau bedeutet eine Unsicherheit von 37%?
- Welche Werte wählst du für die Parameter der Trapezverteilung?

Gruß, R2
mona19
User
Beiträge: 4
Registriert: Dienstag 4. Dezember 2018, 11:25

Hallo R2,

zu deinen Fragen:

- Ja, die 88-93% sagen, wie gross der Anteil der entfernten Partikel ist.

- Die Unsicherheit kommt aus meinem Bewertungsschema. Alle Inputwerte werden mittel verschiedener Qualitätsindikatoren bewertet. Dann werden diese umgerechnet, sodass ich anschliessend die "Weite" der Verteilung kenne, sprich die Distanz vom Mittelwert (Trapezverteilung: obere Eckpunkt) zum Extrempunkt (unterer Eckpunkt). Die 37% sagen mir also, wie breit die Werte um meinen bekannten Wert streuen.

- Sorry, das habe ich total vergessen! Meine Inputwerte muss ich erst umrechnen, bevor ich sie eingeben kann. Wenn ich ein Trapez ABCD habe (A links unten, B rechts unten, C links oben, D rechts oben -> sorry für die Abfolge! Und sorry, hab nicht herausgefunden, wie man hier eigene Bilder einfügen kann), dann sind:
- c = (C-A)/(B-A), mit C = 0.88
- d = (D-A)/(B-A), mit D = 0.93
- loc = A
- scale = B-A

mit (meine Inputwerte: 88-93% "Wirkungsgrad" und 37% Unsicherheit der Daten):
-A = 0.88*(1-0.37)
- B = 0.93*(1+0.37)

In diesem Fall gebe ich für den Plot ein

Code: Alles auswählen

plt.hist(trapz.rvs(0.452, 0.522, 0.554, 0.720, size=100000), bins=50)
was mir eine Verteilung gibt, die teilweise über 1.0 liegt. Dort würde ich die Verteilung aber gerne gerade abschneiden, sodass die rechte untere Ecke wegfällt (also alles > 1.0). Es ist eine einfache Überlegung, aber ich weiss leider überhaupt nicht, wie ich das implementieren soll...

Vielen Dank für deine Hilfe!
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Da ist dann doch schon grundlegend etwas falsch. Wenn du sagst, dass die Werte zu beiden Richtungen um 37% streuen, kommst du bei einem Mittelwert zwischen 88% und 93% doch zwangsläufig manchmal auf über 100%. Das Abschneiden sehe ich ziemlich kritisch, weil dadurch die Regeln der WSK-Rechnung verletzt werden (https://de.wikipedia.org/wiki/Wahrschei ... Kolmogorow).
Oder sehe ich das falsch?
mona19
User
Beiträge: 4
Registriert: Dienstag 4. Dezember 2018, 11:25

Du hast natürlich recht. Ich weiss gerade nicht, wie ich das am besten erkläre...Ich verstehe das so: Ich bin am random sampling interessiert, ich ziehe also einen einzelnen Wert aus der Verteilung, der dann weiter in meinem Stoffflussmodell verarbeitet wird. Wenn der Wert jedoch kleiner als 0 oder grösser als 1 ist, sollte er verworfen werden (da ein solcher Wert in Realität nicht möglich ist) und ein neuer Wert aus der Verteilung gezogen werden. Ist es irgendwie möglich, das mit Python umzusetzen? Sowas wie: Zieh aus dieser Verteilung nacheinander 1000 zufällige Werte, wenn der (gezogene) Wert <0 oder >1, dann überspringe diesen Wert und zieh einen Neuen Wert, wenn der Wert >0 und <1, dann rechne weiter damit.
Hilft das?
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Klar, man könnte halt dann so etwas in der Art benutzen:

Code: Alles auswählen

min(max(0,a),1)
wenn a die Stichprobe ist.
mona19
User
Beiträge: 4
Registriert: Dienstag 4. Dezember 2018, 11:25

Ok, vielen Dank für deine Hilfe, ich versuche das mal zusammenzubasteln!
Antworten