You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python lmfit包:参数协方差矩阵计算及Arrhenius参数统计量求解

问题1:使用lmfit计算参数协方差矩阵而非相关矩阵

当然可以!lmfit在完成拟合后,默认就会计算并存储参数的协方差矩阵,相关矩阵其实是从协方差矩阵标准化推导而来的。你可以直接通过拟合结果对象的covariance属性获取协方差矩阵,而相关矩阵对应的是corr_matrix属性。

举个快速示例:

from lmfit import Model
import numpy as np

# 定义重参数化后的Arrhenius模型
def arrhenius_reparam(T, kref, E, R=8.314, Tref=298):
    return kref * np.exp(-E/R * (1/T - 1/Tref))

# 生成模拟数据
T_data = np.linspace(300, 500, 20)
k_data = arrhenius_reparam(T_data, 1e6, 50000) + np.random.normal(0, 1e4, 20)

# 执行拟合
model = Model(arrhenius_reparam)
params = model.make_params(kref=1e6, E=50000)
result = model.fit(k_data, params, T=T_data)

# 获取协方差矩阵
cov_matrix = result.covariance
print("协方差矩阵:")
print(cov_matrix)

# 对比相关矩阵(供参考)
print("\n相关矩阵:")
print(result.corr_matrix)

协方差矩阵里的cov_matrix[i,j]代表第i个参数和第j个参数的协方差,对角线元素就是单个参数的方差,这正是你后续需要用到的。


问题2:求解Var(E)和kref的标准差,验证相关性变化

这部分操作非常直接,结合lmfit的拟合结果就能轻松得到:

  • Var(E):直接取协方差矩阵中E对应的对角线元素即可,比如result.covariance['E', 'E'],这个值就是E的方差。
  • kref的标准差:先拿到kref的方差(协方差矩阵中kref的对角线元素result.covariance['kref', 'kref']),再对其求平方根,也就是np.sqrt(result.covariance['kref', 'kref'])。

关于你推导的关系式Cov(ko,E)/k0 = Var(E)/RTref - Cov(Kref,E)/kref,可以按以下步骤验证相关性变化:

  1. 从拟合结果中提取Cov(kref,E)(即result.covariance['kref', 'E'])、Var(E)、kref的拟合值;
  2. 根据kref = ko*exp(-E/RTref)推导出ko = kref * exp(E/(R*Tref));
  3. 代入公式计算Cov(ko,E);
  4. 计算原参数ko与E的相关性:corr(ko,E) = Cov(ko,E) / (std(ko) * std(E)),其中std(E)是np.sqrt(Var(E)),std(ko)可通过误差传递公式计算,或者直接拟合原Arrhenius方程得到后对比。

这样就能直观验证重参数化后,ko与E的相关性是否降低了。


内容的提问来源于stack exchange,提问作者user14466123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:00:03