Nas estatísticas, às vezes é útil saber se duas amostras de dados são da mesma distribuição subjacente. Uma maneira de fazer isso é usar o teste de duas amostras de Kolmogorov-Smirnov .
Sua tarefa será escrever um programa que leia duas matrizes inteiras não-negativas não classificadas e calcule a principal estatística usada no teste.
Dada uma matriz A
e um número real x
, defina a função de distribuição F
por
F(A,x) = (#number of elements in A less than or equal to x)/(#number of elements in A)
Dadas duas matrizes A1
e A2
, defina
D(x) = |F(A1, x) - F(A2, x)|
A estatística Kolmogorov-Smirnov de duas amostras é o valor máximo de D
todo o real x
.
Exemplo
A1 = [1, 2, 1, 4, 3, 6]
A2 = [3, 4, 5, 4]
Então:
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
A estatística KS para as duas matrizes é 1/2
o valor máximo de D
.
Casos de teste
[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
Regras
- Você pode escrever uma função ou um programa completo. A entrada pode ser via STDIN ou argumento de função e a saída pode ser via STDOUT ou valor de retorno.
- Você pode assumir qualquer formato inequívoco de lista ou string para a entrada, desde que seja consistente para ambas as matrizes
- Se você não tiver um idioma embutido para isso, não poderá usá-lo.
- As respostas precisam estar corretas para pelo menos 3 números significativos
- Isso é código-golfe , então o programa com o menor número de bytes ganha
code-golf
array-manipulation
Sp3000
fonte
fonte
A
são abaixolength(A)
?)Respostas:
APL (
2924)(Obrigado a Zgarb pela inspiração extra.)
Essa é uma função que aceita as matrizes como argumentos esquerdo e direito.
Explicação:
fonte
⍺⍵
! Isso é útil.⍳⌈/
desnecessário, pois o máximo é obtido exatamente em um dos valores da matriz.0,
disso, pois ele testará isso se a matriz o contiver. Obrigado! (E isso vai me ensinar, como geralmente se você tem que adicionar em um caso especial, significa que o algoritmo não é suficiente simples.)1
, pois isso seria um escalar. Você deve escrever em seu(,1)
lugar. Se você fizer isso, funciona.J - 39
Tenho certeza que pode ser encurtar muito mais
Uso
fonte
f
se usar algo como,>./@:|@({.-{:)f"1@,
mas não tenho certeza.Python 3,
1321089588A entrada são 2 listas para a função
g
Graças a: Sp3000, xnor, undergroundmonorail
Linha 2, primeira chamada para
f
leituras como "fax". Eu achei isso levemente divertidofonte
sum(n>x for n in a)
. Além disso, parece que você não está usandos=filter
. Emax
, na verdade, você não precisa dos colchetes da lista; O Python permite que a função pareça o dobro da compreensão.filter
em uma versão anterior, esqueci de removê-lo. Infelizmente não consigo remover o primeiro par de colchetes desde então, será um gerador que não possuilen
.len
, leia o comentário novamente: PJavaScript (ES6) 99
119 128Implementação de JavaScript mais ou menos direta
, provavelmente mais fácil de jogar. Na função F eu uso> em vez de <=, como abs (F (a) -F (b)) === abs ((1-F (a)) - (1-F (b)))Não há mais definição de função como parâmetro padrão nesta última edição.
Como eu disse, é direto. A função F é a função F, a função D é a função sem nome usada na linha 2. É avaliada usando .map para cada valor presente nas duas matrizes, pois o valor máximo para
all
reais deve ser um deles. Por fim, o operador de spread (...) é usado para passar a matriz de valores D como uma lista de parâmetros para a função max.Teste no console do FireFox / FireBug
Resultado
fonte
K
: é correto que você defina outras funçõesF,D
na lista de argumentos? Isso se comporta como alguns argumentos opcionais ou algo assim?CJam,
3331 bytesEntrada é uma matriz de estilos CJam das duas matrizes.
Exemplo:
Resultado:
Experimente online aqui
fonte
Matlab
(121)(119)Este é um programa que pega duas listas através de stdin e imprime o resultado em stdout. É uma abordagem direta e tentei jogar golfe o máximo possível.
K(a)
retorna uma função que calculax -> F(a,x)
. Em seguida, a função anônima@(x)abs(g(x)-h(x))
que corresponde à funçãoD
é aplicada a todo número inteiro possível0:max([a,b])
e o máximo dos resultados é exibido. (arrayfun
faz o mesmo quemap
em outros idiomas: aplica uma função a todos os elementos de uma matriz)fonte
Erlang, 96 bytes
A solução JavaScript do edc65 foi portada para Erlang.
Teste:
Resultado:
fonte
STATA 215
Isso significa 90% da entrada do arquivo em um formato que pode ser usado porque o STATA já possui um comando ksmirnov.
fonte
R, 65 bytes
Essa função aceita dois vetores como argumentos e retorna a diferença máxima de suas funções de distribuição cumulativa empírica.
Se os embutidos fossem permitidos, reduziria para meros 12 bytes:
fonte
Mathematica,
76 7363O Mathematica possui a função interna
KolmogorovSmirnovTest
, mas não a utilizarei aqui.Uso:
fonte
Implementação rápida no Python 3.4.2 (79 bytes):
Exemplo:
fonte
D
, não apenas implementarD
como uma função. Além disso, me desculpe se eu não estava claro, mas você não pode assumir queA1
eA2
já estão variáveis definidas (você pode colocá-los no lambda embora, por exemplolambda x,A1,A2:
- que está tudo bem)Java -
633622 bytesOk, primeiro, tentando melhorar em java, por isso tentei em java, sei que nunca vou me sair bem, mas é divertido. segundo, sinceramente pensei que poderia fazer isso de uma maneira menos, depois cheguei ao estágio em que havia duplas em todos os lugares, e as declarações do método significavam que o uso de métodos salvava apenas 4-5 caracteres no total. em resumo, sou um mau jogador de golfe.
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 "
fonte
Haskell
9683(!) é a função kolmogorov-smirnov que leva duas listas
fonte
map
vez defmap
; use emmaximum
vez defoldr1 max
; definal=fromIntegral.length
e você poderá se livrari
e, em seguida, poderá abreviá%
-lol(filter(<=x)a)/l a
. Reduz para 84!R, 107 bytes
Abordagem diferente
Ungolfed
fonte