假设我有一个大致线性的数据样本空间。我在数据中画了一条线。 我想要模型线数据的标准差。
pcov 矩阵提供参数的标准差。但我想要数据集 (y) 与曲线拟合 (y_model) 的标准偏差。除了像这样用Python计算之外,还有什么直接的方法可以得到它吗?
stdev = np.std(f_model(x_data,popt[0],popt[1]) - y_data)
假设您有一个线性数据集:
import numpy as np
import numdifftools as nd
import matplotlib.pyplot as plt
from scipy import optimize, stats
def model(x, a, b):
return a * x + b
np.random.seed(12345)
x = np.linspace(-1, 1, 30)
p = (2., 3.)
y = model(x, *p)
s = 0.25 * np.ones_like(y)
n = s * np.random.normal(size=y.size)
yn = y + n
popt, pcov = optimize.curve_fit(model, x, yn, sigma=s, absolute_sigma=True)
# (array([2.00095541, 3.08452241]),
# array([[5.84677424e-03, 1.04805847e-11],
# [1.04805847e-11, 2.08333335e-03]]))
您可以通过
传播参数误差来估计
y
上的不确定性误差。
def error(x, p, Cp):
def proxy(r):
return model(x, *r)
gradient = nd.Gradient(proxy)
def propagation(J):
return J @ Cp @ J.T
Cy = np.apply_along_axis(propagation, 1, gradient(p))
sy = np.sqrt(Cy)
return sy
sy = error(x, popt, pcov)
# array([0.08905115, 0.08456633, 0.08017755, 0.07590145, 0.0717582 ,
# 0.06777217, 0.06397273, 0.06039513, 0.05708108, 0.05407907,
# 0.05144375, 0.04923403, 0.04750934, 0.04632389, 0.04571964,
# 0.04571964, 0.04632389, 0.04750934, 0.04923403, 0.05144375,
# 0.05407907, 0.05708108, 0.06039513, 0.06397273, 0.06777217,
# 0.0717582 , 0.07590145, 0.08017755, 0.08456633, 0.08905115])
如果参数变化,可用于评估模型所在的置信区间: