Dalam statistik, terkadang berguna untuk mengetahui apakah dua sampel data berasal dari distribusi dasar yang sama. Salah satu cara untuk melakukan ini adalah dengan menggunakan uji Kolmogorov-Smirnov dua sampel .
Tugas Anda adalah menulis sebuah program yang membaca dalam dua array integer non-negatif yang tidak disortir dan menghitung statistik utama yang digunakan dalam pengujian.
Diberikan array A
dan bilangan real x
, tentukan fungsi distribusi F
dengan
F(A,x) = (#number of elements in A less than or equal to x)/(#number of elements in A)
Diberikan dua array A1
dan A2
, tentukan
D(x) = |F(A1, x) - F(A2, x)|
Statistik Kolmogorov-Smirnov dua sampel adalah nilai maksimum dari D
semua nyata x
.
Contoh
A1 = [1, 2, 1, 4, 3, 6]
A2 = [3, 4, 5, 4]
Kemudian:
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
Statistik KS untuk dua array adalah 1/2
, nilai maksimum D
.
Uji kasus
[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
Aturan
- Anda dapat menulis fungsi atau program lengkap. Input mungkin melalui STDIN atau argumen fungsi, dan output mungkin melalui STDOUT atau nilai balik.
- Anda dapat mengasumsikan format daftar atau string yang tidak ambigu untuk input, asalkan konsisten untuk kedua array
- Jika bahasa Anda memiliki builtin untuk ini, Anda tidak dapat menggunakannya.
- Jawaban harus benar setidaknya untuk 3 angka penting
- Ini adalah kode-golf , sehingga program dalam byte paling sedikit menang
code-golf
array-manipulation
Sp3000
sumber
sumber
A
bawahlength(A)
?)Jawaban:
APL (
2924)(Terima kasih kepada Zgarb untuk inspirasi ekstra.)
Ini adalah fungsi yang mengambil array sebagai argumen kiri dan kanannya.
Penjelasan:
sumber
⍺⍵
! Itu berguna.⍳⌈/
tidak perlu, karena maksimum diperoleh tepat di salah satu nilai array.0,
juga, karena akan menguji untuk itu jika array mengandungnya. Terima kasih! (Dan itu akan mengajari saya, seperti biasanya jika Anda harus menambahkan dalam kasus khusus, itu artinya algoritme tidak cukup sederhana.)1
, karena itu akan menjadi skalar. Anda harus menulis(,1)
. Jika Anda melakukannya, itu akan berhasil.J - 39
Saya yakin bisa dipersingkat lebih banyak
Pemakaian
sumber
f
jika Anda menggunakan sesuatu seperti>./@:|@({.-{:)f"1@,
tapi saya tidak yakin.Python 3,
1321089588Input adalah 2 daftar ke fungsi
g
Terima kasih kepada: Sp3000, xnor, undergroundmonorail
Baris 2, panggilan pertama
f
berbunyi seperti "faks". Saya menemukan itu agak lucusumber
sum(n>x for n in a)
. Juga, sepertinya Anda tidak menggunakans=filter
. Dan untukmax
, Anda sebenarnya tidak membutuhkan tanda kurung; Python memungkinkan fungsi parens berfungsi ganda sebagai parens pemahaman.filter
dalam versi sebelumnya, lupa menghapusnya. Sayangnya saya tidak dapat menghapus pasangan pertama kurung sejak itu akan menjadi generator, yang tidak memilikilen
.len
, baca komentar lagi: PJavaScript (ES6) 99
119 128Implementasi JavaScript lebih atau kurang langsung
, mungkin lebih golf. Dalam fungsi F saya menggunakan> alih-alih <=, sebagai abs (F (a) -F (b)) === abs ((1-F (a)) - (1-F (b)))Tidak ada lagi definisi fungsi sebagai parameter default dalam pengeditan terakhir ini.
Seperti yang saya katakan, itu mudah. Fungsi F adalah fungsi F, fungsi D adalah fungsi yang tidak disebutkan namanya yang digunakan pada baris 2. Dievaluasi menggunakan .map untuk setiap nilai yang ada di dua array, karena nilai maksimum untuk
all
real harus menjadi salah satunya. Akhirnya, operator spread (...) digunakan untuk meneruskan larik nilai D sebagai daftar parameter ke fungsi maks.Uji di konsol FireFox / FireBug
Keluaran
sumber
K
: Apakah benar Anda mendefinisikan fungsi lainF,D
dalam daftar argumen? Apakah ini berperilaku seperti beberapa argumen opsional atau lebih?CJam,
3331 byteInput adalah array gaya CJam dari dua array.
Contoh:
Keluaran:
Cobalah online di sini
sumber
Matlab
(121)(119)Ini adalah program yang mengambil dua daftar melalui stdin dan mencetak hasilnya ke stdout. Ini adalah pendekatan strightfwd dan saya mencoba golf sebanyak mungkin.
K(a)
mengembalikan fungsi yang menghitungx -> F(a,x)
. Kemudian fungsi anonim@(x)abs(g(x)-h(x))
yang sesuai dengan fungsiD
diterapkan ke setiap kemungkinan integer0:max([a,b])
dan hasil maksimal ditampilkan. (arrayfun
melakukan hal yang sama sepertimap
dalam bahasa lain: itu berlaku fungsi untuk setiap elemen array)sumber
Erlang, 96 Bytes
Solusi JavaScript edc65 di porting ke Erlang.
Uji:
Keluaran:
sumber
STATA 215
Ini adalah 90% memasukkan input ke dalam format yang dapat digunakan karena STATA sudah memiliki perintah ksmirnov.
sumber
R, 65 byte
Fungsi ini mengambil dua vektor sebagai argumen dan mengembalikan perbedaan maksimum fungsi distribusi kumulatif empirisnya.
Jika built-in diizinkan, itu akan berkurang menjadi hanya 12 byte:
sumber
Mathematica,
76 7363Mathematica memiliki fungsi bawaan
KolmogorovSmirnovTest
, tetapi saya tidak akan menggunakannya di sini.Pemakaian:
sumber
Implementasi cepat dalam Python 3.4.2 (79 byte):
Contoh:
sumber
D
, bukan hanya mengimplementasikanD
sebagai fungsi. Juga, saya minta maaf jika saya tidak jelas, tetapi Anda tidak dapat mengasumsikan ituA1
danA2
sudah variabel didefinisikan (Anda dapat menempatkan mereka di lambda, misalnyalambda x,A1,A2:
- tidak apa-apa)Java -
633622 BytesOk, pertama, mencoba untuk menjadi lebih baik di java jadi itu sebabnya saya mencobanya di java, saya tahu saya tidak akan pernah melakukannya dengan baik, tapi eh, itu menyenangkan. kedua, saya benar-benar berpikir saya bisa melakukan ini dengan cara yang kurang, kemudian saya sampai pada tahap di mana ada dua kali lipat di mana-mana, dan deklarasi metode berarti menggunakan metode hanya menyelamatkan 4-5 karakter secara total. singkatnya, saya pegolf yang buruk.
sunting: format penggunaan> java K "2,10,10,10,1,6,7,2,10,4,7" "7,7,9,9,9,6,6,5,2,7,2 , 8 "
sumber
Haskell
9683(!) adalah fungsi kolmogorov-smirnov yang mengambil dua daftar
sumber
map
daripadafmap
; gunakanmaximum
daripadafoldr1 max
; mendefinisikanl=fromIntegral.length
dan Anda dapat menyingkirkani
, dan kemudian Anda dapat mempersingkat%
untukl(filter(<=x)a)/l a
. Turun ke 84!R, 107 byte
Pendekatan yang berbeda
Tidak disatukan
sumber