那个概率分布是谁?


16

介绍

在此挑战中,将为您提供与某些概率分布无关地绘制的非负浮点数的列表。您的任务是从数字推断该分布。为了使挑战切实可行,您只有五个分布可供选择。

请注意,上述所有分布的均值均精确为1/2。

任务

您的输入是一个非负浮点数数组,长度在75到100之间(含75和100)。您的输出应为字母之一UTBEG,根据您猜测数字是从上述分布中的哪一个得出的。

规则和计分

您可以提供完整的程序或功能。不允许出现标准漏洞。

此存储库中,有五个文本文件,每个分发文件一个,每个文件的长度恰好为100行。每行包含一个由逗号分隔的列表,其中包含75至100个浮点数,它们独立于分布而绘制,并被截断为小数点后的7位数字。您可以修改定界符以匹配您语言的本机数组格式。要获得答案的资格,您的程序应正确地对每个文件中的至少50个列表进行分类。有效答案的分数是字节数+错误分类列表的总数。最低分获胜。


我可能早些时候应该问过,但是期望对测试用例进行多少优化?我现在可以通过调整一些参数来提高我的分数,但是对分数的影响可能取决于给定的测试用例。
丹尼斯

2
@Dennis您可以根据需要进行尽可能多的优化,测试用例是挑战的固定部分。
Zgarb 2015年

YU NO学生t分布?=(
N3buchadnezzar

Answers:


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))-也就是说,我们检查了指数和gamma值,因为它改善了整体性能。

为了保存一个字节,"EGTBU"完成对字符串的索引操作,而不是直接在条件语句中求值为字符串。

为了进行测试,请将txt文件保存到目录中(保持名称不变),然后在该目录中运行Julia REPL。然后,将该函数附加到名称为

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个不匹配,对于U.txt应该有1个不匹配


7

R,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))]

这基于贝叶斯公式P(D = d | X = x)= P(X = x | D = d)* P(D = d)/ P(X = x),其中D是分布,X是随机样本。我们选择d,以使P(D = d | X = x)最大为5。

我假设先验是平坦的(即[1,5]中i的P(D = di)= 1/5),这意味着分子中的P(D = d)在所有情况下都是相同的(分母将无论如何在所有情况下都是相同的),因此我们可以消除除P(x = X | D = d)之外的所有内容,除了三角形分布以外的P(x = X | D = d)简化为R中的本机函数。

松散

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))]
}

请注意,取消高尔夫版本并不完全等同于高尔夫版本,因为消除分母可以避免出现Inf / Inf的情况,如果您允许Beta分布在[0,1]而不是(0, 1)-与样本数据一样。附加的if语句可以处理该问题,但是由于仅出于说明目的,可能不值得增加算法核心以外的复杂性。

感谢@Alex A.进行其他代码减少。特别是对于which.max!


1
您可以通过以下方法将其拆分为190个字节:删除打开后的换行符{和关闭前的换行符},以及别名prod,例如P=prod,然后做P(dunif(x)),等等。该函数不需要名称即可成为有效的提交,因此您可以删除p=。此外,出色的工作。:)
Alex A.

2
您可以使用上述建议并which.max(c(u,r,b,e,g))代替使其达到182 c(u,r,b,e,g)==max(c(u,r,b,e,g))
Alex A.

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))]}
Alex A.

您多么敢用R进行涉及统计的挑战!!
瑕疵的

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的分布。

为了确定gamma值指数值和其他值,我们看一下样本的第二高值。

  • 如果它位于[1.5,∞) ,我们猜测伽马

  • 如果它位于[1,1.5)中,则我们猜测是指数

  • 如果它位于 [0,1),则我们有三种剩余的可能性。

    剩余的分布可以通过接近平均值(0.5)的样本值百分比来区分。

    我们将样本的长度除以落在(0.3,0.7)中的值的计数,然后看一下所得商。

    • 如果它位于(1,2]中,我们猜为三角形

    • 如果它位于(2,3] ,我们猜测一致

    • 如果它位于(3,∞)中,我们猜测为beta

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

Matlab,428 328字节+ 33错误分类

该程序基本上是在给定数据的情况下将实际CDF与估计的CDF进行比较,然后计算两者之间的平均距离:我认为图像可以解释更多信息:

在此处输入图片说明

此图所示的数据非常清楚地表明它属于绿松石分布,因为它与该分布非常接近,因此基本上就是我的程序正在执行的操作。它可能可以打更多的高尔夫球。对我来说,这首先是一个概念上的挑战,而不是高尔夫运动。

这种方法也与选择的pdf无关,适用于任何发行版。

下面的代码(未启用)应显示其完成方式。高尔夫版本如下。

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

Perl,119个字节+ 8个错误分类= 127

我在三个功能上做了一个很小的决策树:

  • $ o:布尔值:如果有任何样本> 1.0
  • $ t:计数:0减6的13 ile限制在0-1范围内,
  • $ h:计数:第0个减去第6个加第12个13个ile进入0-1范围

调用了perl -F, -lane -e '...'。我不确定是否应该为非标准参数添加罚款。如果逗号是空格,我想如果没有-F,我本该逃脱的

for(@F){$ b [$ _ * 13] ++; $ o ++ if $ _> 1}
$ h =($ t = $ b [0]-$ b [6])+ $ b [12];
print $ o?($ t> -2?“ e”:“ g”):($ h = 19?“ b”:“ u”));
$ o = @ b =()

格式略微的输出(没有-l标志)是:

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    eeegeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
gggggggegggggggggggggggggggggggggggggggggggggggggggg
    gggggggggggggggggggggggggggggggggggggggggggggg
tttttttttttttttttttttttttttttttttttttttttttttttttttt
    ttttttttttttttttttttttttttuttttttttttttutttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

0

Python,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)

想法:根据Kolmogorov-Smirnov检验的p值猜测分布。

测试

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.