试图按照PyMC3上的教程,它来到:"'模型'对象没有属性TransformedVar"

use*_*442 2 python pymc3 jupyter-notebook

我一直在尝试按照PYMC3上的教程https://pymc-devs.github.io/pymc3/getting_started/,但是当我看到以下代码部分时,我遇到了错误......

from pymc3 import Exponential, T, logtransform, exp, Deterministic
from pymc3.distributions.timeseries import GaussianRandomWalk


with Model() as sp500_model:

    nu = Exponential('nu', 1./10, testval=.1)

    sigma, log_sigma = sp500_model.TransformedVar('sigma', Exponential.dist(1./.02, testval=.1),
                                        logtransform)

    s = GaussianRandomWalk('s', sigma**-2, shape=n)

    volatility_process = Deterministic('volatility_process', exp(-2*s))

    r = T('r', nu, lam=volatility_process, observed=returns)
Run Code Online (Sandbox Code Playgroud)

第一个错误是"无法导入名称logtransform".第二个错误(如果我不尝试加载logtransform)是"'模型'对象没有属性TransformedVar".

我在Windows 7上的IPython Notebook中运行它,我尝试卸载并重新安装PyMC3无济于事.

unu*_*tbu 5

当前版本的pymc3与教程不同步.

TransformedVar已于 2015-06-03 删除.

pymc3.logtransform已于 2015-06-15 删除.

这种新方法不再需要TransformedVar:

 sigma, log_sigma = model.TransformedVar(
     'sigma', Exponential.dist(1. / .02, testval=.1),
     logtransform)
Run Code Online (Sandbox Code Playgroud)

被替换为

 sigma = Exponential('sigma', 1. / .02, testval=.1)
Run Code Online (Sandbox Code Playgroud)

你的pymc3安装应该包含pymc3/examples/stochastic_volatility.py.与在线教程不同,此代码应与您的pymc3版本一致.

代码可以通过这种方式简化的原因是因为它Exponential是一个子类PositiveContinuous,并且该类默认使用logtransform.


有关记录,这是当前版本的stochastic_volatility.py(截至2015-06-04):

from matplotlib.pylab import *
import numpy as np
from pymc3 import *
from pymc3.distributions.timeseries import *

from scipy.sparse import csc_matrix
from scipy import optimize

n = 400

returns = np.genfromtxt(get_data_file('pymc3.examples', "data/SP500.csv"))[-n:]
returns[:5]

model = Model()
with model:
    sigma= Exponential('sigma', 1. / .02, testval=.1)

    nu = Exponential('nu', 1. / 10)

    s = GaussianRandomWalk('s', sigma ** -2, shape=n)

    r = T('r', nu, lam=exp(-2 * s), observed=returns)


def run(n=2000):
    if n == "short":
        n = 50
    with model:
        start = find_MAP(vars=[s], fmin=optimize.fmin_l_bfgs_b)
        step = NUTS(model.vars, scaling=start, gamma=.25)
        trace = sample(5, step, start)

        # Start next run at the last sampled position.
        start2 = trace.point(-1)
        step2 = NUTS(model.vars, scaling=start2, gamma=.25)
        trace = sample(n, step2, trace=trace)

    # <codecell>

    # figsize(12,6)
    title(str(s))
    plot(trace[s][::10].T, 'b', alpha=.03)
    xlabel('time')
    ylabel('log volatility')

    # figsize(12,6)
    traceplot(trace, model.vars[:-1])

if __name__ == '__main__':
    run()
Run Code Online (Sandbox Code Playgroud)

我通过从github克隆pymc3找到了这个:

git clone https://github.com/pymc-devs/pymc3
Run Code Online (Sandbox Code Playgroud)

然后查看影响transforms.py的提交:

gitk pymc3/distributions/transforms.py 
gitk pymc3/distributions/continuous.py
gitk pymc3/examples/stochastic_volatility.py
Run Code Online (Sandbox Code Playgroud)

一旦找到提交哈希(例如c3120bce05bf8f1389272e1c38ddf83cb46c8d84),github上的相应提交可以位于:

https://github.com/pymc-devs/pymc3/commit/c3120bce05bf8f1389272e1c38ddf83cb46c8d84
Run Code Online (Sandbox Code Playgroud)

我在相关时间段(2015-06-xx)期间未能找到github问题,该时间段讨论/解释了这一变化.