【问题标题】:How to get the mode of distribution in scipy.stats如何在 scipy.stats 中获取分发模式
【发布时间】:2020-04-26 23:55:00
【问题描述】:

scipy.stats 库具有查找拟合分布的均值和中位数但不查找众数的函数。

如果我有拟合数据后的分布参数,如何找到拟合分布的mode

【问题讨论】:

标签: python scipy statistics distribution


【解决方案1】:

如果我没有理解错,您希望找到拟合分布的模式,而不是给定数据的模式。基本上,我们可以通过以下 3 个步骤来完成。

第 1 步:从分布生成数据集

from scipy import stats
from scipy.optimize import minimize
# generate a norm data with 0 mean and 1 variance
data = stats.norm.rvs(loc= 0,scale = 1,size = 100)
data[0:5]

输出:

数组([1.76405235, 0.40015721, 0.97873798, 2.2408932, 1.86755799])

第二步:拟合参数

# fit the parameters of norm distribution
params = stats.norm.fit(data)
params

输出:

(0.059808015534485, 1.0078822447165796)

注意stats.norm有两个参数,即locscale。对于scipy.stats中的不同dist,参数不同。我认为将参数存储在一个元组中然后在下一步解包它很方便。

第三步:获取拟合分布的众数(密度函数的最大值)

# continuous case
def your_density(x):
    return -stats.norm.pdf(x,*paras)
minimize(your_density,0).x

输出:

0.05980794

请注意,norm 分布的 mode 等于 mean。在这个例子中这是一个巧合。

还有一件事scipy 对待连续分布和离散分布不同(它们有不同的父类),您可以在离散分布上使用以下代码来做同样的事情。

## discrete dist, example for poisson
x = np.arange(0,100) # the range of x should be specificied
x[stats.poisson.pmf(x,mu = 2).argmax()] # find the x value to maximize pmf

输出:

1

您可以尝试使用自己的数据和分布!

【讨论】:

  • 感谢您的详细解答!我理解你在这里使用的逻辑。但我不确定为什么在我的情况下 pdf 函数总是返回 0。我有一个适合数据的伽马分布。 ppf、mean 和 var 等其他函数返回正确的值,但 pdf 返回 0。如果我尝试最小化它,返回的解决方案是优化的初始起点。不知道这里出了什么问题。
  • @AdnanTamimi 给我看你的数据和代码,我想你可能滥用了.pdf 函数
  • 分布参数 p = [1.0903919789648953, 186586.34341665, 102313.74542487558] from scipy.stats import gamma def your_density(x): return -gamma.pdf(x,*p) minimum(your_density, 0 ).x
  • 因字数限制无法在此发布数据
  • 你的x范围应该大于scale,这意味着x0应该大于186586.See
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2015-12-23
  • 2017-05-04
  • 2019-01-25
  • 2017-05-06
  • 2019-03-18
  • 1970-01-01
相关资源
最近更新 更多