自定义方程最优参数求解:改用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
相关产品推荐
相关产品推荐

