如何用Python高效计算实验列表与多个模拟列表的RMSE?
多模拟列表与实验数据的RMSE批量计算实现
原代码的问题
你的代码无法运行主要有以下几个问题:
- 未初始化
MSE、RMSE容器就直接用索引赋值,且变量i此时完全未定义 - 循环逻辑错误:遍历
sim_list时,i是模拟列表本身,不是索引,却错误地用它作为RMSE的索引,还把RMSE[i]当作函数调用 - Python3语法错误:
print语句需要加括号
修正后的实现方案
推荐用函数封装RMSE计算逻辑,既避免重复代码,也让逻辑更清晰:
import numpy as np def calculate_rmse(experimental, simulated): exp_array = np.array(experimental) sim_array = np.array(simulated) mse = np.square(exp_array - sim_array).mean() return np.sqrt(mse) # 定义实验数据和所有模拟列表 experimental = [1, 2, 3, 4, 5] sim_list = [ [1.6, 2.5, 2.9, 3, 4.1], [5, 4, 3, 2, 1] ] # 批量计算并输出每个模拟列表的RMSE for idx, simulated in enumerate(sim_list, start=1): rmse = calculate_rmse(experimental, simulated) print(f"Root Mean Square Error {idx}:\n{rmse}\n")
如果不想封装函数,也可以直接在循环内完成计算:
import numpy as np experimental = [1, 2, 3, 4, 5] sim_list = [ [1.6, 2.5, 2.9, 3, 4.1], [5, 4, 3, 2, 1] ] exp_array = np.array(experimental) for idx, simulated in enumerate(sim_list, start=1): sim_array = np.array(simulated) mse = np.square(exp_array - sim_array).mean() rmse = np.sqrt(mse) print(f"Root Mean Square Error {idx}:\n{rmse}\n")
优化说明
- 用
numpy数组替代原生列表计算,效率更高且代码更简洁 - 使用
enumerate给每个模拟列表自动编号,输出结果更易区分 - 用
np.sqrt替代math.sqrt,无需额外导入math模块,且更适配numpy计算结果
内容的提问来源于stack exchange,提问作者Benjamin Atterberry
相关产品推荐
相关产品推荐

