En estadística, a veces es útil saber si dos muestras de datos provienen de la misma distribución subyacente. Una forma de hacerlo es usar la prueba de Kolmogorov-Smirnov de dos muestras .
Su tarea será escribir un programa que lea en dos conjuntos enteros no negativos no clasificados y calcule la estadística principal utilizada en la prueba.
Dada una matriz A
y un número real x
, defina la función de distribución F
por
F(A,x) = (#number of elements in A less than or equal to x)/(#number of elements in A)
Dadas dos matrices A1
y A2
, definir
D(x) = |F(A1, x) - F(A2, x)|
La estadística de Kolmogorov-Smirnov de dos muestras es el valor máximo de D
todo real x
.
Ejemplo
A1 = [1, 2, 1, 4, 3, 6]
A2 = [3, 4, 5, 4]
Luego:
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 estadística KS para las dos matrices es 1/2
el valor máximo de D
.
Casos de prueba
[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
Reglas
- Puede escribir una función o un programa completo. La entrada puede ser a través de STDIN o argumento de función, y la salida puede ser a través de STDOUT o valor de retorno.
- Puede asumir cualquier formato de lista o cadena inequívoco para la entrada, siempre que sea coherente para ambas matrices
- En caso de que su idioma tenga algo incorporado para esto, no puede usarlo.
- Las respuestas deben ser correctas para al menos 3 cifras significativas
- Este es el código de golf , por lo que el programa en la menor cantidad de bytes gana
code-golf
array-manipulation
Sp3000
fuente
fuente
A
están debajolength(A)
?)Respuestas:
APL (
2924)(Gracias a Zgarb por la inspiración extra).
Esta es una función que toma las matrices como sus argumentos izquierdo y derecho.
Explicación:
fuente
⍺⍵
! Eso es útil.⍳⌈/
es innecesario, ya que el máximo se obtiene exactamente en uno de los valores de la matriz.0,
, ya que lo probará si la matriz lo contiene. ¡Gracias! (Y eso me enseñará, como generalmente si tiene que agregar un caso especial, eso significa que el algoritmo no es lo suficientemente simple)1
, ya que sería un escalar. Deberías escribir en su(,1)
lugar. Si haces eso, funciona.J - 39
Estoy seguro de que se puede acortar mucho más
Uso
fuente
f
si usa algo como,>./@:|@({.-{:)f"1@,
pero no estoy muy seguro.Python 3,
1321089588La entrada son 2 listas para la función
g
Gracias a: Sp3000, xnor, undergroundmonorail
Línea 2, primera llamada a
f
lecturas como "fax". Eso me pareció un poco divertidofuente
sum(n>x for n in a)
. Además, parece que no estás usandos=filter
. Y paramax
, en realidad no necesita los corchetes de la lista; Python permite que la función parens se duplique como comprensión parens.filter
en una versión anterior, olvidé eliminarlo. Lamentablemente, no puedo eliminar el primer par de corchetes, ya que será un generador, que no tienelen
.len
, lea el comentario nuevamente: PJavaScript (ES6) 99
119 128Implementación de JavaScript más o menos sencilla
, probablemente más fácil de jugar. En la función F uso> en lugar de <=, como abs (F (a) -F (b)) === abs ((1-F (a)) - (1-F (b)))No más definición de función como parámetro predeterminado en esta última edición.
Como dije, es sencillo. La función F es la función F, la función D es la función sin nombre utilizada en la línea 2. Se evalúa usando .map para cada valor presente en las dos matrices, ya que el valor máximo para
all
reales debe ser uno de estos. Por último, el operador de propagación (...) se utiliza para pasar la matriz de valores D como una lista de parámetros a la función máxima.Prueba en la consola FireFox / FireBug
Salida
fuente
K
: ¿es correcto que defina otras funcionesF,D
en la lista de argumentos? ¿Esto se comporta como algunos argumentos opcionales más o menos?CJam,
3331 bytesLa entrada es una matriz de estilos CJam de las dos matrices.
Ejemplo:
Salida:
Pruébalo en línea aquí
fuente
Matlab
(121)(119)Este es un programa que toma dos listas a través de stdin e imprime el resultado en stdout. Es un enfoque perfecto y traté de jugar al golf lo más posible.
K(a)
devuelve una función que calculax -> F(a,x)
. Luego, la función anónima@(x)abs(g(x)-h(x))
que corresponde a la funciónD
se aplica a cada entero posible0:max([a,b])
y se muestra el máximo de los resultados. (arrayfun
hace lo mismo quemap
en otros idiomas: aplica una función a cada elemento de una matriz)fuente
Erlang, 96 bytes
La solución JavaScript de edc65 portada a Erlang.
Prueba:
Salida:
fuente
STATA 215
Esto es 90% obteniendo la entrada en un formato que puede usarse porque STATA ya tiene un comando ksmirnov.
fuente
R, 65 bytes
Esta función toma dos vectores como argumentos y devuelve la diferencia máxima de sus funciones de distribución acumulativa empírica.
Si se permitieran las incorporaciones, se reduciría a solo 12 bytes:
fuente
Mathematica,
76 7363Mathematica tiene la función incorporada
KolmogorovSmirnovTest
, pero no la usaré aquí.Uso:
fuente
Implementación rápida en Python 3.4.2 (79 bytes):
Ejemplo:
fuente
D
, no solo implementarloD
como una función. Además, lo siento si no estaba claro, pero no puede asumir esoA1
yA2
ya son variables definidas (aunque puede ponerlas en el lambda, por ejemplolambda x,A1,A2:
, está bien)Java -
633622 BytesOk, primero, tratando de mejorar en Java, así que por eso lo intenté en Java, sé que nunca lo haré bien, pero eh, es divertido. segundo, honestamente pensé que podía hacer esto de una manera menos, luego llegué al escenario donde había dobles en todas partes, y las declaraciones de métodos significaban que usar métodos solo guardaba 4-5 caracteres en total. En resumen, soy un mal golfista.
editar: formato de uso> java K "2,10,10,10,1,6,7,2,10,4,7" "7,7,9,9,6,6,5,2,7,2 , 8 "
fuente
Haskell
9683(!) es la función kolmogorov-smirnov que toma dos listas
fuente
map
lugar defmap
; usar enmaximum
lugar defoldr1 max
; definirl=fromIntegral.length
y puede deshacerse dei
, y luego puede acortar%
al(filter(<=x)a)/l a
. ¡Se reduce a 84!R, 107 bytes
Enfoque diferente
Sin golf
fuente