Einführung
In dieser Herausforderung erhalten Sie eine Liste nichtnegativer Gleitkommazahlen, die unabhängig von einer Wahrscheinlichkeitsverteilung erstellt wurden. Ihre Aufgabe ist es, diese Verteilung aus den Zahlen abzuleiten. Um die Herausforderung zu meistern, stehen Ihnen nur fünf Verteilungen zur Auswahl.
U
die gleichmäßige Verteilung auf das Intervall [0,1].T
die Dreiecksverteilung im Intervall [0,1] mit Mode c = 1/2.B
die Beta-Verteilung im Intervall [0,1] mit den Parametern α = β = 1/2.E
die Exponentialverteilung über das Intervall [0, ∞) mit der Rate λ = 2.G
die Gammaverteilung im Intervall [0, ∞) mit den Parametern k = 3 und θ = 1/6.
Beachten Sie, dass alle oben genannten Verteilungen genau 1/2 bedeuten.
Die Aufgabe
Ihre Eingabe besteht aus einem Array nichtnegativer Gleitkommazahlen mit einer Länge zwischen 75 und 100 einschließlich. Ihre Ausgabe soll einer der Buchstaben sein UTBEG
, basierend darauf, aus welcher der oben genannten Verteilungen die Zahlen stammen.
Regeln und Wertung
Sie können entweder ein vollständiges Programm oder eine Funktion angeben. Standardlücken sind nicht zulässig.
In diesem Repository befinden sich fünf Textdateien, eine für jede Distribution mit einer Länge von jeweils genau 100 Zeilen. Jede Zeile enthält eine durch Kommas getrennte Liste mit 75 bis 100 Gleitkommazahlen, die unabhängig von der Verteilung gezeichnet und auf 7 Nachkommastellen gekürzt werden. Sie können die Trennzeichen ändern, um sie an das native Array-Format Ihrer Sprache anzupassen. Um als Antwort zu gelten, sollte Ihr Programm mindestens 50 Listen aus jeder Datei korrekt klassifizieren . Die Punktzahl einer gültigen Antwort ist die Anzahl der Bytes + die Gesamtzahl der falsch klassifizierten Listen . Die niedrigste Punktzahl gewinnt.
Antworten:
Julia,
6062 Bytes +252 Fehler =8264Das ist ziemlich einfach. Die Varianz der Verteilungen ist größtenteils unterschiedlich - 1/4 für Exponential, 1/8 für Beta, 1/12 für Gamma und Uniform und 1/24 für Dreieck. Wenn wir also die Varianz (hier
std
für die Standardabweichung, die Quadratwurzel der Varianz) verwenden, um die wahrscheinliche Verteilung zu bestimmen, müssen wir nur mehr tun, um Gamma von Uniform zu unterscheiden. Dafür suchen wir nach einem Wert größer als 1 (mitany(k.>1)
) - das heißt, wir überprüfen sowohl Exponential- als auch Gamma- Werte , da dies die Gesamtleistung verbessert.Um ein Byte zu speichern, wird die Zeichenfolge indiziert
"EGTBU"
, anstatt sie direkt als Zeichenfolge innerhalb der Bedingungen auszuwerten.Speichern Sie zu Testzwecken die txt-Dateien in einem Verzeichnis (behalten Sie die Namen unverändert bei) und führen Sie Julia REPL in diesem Verzeichnis aus. Fügen Sie dann die Funktion einem Namen als hinzu
und verwenden Sie den folgenden Code, um das Testen zu automatisieren (dies wird aus der Datei gelesen, in ein Array von Arrays konvertiert, die Funktion verwendet und für jede Nichtübereinstimmung ausgegeben):
Die Ausgabe besteht aus Zeilen, die den nicht übereinstimmenden Fall, die korrekte Verteilung -> die ermittelte Verteilung und die berechnete Varianz enthalten (z. B.
13 G->E 0.35008999281668357
bedeutet dies, dass die 13. Zeile in G.txt, die eine Gamma-Verteilung sein sollte, als Exponential bestimmt wird Verteilung mit der Standardabweichung 0,35008999 ...)Nach jeder Datei wird auch die Anzahl der Nichtübereinstimmungen für diese Datei ausgegeben, und am Ende werden auch die gesamten Nichtübereinstimmungen angezeigt (und es sollte 2 lauten, wenn wie oben ausgeführt). Im Übrigen sollte es 1 Mismatch für G.txt und 1 Mismatch für U.txt geben
quelle
R,
202 192 184 182 162154 Bytes + 0 FehlerDies basiert auf der Bayes'schen Formel P (D = d | X = x) = P (X = x | D = d) * P (D = d) / P (X = x), wobei D die Verteilung und X ist ist die Zufallsstichprobe. Wir wählen das d so, dass P (D = d | X = x) von den 5 am größten ist.
Ich gehe von einem flachen Prior aus (dh P (D = di) = 1/5 für i in [1,5]), was bedeutet, dass P (D = d) im Zähler in allen Fällen gleich ist (und der Nenner gleich wäre) ist in jedem Fall gleich), so dass wir alles außer dem P (x = X | D = d) weggolfen können, was (mit Ausnahme der Dreiecksverteilung) die nativen Funktionen in R vereinfacht.
ungolfed:
Beachten Sie, dass die ungolfed version nicht genau der golfed version entspricht, da durch das Entfernen des Nenners der Fall von Inf / Inf vermieden wird, der auftritt, wenn Sie zulassen, dass die Beta-Verteilung über das geschlossene Intervall [0,1] statt (0, 1) - wie die Beispieldaten. Eine zusätzliche if-Anweisung würde damit umgehen, aber da dies nur zu Illustrationszwecken dient, lohnt es sich wahrscheinlich nicht, die Komplexität hinzuzufügen, die nicht im Mittelpunkt des Algorithmus steht.
Vielen Dank an @Alex A. für zusätzliche Code-Reduzierungen. Vor allem für which.max!
quelle
{
und vor dem Schließen entfernen}
undprod
z. B.P=prod
dann Aliasing ausführenP(dunif(x))
usw. Die Funktion benötigt keinen Namen, um eine gültige Übermittlung zu sein, und Sie können ihn entfernenp=
. Auch hervorragende Arbeit. :)which.max(c(u,r,b,e,g))
anstelle von verwendenc(u,r,b,e,g)==max(c(u,r,b,e,g))
.function(x){c("U","T","B","E","G")[which.max(lapply(list(dunif(x),sapply(x,function(y)max(0,2-4*abs(.5-y))),dbeta(x,.5,.5),dexp(x,2),dgamma(x,3,6)),prod))]}
CJam, 76
Der Quellcode ist 43 Bytes lang und klassifiziert 33 Listen falsch .
Nachprüfung
Idee
Es ist einfach, die Exponential- und Gammaverteilung von den übrigen zu unterscheiden, da sie die einzigen Verteilungen sind, die Werte größer als 1 annehmen .
Um zwischen Gamma , Exponential und anderen zu entscheiden , betrachten wir den zweithöchsten Wert der Stichprobe.
Wenn es in [1.5, ∞) liegt , raten wir Gamma .
Wenn es in [1, 1.5] liegt , schätzen wir exponentiell .
Wenn es in [0, 1) liegt , haben wir drei verbleibende Möglichkeiten.
Die verbleibenden Verteilungen können anhand des Prozentsatzes der Stichprobenwerte unterschieden werden, die nahe am Mittelwert ( 0,5 ) liegen.
Wir teilen die Länge der Stichprobe durch die Anzahl der Werte, die in (0,3, 0,7) fallen, und sehen uns den resultierenden Quotienten an.
Wenn es in (1, 2] liegt , raten wir dreieckig .
Wenn es in (2, 3] liegt , raten wir Uniform .
Wenn es in (3, ∞) liegt , raten wir Beta .
Code
quelle
Matlab,
428328 Bytes + 33 falsch klassifiziertDieses Programm vergleicht im Grunde die reale CDF mit einer geschätzten anhand der Daten und berechnet dann den mittleren Abstand zwischen diesen beiden: Ich denke, das Bild erklärt mehr:
Die in diesem Bild gezeigten Daten zeigen ziemlich deutlich, dass es zur türkisfarbenen Verteilung gehört, da es dieser ziemlich nahe kommt, also ist es im Grunde das, was mein Programm tut. Es kann wohl etwas mehr golfen werden. Für mich war das zunächst eine konzeptionelle Herausforderung, nicht sehr golfen.
Dieser Ansatz ist auch unabhängig von den gewählten pdfs, er würde für jede Menge von Distributionen funktionieren .
Der folgende (ungolfed) Code sollte zeigen, wie es gemacht wird. Die Golfversion ist unten.
Vollgolf-Version:
quelle
Perl, 119 Bytes + 8 Fehlklassifizierungen = 127
Ich habe einen winzigen Entscheidungsbaum für drei Funktionen erstellt:
Aufgerufen mit
perl -F, -lane -e '...'
. Ich bin nicht sicher, ob ich eine Strafe für die nicht standardmäßigen Parameter hinzufügen soll. Wenn die Kommas Leerzeichen wären , hätte ich wohl ohne das -F davonkommen können ,Die leicht formatierte Ausgabe (ohne das Flag -l) lautet:
quelle
Python, 318 Bytes + 35 Fehlklassifizierungen
Idee: Die Verteilung basiert auf dem p-Wert des Kolmogorov-Smirnov-Tests.
Prüfung
quelle