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

scipy.minimize优化双参数函数报错缺少必填位置参数z求助

问题根源

你遇到的报错是scipy.optimize.minimize的传参逻辑和你定义的损失函数的参数结构不匹配导致的:

  • minimize要求传入的目标损失函数只能接收一个一维数组类型的参数,你传入的初始值initial = [1,2]是长度为2的数组,运行时minimize会把整段数组作为单个参数传给calculate_loss
  • 但你当前定义的calculate_loss要求接收两个独立的位置参数alpha和z,运行时只接收到了传入的数组作为第一个参数alpha,缺少第二个参数z,就会抛出对应的报错。

修复方案

第一步:调整损失函数的参数结构

将损失函数的入参改为单个参数数组,在函数内部拆分出alpha和z两个变量:

# 原定义:def calculate_loss(alpha, z):
# 修改为:
def calculate_loss(params):
    alpha, z = params
    # 后面的原有逻辑不变

第二步:修复代码隐藏bug

你当前损失计算的循环中错误使用了之前循环的ind变量,会导致损失计算结果不符合预期,需要把对应位置的ind替换为循环变量i:

# 原代码:loss += np.sum((scaled_data[ind][1] - (a[j]*(scaled_data[ind][0])+b[j]))**2)
# 修改为:
loss += np.sum((scaled_data[i][1] - (a[j]*(scaled_data[i][0])+b[j]))**2)

完整可运行的核心代码参考

import numpy as np
from scipy.optimize import minimize
from scipy.optimize import curve_fit

# 这里提前定义你用到的f函数、LLs、data变量即可
def calculate_loss(params):
    alpha, z = params
    scaled_data = []
    for ind, L in enumerate(LLs):
        scaled_data.append(data[ind][:,1:45])
        scaled_data[ind][0] = np.log10(scaled_data[ind][0]/(L**z))
        scaled_data[ind][1] = np.log10(scaled_data[ind][1]/(L**alpha))

    a = []
    b = []

    for ind, L in enumerate(LLs):
        popt, pcov = curve_fit(f, scaled_data[ind][0], scaled_data[ind][1])
        a.append(popt[0])
        b.append(popt[1])

    N = len(LLs)

    loss = 0
    for i in range(0,N):
        for j in range(i+1,N):
            loss += np.sum((scaled_data[i][1] - (a[j]*(scaled_data[i][0])+b[j]))**2)
        
    return loss

initial = [1, 2]
res = minimize(calculate_loss, initial)
print(res.x)
fitted = res.x

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:54:07