python - curve_fit - 关于 var/covar 矩阵的问题
问题描述
我正在使用curve_fit
将曲线拟合到(x,y)
2D 空间中的某些数据点集。我们知道curve_fit
有这个参数。p0
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html
返回的第二件事curve_fit
是pcov
,当我取它的对角线pcov
和平方根时,我得到一个v
值向量。
然后我将所有这些值(来自这个向量v
)相加并得到一个数字S
:我将其解释为一个整体(正确与否,我不确定?!)std.dev
。(或说总和std.deviations
)。
我注意到,当我变化时,我会p0
得到不同的曲线并且它们具有不同的S
值。而且,有时我认为曲线在视觉上看起来并没有太大的不同,但它们的S
值却有很大的不同。
我不完全理解这个pcov
矩阵,因此我很困惑。它是什么的方差-协方差矩阵?!
我的问题是:这个S
值
1)
它是否衡量我的曲线与数据的拟合程度?
或者
2)
它更像是衡量优化过程(发生在内部curve_fit
)收敛的速度(给定我使用的特定p0
值)吗?
我希望它是 1),因此我可以使用这个数字S
作为曲线拟合过程的质量度量。
是这样还是不是?
此外,任何与上述疑问相关的解释都将不胜感激。
解决方案
实际上既不是 1) 也不是 2)。协方差矩阵给出了拟合参数的误差和相关性。当合身“看起来不错”时,您可能会有很大的错误。较大的误差意味着模型的预测效果不是很好。当两个参数基本上做同样的事情时,相关性(非对角元素)可能非常大,而模型仍然很好。在第一种方法中,更好地检查拟合的优度,是减少的卡方。大多数拟合是通过最小化卡方来完成的。收敛速度取决于许多因素,包括高维(维度作为参数数量)卡方超曲面的复杂性,而误差仅根据近似抛物线(局部)最小值的曲率估计。
当进入细节时,它会很快变得复杂,但作为一个粗略的想法,就是这样,不知何故。
附录
出现了以下问题:是不是小号S
通常表示合身,而好看的合身不一定有小号S
?
在拟合过程中,最佳参数最终是输入参数的函数。参数的误差反映了如果输入数据发生轻微变化,参数将如何变化。假设我们有a + b x_i = y_i
(这是线性的,但可以概括它。我们假设 没有错误x
)。然后我们会有a = f( x, y )
. 错误s_a
与d/d y_i f(x, y)
实际上是错误传播有关->错误如何y_i
影响a
等等。所以大多数时候我会说一个小错误意味着一个很好的拟合,在线性系统中肯定是这样。在奇怪的非线性情况下,我很确定可以构造一个情况(陡峭的局部最小值),其中参数的变化相对于输入值的变化很小,而拟合本身非常糟糕。在这种情况下,一个人会同时出现小错误和不合适的情况。不过,人们可能会在卡方值中看到它。
另一方面,如前所述,您可以在卡方很小但误差很大的情况下获得很好的拟合效果。这本身不是问题。但是如果使用带有拟合参数的模型来预测其他值,则需要执行误差传播。因此,预测在现实中可能非常好,但数学告诉你要宣布低置信度。
这里给出了一些数学
推荐阅读
- c# - 无法将 System.Data.DataRowView 类型的对象转换为 System.Windows.Controls.ListViewItem 类型
- python-3.x - 在 Windows 10 上安装 pycrypto 时出现问题
- javascript - React-table 中的表单
- laravel - 我们可以在 Laravel 5.6 中使用 Laravel 5.7 电子邮件验证吗?
- javascript - vue 数据在异步函数中改变
- python - 使用 os.walk 在目录中移动并执行脚本
- c - 如何识别字符串中第一个单词后的空格?
- reactjs - 即使在rest datagrid的管理员中没有数据显示时也显示标题
- java - java - 如何使用jsp文件中模型的特定列从java arrayList打印值
- java - Android 即时功能:这种方法是否存在根本缺陷?