如何在 scipy.stats 中获取分布模式

Adn*_*imi 5 python statistics distribution scipy

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

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

Tra*_*vis 6

如果我没有理解错的话,您想要找到拟合分布的众数而不是给定数据的众数。基本上,我们可以通过以下 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]
Run Code Online (Sandbox Code Playgroud)

输出:

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

第2步:拟合参数

# fit the parameters of norm distribution
params = stats.norm.fit(data)
params
Run Code Online (Sandbox Code Playgroud)

输出:

(0.059808015534485,1.0078822447165796)

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

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

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

输出:

0.05980794

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

另一件事是,scipy对待连续 dist 和离散 dist 不同(它们有不同的父类),您可以使用以下代码对离散 dist 执行相同的操作。

## 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
Run Code Online (Sandbox Code Playgroud)

出去:

1

您可以尝试使用您自己的数据和发行版!