数学
首先,我们从线性回归开始。在许多统计问题中,我们假设变量具有一些带有一些未知参数的潜在分布,并且我们估计这些参数。在线性回归中,我们假设因变量 y i与自变量 x ij具有线性关系:
y i = x i1 β 1 + ... + x ip β p + σε i , i = 1, ..., n。
其中 ε i具有独立的标准正态分布,β j是 p 个未知参数,σ 也是未知的。我们可以把它写成矩阵形式:
Y = X β + σε,
其中 Y、β 和 ε 是列向量。为了找到最好的 β,我们最小化平方和
S = (Y - X β) T (Y - X β)。
我只是写出解决方案,即
β^ = (X T X) -1 X T Y。
如果我们将 Y 视为特定的观察数据,则 β^ 是在该观察下对 β 的估计。另一方面,如果我们将 Y 视为随机变量,则估计量 β^ 也将成为随机变量。这样我们就可以看出β^的协方差是多少了。
因为 Y 具有多元正态分布且 β^ 是 Y 的线性变换,所以 β^ 也具有多元正态分布。β^ 的协方差矩阵为
Cov(β^) = (X T X) -1 X T Cov(Y) ((X T X) -1 X T ) T = (X T X) -1 σ 2。
但是这里 σ 是未知的,所以我们也需要估计一下。如果我们让
Q = (Y - X β^) T (Y - X β^),
可以证明Q / σ 2具有n - p 个自由度的卡方分布(此外,Q 与β^ 无关)。这使得
σ^ 2 = Q / (n - p)
σ 2的无偏估计量。所以 Cov(β^) 的最终估计量是
(X T X) -1 Q / (n - p)。
SciPy API
curve_fit
是最方便的,第二个返回值pcov
只是对β^的协方差的估计,也就是上面的最终结果(X T X) -1 Q / (n - p)。
在leastsq
中,第二个返回值为cov_x
(X T X) -1。从 S 的表达式,我们看到 X T X 是 S 的 Hessian(准确地说是 Hessian 的一半),这就是为什么文档说cov_x
是 Hessian 的逆。要获得协方差,您需要乘以cov_x
Q / (n - p)。
非线性回归
在非线性回归中,y i非线性地取决于参数:
y i = f( x i , β 1 , ... , β p ) + σε i。
我们可以计算 f 对 β j的偏导数,所以它变成近似线性的。然后计算与线性回归基本相同,只是我们需要迭代地逼近最小值。在实践中,该算法可以是一些更复杂的算法,例如默认的 Levenberg-Marquardt 算法curve_fit
。
更多关于提供 Sigma
本节介绍 中的sigma
andabsolute_sigma
参数curve_fit
。对于curve_fit
当您对 Y 的协方差没有先验知识时的基本用法,您可以忽略此部分。
绝对西格玛
在上面的线性回归中,y i的方差是 σ 并且是未知的。如果你知道方差。您可以curve_fit
通过sigma
参数和设置提供它absolute_sigma=True
。
假设您提供的sigma
矩阵是 Σ。IE
Y ~ N(X β, Σ)。
Y 具有均值 X β 和协方差 Σ 的多元正态分布。我们希望最大化 Y 的似然性。从 Y 的概率密度函数,这相当于最小化
S = (Y - X β) T Σ -1 (Y - X β)。
解决方案是
β^ = (X T Σ -1 X) -1 X T Σ -1 Y。
和
Cov(β^) = (X T Σ -1 X) -1。
curve_fit
上面的 β^ 和 Cov(β^) 是with的返回值absolute_sigma=True
。
相对西格玛
在某些情况下,您不知道 y i的确切方差,但您知道不同 y i之间的相对关系,例如 y 2的方差是 y 1的方差的 4 倍。然后你可以通过sigma
和设置absolute_sigma=False
。
这次
Y ~ N(X β, Σσ)
提供已知矩阵 Σ 和未知数 σ。最小化的目标函数与绝对 sigma 相同,因为 σ 是常数,因此估计量 β^ 是相同的。但协方差
Cov(β^) = (X T Σ -1 X) -1 σ 2 ,
里面有未知的σ。为了估计 σ,让
Q = (Y - X β^) T Σ -1 (Y - X β^)。
同样,Q / σ 2具有自由度为 n - p 的卡方分布。
Cov(β^) 的估计是
(X T Σ -1 X) -1 Q / (n - p)。
这是curve_fit
with的第二个返回值absolute_sigma=False
。