- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有很多 x-y 数据点在 y 轴上有错误,我需要用非线性函数拟合它们。这些函数在某些情况下可以是线性的,但更常见的是指数衰减、高斯曲线等。 SciPy 通过scipy.optimize.curve_fit
支持这种拟合,我还可以指定每个点的权重。这给了我很好的加权非线性拟合。从结果中,我可以提取参数及其各自的错误。
只有一个警告:错误仅用作权重,但不包含在错误中。如果我将所有数据点的误差加倍,我预计结果的不确定性也会增加。所以我构建了一个测试用例 ( source code ) 来测试它。
配合 scipy.optimize.curve_fit
给我:
Parameters: [ 1.99900756 2.99695535]
Errors: [ 0.00424833 0.00943236]
相同但带有 2 * y_err
:
Parameters: [ 1.99900756 2.99695535]
Errors: [ 0.00424833 0.00943236]
相同但有 2 * y_err:
因此您可以看到值是相同的。这告诉我算法没有考虑这些,但我认为值应该不同。
我在这里也读到了另一种拟合方法,所以我也尝试用 scipy.odr
拟合:
Beta: [ 2.00538124 2.95000413]
Beta Std Error: [ 0.00652719 0.03870884]
相同但带有 20 * y_err
:
Beta: [ 2.00517894 2.9489472 ]
Beta Std Error: [ 0.00642428 0.03647149]
值略有不同,但我确实认为这是导致错误增加的原因。我认为这只是舍入误差或稍微不同的权重。
是否有一些包可以让我拟合数据并获得实际错误?我在一本书中有这里的公式,但如果不需要,我不想自己实现它。
我现在已经在另一个问题中阅读了关于 linfit.py
的内容。这很好地处理了我的想法。它支持两种模式,第一种是我需要的。
Fit with linfit:
Parameters: [ 2.02600849 2.91759066]
Errors: [ 0.00772283 0.04449971]
Same but with 20 * y_err:
Parameters: [ 2.02600849 2.91759066]
Errors: [ 0.15445662 0.88999413]
Fit with linfit(relsigma=True):
Parameters: [ 2.02600849 2.91759066]
Errors: [ 0.00622595 0.03587451]
Same but with 20 * y_err:
Parameters: [ 2.02600849 2.91759066]
Errors: [ 0.00622595 0.03587451]
我应该回答我的问题还是立即关闭/删除它?
最佳答案
一种行之有效且实际提供更好结果的方法是 Bootstrap 方法。当给出有错误的数据点时,使用参数 Bootstrap 并让每个 x
和 y
值描述高斯分布。然后将从这些分布中的每一个中抽取一个点并获得一个新的自举样本。执行简单的未加权拟合为参数提供一个值。
这个过程会重复大约 300 到几千次。最终会得到拟合参数的分布,其中可以采用均值和标准差来获得值和误差。
另一件巧妙的事情是,结果不是获得单个拟合曲线,而是获得许多曲线。对于每个内插的 x
值,我们可以再次取许多值的平均值和标准差 f(x, param)
并获得误差带:
然后使用各种拟合参数再次执行分析中的其他步骤数百次。然后,这还将考虑拟合参数的相关性,正如上图中可以清楚地看到的那样:尽管对数据拟合了对称函数,但误差带是不对称的。这意味着左侧的插值具有比右侧更大的不确定性。
关于python - 线性拟合,包括 NumPy/SciPy 的所有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23951876/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!