scipy.optimize.minimize优化失败排查:二项分布负似然求解问题
问题原因及解决方法
1. 参数传递不匹配
你的opt_like函数定义为接受两个参数:parameters和constants,但调用minimize时传入的args=[n, d1]会将n和d1作为两个独立参数传递给目标函数,导致函数调用时参数数量不匹配,直接引发报错。
修复方式:
修改opt_like的参数定义,直接接收n和data作为单独参数:
def opt_like(parameters, n, data): p = parameters return likelihood(data, n, p)
此时调用minimize时保持args=[n, d1]即可。
2. 未限制参数p的取值范围
二项分布的成功概率p必须满足0 < p < 1,但minimize默认使用的无约束优化方法(如BFGS)不会限制参数范围,优化过程中可能出现p ≤ 0或p ≥ 1的情况,此时binom.logpmf会返回-inf,导致负似然函数计算异常,最终优化失败。
修复方式:
调用minimize时通过bounds参数设置p的取值边界(用1e-6和1-1e-6避免对数0的计算问题):
minimize(opt_like, 0.5, args=[n, d1], bounds=((1e-6, 1-1e-6),))
3. 可选优化:提升计算效率
原likelihood函数使用Python内置sum,换成numpy的np.sum会更高效,尤其当数据集较大时:
def likelihood(data, n, p): return -np.sum(binom.logpmf(data, n, p))
完整修复后的代码示例
from scipy.stats import binom from scipy.optimize import minimize import numpy as np n=20 p=0.45 ## data d1 = binom.rvs(n, p, size=200) def likelihood(data, n, p): return -np.sum(binom.logpmf(data, n, p)) def opt_like(parameters, n, data): p = parameters return likelihood(data, n, p) # 调用minimize并设置边界 result = minimize(opt_like, 0.5, args=[n, d1], bounds=((1e-6, 1-1e-6),)) print(result)
运行后优化结果的x值会接近真实的0.45,说明优化成功。
内容的提问来源于stack exchange,提问作者StackyGuy
相关产品推荐
相关产品推荐

