scipy.stats
库中有函数可以找到拟合分布的均值和中位数,但没有模式。
如果我有拟合数据后的分布参数,如何找到拟合分布的 模式
?
scipy.stats
库中有函数可以找到拟合分布的均值和中位数,但没有模式。
如果我有拟合数据后的分布参数,如何找到拟合分布的 模式
?
如果我没理解错,您想找到拟合分布的模式而不是给定数据的模式。基本上,我们可以通过以下三个步骤来完成。
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
有两个参数,即loc
和scale
。对于scipy.stats
中的不同分布,它们的参数也是不同的。我认为将参数存储在元组中,然后在下一步中解压缩它是很方便的。
# 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
函数。 - Travis