You need to enable JavaScript to run this app. Python中用scipy.optimize.minimize最小化逻辑函数报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

Python中用scipy.optimize.minimize最小化逻辑函数报错如何解决

错误原因

你遇到的报错核心是输入代价函数的参数长度和维度不符合要求,具体问题有两个:

  1. 参数长度不匹配:你的代价函数需要输入的theta_conca总长度为 25*401 + 10*26 = 10285,而你生成的theta_random长度是样本数m(从报错信息可知m=5000),长度远小于要求,reshape操作自然失败。
  2. 参数维度错误:scipy.optimize.minimize要求初始值x0为一维数组,你生成的是形状为(m, 1)的二维数组,也会导致后续处理异常。

修正方案

步骤1:生成符合要求的初始参数

建议初始参数范围控制在[-0.1, 0.1],避免初始值过大导致sigmoid函数进入饱和区,梯度消失:

# 计算总参数个数
total_param_num = 25 * 401 + 10 * 26
# 生成一维随机初始参数
theta_random = numpy.random.uniform(low=-0.1, high=0.1, size=total_param_num)

步骤2:调用minimize执行最小化

如果没有手动实现梯度函数,可以让scipy自动计算数值梯度,也可以指定迭代次数等参数:

import scipy.optimize

# 执行最小化
minimize_result = scipy.optimize.minimize(
    fun=computecost,
    x0=theta_random,
    method='BFGS',
    jac=False, # 表示使用数值梯度,如果你自己实现了梯度函数可以替换成函数名
    options={'maxiter': 1000, 'disp': True}
)

# 拆分得到最优权重
opt_theta = minimize_result.x
opt_theta1 = numpy.reshape(opt_theta[0:10025], (25, 401))
opt_theta2 = numpy.reshape(opt_theta[10025:10285], (10, 26))

额外优化建议

  • 可以手动实现反向传播的梯度函数传给jac参数,相比数值梯度速度提升非常明显,精度也更高。
  • 可以优化sigmoid函数的实现,避免输入值过大/过小的时候出现数值溢出警告。

内容的提问来源于stack exchange,提问作者user15515518

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 05:54:04