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

自定义方程最优参数求解:改用minimize与Nelder-Mead算法的实现咨询

使用Scipy minimize与Nelder-Mead算法拟合自定义方程

核心思路

改用最小化损失函数的方式替代curve_fit:定义预测值与真实值的均方误差(MSE)作为损失,通过Nelder-Mead无梯度算法寻找使损失最小的参数a、b、c、d。Nelder-Mead适合处理导数难以计算或非线性较强的拟合任务,无需依赖目标函数的梯度信息。

实现代码

import numpy as np
from scipy.optimize import minimize

# 转换数据为numpy数组,便于批量计算
xdata = np.array([0.221,0.23,0.24,0.242,0.233,0.21,0.171,0.221,0.231,0.237,0.227,0.213,0.209,0.209,0.196,0.207,0.213,0.218,0.187,0.196,0.203,0.205,0.219,0.224,0.216,0.205,0.2,0.184,0.169])
zdata = np.array([317,316.6,316.2,315.8,315.4,315,314.6,312.6,312.1,311.7,311.3,310.9,310.5,310.1,301.2,300.8,300.4,300,296.7,296.3,295.9,291,290.6,290.2,289.8,289.4,289,288.6,270.8])
ydata = np.array([0.211,0.199,0.192,0.197,0.212,0.246,0.329,0.252,0.238,0.231,0.251,0.282,0.296,0.305,0.231,0.211,0.203,0.195,0.248,0.234,0.224,0.183,0.163,0.156,0.161,0.167,0.162,0.168,0.253])

# 定义自定义预测函数
def predict_func(x, z, a, b, c, d):
    term1 = a + b * x
    term2 = (1 - term1) * (c / z) ** (1.0 / d)
    return term1 + term2

# 定义损失函数:均方误差(MSE)+ 取值范围惩罚
def loss_func(params):
    a, b, c, d = params
    y_pred = predict_func(xdata, zdata, a, b, c, d)
    mse = np.mean((y_pred - ydata) ** 2)
    # 对超出0-1范围的预测值添加惩罚,确保结果符合y的约束
    penalty = np.mean(np.maximum(0, y_pred - 1) ** 2) + np.mean(np.maximum(0, -y_pred) ** 2)
    return mse + 10 * penalty  # 惩罚系数可根据实际情况调整

# 初始参数(与原curve_fit设置一致)
initial_params = [-0.1, -0.5, 0.01, 5]

# 设置参数边界:c、d需为正(避免无意义的数学运算)
bounds = [(-np.inf, np.inf), (-np.inf, np.inf), (1e-6, np.inf), (1e-6, np.inf)]

# 调用Nelder-Mead算法最小化损失函数
result = minimize(loss_func, initial_params, method='Nelder-Mead', bounds=bounds, options={'maxiter': 100000})

# 输出拟合结果
print("最优参数:")
print(f"a = {result.x[0]:.6f}, b = {result.x[1]:.6f}, c = {result.x[2]:.6f}, d = {result.x[3]:.6f}")
print(f"最小损失值:{result.fun:.6f}")

# 验证前5个样本的拟合效果
y_pred = predict_func(xdata, zdata, *result.x)
print("\n前5个样本的真实值与预测值对比:")
for y_true, y_p in zip(ydata[:5], y_pred[:5]):
    print(f"真实值:{y_true:.6f},预测值:{y_p:.6f}")

关键说明

  • 损失函数设计:核心用均方误差衡量拟合偏差,额外添加预测值超出0-1范围的惩罚项,确保结果符合y的取值约束。
  • 参数边界:为c和d设置正下限,避免出现负数开方、除以0等无意义运算。
  • Nelder-Mead优势:无需计算目标函数梯度,对非线性、导数复杂的拟合任务适配性更强,初始参数鲁棒性优于部分梯度类算法。
  • 结果优化:可调整初始参数、惩罚系数或算法迭代次数,进一步提升拟合精度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 23:50:07