多变量Normal更改PyMC中变量的值

时间:2014-09-03 22:16:08

标签: python distribution pymc

我可能做错了但我无法弄清楚它是什么。我试图从洛杉矶巴吞鲁日的真实状态数据集中重现一些结果。原始代码是用WinBUGS here编写的。在上面的链接中使用的数据集与我现在使用的数据集之间存在一些细微差别。但是,我认为这并不重要。这是代码:

import pymc as pm, pandas as pd, numpy as np
from scipy.spatial.distance import pdist, squareform
from numpy.linalg import inv

# Loading dataset
df = pd.read_table('http://pastebin.com/raw.php?i=41us4HVj', sep=' ')

# Setting priors
beta = pm.Normal('beta', 0.0, 0.1, size=3)
mu = pm.Lambda('mu', lambda b=beta: 
               b[0]+b[1]*df['LivingArea']/1000.0+b[2]*df['Age'])
tau = pm.Gamma('tau', 0.1, 0.1)
phi = pm.Uniform('phi', 0.1, 10)

# Trying to build a covariate matrix
A = squareform(pdist(np.array(zip(df['Latitude'], df['Longitude']))))

# Using the powered exponential to obtain a precision matrix
precision = pm.Lambda('exp', lambda u=A, tau=tau, phi=phi, kappa=1: 
                                inv((1/tau)*np.exp(-(phi*u)**kappa)))

如果我检查mu的值,我明白了:

mu.value
Out[2]:
0     24.568272
1      2.909063
2     -2.778916
3     28.206696
4     -0.270571
5     -2.865153
6     14.158162
7     31.466438
8     44.681351
9     22.191397
10    -6.412350
11    11.709424
12    25.453254
13    24.366674
14    34.711048
...
55    24.625763
56    21.763089
57    65.108136
58    15.428714
59    20.992329
60    36.384037
61    16.730507
62    23.021763
63    54.887747
64    30.612696
65    52.685840
66    59.612372
67    18.822422
68    18.940658
69    72.678188
Length: 70, dtype: float64

然而,在运行MvNormal之后,mu的值发生了变化:

w = pm.MvNormal('w', mu, precision)

mu.value
Out[4]:
0    -107.913779
1      -1.243466
2       8.283926
3      26.412651
4       1.806728
5      -1.300734
6     -80.657396
7      71.614343
8      -3.817774
9     -10.283683
10     -3.804962
11      8.639403
12     18.927553
13    -10.004095
14    -37.431770
...
55    88.612179
56    18.011459
57    -7.421157
58     7.974531
59    -3.697444
60   -17.520367
61    36.453531
62   -39.235745
63    -6.701737
64    68.672902
65   -44.040923
66    11.826075
67   -21.995198
68   -15.886362
69     4.653335
Length: 70, dtype: float64

顺便说一句,这只发生在mu。精度变量保持不变。

我犯了错误吗?

更新

GitHub上已经有filed个问题。在进一步检查之后,罪魁祸首似乎是mu变量中使用的pd.Series对象。如果我转换或删除系列,则在调用MvNormal后mu将不会更改。

谢谢!

0 个答案:

没有答案