函数拟合时从固定值列表选取指定拟合参数的方案问询
问题解答
可行性说明
你的需求完全可实现。本质是给优化变量b增加了离散取值约束,不需要依赖无约束优化的近似求解结果。
对应算法名称
这类问题属于混合整数优化范畴,针对你的场景有两类常用实现思路:
- 暴力网格搜索:因为你的
possible_b可选值极少,直接遍历所有候选的b,对每个固定的b单独拟合最优的连续参数a,最终选择总误差最小的参数组合即可,运算成本极低。 - 混合整数非线性规划(MINLP):如果离散候选值更多、或者约束更复杂,就属于这类通用优化问题,有专门的求解算法。
支持的相关库
- 轻量场景直接用
scipy即可:既可以手动遍历离散值做简单计算,也可以直接调用scipy.optimize.brute接口直接定义离散参数的候选网格。 - 复杂混合整数优化场景可以用
CVXPY、Google OR-Tools、PuLP等库,原生支持离散变量、整数变量的约束定义。
适配你需求的代码修改示例
直接修改fit方法即可,不需要改动原有其他逻辑:
def fit(self): time_beg = time.time() min_err = float('inf') best_a = None best_b = None # 遍历所有候选的b for b_candidate in self.possible_b: # 固定b,只优化a def obj_fun(a): y_fit = self._fun_linear(self.x_exp, a[0], b_candidate) return np.linalg.norm(y_fit - self.y_exp) # 求解当前b下最优的a res_a = minimize(obj_fun, x0=self.params_init[0]) current_err = res_a.fun # 记录最优结果 if current_err < min_err: min_err = current_err best_a = res_a.x[0] best_b = b_candidate # 保存结果和原接口兼容 self.res = type('MockRes', (), {})() self.res.x = [best_a, best_b] self.res.fun = min_err time_end = time.time() print(time_end - time_beg) print(self.res.x) print(self.res)
内容的提问来源于stack exchange,提问作者Mimi
相关产品推荐
相关产品推荐

