কে সেই সম্ভাবনা বন্টন?


16

ভূমিকা

এই চ্যালেঞ্জে আপনাকে কিছু সম্ভাব্যতা বন্টন থেকে স্বতন্ত্রভাবে আঁকা নননেজিটিভ ফ্লোটিং পয়েন্ট সংখ্যাগুলির একটি তালিকা দেওয়া হবে। আপনার কাজটি সংখ্যা থেকে এই বিতরণটি অনুমান করা। চ্যালেঞ্জটিকে সম্ভাব্য করে তুলতে, আপনার চয়ন করতে কেবল পাঁচটি বিতরণ রয়েছে।

নোট করুন যে উপরের সমস্ত বিতরণের অর্থ হুবহু 1/2।

কাজটি

আপনার ইনপুটটি 75 থেকে 100 সমেতের দৈর্ঘ্যের অব্যবহিত ভাসমান পয়েন্ট সংখ্যাগুলির একটি অ্যারে is আপনার আউটপুট একটি বর্ণ হতে হবেUTBEGউপরের বিতরণগুলির মধ্যে কোনটির উপর ভিত্তি করে আপনি অনুমান করেছেন যে সংখ্যাগুলি অঙ্কিত হয়েছে তার উপর ভিত্তি করে ।

বিধি এবং স্কোরিং

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

ইন এই সংগ্রহস্থলের সেখানে পাঁচটি পাঠ্য ফাইল, প্রতিটি ডিস্ট্রিবিউশনের জন্য এক, প্রতিটি ঠিক 100 লাইন দীর্ঘ। প্রতিটি লাইনে 75 থেকে 100 ফ্লোটের কমা-বিস্মৃত তালিকা থাকে যা বিতরণ থেকে স্বতন্ত্রভাবে আঁকা হয় এবং দশমিক বিন্দুর পরে 7 সংখ্যায় কাটা হয়। আপনার ভাষার নেটিভ অ্যারে ফর্ম্যাটটি মেলে আপনি ডিলিমিটারগুলিকে সংশোধন করতে পারেন। উত্তর হিসাবে যোগ্যতা অর্জনের জন্য, আপনার প্রোগ্রামটি প্রতিটি ফাইল থেকে কমপক্ষে 50 টি তালিকা সঠিকভাবে শ্রেণিবদ্ধ করা উচিত । একটি বৈধ উত্তরের স্কোর বাইট গণনা + বিযুক্ত শ্রেণিবদ্ধ তালিকার মোট সংখ্যা । সর্বনিম্ন স্কোর জয়।


আমার সম্ভবত আগে জিজ্ঞাসা করা উচিত ছিল, তবে পরীক্ষার মামলার প্রতি কতটা অপ্টিমাইজেশন আশা করা যায়? আমি এমন এক পর্যায়ে পৌঁছেছি যেখানে কয়েকটি পরামিতি টুইট করে আমি আমার স্কোরটি উন্নত করতে পারি, তবে স্কোরের প্রভাব সম্ভবত প্রদত্ত পরীক্ষার ক্ষেত্রে নির্ভর করবে।
ডেনিস

2
@ ডেনিস আপনি যতটা চান অনুকূলিত করতে পারেন, পরীক্ষার কেসগুলি চ্যালেঞ্জের একটি স্থির অংশ।
জাগারব

YU NO শিক্ষার্থী-টি বিতরণ? = (
এন

উত্তর:


6

জুলিয়া, 60 62 বাইট + 25 2 ত্রুটি = 82 64

k->"EGTBU"[(V=std(k);any(k.>1)?V>.34?1:2:V<.236?3:V>.315?4:5)]

এটি মোটামুটি সহজ। বিতরণগুলির বৈচিত্রটি বেশিরভাগ ক্ষেত্রে পৃথক - এটি সূচকীয় জন্য 1/4, বিটার জন্য 1/8, গামা এবং ইউনিফর্মের জন্য 1/12 এবং ত্রিভুজাকার জন্য 1/24। তেমনি, stdসম্ভাব্য বন্টন নির্ধারণ করতে আমরা যদি বৈকল্পিক (এখানে আদর্শ বিচ্যুতি ব্যবহারের জন্য সম্পন্ন করা হয় , বিবর্তনের বর্গমূল) ব্যবহার করে , তবে কেবল ইউনিফর্ম থেকে গামাকে আলাদা করার জন্য আমাদের আরও কিছু করতে হবে; তার জন্য, আমরা 1 (বৃহত্তর any(k.>1)) ব্যবহারের চেয়ে বড়টির সন্ধান করি - যা বলেছিল, আমরা ক্ষতিকারক এবং গামা উভয়ের জন্য চেক করি, কারণ এটি সামগ্রিক কর্মক্ষমতা উন্নত করে।

বাইট সংরক্ষণ করতে, "EGTBU"কন্ডিশনালের মধ্যে স্ট্রিংয়ের সরাসরি মূল্যায়ন না করে স্ট্রিংকে ইনডেক্সিং করা হয়।

পরীক্ষার জন্য, টেক্সট ফাইলগুলিকে একটি ডিরেক্টরিতে সংরক্ষণ করুন (নামগুলি যেমন রয়েছে তেমন করে রাখুন) এবং সেই ডিরেক্টরিতে জুলিয়া আরপিএল চালান। তারপরে, হিসাবে একটি নামের সাথে ফাংশনটি সংযুক্ত করুন

f=k->"EGTBU"[(V=std(k);any(k.>1)?V>.34?1:2:V<.236?3:V>.315?4:5)]

এবং পরীক্ষাটি স্বয়ংক্রিয় করতে নীচের কোডটি ব্যবহার করুন (এটি ফাইল থেকে পড়বে, অ্যারের অ্যারে রূপান্তর করবে, ফাংশনটি ব্যবহার করবে এবং প্রতিটি মিলের জন্য আউটপুট আসবে):

m=0;for S=["B","E","G","T","U"] K=open(S*".txt");F=readcsv(K);
M=Array{Float64,1}[];for i=1:100 push!(M,filter(j->j!="",F[i,:]))end;
close(K);n=0;
for i=1:100 f(M[i])!=S[1]&&(n+=1;println(i," "S,"->",f(M[i])," ",std(M[i])))end;
println(n);m+=n;end;println(m)

13 G->E 0.35008999281668357আউটপুটটিতে সারণীগুলি মিলবে না যা মিলে যায় না, সঠিক বিতরণ -> নির্ধারিত বিতরণ এবং গণনা করা বৈকল্পিক (উদাহরণস্বরূপ যে G.txt এর 13 তম সারি, যা গামা বিতরণ হওয়া উচিত, এটি একটি ক্ষতিকারক হিসাবে নির্ধারিত হয়) বন্টন, স্ট্যান্ডার্ড বিচ্যুতি 0.35008999 এর সাথে ...)

প্রতিটি ফাইলের পরে, এটি সেই ফাইলটির জন্য মেলে না এমন সংখ্যার সংখ্যাও আউটপুট করে এবং তারপরে শেষে এটি মোট মিলগুলিও প্রদর্শন করে (এবং উপরের মতো চালানো হলে এটি 2 টি পড়তে হবে)। প্রসঙ্গত, এর G.txt এর জন্য 1 টি মিল এবং ইউ টেক্সটের জন্য 1 টি অমিল থাকতে হবে


7

আর, 202 192 184 182 162 154 বাইট + 0 ত্রুটি

function(x)c("U","T","B","E","G")[which.max(lapply(list(dunif(x),sapply(x,function(y)max(0,2-4*abs(.5-y))),dbeta(x,.5,.5),dexp(x,2),dgamma(x,3,6)),prod))]

এটি বেইশিয়ান সূত্র পি (ডি = ডি | এক্স = এক্স) = পি (এক্স = এক্স | ডি = ডি) * পি (ডি = ডি) / পি (এক্স = এক্স) এর উপর ভিত্তি করে যেখানে ডি বিতরণ এবং এক্স এলোমেলো নমুনা। আমরা ডিটি বেছে নেই যে পি (ডি = ডি | এক্স = এক্স) 5 এর মধ্যে সবচেয়ে বড় is

আমি ধরে নিলাম ফ্ল্যাট পূর্বের (যেমন পি (ডি = ডি) = ১/৫ এর জন্য আমি [১,৫]], যার অর্থ হ'ল অঙ্কের পি (ডি = ডি) সমস্ত ক্ষেত্রে একই (এবং ডিনোমিনেটর যাইহোক সকল ক্ষেত্রে একই হতে হবে), সুতরাং আমরা পি (x = এক্স | ডি = ডি) ব্যতীত সমস্ত কিছু গল্ফ করতে পারি, যা (ত্রিভুজাকার বিতরণ ব্যতীত) আর এর স্থানীয় ফাংশনগুলিকে সহজ করে তোলে।

ungolfed:

function(x){
  u=prod(dunif(x))
  r=prod(sapply(x,function(y)max(0,2-4*abs(.5-y))))
  b=prod(dbeta(x,.5,.5))
  e=prod(dexp(x,2))
  g=prod(dgamma(x,3,6))
  den=.2*u+.2*r+.2*b+.2*e+.2*g
  c("U","T","B","E","G")[which.max(c(u*.2/den,r*.2/den,b*.2/den,e*.2/den,g*.2/den))]
}

দ্রষ্টব্য সংস্করণটি গল্ফ করা সংস্করণের সাথে একেবারে সমান নয় কারণ ডিনোমিনেটর থেকে মুক্তি পেয়ে ইনফ / ইনফের ক্ষেত্রে এড়ানো হয় যা আপনি যদি বিটার বিতরণ বন্ধ (অন্তঃসত্ত্বার) পরিবর্তে (০, 1) - নমুনা তথ্য হিসাবে। একটি অতিরিক্ত যদি বিবৃতি তা হ্যান্ডেল করে তবে এটি কেবল উদাহরণস্বরূপ উদ্দেশ্যেই এটি সম্ভবত অ্যালগরিদমের কেন্দ্রস্থলে যে জটিলতা রয়েছে তা যুক্ত করার উপযুক্ত নয়।

অতিরিক্ত কোড হ্রাসের জন্য ধন্যবাদ @ অ্যালেক্স এ। বিশেষত যার জন্য.ম্যাক্স!


1
আপনি খোলার পরে লাইন ব্রেকটি {বন্ধ করে }এবং 1907 বাইটে এটিকে পেতে পারেন , এবং এলিয়াসিং prod, উদাহরণস্বরূপ P=prod, তারপর করছেন P(dunif(x))ইত্যাদি The ফাংশনটির বৈধ জমা দেওয়ার জন্য প্রয়োজন নেই, তাই আপনি মুছে ফেলতে পারেন p=। এছাড়াও, দুর্দান্ত কাজ। :)
অ্যালেক্স এ।

2
উপরের পরামর্শগুলি ব্যবহার করে which.max(c(u,r,b,e,g))এবং এর জায়গায় ব্যবহার করে আপনি এটি 182 এ পেতে পারেন c(u,r,b,e,g)==max(c(u,r,b,e,g))
অ্যালেক্স এ।

156:function(x){c("U","T","B","E","G")[which.max(lapply(list(dunif(x),sapply(x,function(y)max(0,2-4*abs(.5-y))),dbeta(x,.5,.5),dexp(x,2),dgamma(x,3,6)),prod))]}
অ্যালেক্স এ।

পরিসংখ্যান জড়িত একটি চ্যালেঞ্জের জন্য আপনি আর ব্যবহার করার সাহস কী করে !!
flawr

6

সিজেম, 76

{2f*__{(z.4<},,%,4e<"UBT"="EG"\*\$-2=i3e<=}

উত্স কোড হয় 43 বাইট দীর্ঘ এবং 33 টি তালিকার ভুল সংকলন করেছে।

প্রতিপাদন

$ count()(sort | uniq -c | sort -nr)
$ cat score.cjam
qN%{',' er[~]
  {2f*__{(z.4<},,%,4e<"UBT"="EG"\*\$-2=i3e<=}
~N}/
$ for list in U T B E G; { echo $list; cjam score.cjam < $list.txt | count; }
U
     92 U
      6 B
      2 T
T
    100 T
B
     93 B
      7 U
E
     92 E
      8 G
G
     90 G
      6 E
      3 T
      1 U

ধারণা

অবশিষ্টগুলি থেকে সূচকীয় এবং গামা বিতরণকে পৃথক করা সহজ, যেহেতু এগুলিই কেবলমাত্র বিতরণ যা এর চেয়ে বেশি মান গ্রহণ করে 1 এর

গামা , সূচকীয় মধ্যে সিদ্ধান্ত নিতে এবং অন্যদের , আমরা নমুনার দ্বিতীয় সর্বোচ্চ মানটি একবার দেখে নিই।

  • এটি যদি [1.5, ∞) এর মধ্যে থাকে তবে আমরা গামা অনুমান করি

  • যদি এটি [1, 1.5) এর মধ্যে থাকে তবে আমাদের অনুমানযোগ্য

  • যদি এটি থাকে [0, 1) এর মধ্যে থাকে তবে আমাদের তিনটি সম্ভাবনা রয়েছে।

    অবশিষ্ট বিতরণগুলি গড়ের কাছাকাছি থাকা নমুনা মানের শতাংশের দ্বারা পৃথক করা যায় ( ০.৫ ) ।

    আমরা নমুনার দৈর্ঘ্যকে (০.০, ০.7) মানগুলিতে বিভক্ত করি এবং ফলাফলটি ভাগ করে দেখি।

    • যদি এটিতে থাকে (1, 2] , আমরা অনুমান করি ত্রিভুজাকৃতির

    • যদি এটি (2, 3] এর মধ্যে থাকে তবে আমাদের ধারণা ইউনিফর্ম

    • যদি এটি থাকে (3, ∞) , আমরা বিটা অনুমান করি ।

কোড

2f*    e# Multiply all sample values by 2.
__     e# Push to copies of the sample.
{      e# Filter; for each (doubled) value in the sample:
  (z   e#   Subtract 1 and apply absolute value.
  .4<  e#   Check if the result is smaller than 0.4.
},     e# If it is, keep the value.
,/     e# Count the kept values (K).
%      e# Select every Kth value form the sample, starting with the first.
,      e# Compute the length of the resulting array.
       e# This performs ceiled division of the sample length by K.
4e<    e# Truncate the quotient at 4.
"UBT"= e# Select 'T' for 2, 'U' for 3 and 'B' for 4.
"EG"\* e# Place the selected character between 'E' and 'G'.
\$     e# Sort the remaining sample.
-2=i   e# Extract the second-highest (doubled) value and cast to integer.
3e<    e# Truncate the result at 3.
=      e# Select 'E' for 3, 'G' for 2 and the character from before for 1.

3

মতলব, 428 328 বাইট + 33 বিচ্ছিন্ন

এই প্রোগ্রামটি মূলত প্রকৃত সিডিএফকে তুলনামূলকভাবে একটি উপাত্ত প্রদত্ত ডেটার সাথে তুলনা করছে এবং তারপরে সেই দুজনের মধ্যে গড় দূরত্ব গণনা করছে: আমি মনে করি চিত্রটি আরও ব্যাখ্যা করে:

এখানে চিত্র বর্ণনা লিখুন

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

এই পন্থাটি বেছে নেওয়া পিডিএফগুলির থেকেও স্বতন্ত্র, এটি কোনও বিতরণের জন্য সেট করবে ।

নিম্নলিখিত (অব্যক্ত) কোডটি কীভাবে এটি করা হয় তা দেখানো উচিত। গল্ফযুক্ত সংস্করণটি নীচে রয়েছে।

function r=p(x);
data=sort(x(1:75));
%% cumulative probability distributiosn
fu=@(x)(0<x&x<1).*x+(1<=x).*1;
ft=@(x)(0<x&x< 0.5).* 2.*x.^2+(1-2*(1-x).^2).*(0.5<=x&x<1)+(1<=x);
fb=@(x)(0<x&x<1).*2.*asin(sqrt(x))/pi+(1<=x);
fe=@(x)(0<x).*(1-exp(-2*x));
fg=@(x)(0<x).*(1-exp(-x*6).*(1+x*6+1/2*(6*x).^2));
fdata = @(x)sum(bsxfun(@le,data,x.'),2).'/length(data);
f = {fe,fg,fu,ft,fb};
str='EGUTB';
%calculate distance to the different cdfs at each datapoint
for k=1:numel(f);
dist(k) = max(abs(f{k}(x)-fdata(x)));
end;
[~,i]=min(dist);
r=str(i);
end

পুরো গল্ফযুক্ত সংস্করণ:

function r=p(x);f={@(x)(0<x).*(1-exp(-2*x)),@(x)(0<x).*(1-exp(-x*6).*(1+x*6+18*x.^2)),@(x)(0<x&x<1).*x+(1<=x),@(x)(0<x&x<.5).*2.*x.^2+(1-2*(1-x).^2).*(.5<=x&x<1)+(1<=x),@(x)(0<x&x<1).*2.*asin(sqrt(x))/pi+(1<=x)};s='EGUTB';for k=1:5;d(k)=max(abs(f{k}(x)-sum(bsxfun(@le,x,x.'),2).'/nnz(x)));end;[~,i]=min(d(1:5-3*any(x>1)));r=s(i)

2

পার্ল, 119 বাইট + 8 বিবিধ শংসাপত্র = 127

আমি তিনটি বৈশিষ্ট্যে একটি ক্ষুদ্র সিদ্ধান্ত গাছ তৈরি করেছি:

  • $ ও: বুলিয়ান: যদি কোনও নমুনা থাকে> 1.0
  • : টি: গণনা: 0-ম মাইনাস 6-ম 13-আইল 0-1 রেঞ্জের মধ্যে কাটা হয়েছে,
  • $ এইচ: গণনা: 0-ম মাইনাস 6-তম প্লাস 12-ম 13-ile 0-1 রেটে বিভক্ত

সঙ্গে আমন্ত্রণ জানানো perl -F, -lane -e '...'। আমি নিশ্চিত না যে আমার অ-মানক পরামিতিগুলির জন্য কোনও পেনাল্টি যুক্ত করা উচিত। কমাগুলি যদি ফাঁকা স্থান হয় তবে আমি অনুমান করি যে আমি -F ছাড়া দূরে সরে যেতে পারতাম ,

জন্য (@F) {$ খ [$: _ * 13] ++,; $ ণ ++, যদি $: _> 1}
$ H = ($ T = $ খ [0] - $ খ [6]) + + $ খ [12];
$ ণ প্রিন্ট ($ T> -2 "ই": "ছ"?): ($ H = 19 "B": "তোমার দর্শন লগ করা")?);
$ ণ = @ খ = ()

সামান্য বিন্যাসিত আউটপুট (-l পতাকা ছাড়া):

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    bbbbbbbbbbbbbbbbbbbbbbbbubbbbbbbbbbbbbbbbbbbbbbb
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    eeegeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
gggggggegggggggggggggggggggggggggggggggggggggggggggg
    gggggggggggggggggggggggggggggggggggggggggggggggg
tttttttttttttttttttttttttttttttttttttttttttttttttttt
    ttttttttttttttttttttttttttttuttttttttttttutttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuutuuuuuuuuuuuuuuuubuuuuuuu
    uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutuuuu

0

পাইথন, 318 বাইট + 35 মিসক্লাসিফিকেশন

from scipy.stats import*
from numpy import*
def f(l):
    r={'U':kstest(l,'uniform')[1],'T':kstest(l,'triang',args=(.5,))[1],'B':kstest(l,'beta',args=(.5,.5))[1],'E':kstest(l,'expon',args=(0,.5,))[1],'G':kstest(l,'gamma',args=(3,0,1/6.0))[1]}
    if sum([x>1 for x in l]): r['U'],r['T'],r['B']=0,0,0
    return max(r,key=r.get)

আইডিয়া: বিতরণটি কলমোগোরভ-স্মারনভ পরীক্ষার পি-মানের ভিত্তিতে অনুমান করা হয়।

পরীক্ষা

from scipy.stats import*
from numpy import*
import os
from io import StringIO
dir=os.path.dirname(os.path.abspath(__file__))+"/random-data-master/"

def f(l):
    r={'U':kstest(l,'uniform')[1],'T':kstest(l,'triang',args=(.5,))[1],'B':kstest(l,'beta',args=(.5,.5))[1],'E':kstest(l,'expon',args=(0,.5,))[1],'G':kstest(l,'gamma',args=(3,0,1/6.0))[1]}
    if sum([x>1 for x in l]): r['U'],r['T'],r['B']=0,0,0
    return max(r,key=r.get)

U=[line.rstrip('\n').split(',') for line in open(dir+'U.txt')]
U=[[float(x) for x in r] for r in U]
T=[line.rstrip('\n').split(',') for line in open(dir+'T.txt')]
T=[[float(x) for x in r] for r in T]
B=[line.rstrip('\n').split(',') for line in open(dir+'B.txt')]
B=[[float(x) for x in r] for r in B]
E=[line.rstrip('\n').split(',') for line in open(dir+'E.txt')]
E=[[float(x) for x in r] for r in E]
G=[line.rstrip('\n').split(',') for line in open(dir+'G.txt')]
G=[[float(x) for x in r] for r in G]

i,_u,_t,_b,_e,_g=0,0,0,0,0,0
for u,t,b,e,g in zip(U,T,B,E,G):
    _u+=1 if f(u)=='U' else 0
    _t+=1 if f(t)=='T' else 0
    _b+=1 if f(b)=='B' else 0
    _e+=1 if f(e)=='E' else 0
    _g+=1 if f(g)=='G' else 0
    print f(u),f(t),f(b),f(e),f(g)
print _u,_t,_b,_e,_g,100*5-_u-_t-_b-_e-_g
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.