Wie berechnen Sie die Wahrscheinlichkeit, einen Wert aus einer Liste von Stichproben aus einer Verteilung in Python?
Nicht sicher, ob dies gehört in der Statistik, aber ich bin versucht, Python, dies zu erreichen. Ich habe im wesentlichen nur eine Liste von Integer-zahlen:
data = [300,244,543,1011,300,125,300 ... ]
Und ich würde gerne wissen, die Wahrscheinlichkeit, dass ein Wert Auftritt, gegeben diese Daten.
I dargestellten Histogramme der Daten mit matplotlib und erhalten diese:
In der ersten Grafik dargestellt, die zahlen repräsentieren die Anzahl der Zeichen in einer Sequenz. In der zweiten Grafik dargestellt, es ist eine gemessene Zeit in Millisekunden. Das minimum ist größer als null, aber es ist nicht unbedingt ein maximum. Die Grafiken wurden erstellt mit Millionen von Beispiele, aber ich bin mir nicht sicher, ich kann keine anderen Annahmen über die Verteilung. Ich möchte wissen, die Wahrscheinlichkeit, dass ein neuer Wert gegeben, dass ich ein paar Millionen Beispiele von Werten. In der ersten Grafik, ich habe ein paar Millionen Sequenzen verschiedener Längen. Würde gerne wissen, Wahrscheinlichkeit einer 200-Länge, zum Beispiel.
Ich weiß, dass für eine kontinuierliche Verteilung die Wahrscheinlichkeit eines genauen Punkt soll null sein, aber angesichts einer Flut neuer Werte, ich muss in der Lage sein zu sagen, wie wahrscheinlich jeder Wert ist. Ich habe mir durch einige der numpy/scipy Wahrscheinlichkeits-Dichte-Funktionen, aber ich bin mir nicht sicher, was zu wählen oder, wie die Abfrage für die neuen Werte, sobald ich so etwas wie laufen scipy.stats.norm.pdf(Daten). Es scheint, wie verschiedene Wahrscheinlichkeits-Dichte-Funktionen passen die Daten anders. Die Form der Histogramme ich bin mir nicht sicher, wie Sie entscheiden, welche zu verwenden.
- Was ist die Natur dieser zahlen? Sie sind alle ganzen zahlen, gibt es einen festen Bereich? Können Sie keine Annahmen über die Verteilung (was machen die zahlen darstellen)?
- Was genau möchten Sie wissen angesichts Ihrer dataset?
- In der ersten Grafik dargestellt, die zahlen repräsentieren die Anzahl der Zeichen in einer Sequenz. In der zweiten Grafik dargestellt, es ist eine gemessene Zeit in Millisekunden. Das minimum ist größer als null, aber es ist nicht unbedingt ein maximum. Die Grafiken wurden erstellt mit Millionen von Beispiele, aber ich bin mir nicht sicher, ich kann keine anderen Annahmen über die Verteilung. Ich möchte wissen, die Wahrscheinlichkeit, dass ein neuer Wert gegeben, dass ich ein paar Millionen Beispiele von Werten. In graph1, ich habe ein paar Millionen Sequenzen verschiedener Längen. Würde gerne wissen, Wahrscheinlichkeit einer 200-Länge, zum Beispiel.
- Für die zweite Grafik, wird Sie daran interessiert sein, die Wahrscheinlichkeit von einigen der gemessenen Höhe der Zeit, wenn man in einem bestimmten Intervall?
- Sicher, was hast du im Sinn?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Sie nicht scheinen, um eine bestimmte Verteilung im Auge, aber Sie haben eine Menge Daten, Proben, schlage ich vor, eine nicht-parametrische Dichte-Schätzung Methode. Einer der Datentypen, die Sie beschreiben (Zeit in ms) ist deutlich eine kontinuierliche und eine Methode für die nicht-parametrische Schätzung einer Wahrscheinlichkeits-Dichte-Funktion (PDF) für stetige Zufallsvariablen ist das Histogramm, das Sie bereits erwähnt. Jedoch, wie Sie unten sehen werden, Kernel Density Estimation (KDE) besser sein kann. Die zweite Art von Daten, die Sie beschreiben (Anzahl der Zeichen in einer Sequenz) ist die diskrete Art. Hier werden kernel-Dichte-Schätzung kann auch nützlich sein, und kann gesehen werden als ein Glättungsverfahren für die Situationen, in denen Sie nicht über eine ausreichende Menge von Proben für alle Werte der diskreten Variablen.
Schätzung Der Dichte
Das Beispiel unten zeigt, wie erste Daten generieren, die Proben aus einer Mischung von 2 Gauß-Verteilungen und wenden Sie dann die kernel-Dichte Schätzung zu finden, die Wahrscheinlichkeits-Dichte-Funktion:
Dies ergibt folgenden plot, wo die wahre Verteilung ist in blau dargestellt, das Histogramm ist in grün dargestellt, und die PDF-schätzungsweise mit KDE ist in rot dargestellt:
Wie Sie sehen können, in dieser situation, die PDF-angenähert durch das Histogramm ist nicht sehr nützlich, während KDE bietet eine viel bessere Schätzung. Jedoch mit einer größeren Anzahl von Daten, Proben und eine geeignete Wahl der bin-Größe, Histogramm produzieren könnten, eine gute Schätzung als gut.
Die Parameter, die Sie einstellen können, im Falle von KDE sind die kernel und die Bandbreite. Sie denken können dem kernel als Baustein für die Abschätzung der PDF, und mehrere kernel-Funktionen sind verfügbar in Scikit Lernen: Gauß, tophat, epanechnikov, exponentiell, linear, Cosinus. Die änderung der Bandbreite ermöglicht das anpassen der bias-Varianz-trade-off. Größere Bandbreite führt zu erhöhten bias, was gut ist, wenn Sie weniger Daten-samples. Eine kleinere Bandbreite erhöhen Varianz (weniger Proben enthalten sind in der Schätzung), wird aber eine bessere Schätzung, wenn mehr Proben zur Verfügung stehen.
Berechnung Der Wahrscheinlichkeit
Einer PDF-Datei, Wahrscheinlichkeit erhält man durch die Berechnung das integral über einen Bereich von Werten. Als Sie bemerkte, dass dies die Wahrscheinlichkeit 0 für einen bestimmten Wert.
Scikit Lernen scheint nicht zu haben eine eingebaute Funktion zur Berechnung der Wahrscheinlichkeit. Allerdings ist es leicht zu schätzen das integral der PDF-Datei über einen Bereich. Wir können es tun, durch die Auswertung der PDF-mehrmals innerhalb der Reihe und addieren der erhaltenen Werte multipliziert mit der Schrittweite zwischen jeder Bewertung zeigen. Im Beispiel unten
N
Proben mit Schrittstep
.Bitte beachten Sie, dass
kd.score_samples
generiert log-likelihood der Daten-samples. Dahernp.exp
ist erforderlich, um die Wahrscheinlichkeit.Die gleiche Berechnung kann durchgeführt werden, indem builtin SciPy integration Methoden, die geben ein bisschen mehr genaues Ergebnis:
Beispielsweise für einen Lauf, die erste Methode berechnet die Wahrscheinlichkeit als
0.0859024655305
während die zweite Methode produziert0.0850974209996139
.scipy.integrate.quad
. Ein bisschen weniger Hektik und genaueres Ergebnis.OK ich bieten dies als Ausgangspunkt, sondern die Schätzung der Dichte ist ein sehr breites Thema. Für Ihren Fall mit der Anzahl der Zeichen in einer Sequenz, können wir dieses Modell aus einer straight-forward-frequentistischen Perspektive mit empirische Wahrscheinlichkeit. Hier, die Wahrscheinlichkeit ist im wesentlichen eine Verallgemeinerung des Konzepts der Prozentsatz. In unserem Modell, dem Probe-Raum ist diskret und ist für alle positiven ganzen zahlen. Gut, dann kann man einfach zählen der vorkommen und teilt Sie durch die Gesamtzahl der Ereignisse, um Ihre Schätzung für die Wahrscheinlichkeiten. Überall haben wir null Beobachtungen, unsere Schätzung für die Wahrscheinlichkeit gleich null ist.
Nun, für Ihre timing-Daten, wird es natürlich mehr, um dieses Modell als eine kontinuierliche Verteilung. Statt mit einem parametrischen Ansatz, bei dem Sie davon ausgehen, dass Ihre Daten in einigen Verteilungs-und dann passen, dass mit der Verteilung Ihrer Daten, sollten Sie einen nicht-parametrischen Ansatz. Eine einfache Möglichkeit ist die Verwendung eines kernel-Dichte-Schätzung. Sie können einfach denken, dass Sie dies als eine Art der Glättung ein Histogramm, um Ihnen eine kontinuierliche wahrscheinlichkeitsdichte-Funktion. Es gibt mehrere Bibliotheken zur Verfügung. Vielleicht die einfachste für univariate Daten scipy ist:
Um die Wahrscheinlichkeit einer Beobachtung in einem Intervall:
Hier ist eine mögliche Lösung. Zählen Sie die Anzahl der vorkommen der einzelnen Werte der ursprünglichen Liste. Die Zukunft die Wahrscheinlichkeit für einen bestimmten Wert ist seine Vergangenheit, die rate des Auftretens, das ist einfach die # der Vergangenheit vorkommen, dividiert durch die Länge der ursprünglichen Liste. In Python ist es sehr einfach:
x ist die gegebene Liste von Werten