En statistiques, il est parfois utile de savoir si deux échantillons de données proviennent de la même distribution sous-jacente. Une façon de procéder consiste à utiliser le test de Kolmogorov-Smirnov à deux échantillons .
Votre tâche sera d'écrire un programme qui lit dans deux tableaux d'entiers non négatifs non triés et calcule la statistique principale utilisée dans le test.
Étant donné un tableau A
et un nombre réel x
, définissez la fonction de distribution F
en
F(A,x) = (#number of elements in A less than or equal to x)/(#number of elements in A)
Étant donné deux tableaux A1
et A2
, définissez
D(x) = |F(A1, x) - F(A2, x)|
La statistique de Kolmogorov-Smirnov à deux échantillons est la valeur maximale de D
tout réel x
.
Exemple
A1 = [1, 2, 1, 4, 3, 6]
A2 = [3, 4, 5, 4]
Alors:
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
La statistique KS pour les deux tableaux est 1/2
la valeur maximale de D
.
Cas de test
[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
Règles
- Vous pouvez écrire une fonction ou un programme complet. L'entrée peut être via STDIN ou un argument de fonction, et la sortie peut être via STDOUT ou une valeur de retour.
- Vous pouvez assumer n'importe quel format de liste ou de chaîne sans ambiguïté pour l'entrée, tant qu'il est cohérent pour les deux tableaux
- Au cas où votre langue possède une fonction intégrée pour cela, vous ne pouvez pas l'utiliser.
- Les réponses doivent être correctes à au moins 3 chiffres significatifs
- C'est du code-golf , donc le programme dans le moins d'octets gagne
code-golf
array-manipulation
Sp3000
la source
la source
A
sont ci-dessouslength(A)
?)Réponses:
APL (
2924)(Merci à Zgarb pour l'inspiration supplémentaire.)
Il s'agit d'une fonction qui prend les tableaux comme arguments gauche et droit.
Explication:
la source
⍺⍵
! C'est pratique.⍳⌈/
n'est pas nécessaire, car le maximum est obtenu exactement à l'une des valeurs du tableau.0,
, car il le testera si le tableau le contient. Merci! (Et cela m'apprendra, comme d'habitude si vous devez ajouter dans un cas spécial, cela signifie que l'algorithme n'est pas assez simple.)1
, car ce serait un scalaire. Vous devriez(,1)
plutôt écrire . Si vous faites cela, cela fonctionne.J - 39
Je suis sûr que cela peut être raccourci beaucoup plus
Usage
la source
f
si vous utilisez quelque chose comme>./@:|@({.-{:)f"1@,
mais je ne suis pas tout à fait sûr.Python 3,
1321089588Les entrées sont 2 listes pour la fonction
g
Merci à: Sp3000, xnor, undergroundmonorail
Ligne 2, premier appel à
f
lit comme "fax". J'ai trouvé ça légèrement amusantla source
sum(n>x for n in a)
. De plus, il semble que vous n'utilisiez pass=filter
. Et pourmax
, vous n'avez pas réellement besoin des crochets de liste; Python laisse la fonction parens doubler comme parens de compréhension.filter
dans une version précédente, j'ai oublié de le supprimer. Malheureusement, je ne peux pas supprimer la première paire de crochets car ce sera alors un générateur, qui n'en a paslen
.len
, relisez le commentaire: PJavaScript (ES6) 99
119 128ImplémentationJavaScript plus ou moins simple, probablement plus jouable. Dans la fonction F, j'utilise> au lieu de <=, comme abs (F (a) -F (b)) === abs ((1-F (a)) - (1-F (b)))Plus de définition de fonction comme paramètre par défaut dans cette dernière édition.
Comme je l'ai dit, c'est simple. La fonction F est la fonction F, la fonction D est la fonction sans nom utilisée à la ligne 2. Elle est évaluée en utilisant .map pour chaque valeur présente dans les deux tableaux, car la valeur maximale pour les
all
réels doit être l'une d'entre elles. Enfin, l'opérateur d'étalement (...) est utilisé pour passer le tableau de valeurs D en tant que liste de paramètres à la fonction max.Test dans la console FireFox / FireBug
Production
la source
K
: est-il exact que vous définissez d'autres fonctionsF,D
dans la liste des arguments? Cela se comporte-t-il comme des arguments facultatifs?CJam,
3331 octetsL'entrée est un tableau de styles CJam des deux tableaux.
Exemple:
Production:
Essayez-le en ligne ici
la source
Matlab
(121)(119)Il s'agit d'un programme qui prend deux listes via stdin et imprime le résultat sur stdout. C'est une approche efficace et j'ai essayé de jouer au golf autant que possible.
K(a)
renvoie une fonction qui calculex -> F(a,x)
. Ensuite, la fonction anonyme@(x)abs(g(x)-h(x))
qui correspond à la fonctionD
est appliquée à chaque entier possible de0:max([a,b])
et le maximum des résultats est affiché. (arrayfun
fait la même chose quemap
dans les autres langages: il applique une fonction à chaque élément d'un tableau)la source
Erlang, 96 octets
La solution JavaScript d'edc65 portée sur Erlang.
Tester:
Production:
la source
STATA 215
Cela représente 90% de l'entrée dans un format utilisable car STATA a déjà une commande ksmirnov.
la source
R, 65 octets
Cette fonction prend deux vecteurs comme arguments et renvoie la différence maximale de leurs fonctions de distribution cumulative empirique.
Si les fonctions intégrées étaient autorisées, cela réduirait à seulement 12 octets:
la source
Mathematica,
76 7363Mathematica a la fonction intégrée
KolmogorovSmirnovTest
, mais je ne l'utilise pas ici.Usage:
la source
Implémentation rapide en Python 3.4.2 (79 octets):
Exemple:
la source
D
, et non à simplement l'implémenter enD
tant que fonction. De plus, je suis désolé si je n'ai pas été clair, mais vous ne pouvez pas supposer celaA1
et ceA2
sont déjà des variables définies (vous pouvez les mettre dans le lambda cependant, par exemplelambda x,A1,A2:
- ça va)Java -
633622 octetsD'accord, tout d'abord, en essayant de m'améliorer en java, c'est pourquoi je l'ai essayé en java, je sais que je ne réussirai jamais bien, mais eh, c'est amusant. deuxièmement, je pensais honnêtement que je pouvais faire cela de manière beaucoup moins, puis je suis arrivé à l'étape où il y avait des doubles partout, et les déclarations de méthode signifiaient que l'utilisation de méthodes ne permettait de sauver que 4-5 caractères au total. bref, je suis un mauvais golfeur.
modifier: format d'utilisation> java K "2,10,10,10,1,6,7,2,10,4,7" "7,7,9,9,6,6,5,2,7,2 , 8 "
la source
Haskell
9683(!) est la fonction kolmogorov-smirnov qui prend deux listes
la source
map
plutôt quefmap
; utilisermaximum
plutôt quefoldr1 max
; définirl=fromIntegral.length
et vous pouvez vous débarrasseri
, puis vous pouvez raccourcir%
enl(filter(<=x)a)/l a
. Obtient à 84!R, 107 octets
Une approche différente
Non golfé
la source