对于我的学士论文,我正在开展一个项目,我想对某些数据进行拟合。问题有点复杂,但我试着在这里尽量减少问题:
我们有三个数据点(很少有理论数据可用),但这些点高度相关。
使用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()
答案 0 :(得分:3)
这不是数字问题。 "问题"是你的协方差矩阵的非对角线项是正的和相对大的。这些确定了拟合中误差之间的相关性,因此如果所有术语都是正数,则表示所有误差都是正相关的。如果一个人很大,那么其他人也会因为同一个标志而变大。
这是一个类似于你的例子,带有协方差矩阵
[2.0 1.3 0.0]
sigma = [1.3 2.0 1.3]
[0.0 1.3 2.0]
(该矩阵的条件数为23.76,所以我们不应该期待任何数值问题。)
虽然第一点和第三点之间的协方差为0,但是第一点和第二点之间的协方差为1.3,第二点和第三点之间的协方差为1.3,并且1.3是差异的相对较大部分,均为2.因此它将是如果拟合模型中的所有误差都具有相同的符号,那就不足为奇了。
这个脚本有三个点,并绘制数据和拟合线。
import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
def f(x, a, b):
return a + b*x
x = np.array([1, 2, 3])
y = np.array([2, 0.75, 0])
sig = np.array([[2.0, 1.3, 0.0],
[1.3, 2.0, 1.3],
[0.0, 1.3, 2.0]])
params, pcov = curve_fit(f, x, y, sigma=sig)
y_errors = f(x, *params) - y
plt.plot(x, y, 'ko', label="data")
plt.plot(x, f(x, *params), linewidth=2.5, label="fitted curve")
plt.vlines(x, y, f(x, *params), 'r')
for k in range(3):
plt.annotate(s=r"$e_{%d}$" % (k+1), xy=(x[k]-0.05, y[k]+0.5*y_errors[k]), ha='right')
plt.xlabel('x')
plt.ylabel('y')
plt.axis('equal')
plt.grid()
plt.legend(framealpha=1, shadow=True)
plt.show()
正如您在图中看到的,所有错误都具有相同的符号。
我们可以通过考虑另一个协方差矩阵
来确认这种推理 [ 2.0 1.3 -1.0]
sigma = [ 1.3 2.0 -1.3]
[-1.0 -1.3 2.0]
在这种情况下,所有非对角线项的幅度都相对较大。第一和第二错误之间的协方差是正的,并且在第二和第三错误之间以及在第一和第三错误之间是负的。如果这些非对角线项相对于方差足够大,我们应该预期前两个点的误差的符号是相同的,而第三个误差将与前两个相反的符号相反。
以下是sig
更改为上述矩阵时脚本生成的图表:
错误显示预期的模式。