gpt4 book ai didi

pymc3 - 如何拟合在 pymc3 中显示偏斜的数据

转载 作者:行者123 更新时间:2023-12-05 01:30:57 25 4
gpt4 key购买 nike

我正在为某些数据拟合分层模型,拟合似乎可以接受。

with pm.Model() as model:
mu_a = pm.Normal('mu_a', 0, sd=.2)
sigma_b = pm.HalfNormal('sig_a', 0.1)

mean = pm.Normal('mean', mu_a, sigma_b, shape=n)
std = pm.HalfNormal('std', 0.01 , shape=n)

means = mean[h]
stds = std[h]

y = pm.Laplace('y', mu=means, b=stds, observed=data)
hierarchical_trace = pm.sample(2000, n_init=30000)

当检查后验预测时,尾部似乎是合理的,数据的最小值和最大值(黑线)似乎都在生成样本的最小值/最大值之内(StudentT 不是这种情况)。
ppc_trace = pm.sample_ppc(model=model, trace=hierarchical_trace)

ppc with min/max/mean of original data

然而,平均值(最右边的图表)离得很远,我认为这是因为我的数据是负偏斜的,所以大量的数据将平均值向右移动得太远。
sp.stats.skew(data)

-0.1699020117521286

Pymc3 中推荐的对此类数据进行建模的方法是什么。尽管它是对称分布,但拉普拉斯似乎很适合我的数据。高斯在尾部没有提供足够的权重(这排除了偏斜正常?)。如何对这种适度倾斜的数据进行建模?

我的目标是为我的数据的不同部分获得具有可信区间的准确 MAP 估计(基于分层规范)

最佳答案

橡胶避开了这个……但对后来绊倒的人的回答

我找到了一个 asymmetric laplace很好地解决了不合适的问题。

def asym_laplace_log_p(x, m, lam, k):
diff = x - m
s = tt.sgn(diff)
return tt.log(lam / (k + 1 /k)) + ( - diff * lam * s * tt.pow(k, s))

def asym_laplace_cdf(x, m, lam, k):
diff = x - m
k_2 = k ** 2
if x <= m:
return (k_2 / (1 + k_2)) * np.exp((lam / k) * diff)
return 1 - ((1 / (1 + k_2)) * np.exp(-1 * lam * k * diff))

def inverse_cdf(u, m, lam, k):
s = np.sign(u)
k_s = np.power(k, s)
return m - (1/ (lam * s * k_s)) * np.log(u * s * k_s)

def asym_laplace_mean(m, lam, k):
return m + ((1 - k** 2) / (lam * k))

然后在模型里面
y = pm.DensityDist('y', lambda x: asym_laplace_dist(x, means, stds, k), testval=0, observed=data)  

cdf、inverse cdf 和 mean 仅用于调试目的,值得注意的是,此实现使用 lambda 作为形状而不是 1/lambda 所以我发现形状先验的半柯西比原始问题中的半正常效果更好。

很高兴听到有关此实现的反馈。

在撰写本文时,密度 dist 不适用于 sample_ppc(“AttributeError: 'DensityDist' 对象没有属性 'random'”),因此我最终可能会使用生成的位置、形状和偏斜值通过上述方法生成我自己的样本.

我不认为这完全是犹太洁食,所以很高兴对此有一些指导(或解决此问题并直接使用 sample_ppc 的指导)。

关于pymc3 - 如何拟合在 pymc3 中显示偏斜的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43642577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com