- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
目前,我正在尝试解决天体物理学的一个问题,可以简化如下:
我想将线性模型(例如y = a + b*x
)拟合到观察到的数据,并且我希望使用PyMC
来表征a和的后验离散网格参数空间中的 b 如下图所示:
我知道PyMC
有DiscreteMetropolis
类来查找离散空间中的后验,但那是在整数空间中,而不是在自定义离散空间中。所以我正在考虑定义一个强制 PyMC 在网格中搜索的潜力,但效果不佳......任何人都可以帮忙解决这个问题吗?或者有人解决过类似的问题吗?任何想法将不胜感激:)
这是我的草稿代码,注释掉潜在的类是我强制 PyMC 在网格中搜索的想法:
import sys
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import pymc
#------------------------------------------------------------
# Generate the data
size = 200
slope_true = 12.3
y_intercept_true = 22.4
x = np.linspace(0, 1, size)
# y = a + b*x
y_true = y_intercept_true + slope_true * x
# add noise
y = y_true + np.random.normal(scale=.03, size=size)
# Define searching parameter space
# Note: this is discrete but not in the form of integer
slope_search_space = np.linspace(1,30,51)
y_intercept_search_space = np.linspace(1,30,51)
#------------------------------------------------------------
#Start initializing PyMC
@pymc.stochastic(dtype=int)
def slope(value = 5, t_l=1, t_h=30):
"""The switchpoint for the rate of disaster occurrence."""
def logp(value, t_l, t_h):
if value > t_h or value < t_l:
return -np.inf
else:
return -np.log(t_h - t_l + 1)
#@pymc.potential
#def slope_prior(val=slope,t_l=-30, t_h=30):
# if val not in slope_search_space:
# return -np.inf
# return -np.log(t_h - t_l + 1)
#---
@pymc.stochastic(dtype=int)
def y_intercept(value=4, t_l=1, t_h=30):
"""The switchpoint for the rate of disaster occurrence."""
def logp(value, t_l, t_h):
if value > t_h or value < t_l:
return -np.inf
else:
return -np.log(t_h - t_l + 1)
#@pymc.potential
#def y_intercept_prior(val=y_intercept,t_l=-30, t_h=30):
# if val not in y_intercept_search_space:
# return -np.inf
# return -np.log(t_h - t_l + 1)
# Define observed data
@pymc.deterministic
def mu(x=x, slope=slope, y_intercept=y_intercept):
# Linear age-price model
return y_intercept + slope*x
# Sampling distribution of prices
p = pymc.Poisson('p', mu, value=y, observed=True)
model = dict(slope=slope, y_intercept=y_intercept, mu=mu, p=p)
#-----------------------------------------------------------
# perform the MCMC
M = pymc.MCMC(model)
trace = M.sample(iter=10000,burn=5000)
#Plot
pymc.Matplot.plot(M)
plt.figure()
pymc.Matplot.summary_plot([M.slope,M.y_intercept])
plt.show()
最佳答案
几天前我成功解决了我的问题。令我惊讶的是,我在 Facebook 群组中的一些天文学 friend 也对这个问题感兴趣,所以我认为发布我的解决方案可能会很有用,以防其他人遇到同样的问题。请注意,这个解决方案可能不是解决这个问题的最佳方法,事实上,我相信还有更优雅的方法。但就目前而言,这是我能想到的最好的办法。希望这对你们中的一些人有帮助。
我解决问题的方式很简单,我总结如下
1> 以连续形式定义斜率、y_intercept 随机变量(PyMC
然后将使用 Metropolis
进行采样)
2> 定义函数 find_nearest
将连续随机变量斜率、y_intercept 映射到网格,例如Grid_slope=np.array([1,2,3,4,…51])
,slope=4.678
,然后find_nearest(Grid_slope, slip)
code> 将返回 5,因为 Grid_slope 中的斜率值最接近 5。与 y_intercept 变量类似。
3> 计算似然度时,这就是我的技巧,我应用了 find_nearest
函数来对似然函数进行建模,即更改 model(slope, y_intercept)
到 model(find_nearest(Grid_slope, slip), find_nearest(Grid_y_intercept, y_intercept))
,它将仅在网格参数空间上计算似然度。
4>PyMC
返回的斜率和y_intercept轨迹可能不是严格的Grid值,您可以使用find_nearest
函数将轨迹映射到Grid值,然后制作从中得出的任何统计推断。对于我的情况,我只是直接使用跟踪来获取统计数据,结果很好:)
import sys
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
import pymc
#------------------------------------------------------------
# Generate the data
size = 200
slope_true = 12.3
y_intercept_true = 22.4
x = np.linspace(0, 1, size)
# y = a + b*x
y_true = y_intercept_true + slope_true * x
# add noise
y = y_true + np.random.normal(scale=.03, size=size)
# Define searching parameter space
# Note: this is discrete but not in the form of integer
slope_search_space = np.linspace(1,30,51)
y_intercept_search_space = np.linspace(1,30,51)
#------------------------------------------------------------
#Start initializing PyMC
from pymc import Normal, Gamma, deterministic, MCMC, Matplot, Uniform
# Constant priors for parameters
slope = Uniform('slope', 1, 30)
y_intercept = Uniform('y_intp', 1, 30)
# Precision of normal distribution of y value
tau = Uniform('tau',0,10000 )
@deterministic
def mu(x=x,slope=slope, y_intercept=y_intercept):
def find_nearest(array,value):
"""
This function maps 'value' to the nearest point in 'array'
"""
idx = (np.abs(array-value)).argmin()
return array[idx]
# Linear model
iso = find_nearest(y_intercept_search_space,y_intercept) + find_nearest(slope_search_space,slope)*x
return iso
# Sampling distribution of y
p = Normal('p', mu, tau, value=y, observed=True)
model = dict(slope=slope, y_intercept=y_intercept,tau=tau, mu=mu, p=p)
#-----------------------------------------------------------
# perform the MCMC
M = pymc.MCMC(model)
trace = M.sample(40000,20000)
#Plot
pymc.Matplot.plot(M)
M.slope.summary()
M.y_intercept.summary()
plt.figure()
pymc.Matplot.summary_plot([M.slope,M.y_intercept])
plt.show()
关于python - 离散浮点网格中的 PyMC DiscreteMetropolis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37520690/
我尝试移植简单的生存模型 from here (the first one in introduction)从 PyMC 2 到 PyMC 3。但是,我没有找到任何等效于“观察到”的装饰器,并且我尝试
我使用了基于 Clojure 的“圣公会”,我认为这对我不利。糟糕的文档和太小的社区无法寻求帮助。此外,我仍然无法熟悉基于 Scheme 的语言。所以我想将语言更改为基于 Python 的语言。 也许
我想对我在不使用 pymc 的情况下生成的示例使用 pymc 诊断和摘要功能。例如,我想在我自己的一组示例中使用 pymc 的 mc_error 例程。 一些 pymc 诊断函数可以采用 np.arr
我正在尝试在PyMC3中采样多个链。在PyMC2中,我将执行以下操作: for i in range(N): model.sample(iter=iter, burn=burn, thin =
有关如何使用PyMC将两个正态分布拟合到数据的信息,请参见a question on CrossValidated。 Cam.Davidson.Pilon的答案是使用伯努利分布将数据分配给两个法线之一
我正在尝试使用最大后验估计来估计泊松过程的速率,其中速率随时间变化。这是一个速率线性变化的简化示例 (λ = ax+b): import numpy as np import pymc # Obser
我正在用一个简单的多级模型尝试 PyMC3。当同时使用假数据和真实数据时,随机效应分布的轨迹会相互移动(见下图),并且似乎是同一轨迹的偏移量。这是 NUTS 的预期产物还是表明我的模型存在问题? 这是
我试图在通过 PyMC 的 MCMC 方法拟合变量时设置约束 例如,我在 PyMC 中定义了以下随机模型 import pymc as pm a=pm.Uniform('a',lower=0.,upp
尝试通过 conda 安装 pymc 时,我收到以下信息: C:\Anaconda>conda install -c https://conda.binstar.org/pymc pymc 正在获取包
如何在 PyMC3 中定义自定义似然?在 PyMC2 中,我可以使用 @pymc.potential .我尝试使用 pymc.Potential然而,在 PyMC3 中,似乎 bool 运算不能应用于
我正在尝试从随机 Petri 网模型中估计速率。我不明白为什么,但我得到了零概率错误,即使在给定我为速率定义的初始值的情况下,将数据数据与预期的观察次数完全对应。 例如,以下比率 [0.01, 2,
我正在尝试从 Infer.NET 移植一个模型,但我正在努力如何制作在 pymc3 中观察到的确定性变量? M,L ~ 伯努利 # doesn't work ... Deterministic("U
我已经开始试用 pymc3 并且需要实现多项逻辑回归模型。我研究了 twiecki 的教程,并且了解他对层次回归模型的实现(请参阅 https://twiecki.github.io/blog/201
我正在尝试使用 PyMC 实现一个非常简单的大数定律示例。目标是生成不同大小样本的许多样本平均值。例如,在下面的代码中,我重复采集 5 个样本组 (samples_to_average = 5),计算
这是 PyMC: Parameter estimation in a Markov system 的后续内容 我有一个由每个时间步的位置和速度定义的系统。系统的行为定义为: vel = vel + d
型号 我有以下统计模型: r_i ~ N(r | mu_i, sigma) mu_i = w . Q_i w ~ N(w | phi, Sigma) prior(phi, Sigma) = Norma
我正在尝试将负二项式混合物与 PyMC 拟合。看来我做错了什么,因为预测看起来与输入数据并不相似。问题可能出在负二项式参数的先验上。有什么建议吗? from sklearn.cluster i
我有三个关于装饰器的问题,我无法找到答案: Q1)PyMC 中装饰器的参数(@Deterministic,@Stochastic)表示什么? Q2) @pymc.stochastic(dtype=in
我正在使用an example of linear regression from bayesian methods for hackers但无法将其扩展到我的用途。 我对一个随机变量进行了观察,对该
我正在尝试拟合共享相同截距的多条线。 import numpy as np import pymc # Observations a_actual = np.array([[2., 5., 7.]])
我是一名优秀的程序员,十分优秀!