In der Statistik ist es manchmal hilfreich zu wissen, ob zwei Datenstichproben aus derselben zugrunde liegenden Verteilung stammen. Eine Möglichkeit hierfür ist die Verwendung des Kolmogorov-Smirnov-Tests mit zwei Stichproben .
Ihre Aufgabe besteht darin, ein Programm zu schreiben, das zwei unsortierte nichtnegative Ganzzahl-Arrays einliest und die im Test verwendete Hauptstatistik berechnet.
Definieren Sie die Verteilungsfunktion für ein Array A
und eine reelle Zahl mitx
F
F(A,x) = (#number of elements in A less than or equal to x)/(#number of elements in A)
Gegeben zwei Arrays A1
und A2
definieren
D(x) = |F(A1, x) - F(A2, x)|
Die Kolmogorov-Smirnov-Statistik mit zwei Stichproben ist der Maximalwert von D
over all real x
.
Beispiel
A1 = [1, 2, 1, 4, 3, 6]
A2 = [3, 4, 5, 4]
Dann:
D(1) = |2/6 - 0| = 1/3
D(2) = |3/6 - 0| = 1/2
D(3) = |4/6 - 1/4| = 5/12
D(4) = |5/6 - 3/4| = 1/12
D(5) = |5/6 - 4/4| = 1/6
D(6) = |6/6 - 4/4| = 0
Die KS-Statistik für die beiden Arrays ist 1/2
der Maximalwert von D
.
Testfälle
[0] [0] -> 0.0
[0] [1] -> 1.0
[1, 2, 3, 4, 5] [2, 3, 4, 5, 6] -> 0.2
[3, 3, 3, 3, 3] [5, 4, 3, 2, 1] -> 0.4
[1, 2, 1, 4, 3, 6] [3, 4, 5, 4] -> 0.5
[8, 9, 9, 5, 5, 0, 3] [4, 9, 0, 5, 5, 0, 4, 6, 9, 10, 4, 0, 9] -> 0.175824
[2, 10, 10, 10, 1, 6, 7, 2, 10, 4, 7] [7, 7, 9, 9, 6, 6, 5, 2, 7, 2, 8] -> 0.363636
Regeln
- Sie können eine Funktion oder ein vollständiges Programm schreiben. Die Eingabe kann über STDIN oder ein Funktionsargument erfolgen, und die Ausgabe kann über STDOUT oder einen Rückgabewert erfolgen.
- Sie können jedes eindeutige Listen- oder Zeichenfolgenformat für die Eingabe annehmen, sofern es für beide Arrays konsistent ist
- Wenn es unwahrscheinlich ist, dass Ihre Sprache dafür eine eingebaute Sprache ist, können Sie diese möglicherweise nicht verwenden.
- Die Antworten müssen auf mindestens 3 signifikante Zahlen zutreffen
- Das ist Code-Golf , also gewinnt das Programm mit den wenigsten Bytes
code-golf
array-manipulation
Sp3000
quelle
quelle
A
untenlength(A)
?)Antworten:
APL (
2924)(Danke an Zgarb für die zusätzliche Inspiration.)
Dies ist eine Funktion, die die Arrays als linkes und rechtes Argument verwendet.
Erläuterung:
quelle
⍺⍵
! Das ist praktisch.⍳⌈/
unnötig, da das Maximum genau bei einem der Array-Werte erhalten wird.0,
, da es darauf hin überprüft, ob das Array es enthält. Vielen Dank! (Und das wird mich lehren, wie normalerweise, wenn Sie in einem speziellen Fall hinzufügen müssen, bedeutet das, dass der Algorithmus nicht einfach genug ist.)1
, da dies ein Skalar wäre. Du solltest(,1)
stattdessen schreiben . Wenn Sie das tun, funktioniert es.J - 39
Ich bin sicher, man kann viel mehr verkürzen
Verwendung
quelle
f
wenn Sie so etwas verwenden,>./@:|@({.-{:)f"1@,
aber ich bin nicht ganz sicher.Python 3,
1321089588Die Eingabe sind 2 Listen zur Funktion
g
Dank an: Sp3000, xnor, undergroundmonorail
Zeile 2, erster Anruf
f
liest sich wie "Fax". Ich fand das leicht amüsantquelle
sum(n>x for n in a)
. Es sieht auch so aus, als würden Sie nicht verwendens=filter
. Undmax
, Sie müssen nicht tatsächlich die Liste Klammern; Mit Python können die Funktionsparens als Verständnisparens verdoppelt werden.filter
in einer früheren Version vergessen, es zu entfernen. Leider kann ich das erste Paar eckiger Klammern nicht entfernen, da es sich dann um einen Generator handelt, der keine hatlen
.len
, lesen Sie den Kommentar noch einmal: PJavaScript (ES6) 99
119 128Mehr oder weniger unkomplizierte JavaScript-Implementierung
, wahrscheinlich besser zum Golfen geeignet. In der F-Funktion verwende ich> anstelle von <= als abs (F (a) -F (b)) === abs ((1-F (a)) - (1-F (b)))Keine Funktionsdefinition mehr als Standardparameer in dieser letzten Bearbeitung.
Wie gesagt, es ist unkompliziert. Die F-Funktion ist die F-Funktion, die D-Funktion ist die unbenannte Funktion, die in Zeile 2 verwendet wird. Sie wird mit .map für jeden in den beiden Arrays vorhandenen Wert ausgewertet, da der Maximalwert für reelle Werte
all
einer dieser Werte sein muss. Zuletzt wird mit dem Spread-Operator (...) das D-Wertearray als Parameterliste an die Max-Funktion übergeben.Test In FireFox / Firebug - Konsole
Ausgabe
quelle
K
: Ist es richtig, dass Sie andere FunktionenF,D
in der Argumentliste definieren ? Verhält sich das wie einige optionale Argumente oder so?CJam,
3331 BytesInput ist ein CJam-Styles-Array der beiden Arrays.
Beispiel:
Ausgabe:
Probieren Sie es hier online aus
quelle
Matlab
(121)(119)Dies ist ein Programm, das zwei Listen in stdin aufnimmt und das Ergebnis in stdout ausgibt. Es ist eine leichte Aufgabe und ich habe versucht, so viel wie möglich Golf zu spielen.
K(a)
Gibt eine berechnete Funktion zurückx -> F(a,x)
. Dann wird die anonyme Funktion,@(x)abs(g(x)-h(x))
die der Funktion entspricht,D
auf jede mögliche ganze Zahl angewendet0:max([a,b])
und das Maximum der Ergebnisse angezeigt. (arrayfun
verhält sich wiemap
in anderen Sprachen: Es wendet eine Funktion auf jedes Element eines Arrays an.)quelle
Erlang, 96 Bytes
Die JavaScript-Lösung von edc65 wurde nach Erlang portiert.
Prüfung:
Ausgabe:
quelle
STATA 215
Dies bedeutet, dass 90% der Eingaben in ein Format gelangen, das verwendet werden kann, da STATA bereits über einen Befehl ksmirnov verfügt.
quelle
R, 65 Bytes
Diese Funktion nimmt zwei Vektoren als Argumente und gibt die maximale Differenz ihrer empirischen kumulativen Verteilungsfunktionen zurück.
Wenn eingebaute Funktionen zulässig wären, würden sie auf nur 12 Byte reduziert:
quelle
Mathematica,
76 7363Mathematica hat die eingebaute Funktion
KolmogorovSmirnovTest
, aber ich werde sie hier nicht verwenden.Verwendung:
quelle
Schnelle Implementierung in Python 3.4.2 (79 Bytes):
Beispiel:
quelle
D
und nicht nurD
als Funktion zu implementieren . Es tut mir auch leid, wenn ich nicht klar war, aber Sie können das nicht annehmenA1
undA2
sind bereits definierte Variablen (Sie können sie jedoch in das Lambdalambda x,A1,A2:
Java -
633622 BytesOk, als erstes versuche ich, mich in Java zu verbessern. Deshalb habe ich es in Java versucht. Ich weiß, ich werde es nie gut machen, aber es macht Spaß. zweitens dachte ich ehrlich, ich könnte dies viel weniger tun, dann kam ich zu dem Stadium, in dem es überall Doppelte gab, und die Methodendeklarationen bedeuteten, dass mit Methoden nur 4-5 Zeichen insgesamt gespart wurden. Kurz gesagt, ich bin ein schlechter Golfer.
Bearbeiten: Verwendungsformat> Java K "2,10,10,10,1,6,7,2,10,4,7" "7,7,9,9,6,6,5,2,7,2 8 "
quelle
Haskell
9683(!) ist die Kolmogorov-Smirnov-Funktion, die zwei Listen nimmt
quelle
map
eher verwenden alsfmap
; verwendenmaximum
eher alsfoldr1 max
; definierenl=fromIntegral.length
und Sie können loswerdeni
, und dann können Sie verkürzen%
zul(filter(<=x)a)/l a
. Runter auf 84!R, 107 Bytes
Anderer Ansatz
Ungolfed
quelle