如何获取scipy.stats中的分配方式
How to get the mode of distribution in scipy.stats
scipy.stats
库具有查找拟合分布的均值和中位数的函数,但没有查找众数的函数。
如果我有数据拟合后的分布参数,如何找到拟合分布的mode
?
如果我没有误解你的意思,你想找到拟合分布的众数而不是给定数据的众数。基本上,我们可以通过以下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]
输出:
array([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
有 2 个参数,即 loc
和 scale
。对于scipy.stats
中不同的dist,参数是不同的。我觉得把参数存储在一个元组中,然后在下一步中解压它很方便。
第 3 步:获取拟合分布的众数(密度函数的最大值)
# continuous case
def your_density(x):
return -stats.norm.pdf(x,*paras)
minimize(your_density,0).x
输出:
0.05980794
请注意 norm
分布有 mode
等于 mean
。在这个例子中是巧合。
还有一件事是scipy
对待连续dist和离散dist不同(他们有不同的父亲类),你可以做同样的事情在离散 dists 上使用以下代码。
## 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
你可以用自己的数据和分布试试!
scipy.stats
库具有查找拟合分布的均值和中位数的函数,但没有查找众数的函数。
如果我有数据拟合后的分布参数,如何找到拟合分布的mode
?
如果我没有误解你的意思,你想找到拟合分布的众数而不是给定数据的众数。基本上,我们可以通过以下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]
输出:
array([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
有 2 个参数,即 loc
和 scale
。对于scipy.stats
中不同的dist,参数是不同的。我觉得把参数存储在一个元组中,然后在下一步中解压它很方便。
第 3 步:获取拟合分布的众数(密度函数的最大值)
# continuous case
def your_density(x):
return -stats.norm.pdf(x,*paras)
minimize(your_density,0).x
输出:
0.05980794
请注意 norm
分布有 mode
等于 mean
。在这个例子中是巧合。
还有一件事是scipy
对待连续dist和离散dist不同(他们有不同的父亲类),你可以做同样的事情在离散 dists 上使用以下代码。
## 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
你可以用自己的数据和分布试试!