如何在scipy.stats中获取分布的众数

8

scipy.stats 库中有函数可以找到拟合分布的均值和中位数,但没有模式。

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


@MayowaAyodele:为什么你在评论中提到了这篇相同的帖子 (https://dev59.com/mLjoa4cB1Zd3GeqPAIga) 呢? :-) - András Aszódi
1个回答

6

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

步骤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])

步骤2: 拟合参数

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

输出:

(0.059808015534485, 1.0078822447165796)

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

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

# 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

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


@AdnanTamimi,请展示你的数据和代码,我认为你可能误用了.pdf函数。 - Travis
分布参数 p = [1.0903919789648953, 186586.34341665, 102313.74542487558]从 scipy.stats 导入 gammadef your_density(x): return -gamma.pdf(x,*p)minimize(your_density, 0).x - Adnan Tamimi
由于字符限制,无法在此处发布数据。 - Adnan Tamimi
如果您事先知道可能的值范围,那么这仅适用于离散分布。如果您的分布未知,并且可能是无界或非整数,那么该如何进行搜索?拥有一种通用方法会很好。 - Scott
在参数统计学中,我们假设数据服从某种分布,只有分布的参数是未知的。除了参数统计学之外,还有许多__非参数__统计方法可以基于样本估计总体中位数。其中最简单的方法是使用样本中位数来估计总体中位数。 - Travis
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接