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
相关产品推荐
相关产品推荐

