为指数分布构造log-likelihood函数及参数计算的实现是否正确?
指数分布对数似然实现正确性判断
结论
你的整体实现思路是对的,但存在2个需要修正的小问题:
- 参数命名和定义不匹配
你当前代码里的scale变量实际对应的是指数分布的率参数λ(概率密度为$f(x)=\lambda e^{-\lambda x},x>0$),对应的对数似然公式确实是$lnL = nln\lambda - \lambda\sum x_i$,计算逻辑没有问题。但指数分布的尺度参数定义为$\beta=1/\lambda$,如果你需求里的scale实际是尺度参数,那对数似然要改成y = -len(data)*np.log(scale) - sum(data)/scale。 - 参数采样范围边界错误
你用np.linspace(0,1,100)生成候选参数时,第一个值是0,$ln(0)$是负无穷,会触发numpy的运行时警告,同时这个点没有实际意义。建议把起始值改成极小的正数,比如1e-6,同时可以把采样数调到101保证覆盖区间的均匀点,满足至少100个取值的要求。
修正后参考代码
import numpy as np import matplotlib.pyplot as plt # 和你原有计算逻辑一致的率参数λ版本对数似然 def log_likelihood(lmbd, data): n = len(data) return n * np.log(lmbd) - lmbd * np.sum(data) # 生成100个(0,1]区间的均匀候选值 params = np.linspace(1e-6, 1, 100) # 计算对数似然 L = log_likelihood(params, trans_data.Sales_Amount) # 输出最大似然估计值 print("最优率参数:", params[L.argmax()]) # 画图 plt.plot(params, L) plt.xlabel("率参数λ") plt.ylabel("对数似然值") plt.show()
补充说明
如果你的数据集里存在等于0的观测值,指数分布默认不支持x=0,需要提前做数据清洗剔除0值,否则对数似然计算也会出现异常。
内容的提问来源于stack exchange,提问作者user17059762
相关产品推荐
相关产品推荐

