首页 > 编程问答 >与 scipy ODR 的正确拟合包括错误吗?

与 scipy ODR 的正确拟合包括错误吗?

时间:2024-08-06 03:38:24浏览次数:16  
标签:python scipy scipy-optimize

我有一些数据点的 x 和 y 坐标都有错误。因此我需要使用python的 scipy.odr.ODR 工具来计算最佳拟合斜率和该斜率上的误差。但是,当我尝试添加错误时,ODR 失败并仅返回初始猜测参数。

我尝试运行它而没有错误,并且它按预期工作:

# Import statements
import numpy as np
import matplotlib.pyplot as plt
from scipy.odr import ODR, Model, Data, RealData

# Model function - linear fit
def model_func(params, x):
    m, c = params
    return m * x + c

#Model object - linear fit
model = Model(model_func)

# example data
n = 50
x = np.linspace(0, 50, n)
y = 2.0 * x + 1.0

x_err = np.abs(np.random.normal(0,2.5,n))
y_err = np.abs(np.random.normal(0,2.5,n))

x_data = np.random.normal(x,x_err,n)
y_data = np.random.normal(y,y_err,n)

# Data object with errors
data1 = Data(x_data, y_data, wd=1./x_err, we=1./y_err)
# Data object without errors
data2 = Data(x_data, y_data)

# odr object, and parameters for data1
odr1 = ODR(data1, model, beta0=[1., 1.])
odr1.set_job(fit_type=0)
output1 = odr1.run()
params1 = output1.beta
param_errors1 = output1.sd_beta


# odr object, and parameters for data1
odr2 = ODR(data2, model, beta0=[1., 1.])
odr2.set_job(fit_type=0)
output2 = odr2.run()
params2 = output2.beta
param_errors2 = output2.sd_beta

print("Fitted parameters with err:", params1)
print("Parameter errors with err:", param_errors1)
print("Fitted parameters without err:", params2)
print("Parameter errors without err:", param_errors2)


# Draw plots
fig, ax = plt.subplots()
plt.errorbar(x_data, y_data, yerr=y_err, xerr=x_err, linestyle="", marker="o", label="data")
plt.axline((x_data[0],model_func(params1,x_data[0])),slope=params1[0], color="k", label="Fit without errors")
plt.axline((x_data[0],model_func(params2,x_data[0])),slope=params2[0], color="r", label="Fit with errors")
plt.legend()
plt.show()

打印语句给出:

Fitted parameters with err: [1. 1.]
Parameter errors with err: [0. 0.]
Fitted parameters without err: [1.94789948 2.92857792]
Parameter errors without err: [0.05371152 1.5487141 ]

并且这个是图像: 最适合的数据和线条

当我添加错误参数时出了什么问题?


问题出在定义数据的方式和指定的拟合权重中。在 ODR 中,较大的权重表示较小的方差,因此对拟合有更大的影响。正在使用误差的倒数来定义权重 ( wd=1./x_err, we=1./y_err )。

但是,的某些数据点中的 x_err y_err 值接近于零。当取这些接近零的值的倒数时,得到的权重非常大(接近无穷大)。这些巨大的权重会导致拟合算法出现问题,因为它基本上会强制拟合算法完全通过这些点,而忽略其他数据点。

为了解决此问题,可以:

  1. 避免接近零的错误: 调查为什么的数据点中会出现接近零的错误。如果可能,请更正数据或错误估计过程。
  2. 设置错误阈值: 在计算权重之前,为 x_err y_err 设置一个小的阈值。例如,可以将所有小于 0.1 的错误替换为 0.1。这将防止出现极大的权重。
  3. 使用不同的权重方案: 不要使用误差的倒数,请考虑使用其他权重方案,例如 wd=1./x_err**2, we=1./y_err**2 ,这会减轻极端权重的影响。

以下是修改后的代码,其中包含用于设置错误阈值的选项:

# ...(其他导入和代码)

# 设置错误阈值
error_threshold = 0.1
x_err[x_err < error_threshold] = error_threshold
y_err[y_err < error_threshold] = error_threshold

# 数据对象(使用修改后的错误)
data1 = Data(x_data, y_data, wd=1./x_err, we=1./y_err)

# ...(其余代码)

通过应用这些更改,ODR 拟合应该可以正确处理错误并为提供合理的参数估计和错误。

标签:python,scipy,scipy-optimize
From: 78836025

相关文章

  • 【香橙派系列教程】(七)香橙派下的Python3安装
    【七】香橙派下的Python3安装为接下来的Linux图像识别智能垃圾桶做准备。图像处理使用京东SDK只支持pyhton和Java接口,目的是引入C语言的Python调用,感受大厂做的算法bug此接口是人工智能接口,京东识别模型是通过训练后的模型,精准度取决于训练程度,人工智能范畴在常规嵌入式......
  • vnpy,一个不可思议的Python库!
    vn.py是一个开源的Python交易编程框架,旨在帮助程序员快速搭建属于自己的量化交易平台。该框架支持股票、期货、外汇等多种金融产品的交易,提供了从数据获取、策略开发到交易执行的全流程支持。如何安装vnpy首先,要使用vnpy,您需要通过Python的包管理工具pip来安装它。以下......
  • Python回溯算法
    回溯算法回溯算法是一种系统的搜索算法,用于解决诸如排列组合、子集生成、图的路径、棋盘问题等问题。其核心思想是通过递归尝试各种可能的解决方案,遇到不满足条件的解时则回退(回溯),继续尝试其他可能性,直到找到所有的解决方案或确认无解。主要步骤:选择路径:在当前步骤选择一个可......
  • [python]使用gunivorn部署fastapi服务
    前言Gunicorn是一种流行的WSGIHTTP服务器,常用于部署Django和Flask等PythonWeb框架程序。Gunicorn具有轻量级、高稳定性和高性能等特性,可以轻易提高PythonWSGIApp运行时的性能。基本原理Gunicorn采用了pre-fork模型,也就是一个工作进程和多个worker进程的工作模式。在这个模......
  • python十六进制编辑器
    源代码:importtkinterastkfromtkinterimportfiledialogimportstructimportbinasciiimportosclassHexEditor:def__init__(self,master):self.master=masterself.master.title("十六进制编辑器")self.master.configure(bg......
  • python项目学习 mediapipe手势识别 opencv可视化显示
    importcv2importmediapipeimportnumpydefget_angle(vector1,vector2):#角度计算angle=numpy.dot(vector1,vector2)/(numpy.sqrt(numpy.sum(vector1*vector1))*numpy.sqrt(numpy.sum(vector2*vector2)))#cos(angle)=向量的点乘/向量的模angle=nump......
  • 【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
    摘要气象数据分析在各行各业中扮演着重要的角色,尤其对于农业、航空、海洋、军事、资源环境等领域。在这些领域中,准确的气象数据可以对预测未来的自然环境变化和采取行动来减轻负面影响的决策起到至关重要的作用。本系统基于PythonFlask框架,通过对气象数据的分析和处理来提供......
  • Python-MNE全套教程(官网翻译)-入门01:概述篇
    目的以牺牲深度为代价进行入门学习,简易学习基本方法开始导入相关库:#License:BSD-3-Clause#CopyrighttheMNE-Pythoncontributors.importnumpyasnpimportmne加载数据MNE-Python数据结构式基于fif格式的,但是对于其他格式也有阅读方法,如https://mne.tools/s......
  • Python-MNE全套教程(官网翻译)-入门05:关于传感器位置
    本教程描述了如何读取和绘制传感器位置,以及MNE-Python如何处理传感器的物理位置。像往常一样,我们将从导入我们需要的模块开始:frompathlibimportPathimportmatplotlib.pyplotaspltimportnumpyasnpimportmne关于montage和layout(蒙太奇和传感器布局)montage......
  • Codeforces Round 963 (Div. 2) A - C 详细题解(思路加代码,C++,Python) -- 来自灰名
    比赛链接:Dashboard-CodeforcesRound963(Div.2)-Codeforces之后有实力了再试试后面的题目,现在要做那些题,起码要理解一个多小时题目A:链接:Problem-A-Codeforces题目大意理解:        极少数不考翻译能读懂的cf题目(bushi)每个测试用例第一行一个n,......