1

Python でランダムに生成された連続数分布をシミュレートし、結合された数値 (y=x1+x2) が p(0.9) 内に収まるようにしようとしています。

n = 10000
x11 = [random.random() for i in range(n)]
x12 = [random.random() for i in range(n)]
x21 = [-0.5*(log(1-random.random())) for i in range(n)]
x22 = [-0.5*(log(1-random.random())) for i in range(n)]
x31 = [random.random() for i in range(n)]
x32 = [random.uniform(0,2) for i in range(n)]
x41 = [0.25 if random.random() < 0.8 else 1.5 for r in range(n)]
x42 = [0.25 if random.random() < 0.8 else 1.5 for r in range(n)]

x11 から x42 は、生成されたリストのペアが結合されてから操作される 0.9 から 1.8 の間に入る確率を取得しようとしているケースのペアです。したがって、x11 と x12 を組み合わせて、期待値、分散、0.9 ~ 1.8 の p(x) を求めます。

def test():
  x1,x2,c = 0.0,0.0,0.0
  for i in range(10000):
    if random.random()< 0.8:
      x1 += 0.25
    else:
      x2 += 1.5
    y = x1 + x2
    if y>0.9 and y<=1.8:
      c = c + 1
  return x1,x2,c

print "test: ",test()

def sim(a,b):
  #pyab1 = sum([a for a in a if a>0.9 and a<=1.8])/10000
  #pyab2 = sum([b for b in b if b>0.9 and b<=1.8])/10000
  #print "*****",float(pyab1+pyab2)
  #print a+b
  #array1 = [[a],[b]]
  array1 = a+b
  #array1.extend(a)
  #array1.extend(b)
  #c = 0
  #for y in array1:
    #if y>0.9 and y<=1.8:
      #c = c + 1
  pyab = sum([y for y in array1 if y>0.9 and y<=1.8])/10000
  print("P(a < x <= b) : {0:8.4f}".format(pyab))

確率 P(0.9<%Y<=1.8) のみをカウントしているため、カウントはこれらの値内に収まる必要があります。1-random.random() はその場合のみでした.すべてのケースでそれを使用しようとしたとき、彼らはまだ間違った値を思いつきました. 理論上の結果は次のとおりです。どのように異なるかを確認できます。

y~u(0,1) = 0.575

y~exp(2) = 0.3371

x1~u(0,1) x2~u(0,2)

P(y=0.25)=0.8 P(y=1.5)=0.2 = 0.2

これは、出力に続いてそれが与えるはずの値ですが、これは結果がどれだけ離れているかを示しています。

case 1: P(a < x <= b) : 0.7169 #should be 0.575 
case 2: P(a < x <= b) : 0.4282 #should be 0.3371 
case 3: P(a < x <= b) : 0.5966 #should be 0.4413 
case 4: P(a < x <= b) : 0.5595 #should be 0.2 

私はPythonに非常に慣れていないので、私の質問に私が見逃した明らかな解決策があると思われる場合は、しばらくお待ちください。

4

1 に答える 1

2

おそらくあなたは交換したほうがいいでしょう

pyab = sum([y for y in array1 if y>0.9 and y<=1.8])/10000

pyab = len([y for y in array1 if y>0.9 and y<=1.8])/len(array1)

確率は必要ですが、実際の値の合計は必要ないためです。また、len(array1)ほとんどの場合10000ではなく、2つの配列を合わせた長さです。

于 2012-11-10T03:54:06.420 に答える