【问题标题】:Python fit a distribution to a bell curvePython 将分布拟合到钟形曲线
【发布时间】:2017-09-16 08:20:06
【问题描述】:

我正在研究预测模型。我的模型预测并不总是作为标准分布出现。我想转换或拟合分布值,使分布适合钟形曲线。就像我想要一种转换函数,将我的分布转换为钟形曲线(不一定是标准化的)。

例如,我的分布如下所示:

请注意,分布有些偏斜,并且不是完美标准/形状像钟形曲线。

这是我希望该分布看起来像的东西:

注意:这也不是完美的分布,只是更接近

注意:我不是试图标准化这些值,只是适合分布。请注意,目标分布未归一化。

我想我可以使用 scipy.normnumpy 的东西,但我似乎找不到我想要的东西。

【问题讨论】:

  • 要使您的数据符合正态分布,请参阅* answer
  • 我不认为 fitting 是正确的术语,在这里(它建议您要从数据中确定钟形曲线的参数 - mu 和 sigma)。这个问题本身听起来更像是你想transform分布。

标签: python numpy scipy


【解决方案1】:

您可能会考虑使用的一个工具是Box-Cox transformation。 scipy 中的实现是scipy.stats.boxcox

这是一个例子:

import numpy as np
from scipy.stats import boxcox, gamma
import matplotlib.pyplot as plt


# Generate a random sample that is not from a normal distribution.
np.random.seed(1234)
x = gamma.rvs(1.5, size=250)

# Transform the data.
y, lam = boxcox(x)

# Plot the histograms.
plt.subplot(2, 1, 1)
plt.hist(x, bins=21, rwidth=0.9)
plt.title('Histogram of Original Data')
plt.subplot(2, 1, 2)
plt.hist(y, bins=21, rwidth=0.9)
plt.title('Histogram After Box-Cox Transformation\n($\\lambda$ = %.4g)' % lam)
plt.tight_layout()
plt.show()

【讨论】: