4

y= m * x次のデータを使用して単純な問題の勾配を推定しようとするとします。

x_data = np.array([0,1,2,3])
y_data = np.array([0,1,2,3])

明らかに勾配は1です。ただし、これを PyMC で実行すると10になります

slope  = pm.Uniform('slope',  lower=0, upper=20)

@pm.deterministic
def y_gen(value=y_data, x=x_data, slope=slope, observed=True):
  return slope * x

model = pm.Model([slope])
mcmc  = pm.MCMC(model)
mcmc.sample(100000, 5000)

# This returns 10
final_guess = mcmc.trace('slope')[:].mean()

しかし、それは1でなければなりません!

注: 上記は PyMC2 の場合です。

4

2 に答える 2

3

可能性を定義する必要があります。これを試してください:

import pymc as pm
import numpy as np

x_data = np.linspace(0,1,100)
y_data = np.linspace(0,1,100)

slope  = pm.Normal('slope',  mu=0, tau=10**-2)
tau    = pm.Uniform('tau', lower=0, upper=20)

@pm.deterministic
def y_gen(x=x_data, slope=slope):
  return slope * x

like = pm.Normal('likelihood', mu=y_gen, tau=tau, observed=True, value=y_data)

model = pm.Model([slope, y_gen, like, tau])
mcmc  = pm.MCMC(model)
mcmc.sample(100000, 5000)

# This returns 10
final_guess = mcmc.trace('slope')[:].mean()

ユニフォームの事前分布からサンプリングしているだけで、10 がその期待値であるため、10 が返されます。

于 2014-03-07T02:12:40.500 に答える
1

可能性を設定する必要がありますvalue=y_data, observed=True。また、マイナーな点として、Model オブジェクトをインスタンス化する必要はありません。ノード (または locals() の呼び出し) を MCMC に渡すだけです。

于 2014-03-07T03:04:50.007 に答える