【问题标题】:Regression with “unidirectional” noise带有“单向”噪声的回归
【发布时间】:2014-03-05 10:09:58
【问题描述】:

我想从数据中估计一个简单线性函数和一个伽马分布噪声项的参数。 (注意:这是https://stats.stackexchange.com/questions/88676/regression-with-unidirectional-noise 的后续问题,但经过简化且更具体化)。假设我的观察数据生成如下:

import numpy as np
np.random.seed(0)

size = 200
true_intercept = 1
true_slope = 2

# Generate observed data
x_ = np.linspace(0, 1, size)
true_regression_line = true_intercept + true_slope * x_  # y = a + b*x
noise_ = np.random.gamma(shape=1.0, scale=1.0, size=size)
y_ = true_regression_line + noise_

看起来如下:

我尝试使用 pymc 估计这些参数,如下所示:

from pymc import Normal, Gamma, Uniform, Model, MAP
# Define priors
intercept = Normal('intercept', 0, tau=0.1)
slope = Normal('slope', 0, tau=0.1)
alpha = Uniform('alpha', 0, 2)
beta = Uniform('beta', 0, 2)
noise = Gamma('noise', alpha=alpha, beta=beta, size=size)

# Give likelihood > 0 to models where the regression line becomes larger than
# any of the datapoint
y = Normal('y', mu=intercept + slope * x_ + noise, tau=100,
           observed=True, value=y_)

# Perform MAP fit of model
model = Model([alpha, beta, intercept, slope, noise])
map_ = MAP(model)
map_.fit()

但是,这给了我与真实值相去甚远的估计:

  • 拦截:真:1.000,估计:3.281
  • 斜率:真实:2.000,估计:-3.400

我做错了吗?

【问题讨论】:

  • 我发现这主要是 MAP.fit() 中使用的优化器的问题。

标签: python regression pymc mcmc


【解决方案1】:

您似乎指定了正态似然以及 Gamma 噪声,因此您在模型中添加了额外的高斯噪声,这似乎没有必要。尝试将可能性表示为 Gamma,而不是 Normal,因为这是残差的分布。

【讨论】:

  • 这样做的问题是,对于斜率和截距的某些值,似然性会变为 0,并且会违反最大似然估计的一些规律性条件,请参阅此处的答案:stats.stackexchange.com/questions/88676/…
  • 您在上面绘制的拟合中的残差不是高斯的,但这就是您在 PyMC 模型中指定的。您不必担心规律性条件,因为您没有进行 ML 估计。所有你需要担心的是让你的臀部正确。您可以使用先验来适当地约束模型。
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 2011-09-20
  • 2014-02-11
  • 2022-11-22
  • 2023-01-19
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多