その確率分布は誰ですか?


16

前書き

この課題では、確率分布から独立して描かれた非負の浮動小数点数のリストが与えられます。あなたの仕事は、数字からその分布を推測することです。チャレンジを実行可能にするために、選択できるディストリビューションは5つだけです。

上記の分布はすべて平均がちょうど1/2であることに注意してください。

タスク

入力は、長さが75〜100の非負の浮動小数点数の配列です。出力はUTBEG、上記の分布のどれに基づいて数字が引き出されたかに基づいて、文字の1つになります。

ルールとスコアリング

完全なプログラムまたは機能のいずれかを指定できます。標準の抜け穴は許可されていません。

ではこのリポジトリ、5つのテキストファイル、各ディストリビューションの1、長いそれぞれ正確に100行があります。各行には、分布から独立して描画され、小数点以下7桁に切り捨てられた75〜100個のフロートのコンマ区切りリストが含まれています。言語のネイティブ配列形式に一致するように区切り文字を変更できます。回答として認定するには、プログラムで各ファイルから少なくとも50個のリストを正しく分類する必要があります。有効な回答のスコアは、バイトカウント+誤分類リストの総数です。最も低いスコアが勝ちます。


私はおそらく以前に尋ねるべきでしたが、テストケースに向けてどれくらいの最適化が期待されますか?いくつかのパラメーターを微調整することでスコアを改善できる段階にありますが、スコアへの影響はおそらくテストケースによって異なります。
デニス

2
@Dennis必要に応じて最適化できます。テストケースは課題の固定部分です。
ズガーブ

YU NO Student-tの配布?=(
N3buchadnezzar

回答:


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"に、条件内の文字列を直接評価する代わりにが行われます。

テストのために、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 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ランダムサンプルです。P(D = d | X = x)が5のうちで最大になるようにdを選択します。

フラットな事前分布(つまり、[1,5]のiに対してP(D = di)= 1/5)を想定しています。つまり、分子のP(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))]
}

分母を取り除くと、ベータ分布が(0、 1)-サンプルデータと同様。追加のifステートメントがそれを処理しますが、それは説明目的のためだけであるため、アルゴリズムの中心にない複雑さを追加する価値はおそらくないでしょう。

@Alex A.に追加のコード削減をありがとう。特にwhich.max!


1
これを190バイトにするには、開始後の改行と終了{前の改行を削除し、}エイリアスを作成しますprod(例:P=prodthen doing P(dunif(x))など)。関数は有効な送信であるために名前を必要としないため、削除できますp=。また、素晴らしい仕事。:)
アレックスA.

2
上記の提案を使用しwhich.max(c(u,r,b,e,g))、の代わりにを使用して、182まで取得できますc(u,r,b,e,g)==max(c(u,r,b,e,g))
アレックス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))]}
アレックスA.

統計を含むチャレンジにRを使用することを敢えて!!
flawr

6

CJam、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より大きい値を取る唯一の分布だからです。

ガンマ指数などを決定するために、サンプルの2番目に高い値を調べます。

  • それはである場合は、[1.5、∞) 、我々は推測するガンマ線を

  • それはである場合は、[1、1.5) 、我々は推測する指数

  • にある場合 、[0、1) 、我々は残りの3つの可能性があります。

    残りの分布は、平均値に近いサンプル値の割合によって区別できます( 0.5)に。

    サンプルの長さを(0.3、0.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

Matlab、 428 328バイト+誤分類33

このプログラムは、基本的に実際のCDFとデータが与えられた推定CDFを比較し、次にこれら2つの間の平均距離を計算しています。

ここに画像の説明を入力してください

この画像に示されているデータは、ターコイズ分布に非常に近いため、ターコイズ分布に属していることをはっきりと示しています。それが基本的に私のプログラムが行っていることです。おそらくもう少しゴルフすることができます。私にとって、それはまず概念的な挑戦であり、それほどゴルフではありませんでした。

このアプローチは、選択された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

次の3つの機能について小さな決定ツリーを作成しました。

  • $ o:boolean:サンプルが1.0より大きい場合
  • $ t:カウント:0番目から6番目、13番目のファイルを0-1の範囲に切り詰め、
  • $ h:カウント:0番目から6番目、12番目から13番目のタイルを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フラグなし)は次のとおりです。

bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
    eeegeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
gggggggegggggggggggggggggggggggggggggggggggggggggggggg
    gggggggggggggggggggggggggggggggggggggggggggggggggg
tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt
    ttttttttttttttttttttttttttttuttttttttttttuttttttttttttuttttttttt
uuuuuuuuuuuuuuuuuuuuuuuuuuuuutuuuuuuuuuuuuuuuuuubuuuuuuu
    uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuutuuuu

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.