0

私は理論上の分布を持っており、次の分布について 2D 空間でランダムにサンプリングしたいと考えています。

def p(z,m):
    E = { 'ft':0.55, 'alpha': 2.99, 'z0':0.191, 'km':0.089, 'kt':0.25 }
    S = { 'ft':0.39, 'alpha': 2.15, 'z0':0.121, 'km':0.093, 'kt':-0.175 }
    I={ 'ft':0.06, 'alpha': 1.77, 'z0':0.045, 'km':0.096, 'kt':0.0 }
    Evalue=E['ft']*np.exp(-1*E['kt']*(m-20))*z**E['alpha']*np.exp(-1*(z/(E['z0']+E['km']*(m-20)))**E['alpha'])
    Svalue=S['ft']*np.exp(-1*S['kt']*(m-20))*z**S['alpha']*np.exp(-1*(z/(S['z0']+S['km']*(m-20)))**S['alpha'])
    Ivalue=I['ft']*np.exp(-1*I['kt']*(m-20))*z**I['alpha']*np.exp(-1*(z/(I['z0']+I['km']*(m-20)))**I['alpha'])
    value=Evalue+Svalue+Ivalue
    return value

更新:逆変換サンプリングが、確率分布からデータをサンプリングする適切なアプローチであることがわかりました。2D データ用に Python でこのメソッドをどのようにプログラムできますか、または使用できるライブラリはありますか?

4

2 に答える 2

-1

p(z,m) から値をランダムにサンプリングする場合、これを実装する簡単な方法は、Python で「random」モジュールを使用することです。numpy のランダム バージョンを使用してアイデアを示します。

import numpy as np
import matplotlib.pyplot as plt

def p(z,m):
    E = { 'ft':0.55, 'alpha': 2.99, 'z0':0.191, 'km':0.089, 'kt':0.25 }
    S = { 'ft':0.39, 'alpha': 2.15, 'z0':0.121, 'km':0.093, 'kt':-0.175 }
    I={ 'ft':0.06, 'alpha': 1.77, 'z0':0.045, 'km':0.096, 'kt':0.0 }
    Evalue=E['ft']*np.exp(-1*E['kt']*(m-20))*z**E['alpha']*np.exp(-1*(z/(E['z0']+E['km']*(m-20)))**E['alpha'])
    Svalue=S['ft']*np.exp(-1*S['kt']*(m-20))*z**S['alpha']*np.exp(-1*(z/(S['z0']+S['km']*(m-20)))**S['alpha'])
    Ivalue=I['ft']*np.exp(-1*I['kt']*(m-20))*z**I['alpha']*np.exp(-1*(z/(I['z0']+I['km']*(m-20)))**I['alpha'])
    value=Evalue+Svalue+Ivalue
    return value

# Define the number of iterations you want for each variable    
num_iter_m = 50
num_iter_z = 50

# I then set rand_m to go from 20 to 30, as your function fails for <20
rand_m = (np.random.random(num_iter_m)*10)+20

# z goes from the range 0 - 1
rand_z = (np.random.random(num_iter_z))

# Note, I am sampling from a uniform distribution for m and z. You can use more complicated functions, i.e., Gaussian/Normal shapes or even user defined.

rand_p = np.zeros((len(rand_z), len(rand_m)))

# Fill a grid with the random p(z,m) values
for i in range(len(rand_z)):
  for j in range(len(rand_m)):
    rand_p[i][j] = p(rand_z[i], rand_m[j])

# Plot
fig = plt.figure(0)

ax1 = fig.add_subplot(211)
ax1.scatter(rand_z, rand_m)
ax1.set_xlabel("z")
ax1.set_ylabel("m")

ax2 = fig.add_subplot(212)
cf = ax2.contourf(rand_z, rand_m, rand_p)
ax2.set_xlabel("z")
ax2.set_ylabel("m")

colbar = plt.colorbar(cf)
colbar.set_label("p(z,m)")

plt.show()

サンプル画像

より洗練された方法で使用する特定のモジュールは、たとえば、PyMC ( https://github.com/pymc-devs/pymc ) または emcee ( http://dan.iel.fm/emcee/current/ ) です。 )。

2D 関数 p(z,m) で重み付けされた z と m をサンプリングする場合、これはもう少し複雑です。

于 2014-06-16T16:54:10.717 に答える