You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:30:57