2016-05-30 7 views
0

同じミントから10個のコインがあるとしたら、50回ごとにフリップさせてみましょう。今では、すべてのコインのバイアスだけでなく、ミントの偏りを見積もりたいと思います。pymc3の入力ディメンションを取得するのが正しい

私はこれをしたい方法は、このようなものです:pymcは10のフリップと50枚のコインを見込んようになりました、それはそうなので、

# Generate a list of 10 arrays with 50 flips in each 
test = [bernoulli.rvs(0.5, size=50) for x in range(10)] 

with pm.Model() as test_model: 
    k = pm.Gamma('k', 0.01, 0.01) + 2 
    w = pm.Beta('w', 1, 1) 

thetas = pm.Beta('thetas', w * (k - 2) + 1, (1 - w) * (k - 2) + 1, shape = len(test)) 
y = pm.Bernoulli('y', thetas, observed=test) 

しかし、これは動作しません。私は、この問題をこの例ではハックすることができます。しかし、私はpythonとpymc(3)の初心者ですので、なぜこのように動作し、この状況の適切なシミュレーションがどのように見えるのかを知りたいと思います。

答えて

1

Pythonを初めてお使いの方は、broadcastingの概念に精通していないかもしれません。これはNumPy配列の操作に使用され、PyMC3モデルの定義にも役立ちます。ブロードキャストは、特定の状況下では、異なるサイズの配列で算術演算を行うことができます。

あなたの特定の例についての問題は、放送によると、データベクトルthetasベクトルの形状の形状に互換性がないルールということです。問題の最も簡単な解決策は、データベクトルを転置することです(行の列と列を行にする)。 SciPyを使用すると、リスト内包を使わずに模擬データを作成できるので、適切なシェイプを渡すだけで済みます。

test = bernoulli.rvs(0.5, size=(50, 10)) 


with pm.Model() as test_model: 
    k = pm.Gamma('k', 0.01, 0.01) + 2 
    w = pm.Beta('w', 1, 1) 
    thetas = pm.Beta('thetas', w * (k - 2) + 1, (1 - w) * (k - 2) + 1, shape = test.shape[1]) 
    y = pm.Bernoulli('y', thetas, observed=test) 
関連する問題