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,可以按以下步骤验证相关性变化:
- 从拟合结果中提取
Cov(kref,E)(即result.covariance['kref', 'E'])、Var(E)、kref的拟合值; - 根据
kref = ko*exp(-E/RTref)推导出ko = kref * exp(E/(R*Tref)); - 代入公式计算
Cov(ko,E); - 计算原参数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
相关产品推荐
相关产品推荐

