首页 > 编程问答 >计算参数的ARE

计算参数的ARE

时间:2024-07-23 12:55:52浏览次数:5  
标签:python numpy matplotlib statistics average

我有以下代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate, optimize
import random

def dose(t, y, b, s, c, p, d):
  target, infectious, virus = y
  return np.array([
      -b * target * virus,
      b * target * virus - s * infectious,
      (1. / (d + 1.)) * p * infectious - c * virus
  ])

def model(D, b, s, c, p):
  solutions = []
  for d in D:
      solution = integrate.solve_ivp(
          dose, [0, 5], y0=[1, 0, 0.01],
          t_eval=[2.8828828828828827], # used to be np.linspace(0, 60, 1000)[48]
          args=(b, s, c, p, d)
      )
      data = solution.y[2, 0] / 0.01950269536785707  
      solutions.append(data)
  return np.array(solutions)

b = 0.00001
s = 4
c = 4
p = 2000000
p0 = (b, s, c, p)

np.random.seed(20)
D = np.logspace(-3, 3, 7)
z = model(D, b, s, c, p)
s = np.ones_like(z) * 0.05
n = random.gauss(0,z*0.05)
zn = z + n

popt, pcov = optimize.curve_fit(
  model, D, zn, p0=[1e-5, 1, 1, 1e6],
  method="trf", bounds=(0, np.inf),
  sigma=s, absolute_sigma=True
)

# (array([1.98458777e-05, 3.39383754e+00, 4.55115392e+00, 1.00007348e+06]),
#  array([[ 8.35308599e-10, -3.25230641e-03,  3.73469971e-03,
#          -5.22169803e-11],
#         [-3.25230641e-03,  1.28672442e+04, -1.47634805e+04,
#           2.06436797e-04],
#         [ 3.73469971e-03, -1.47634805e+04,  1.69398903e+04,
#          -2.36868204e-04],
#         [-5.22169803e-11,  2.06436797e-04, -2.36868204e-04,
#           3.31209815e-12]]))

Dlog = np.logspace(-3, 3, 200)
fig, axe = plt.subplots()
axe.scatter(D, zn, label="Data")
axe.semilogx(Dlog, model(Dlog, *popt), label="Fit")
axe.semilogx(Dlog, model(Dlog, *p0), "--", label="Model")
axe.legend()
axe.grid()
plt.show()

我想计算 ODE (b,s,c,p) 中参数的 ARE(平均残差)。我怎样才能有效地做到这一点?作为参考,这是通过以下计算得出的,其中 $\theta$ 是新的猜测,$\theta_i$ 是旧的猜测。

我想从图中读出参数: enter image description here


当然,我可以帮助计算 ODE 参数 (b, s, c, p) 的平均相对误差 (ARE)。

理解 ARE

平均相对误差 (ARE) 衡量估计参数值与真实参数值之间的平均偏差百分比。其计算公式如下:

ARE = (1/n) * Σ [(|θ - θ̂|)/ |θ|] * 100%

其中:

  • θ 表示真实的参数值
  • θ̂ 表示估计的参数值
  • n 表示参数的个数

在代码中计算 ARE

需要修改代码以包含 ARE 计算。以下是如何操作:

import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate, optimize
import random

# ... (的现有代码) ...

popt, pcov = optimize.curve_fit(
    model, D, zn, p0=[1e-5, 1, 1, 1e6],
    method="trf", bounds=(0, np.inf),
    sigma=s, absolute_sigma=True
)

# 计算 ARE
theta = np.array([b, s, c, p])  # 真实的参数值
theta_hat = popt                # 估计的参数值

are = (1/len(theta)) * np.sum(np.abs((theta - theta_hat) / theta)) * 100

print(f"平均相对误差 (ARE): {are:.2f}%")

# ... (代码的其余部分) ...

此代码段将计算并打印估计参数的 ARE。

从图中读取参数

提供的图像无法直接读取参数值。为了从图中获得参数的近似值,需要:

  1. 确定曲线的函数形式: 观察数据点并尝试确定最适合数据的函数类型(例如,线性、指数、对数)。

  2. 使用曲线拟合技术: 使用 Python 中的曲线拟合工具(例如, scipy.optimize.curve_fit numpy.polyfit )将选定的函数拟合到数据。这将为提供拟合参数的估计值。

重要说明: 从图中读取参数值本质上是不精确的。为了获得更准确的参数估计,需要使用原始数据和适当的拟合技术。

标签:python,numpy,matplotlib,statistics,average
From: 78777003

相关文章

  • 运行 python 3 代码时出现 python 2 语法错误
    我有一个如下所示的类classExperimentResult(BaseDataObject):def__init__(self,result_type:str,data:dict,references:list):super().__init__()self.type=result_typeself.references=referencesself.data=data......
  • 如何让 python 类型检查器知道它应该返回其类的新实例?
    我想使用classmethod返回当前类的新实例,并且我尝试了如下代码,但它引发了NameError('name'T'isnotDefined')PutthecodeT=TypeVar('T',bound=A)on|||以上也不起作用。classA有什么好主意来处理它吗?Isthereanygoodideatohandleit?......
  • 由于循环依赖而导致的Python注释错误
    我有两个相互依赖的类,并且无需注释即可正常工作。不幸的是,当我尝试注释返回值时,它会导致预期循环依赖错误。Network.pydefprocessors(self)->List[Processor]:#implementationProcessor.pydefnetwork(self)->Network:......
  • 如何在python中发送带有请求的“multipart/form-data”?
    如何在Python中使用multipart/form-data发送requests?如何发送文件,我明白,但是如何通过这种方法发送表单数据无法理解。可以使用Python中的requests库来发送multipart/form-data请求。说得对,requests库可以轻松发送文件,并且发......
  • 我安装了哪个版本的 Python?
    我必须在Windows服务器上运行Python脚本。我如何知道我拥有哪个版本的Python,这真的很重要吗?我正在考虑更新到最新版本的Python。确定在Windows服务器上安装的Python版本至关重要,因为它可以确定脚本的兼容性和可用库。以下是检查方法:使用命令提......
  • @classmethod 在 Python 的类之外做什么?
    在下面的代码中,如果存在@classmethod注释,则允许内部defnew()代替目标的__new__()--但该类会传递两次。如果@classmethod被删除,那么我们会收到类似“”的错误。@classmethod这里在做什么,有没有办法不用它?(我的动机是清晰的:我不理......
  • 三种语言实现快速选择(C++/Python/Java)
    题目给定一个长度为......
  • 如何让SublimeText支持Python 3的注释?
    我测试了SublimeText2和3,两者都有错误:如果您测试此代码,您会注意到:之后的所有代码都不会正确突出显示语法。deffoo(a,b)->str:#Nothinggetsproperlycoloredfromhere#Abunchofcode…return"bar"我发现了一些链接,解释了如何......
  • 如何用可变长度注释Python列表
    如何为可变长度或None的Python列表编写注释?当我这样写时,它会返回一个错误。defsome_function(params:list[str,...])#thisgiveserror:`TypeError:'type'objectisnotsubscriptable`defsome_function(params:List[str,...])#thisalsogiveserro......
  • Python 协议和 Django 模型
    假设我有一个简单的协议A和一个未能实现该协议的类B:fromtypingimportProtocolclassA(Protocol):deffoo(self)->str:...classB:pass当下面的代码进行类型检查时,Mypy将正确地抱怨x:A=B()mypy.error:Incompatibletypes......