Wahrscheinlichkeitsdichte berechnen
-
Hallo,
ich habe ein Programm geschrieben, dass mir Zufallsvariablen erzeugen soll, die gaussverteilt sind. Das heißt ich kann einen Datensatz erzeugen, der aus einer Spalte besteht. Nun möchte ich die Verteilung dieser Daten plotten und mit der Kurve einer Gaussverteilung vergleichen um mein Programm zu überprüfen. Das heißt ich möchte die Verteilung meiner erzeugten Daten. Mir fehlt jegliche Idee, wie ich dahin komme. Muss ich das Intervall von minus bis plus unendlich in Teilintervalle zerlegen, jedem Teilintervall einen Platz in einem Array zuweisen und dann zählen, wie viele Daten sich in welchem Intervall befinden? Ist das nicht furchtbar umständlich, rechenaufwändig und ungenau? Wäre es überhaupt möglich?
Hat jemand eine Idee? Kann mir jemand helfen??
Ich bin für jede Anregung dankbar!
Lieben Gruß
teresa
-
Dein Problem ist also das Histogramm? Schneid doch einfach nach ein paar sigma ab. Oder wenn dich wirklich die genaue Verteilung weit vom Mittelpunkt interessiert, dann guck dir eben nur diesen Bereich an; viel Spaß dabei, hunderte von Jahren Zufallszahlen zu würfeln um jenseits von ein paar sigma noch eine brauchbare Statistik zu bekommen.
Ansonsten: Im Prinzip ja: Du unterteilst den interessanten Bereich in Intervalle passender* und zählst für jedes Intervall die Anzahl der Werte in diesem. Falls gewünscht normierst du das Signal hinterher noch (bei Wahrscheinlichkeitsdichten bietet sich das besonders an), aber das war's eigentlich schon.
Ich bin aber gerade etwas überrascht, eigentlich sollte das für jemanden, der aus einer Gleichverteilung eine Gaussverteilung erzeugen kann ziemlich selbstverständlich sein. Die eigentliche Schwierigkeit ist doch die Erzeugung dieser Zahlen (so ginge es mir jedenfalls). Habe ich womöglich falsch verstanden, was dein Problem ist?
*: Die eigentliche Schwierigkeit bei Histogrammen ist, zu wissen, was "passend" ist. Aber meistens ist eine gute Schätzung oder ein bisschen ausprobieren genug. Bessere Algorithmen kannst du dir ein anderes Mal angucken.
Nachtrag:
Wenn du absolut nichts wegschmeißen magst, dann nimm erst alle Daten auf und guck dir den Maximal- und Minimalwert an, der bei dieser Ziehung vorkommt. Dabei wird das Histogramm aber sehr unschön, falls die Bins alle gleich groß sind, da dann die wenigen Ausreißer draußen alle in einem eigenen Abschnitt landen, die Abschnitte im interessanten Bereich aber wieder zu grob sind. Da müsstest du wirklich mit ganz cleveren Algorithmen arbeiten.
Oder schneid nach ein paar sigma ab und mach dann noch einen Bin für alles was außerhalb liegt.
-
Erstmal Vielen Dank für die Antwort! Du hast mich schon richtig verstanden. Das Problem ist das Histogramm. Ich weiß nicht, wie ich das einfach und effizient programmieren soll. Ich habe mal versucht ein Programm histogrammtest.c zu schreiben, dass nur ein kleines Histogramm mir ausgeben soll. Die gaussverteilten Zufallsdaten habe ich in einem Array gespeichert gehabt der Länge N. Also ist mein Ziel nun die Verteilung der Daten, die in einem Array gespeichert sind, zu berechnen.
Mein (nicht funktionierender) Versuch:#include <stdio.h> #include <stdlib.h> #include <math.h> int main (){ int i,j; int anf=1; int end=7; int set2[end-anf]; double set[6]; set[0]=2.3; set[1]=3.8; set[2]=1.4; set[3]=4.4; set[4]=4.22; set[5]=0.2; for(j=0; j<end; j++){ for (i=0; i<5;i++){ if (anf+j<=set[i]){ if (anf+j+1>set[i]){ set2[j]++; } } } } for(i=0;i<(end-anf);i++){ printf("%f\t%d\n",(double)i+0.5,set2[i]); } return 0; }
die ersten drei Werte stimmen immer, danach uferts aus. Was mache ich falsch? und insgesamt habe ich das Gefühl sehr sehr kompliziert an das Problem heranzugehen. Geht es einfacher?
Gruß
teresa
-
Du kannst mit Hilfe von deinem Sigma auch gleich auf den Index von deinem Histogramm schliessen.
Da bei dir das Sigma 1 ist kannst du bei dir den Index mit
(int)(set[i]+0.5) bestimmen
Ein Sigma von Eins ist eigentlich selten, wenn du Fließkommawerte hast.
Zudem beginnt das Histogramms nicht unbedingt bei 0Du musst allerdings dein Histogramm vorher initialisieren.
-
Was ist sigma? Wie bekomme ich sigma ungleich eins?
setup2[] habe ich doch initialisiert. Oder was ist gemeint mit "Du musst das Histogramm initialisieren!" ?Ich versteh gar nichts mehr...
-
Ojeh, eigentlich ziemlicher Müll, den du da programmiert hast. Weder Idee noch technische Umsetzung sind auch nur annähernd richtig.
Pseudocode:
Erstelle Zählerarray. Größe: Anzahl der Bins. Startwerte: 0 Berechne Bingröße = (Maximum - Minimum) / Anzahl Bins Schleife über alle Werte: Position = (Wert - Minimum) / Bingröße Erhöhe Zählerarray an Position Eventueller Normalisierungsschritt, der dich hoffnungslos überfordern würde Fertig
-
teresa schrieb:
Was ist sigma? Wie bekomme ich sigma ungleich eins?
Du hast ein Array set2. Darin speicherst du die Anzahl der Werte die in einem bestimmten Bereich liegen z.B. zwischen 0 und 1, 1 bis 2, 2 bis 3, ....
Daher ist dein Sigma 1.Wenn du ein anderes Sigma willst(0 bis 0.5, 0.5 bis 1, ...), musst du den Index etwas anders berechnen.
double sigma = 0.5; double histogrammstart 0.0; index = (int)((set[i]-histogrammstart)/sigma+0.5);
teresa schrieb:
setup2[] habe ich doch initialisiert.
Du rechnest da
set2[j]++;
Der Wert der in set2[j] wird um eins erhöht.
Was ist der Anfangswert, welche Werte sind in set2 in Zeile 21.