Verwendung der Gauss'schen Wahrscheinlichkeitsdichtefunktion in C ++

8

Erstens, ist dies die korrekte C ++ - Darstellung der pdf-Gauss-Funktion?

%Vor%

Zweitens macht es Sinn, dass wir so etwas tun?

%Vor%

BEARBEITEN: Ein Beispiel dafür, was genau Sie erreichen möchten:

Sagen wir, ich habe eine Daten namens Y1. Dann kommen neue Daten namens Xi an. Ich möchte sehen, ob ich Xi mit Y1 verbinden sollte oder ob ich Xi als neue Daten behalten soll, die Y2 heißen. Dies basiert auf dem Abstand zwischen den neuen Daten Xi und den existierenden Daten Y1. Wenn Xi "weit" von Y1 entfernt ist, wird Xi nicht mit Y1 verknüpft, andernfalls wird es, wenn es "nicht weit" ist, Y1 zugeordnet. Jetzt möchte ich dieses "weit" oder "nicht weit" modellieren, indem ich eine Gaußsche Wahrscheinlichkeit verwende, basierend auf dem Mittelwert und der Standardabweichung der Entfernungen zwischen Y und den Daten, die in der Vergangenheit bereits mit Y verbunden waren.

    
shn 01.06.2012, 08:38
quelle

4 Antworten

2

ja. boost::random hat eine Gauss-Verteilung.

Siehe zum Beispiel diese Frage: Wie Boost normale Verteilungsklassen verwenden ?

Als Alternative gibt es einen Standardweg, um zwei gleichmäßig verteilte Zufallszahlen in zwei normalverteilte Zahlen umzuwandeln.

Siehe z. diese Frage: Generieren von Zufallszahlen nach einer normalen Verteilung in C / C ++

Als Antwort auf Ihre letzte Bearbeitung (beachten Sie, dass die Frage in der Bearbeitung komplett anders ist, daher ist meine Antwort auf eine ursprüngliche Frage irrelevant). Ich denke, es wäre besser, zuerst selbst zu formulieren, was genau gemeint ist, wenn man "weit oder nicht weit mit einer gaußschen Verteilung modelliert". Dann formuliere dieses Verständnis mathematisch und beginne erst dann mit der Programmierung. So wie es aussieht, denke ich, dass das Problem unterspezifiziert ist.

    
ev-br 01.06.2012, 08:40
quelle
9

Technisch gesehen

%Vor%

ist nicht falsch, kann aber verbessert werden.

Erstens kann 1 / sqrt(2 Pi) vorberechnet werden, und pow mit Ganzzahlen zu verwenden ist keine gute Idee: es kann exp(2 * log x) oder eine auf Gleitkommaexponenten spezialisierte Routine anstelle von einfach x * x verwenden.

Beispiel besserer Code:

%Vor%

Sie können dies als Vorlage verwenden, anstatt float :

zu verwenden %Vor%

Dies ermöglicht es Ihnen, normal_pdf auf double arguments zu verwenden (es ist allerdings nicht so viel generischer). Es gibt Vorbehalte mit dem letzten Code, nämlich dass man sich davor hüten muss, es nicht mit ganzen Zahlen zu verwenden (es gibt Workarounds, aber das macht die Routine ausführlicher).

    
Alexandre C. 01.06.2012 10:07
quelle
1

Verwenden Sie die Box-Muller-Transformation. Dies erzeugt Werte mit einer normalen / Gaußschen Verteilung.

Ссылка

Ссылка

Es ist nicht sehr komplex, mathematische Bibliotheken zu programmieren.

zB

Generiere 2 einheitliche Zahlen, benutze sie, um zwei normal verteilte Zahlen zu erhalten. Dann gebe eins zurück und speichere das andere, damit du es für deine "nächste" Anfrage einer zufälligen Nummer hast.

    
Totero 01.06.2012 08:47
quelle
0

std :: normal_distribution ist eine Standard-C ++ - Bibliotheksfunktion ...

Ссылка

    
Andrew Tomazos 01.06.2012 10:20
quelle