已关注 this tutorial ,我创建了以下 churn.py
文件:
import numpy as np
import scipy as sp
import scipy.stats as stats
#duration of alive subscriptions
censored = np.array([419,513, ... ,316,14])
#duration of completed subscriptions
uncensored = np.array([389,123,340, ... ,56,31])
#Log likelihoods for censored data
def log_likelihood_lomax(args):
shape, scale = args
val = stats.lomax.logpdf(uncensored, shape, loc=0, scale=scale).sum() + stats.lomax.logsf(censored, shape, loc=0, scale=scale).sum()
return -val
res_lomax = sp.optimize.minimize(log_likelihood_lomax, [1, 1], bounds=((0.001, 1000000), (0.001, 1000000)))
print("lomax shape", res_lomax.x[0], ", scale=", res_lomax.x[1])
print("lomax mean", stats.lomax.mean(res_lomax.x[0], scale=res_lomax.x[1]))
print("lomax median", stats.lomax.median(res_lomax.x[0], scale=res_lomax.x[1]))
注意:审查
和未经审查
中的...
code> 数组放在这里是出于保密目的。在实际脚本中,我改为包含实际值。
当我使用 python3 churn.py
运行此脚本时,我得到以下结果:
lomax shape 0.36948878639375643 , scale= 1440.4384891101636
lomax mean inf
lomax median 7961.447172364986
我知道返回的中位数值不正确。
但最重要的是,我不明白为什么洛马尔平均值返回inf
。
我的脚本有什么问题吗?
最佳答案
您的结果显示
lomax shape 0.36948878639375643
也就是说,使用 scipy 的表示法,形状参数 c
为 0.36948878639375643(在 wikipedia article 中,c
为 α)。
对于 c
≤ 1,分布的均值无限大(即定义均值的积分发散)。
您问“我的脚本有什么问题吗?”我建议进行一项重要更改:在调用 minimize
后,检查 res_lomax.在使用
为 True。像这样的事情:res_lomax.x
中的值之前,success
res_lomax = sp.optimize.minimize(log_likelihood_lomax, [1, 1], bounds=((0.001, 1000000), (0.001, 1000000)))
if res_lomax.success:
print("lomax shape", res_lomax.x[0], ", scale=", res_lomax.x[1])
print("lomax mean", stats.lomax.mean(res_lomax.x[0], scale=res_lomax.x[1]))
print("lomax median", stats.lomax.median(res_lomax.x[0], scale=res_lomax.x[1]))
else:
print("minimization failed:", res_lomax.message)
关于python - Numpy lomax 均值函数返回 "inf"而不是值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53732916/