python - 为什么 scipy.optimize.curve_fit() 在拟合函数中使用定义数量的参数时表现更好?
问题描述
我正在尝试将任意长度的多项式函数拟合到某些粒子数据,并且我注意到当拟合函数的参数明确说明而不是提供未定义数量的参数时,curve_fit() 的性能要好得多,即
import scipy.optimize as optimize
def fit(x, a, b):
return a + b*x
my_fit = optimize.curve_fit(fit, x_data, y_data)
性能比
import scipy.optimize as optimize
import numpy as np
def fit(x, *args):
return np.sum([arg * x**i for i, arg in enumerate(args)])
my_fit = optimize.curve_fit(fit, x_data, y_data, p0=[1, 1])
以下是使用我自己的数据时的拟合比较:
有人对这种行为有任何解释吗?
解决方案
它实际上是一样的,问题是 fit 的第二个定义不适用于 numpy 数组,因为它np.sum
总是会产生一个数字。只需指定轴,它将起作用:
import scipy.optimize as optimize
def fit(x, a, b):
return a + b*x
def fit2(x, *args):
return np.sum([arg * x**i for i, arg in enumerate(args)], axis=0)
x_data = np.linspace(-0.3, 0.3, 200)
y_data = x_data * 1000 + np.random.normal(size=x_data.shape[0], scale=20)
my_fit = optimize.curve_fit(fit, x_data, y_data, p0=[1, 1])
my_fit2 = optimize.curve_fit(fit2, x_data, y_data, p0=[1, 1])
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))
ax1.scatter(x_data, y_data, alpha=0.5, color='red')
ax1.plot(x_data, fit(x_data, my_fit[0][0], my_fit[0][1]), color='k')
ax2.scatter(x_data, y_data, alpha=0.5, color='red')
ax2.plot(x_data, fit2(x_data, my_fit2[0][0], my_fit2[0][1]), color='k')
推荐阅读
- sql-server-2008 - 在组合多行的值时包含自定义逻辑
- regex - 什么是有效 Git 标签的正则表达式?
- okhttp3 - Okhttp3 连接失败的问题
- bash - 将两行输出分配给bash中的两个不同变量
- python - 检查模型输入时出错:预期 conv2d_175_input 有 4 个维度,但得到了形状为 (0, 1) 的数组
- sap - 如何在 SAP EM 数据浏览器上执行界面
- javascript - Vanilla JS,无法替换从 DOM 获取的字符串中的反斜杠
- rust - 创建不同结构的向量的常用方法是什么?
- java - 这个程序是关于java中的字符串压缩的
- vb.net - 在VB中将日、周数和年转换为日期