【发布时间】:2017-12-02 06:53:57
【问题描述】:
对于我的学士论文,我正在做一个项目,我想对一些数据进行拟合。问题有点复杂,但我在这里尽量减少问题:
我们有三个数据点(可用的理论数据很少),但这些点高度相关。
使用curve_fit来拟合这些点,我们得到了一个可怕的拟合结果,正如你在这张图片中看到的那样。 (通过手动改变拟合参数可以很容易地改善拟合)。
我们的拟合结果具有相关性(蓝色)和被忽略的相关性(橙色):
当我们使用更多参数时,结果会变得更好(因为到那时拟合基本上表现得像求解)。
我的问题:为什么会发生这种行为? (我们使用我们自己的最小二乘算法来解决我们的具体问题,但它也遇到了同样的问题)。这是一个数值问题,还是curve_fit有什么好的理由来展示这个解决方案?
我很高兴能很好地解释为什么我们不能使用“仅 2 个”参数来拟合这些高度相关的 3 个数据点。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
plt.rcParams['lines.linewidth'] = 1
y = np.array([1.1994, 1.0941, 1.0047])
w = np.array([1, 1.08, 1.16])
cor = np.array([[1, 0.9674, 0.8812],[0.9674, 1, 0.9523], [0.8812, 0.9523, 1]])
s = np.array([0.0095, 0.0104, 0.0072])
def f(x, a, b):
return a + b*x
cov = np.zeros((3,3))
for i in range(3):
for j in range(3):
cov[i,j] = cor[i,j] * s[i] * s[j]
A1, B1 = curve_fit(f, w, y, sigma=cov)
A2, B2 = curve_fit(f, w, y)
plt.plot(w, f(w, *A1))
plt.plot(w, f(w, *A2))
plt.scatter(w, y)
plt.show()
【问题讨论】:
-
我不明白这个问题(顺便说一句:代码没有在我的机器上运行,因为
cov似乎格式错误)。拟合效果很好,也适用于两个参数 (A2)。那么当您确定A1时,您到底想做什么? -
拟合
A2确实可以正常工作,因为它不包括相关性。在A1中,我想执行加权最小二乘拟合,因此我将协方差矩阵传递给curve_fit。 (代码对我有用,使用 numpy 1,11,2) -
我的错;我确实有一个过时的 numpy/scipy 版本。文档说:
A 2-d sigma should contain the covariance matrix of errors in ydata.这是你的传球吗? -
确实,如果我对此不确定,我很抱歉。我确实传递了 y 数据的协方差矩阵。我不想浪费任何信息,因为我只有 3 个数据点,因此尝试包含有关错误和协方差的所有信息
-
好了,不马上看,怎么了;如果你通过
sigma=s,它看起来很好。
标签: python scipy physics curve-fitting data-science