如何在Python中找到原始数据与最佳曲线拟合的标准差?

问题描述 投票:0回答:1

假设我有一个大致线性的数据样本空间。我在数据中画了一条线。 我想要模型线数据的标准差。

pcov 矩阵提供参数的标准差。但我想要数据集 (y) 与曲线拟合 (y_model) 的标准偏差。除了像这样用Python计算之外,还有什么直接的方法可以得到它吗?

stdev = np.std(f_model(x_data,popt[0],popt[1]) - y_data)
python scipy data-modeling
1个回答
0
投票

假设您有一个线性数据集:

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])

如果参数变化,可用于评估模型所在的置信区间:

© www.soinside.com 2019 - 2024. All rights reserved.