如何获取列表中产生最小误差的对应参数值?
问题描述
我需要从误差计算结果里筛选出产生最小误差的两个参数作为最终结果。现有示例代码如下:
def min_error(par1, par2): output = {"parameters": {"par1": [], "par2": []}, "error": [] } for i in par1: for j in par2: reg = somefunction(par1 = i, par2 = j) error = abs(ymax-ymin) # 计算得到单个误差值(原注释表述有误,此处实际返回单个数值) output["parameters"]["par1"].append(i) output["parameters"]["par2"].append(j) output["error"].append(error) return output
调用min_error(par1, par2)时,par1和par2为列表,嵌套循环会生成多组参数与误差并存入字典返回。但我需要的是从所有误差中找到最小值,以及对应的par1和par2参数,最终返回仅包含该组数据的字典,格式示例:
{'parameters': {'par1': 10, 'par2': 0.11, 'error': 9.83} }
我曾尝试用类似下面的if语句,但不知道怎么把最小值和对应的参数关联起来:
if output["error"] == min(error): output["parameters"]["par1"][i] output["parameters"]["par2"][j] output["error"]
解决方案
提供两种高效实现方式:
方式一:遍历过程中直接跟踪最小值(推荐,节省内存)
无需存储所有参数和误差,仅在遍历过程中记录当前最小误差及对应参数:
def min_error(par1, par2): # 初始化最小误差为极大值,参数为None min_err = float('inf') best_par1 = None best_par2 = None for i in par1: for j in par2: reg = somefunction(par1=i, par2=j) current_err = abs(ymax - ymin) # 若当前误差更小,则更新最小值与对应参数 if current_err < min_err: min_err = current_err best_par1 = i best_par2 = j # 返回目标格式的字典 return { "parameters": { "par1": best_par1, "par2": best_par2, "error": min_err } }
方式二:先存储所有数据,再查找最小值对应索引
如果需要保留全部计算结果用于后续分析,可先按原逻辑存储,再通过误差列表的最小值索引提取对应参数:
def min_error(par1, par2): output = {"parameters": {"par1": [], "par2": []}, "error": []} for i in par1: for j in par2: reg = somefunction(par1=i, par2=j) current_err = abs(ymax - ymin) output["parameters"]["par1"].append(i) output["parameters"]["par2"].append(j) output["error"].append(current_err) # 获取最小误差的索引位置 min_index = output["error"].index(min(output["error"])) # 根据索引提取对应参数与误差 return { "parameters": { "par1": output["parameters"]["par1"][min_index], "par2": output["parameters"]["par2"][min_index], "error": output["error"][min_index] } }
注意事项
- 原代码注释中“返回误差列表”的表述有误,
abs(ymax-ymin)实际返回单个数值,建议用current_err这类变量名更准确。 - 若存在多组参数产生相同最小误差,方式二会返回第一个出现的组合,方式一则返回最后一个遍历到的组合;若需保留所有符合条件的组合,可修改逻辑存储多个结果。
内容的提问来源于stack exchange,提问作者Supernova
相关产品推荐
相关产品推荐

