জটিলতা-মুক্ত কলমোগোরভ (-স্মিরনভ)


12

পরিসংখ্যানগুলিতে, কখনও কখনও এটি জানার জন্য দুটি ডেটা নমুনা একই অন্তর্নিহিত বিতরণ থেকে আসে কিনা তা দরকারী। এটি করার একটি উপায় হ'ল দ্বি-নমুনা কলমোগোরভ-স্মারনভ পরীক্ষাটি ব্যবহার করা

আপনার কাজটি এমন একটি প্রোগ্রাম লিখতে হবে যা দুটি অরসোর্টড নননেজিটিভ পূর্ণসংখ্য অ্যারে পড়ে এবং পরীক্ষায় ব্যবহৃত মূল পরিসংখ্যান গণনা করে।


একটি অ্যারে Aএবং একটি আসল নম্বর দেওয়া x, Fদ্বারা বিতরণ কার্যটি সংজ্ঞায়িত করুন

F(A,x) = (#number of elements in A less than or equal to x)/(#number of elements in A)

দুটি অ্যারে দেওয়া হয়েছে A1এবং A2সংজ্ঞা দিন

D(x) = |F(A1, x) - F(A2, x)|

দুই নমুনা Kolmogorov-Smirnov পরিসংখ্যাত সর্বোচ্চ মান Dসর্বাঙ্গে বাস্তব x

উদাহরণ

A1 = [1, 2, 1, 4, 3, 6]
A2 = [3, 4, 5, 4]

তারপর:

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

দুটি অ্যারের জন্য কেএস-পরিসংখ্যান 1/2, সর্বাধিক মান D

পরীক্ষার মামলা

[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

বিধি

  • আপনি কোনও ফাংশন বা একটি সম্পূর্ণ প্রোগ্রাম লিখতে পারেন। ইনপুটটি STDIN বা ফাংশন আর্গুমেন্টের মাধ্যমে হতে পারে এবং আউটপুট STDOUT বা রিটার্ন মানের মাধ্যমে হতে পারে।
  • আপনি ইনপুটটির জন্য যেকোন দ্ব্যর্থহীন তালিকা বা স্ট্রিং ফর্ম্যাট ধরে নিতে পারেন, যতক্ষণ না এটি উভয় অ্যারেতেই সামঞ্জস্য থাকে
  • আপনার ভাষার এই জন্য একটি অন্তর্নির্মিত সুযোগ আছে, আপনি এটি ব্যবহার নাও করতে পারেন।
  • কমপক্ষে 3 টি গুরুত্বপূর্ণ ব্যক্তির উত্তরগুলি সঠিক হওয়া দরকার
  • এটি , তাই প্রোগ্রামটি খুব কম বাইটে জয়ী হয়

সমস্ত ইনপুট কি পূর্ণসংখ্যার অ্যারে হতে চলেছে, বা এগুলিতে কি ভাসমান পয়েন্ট থাকতে পারে?
কেনেটিএম

পছন্দ করেছেন আমি ভেবেছিলাম আমি বিষয়গুলি সহজ রাখব।
Sp3000

অ্যারেগুলির জন্য আমরা কী সর্বাধিক মান ধরে নিতে পারি? (যেমন এর সমস্ত এন্ট্রি Aনীচে রয়েছে length(A)?)
flawr

@ ফ্লোয়ার না আপনি সর্বাধিক মান ধরে নিতে পারবেন না
Sp3000

আমি শিরোনামটি পছন্দ করি। আমি কলমোগোরভ জটিলতা ব্যাগডে লক্ষ্য রেখেছি, তবে এবার নয়।
edc65

উত্তর:


10

এপিএল ( ২৯ 24)

(অতিরিক্ত অনুপ্রেরণার জন্য জগারবকে ধন্যবাদ।)

{⌈/|-⌿⍺⍵∘.(+/≤÷(⍴⊣))∊⍺⍵}

এটি এমন একটি ফাংশন যা অ্যারেগুলিকে তার বাম এবং ডান আর্গুমেন্ট হিসাবে গ্রহণ করে।

      8 9 9 5 5 0 3 {⌈/|-⌿⍺⍵∘.(+/≤÷(⍴⊣))∊⍺⍵} 4 9 0 5 5 0 4 6 9 10 4 0 9 
0.1758241758

ব্যাখ্যা:

{⌈/                                maximum of
   |                               the absolute value of
    -⌿                             the difference between
      ⍺⍵∘.(         )∊⍺⍵          for both arrays, and each element in both arrays
            +/≤                    the amount of items in that array ≤ the element
               ÷                   divided by
                (⍴⊣)              the length of that array
                          }

আমি জানতাম না আপনি করতে পারবেন ⍺⍵! এটা সহজ।
জাগারব

1
এছাড়াও, আমি মনে করি ⍳⌈/অপ্রয়োজনীয়, যেহেতু সর্বাধিক একটি অ্যারের মানগুলির মধ্যে সঠিকভাবে প্রাপ্ত হয়।
জাগারব

@ জগারব: আপনি অবশ্যই বলেছেন, প্রতিটি সম্ভাব্য অ্যারে মানের জন্য আমাকে কেবল পরীক্ষা করতে হবে। এর অর্থ আমি এ 0,থেকেও মুক্তি পেতে পারি , কারণ এটির জন্য এটি পরীক্ষা করা হবে যদি অ্যারে এতে থাকে। ধন্যবাদ! (এবং এটি আমাকে শিখিয়ে দেবে, সাধারণত যদি আপনাকে কোনও বিশেষ ক্ষেত্রে যুক্ত করতে হয়, তার অর্থ অ্যালগরিদম যথেষ্ট সহজ নয়))
মেরিনাস

2
এটি ঠিক এখানে, জাদু
স্টিভেন লু

@ এসপি 3000: আপনি কি এক-এলিমেন্ট অ্যারেগুলি সঠিকভাবে লিখেছেন? আপনি কেবল লিখতে পারবেন না 1, কারণ এটি একটি স্কেলার হবে। (,1)পরিবর্তে আপনার লেখা উচিত । যদি আপনি এটি করেন, এটি কাজ করে।
মেরিনাস

4

জে - 39

আমি নিশ্চিত যে আরও অনেক ছোট করা যেতে পারে

f=:+/@|:@(>:/)%(]#)
>./@:|@((,f])-(,f[))

ব্যবহার

2 10 10 10 1 6 7 2 10 4 7 >./@:|@((,f])-(,f[)) 7 7 9 9 6 6 5 2 7 2 8
0.363636

এটি কি কোনও ফাংশন তৈরি করে বা স্টিডিন / স্টডআউট ব্যবহার করে? দ্বিতীয় অংশটি ঠিক কী করে? (কোনও ফাংশন কলের জন্য কিছুটা দীর্ঘ মনে হচ্ছে?)
flawr

@flawr একটি ফাংশন, APL অনুরূপ
ফিটফাট

আমি মনে করি আপনি fযদি এর মতো কিছু ব্যবহার করেন তবে আপনি স্পষ্টভাবে সংজ্ঞা দিতে এড়াতে পারবেন >./@:|@({.-{:)f"1@,তবে আমি যথেষ্ট নিশ্চিত নই।
FUZxxl

4

পাইথন 3, 132 108 95 88

f=lambda a,x:sum(n>x for n in a)/len(a)
g=lambda a,b:max(abs(f(a,x)-f(b,x))for x in a+b)

ইনপুটটি ফাংশনের 2 টি তালিকা g

ধন্যবাদ: স্প 3000, এক্সএনওর, আন্ডারগ্রাউন্ডমোনোরাইল

লাইন 2, f"ফ্যাক্স" এর মতো পাঠাতে প্রথমে কল করুন । আমি যে হালকা মজাদার খুঁজে পেয়েছি


2
কোনও সম্পত্তি সন্তুষ্ট করে এমন তালিকার উপাদানগুলির সংখ্যা গণনা করার জন্য এটি করা খাটো sum(n>x for n in a)। এছাড়াও, দেখে মনে হচ্ছে আপনি ব্যবহার করছেন না s=filter। এবং এর জন্য max, আপনাকে তালিকার বন্ধনীগুলির প্রয়োজন নেই; পাইথন ফাংশন পেরেন্সকে বোঝার প্যারেন্স হিসাবে দ্বিগুণ করতে দেয়।
xnor

ধন্যবাদ! আমি filterআগের সংস্করণে ব্যবহার করেছি , এটি মুছে ফেলতে ভুলে গেছি। দুর্ভাগ্যক্রমে আমি প্রথম জোড়া স্কোয়ার বন্ধনীগুলি সরাতে পারছি না তখন থেকে এটি জেনারেটর হবে, যার কোনও নেই len
Kroltan

আপনার দরকার নেই len, আবার মন্তব্যটি পড়ুন: পি
আন্ডারগ্রাউন্ডোমোনাইল

3

জাভাস্ক্রিপ্ট (ES6) 99 119 128

কমবেশি সরাসরি জাভাস্ক্রিপ্ট প্রয়োগ , সম্ভবত আরও গল্ফযোগ্য । এফ ফাংশনে আমি <= এর পরিবর্তে অ্যাবস (এফ (এ) -এফ (বি)) === অ্যাবস ((1-এফ (এ)) - (1-এফ (খ))) ব্যবহার করি

এই শেষ সম্পাদনায় ডিফল্ট প্যারামির হিসাবে কোনও ফাংশন সংজ্ঞা নেই।

আমি যেমন বলেছি, এটা সোজা। এফ ফাংশনটি হ'ল এফ ফাংশন, ডি ফাংশনটি লাইন ২ তে ব্যবহৃত অজ্ঞাত ফাংশন। এটি দুটি অ্যারে উপস্থিত প্রতিটি মানের জন্য .map ব্যবহার করে মূল্যায়ন করা হয়, কারণ allবাস্তবের সর্বাধিক মান এর মধ্যে একটি হতে হবে। শেষ অবধি, স্প্রেড অপারেটর (...) ডি ভ্যালু অ্যারেটিকে সর্বোচ্চ ফাংশনে প্যারামিটার তালিকা হিসাবে পাস করতে ব্যবহৃত হয়।

K=(a,b)=>Math.max(...a.concat(b).map(x=>
  Math.abs((F=a=>a.filter(v=>v>x).length/a.length)(a)-F(b))
))

টেস্ট ফায়ারফক্স / ফায়ারবাগ কনসোলটি

;[[[0],[0]], [[0],[1]],
[[1, 2, 3, 4, 5],[2, 3, 4, 5, 6]],
[[3, 3, 3, 3, 3],[5, 4, 3, 2, 1]],
[[1, 2, 1, 4, 3, 6],[3, 4, 5, 4]],
[[8, 9, 9, 5, 5, 0, 3],[4, 9, 0, 5, 5, 0, 4, 6, 9, 10, 4, 0, 9]],
[[2, 10, 10, 10, 1, 6, 7, 2, 10, 4, 7],[7, 7, 9, 9, 6, 6, 5, 2, 7, 2, 8]]]
.forEach(x=>console.log(x[0],x[1],K(x[0],x[1]).toFixed(6)))

আউটপুট

[0] [0] 0.000000
[0] [1] 1.000000
[1, 2, 3, 4, 5] [2, 3, 4, 5, 6] 0.200000
[3, 3, 3, 3, 3] [5, 4, 3, 2, 1] 0.400000
[1, 2, 1, 4, 3, 6] [3, 4, 5, 4] 0.500000
[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

আমি আপনার ফাংশন সম্পর্কে কৌতূহলী K: আপনি কি F,Dযুক্তি তালিকার অন্যান্য ফাংশন সংজ্ঞায়িত করেছেন এটি সঠিক ? এটি কিছু optionচ্ছিক যুক্তির মতো আচরণ করে বা তাই?
flawr

@ ফ্লোয়ার হ্যাঁ, এগুলি একটি ডিফল্ট মান সহ alচ্ছিক যুক্তি। সুতরাং বৈশ্বিক চলক স্থানের দূষণ এড়ানো (এটি কোড গল্ফের কোনও সমস্যা নয়, তবে যাইহোক ...)
edc65

1
এছাড়াও, যেহেতু ফাংশনটির জন্য ইতিমধ্যে 2 টি ভেরিয়েবলের প্রয়োজন (সুতরাং বন্ধনীগুলি), ফাংশনটির বডিটির ভিতরে বিকল্প ভেরিস্টের বাইরে এই ভেরিয়েবলগুলি সরিয়ে নেওয়া 2 অতিরিক্ত বাইট হবে।
অপ্টিমাইজার 10


2

মতলব (121) (119)

এটি এমন একটি প্রোগ্রাম যা স্ট্রডিনকে দুটি তালিকায় নিয়ে যায় এবং ফলাফলটি স্ট্যাডআউটে প্রিন্ট করে। এটি একটি দৃight় প্রতিবন্ধী পদ্ধতি এবং আমি এটি যথাসম্ভব গল্ফ করার চেষ্টা করেছি। গণনা করে এমন K(a)একটি ফাংশন প্রদান করে x -> F(a,x)। তারপরে অজ্ঞাতনামা ফাংশন @(x)abs(g(x)-h(x))যা ফাংশনটির সাথে সম্পর্কিত তা Dপ্রতিটি সম্ভাব্য পূর্ণসংখ্যার ক্ষেত্রে প্রয়োগ করা হয় 0:max([a,b])এবং সর্বাধিক ফলাফল প্রদর্শিত হয়। ( অন্যান্য ভাষার arrayfunমতো একই mapকাজ করে: এটি অ্যারের প্রতিটি উপাদানকে একটি ফাংশন প্রয়োগ করে)

a=input('');b=input('');
K=@(a)@(x)sum(a<=x)/numel(a);
g=K(a);h=K(b);
disp(max(arrayfun(@(x)abs(g(x)-h(x)),0:max([a,b]))))

2

এরলং, 96 বাইট

edc65 এর জাভাস্ক্রিপ্ট সমাধান এরলং এ পোর্ট করা হয়েছে।

f(A,B)->F=fun(A,X)->length([V||V<-A,V>X])/length(A)end,lists:max([abs(F(A,X)-F(B,X))||X<-A++B]).

টেস্ট:

lists:foreach(fun ([H,T] = L) -> io:format("~p ~p~n", [L, w:f(H, T)]) end, [[[0],[0]], [[0],[1]],
        [[1, 2, 3, 4, 5],[2, 3, 4, 5, 6]],
        [[3, 3, 3, 3, 3],[5, 4, 3, 2, 1]],
        [[1, 2, 1, 4, 3, 6],[3, 4, 5, 4]],
        [[8, 9, 9, 5, 5, 0, 3],[4, 9, 0, 5, 5, 0, 4, 6, 9, 10, 4, 0, 9]],
        [[2, 10, 10, 10, 1, 6, 7, 2, 10, 4, 7],[7, 7, 9, 9, 6, 6, 5, 2, 7, 2, 8]]]).

আউটপুট:

[[0],[0]] 0.0
[[0],[1]] 1.0
[[1,2,3,4,5],[2,3,4,5,6]] 0.20000000000000007
[[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.17582417582417587
[[2,10,10,10,1,6,7,2,10,4,7],[7,7,9,9,6,6,5,2,7,2,8]] 0.36363636363636365

2

স্টাটা 215

এটি 90% এমন বিন্যাসে ইনপুট পাচ্ছে যা ব্যবহার করা যেতে পারে কারণ স্টাটাতে ইতিমধ্যে একটি ksmirnov কমান্ড রয়েছে।

di _r(a)
di _r(b)
file open q using "b.c",w
forv x=1/wordcount($a){
file w q "1,"(word($a,`x'))_n
}
forv x=1/wordcount($b){
file w q "2,"(word($b,`x'))_n
}
file close q
insheet using "b.c"
ksmirnov v2,by(v1)
di r(D)

ওহ, বাহ, আমি ভাবিনি যে এর জন্য ভাষাগুলির একটি বিল্টিন থাকবে ... আমি কেবল কিছু গবেষণা করেছি এবং আমি সিদ্ধান্ত নিয়েছি এখন থেকে বিল্টিনগুলি বাতিল করা ভাল তবে আপনি এটি রাখতে পারেন কারণ এটি নিয়মের আগে পোস্ট করা হয়েছিল পরিবর্তন :)
Sp3000

2

আর, 65 বাইট

f=function(a,b){d=c(a,b);e=ecdf(a);g=ecdf(b);max(abs(e(d)-g(d)))}

এই ফাংশনটি দুটি ভেক্টরকে আর্গুমেন্ট হিসাবে গ্রহণ করে এবং তাদের অভিজ্ঞতাজনিত संचयी বিতরণ কার্যের সর্বাধিক পার্থক্য প্রদান করে।

যদি বিল্ট-ইনগুলিকে অনুমতি দেওয়া হয় তবে তা কমে মাত্র 12 বাইটে নামবে:

ks.test(a,b)

1

গণিত, 76 73 63

গণিতের অন্তর্নির্মিত ফাংশন রয়েছে KolmogorovSmirnovTestতবে আমি এটি এখানে ব্যবহার করব না।

k=N@MaxValue[Abs[#-#2]&@@(Tr@UnitStep[x-#]/Length@#&/@{##}),x]&

ব্যবহার:

k[{1, 2, 1, 4, 3, 6}, {3, 4, 5, 4}]

0.5


0

পাইথন ৩.৪.২ (79৯ বাইট) এ দ্রুত বাস্তবায়ন:

F=lambda A,x:len([n for n in A if n<=x])/len(A)
D=lambda x:abs(F(A1,x)-F(A2,x))

উদাহরণ:

>>> A1 = [-5, 10, 8, -2, 9, 2, -3, -4, -4, 9]
>>> A2 = [-5, -3, -10, 8, -4, 1, -7, 6, 9, 5, -7]
>>> D(0)
0.045454545454545414

1
প্রয়োজনটি হল x এর সমস্ত পূর্ণসংখ্যার মানগুলির জন্য সর্বাধিক মান D (x) সন্ধান করা। দয়া করে সমস্যাটি মেনে চলুন।
অপ্টিমাইজার

1
স্বাগত! অপ্টিমাইজার যেমন বলেছেন, কাজটি সর্বাধিক মান সন্ধান করা D, কেবল Dকোনও ফাংশন হিসাবে বাস্তবায়ন করা নয় find এছাড়াও, আমি দুঃখিত যদি আমি পরিষ্কার ছিল না, তবে আপনি এটি ধরে নিতে পারবেন না A1এবং A2ইতিমধ্যে সংজ্ঞায়িত ভেরিয়েবলগুলি (আপনি এগুলি ল্যাম্বডায় রাখতে পারেন, যেমন lambda x,A1,A2:- ঠিক আছে)
Sp3000

এছাড়াও আমি কিছু বাক্য গঠন হাইলাইট করেছি - আমার মনে হয় এটি এটিকে সুন্দর দেখায় :)
Sp3000

সে সম্পর্কে দুঃখিত, আমি এখানে নতুন।
কাপ্তেন

কোনও সমস্যা নেই :) যদি কিছু অস্পষ্ট হয় তবে আপনি মন্তব্যগুলিতে জিজ্ঞাসা করতে পারেন। তবে আবারও, স্বাগতম!
Sp3000

0

জাভা - 633 622 বাইট

ঠিক আছে, প্রথমে, জাভাতে আরও উন্নত হওয়ার চেষ্টা করছি যাতে আমি কেন এটি জাভাতে চেষ্টা করেছিলাম, আমি জানি আমি কখনই ভাল করতে পারব না, তবে এটি মজাদার। দ্বিতীয়ত, আমি সত্যই ভেবেছিলাম যে আমি এটি কম উপায়ে করতে পারব, তারপরে আমি এমন পর্যায়ে পৌঁছেছি যেখানে সর্বত্র দ্বিগুণ ছিল এবং পদ্ধতি ঘোষণার অর্থ হল পদ্ধতিগুলি ব্যবহারের ফলে কেবল মোট 4-5 অক্ষর সংরক্ষণ করা হয়েছিল। সংক্ষেপে, আমি একটি খারাপ গল্ফার

সম্পাদনা করুন: ব্যবহার বিন্যাস> জাভা কে "2,10,10,10,1,6,7,2,10,4,7" "7,7,9,9,6,6,5,2,7,2" , 8 "

import java.lang.*;
class K{public static void main(String[]a){double[]s1=m(a[0]);double[]s2=m(a[1]);
int h=0;if(H(s1)<H(s2))h=(int)H(s2);else h=(int)H(s1);double[]D=new double[h];
for(int i=0;i<h;i++){D[i]=Math.abs(F(s1,i)-F(s2,i));}System.out.println(H(D));}
static double[]m(String S){String[]b=S.split(",");double[]i=new double[b.length];
for(int j=0;j<b.length;j++){i[j]=new Integer(b[j]);}return i;}
static double H(double[]i){double t=0;for(int j=0;j<i.length;j++)
{if(i[j]>t)t=i[j];}return t;}
static double F(double[]A,int x){double t=0;double l=A.length;
for(int i=0;i<l;i++){if(A[i]<=x)t++;}return t/l;}}

আপনি ঠিক বলেছেন। আপডেট।
ব্রায়ান দেবানে 16

0

হাস্কেল 96 83

l=fromIntegral.length
a%x=l(filter(<=x)a)/l a
a!b=maximum$map(\x->abs$a%x-b%x)$a++b

(!) হল কলমোগোরভ-স্মারনভ ফাংশন যা দুটি তালিকাগুলি নিয়েছে


1
কিছু দ্রুত গল্ফ: mapপরিবর্তে ব্যবহার করুন fmap; maximumপরিবর্তে ব্যবহার foldr1 max; সংজ্ঞায়িত l=fromIntegral.lengthএবং আপনি পরিত্রাণ পেতে পারেন i, এবং তারপরে আপনি খাটো করতে পারেন %থেকে l(filter(<=x)a)/l a। এটি নিচে হয়ে যায় ৮৪!
এমটিএনভিউমার্ক

0

আর, 107 বাইট

বিভিন্ন পদ্ধতির

f=function(a,b){e=0
d=sort(unique(c(a,b)))
for(i in d-min(diff(d))*0.8)e=max(abs(mean(a<i)-mean(b<i)),e)
e}

Ungolfed

f=function(a,b){
    e=0
    d=sort(unique(c(a,b)))
    d=d-min(diff(d))*0.8
    for(i in d) {
        f=mean(a<i)-mean(b<i)
        e=max(e,abs(f))
    }
    e
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.