我正在尝试使用卡方作为拟合统计量来拟合一个常数。我试图拟合的常数不是一个简单的缩放常数,而是输入到输出值的方程中。
const -> fn -> 值和错误
这里有大量关于卡方检验的帖子,但我找不到任何关于使用它来拟合值和/或允许有错误的数据的版本,其中:
chi2 =(观察值 - 预期值)** 2 /(观察值中的 1 西格玛误差)** 2
您能告诉我该怎么做吗? 谢谢,
让我们构建一个 MCVE 来解决您的问题:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize, special
假设您有两个任意函数用于模型和误差:
def model(x, a):
return special.expit(a * x)
def error(x, a):
return 0.01 * a * (np.abs(x) + 1e-6) + 0.01
我们可以为卡方统计构建一个包装器:
def loss_factory(x, y):
def wrapped(a):
return np.sum(np.power((y - model(x, a)) / error(x, a), 2))
return wrapped
我们生成一些综合数据:
np.random.seed(12345)
a = 3.5
x = np.linspace(-1, 1, 30)
y = model(x, a)
s = error(x, a)
n = s * np.random.normal(size=x.size)
yn = y + n
并产生相关损失:
loss = loss_factory(x, yn)
现在我们将最小化参数
a
的损失,知道x
,y
和s
:
solution = optimize.minimize(loss, x0=[3.])
# fun: 36.084631813621556
# hess_inv: array([[0.00449676]])
# jac: array([-3.81469727e-06])
# message: 'Optimization terminated successfully.'
# nfev: 18
# nit: 8
# njev: 9
# status: 0
# success: True
# x: array([3.49451316])
返回卡方 (
solution.fun
) 和最优参数 (solution.x
)。
我们可以检查是否合身:
以及解决方案相对于损失函数的最优性: