Python实现高维噪声数据降噪并求解隐藏函数全局最大值方案咨询
解决方案
问题1:多项式回归代码报错原因
你提供的示例代码报错是因为predict输入为一维列表,PolynomialFeatures要求输入为二维结构(每行对应一个样本),将predict= [0.49, 0.18]改为predict= [[0.49, 0.18]]即可修复。
核心方案说明
高维场景下不要使用sympy做符号计算,原因有二:
- d>5之后多元多项式的项数会指数级增长,符号求导、求解驻点的时间复杂度完全不可接受
- 符号求解对有约束定义域的适配性差,效率远低于数值优化方案
我们改用「多项式回归拟合 + 数值全局优化」的落地方案,适配高维场景,运行效率可控。
完整可运行实现
import numpy as np from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from scipy.optimize import differential_evolution def filter_noise_and_return_global_maxima(list_of_points, list_of_values, domain, degree_of_regression_polynomial, max_num_points=10, tol=1e-6): """ 参数说明: list_of_points: 样本点列表,形状(n, d) list_of_values: 样本观测值列表,形状(n,) domain: 定义域上下界,形状(d, 2),例如d=2时格式为[[x1_min, x1_max], [x2_min, x2_max]] degree_of_regression_polynomial: 多项式回归阶数 max_num_points: 最多返回的全局最优点数量 tol: 全局最大值判断容差,函数值与最大值差值小于tol即判定为全局最优点 """ X = np.array(list_of_points) y = np.array(list_of_values) d = X.shape[1] # 拟合多项式回归模型 poly = PolynomialFeatures(degree=degree_of_regression_polynomial, include_bias=True) X_poly = poly.fit_transform(X) model = LinearRegression(fit_intercept=False) model.fit(X_poly, y) # 封装目标函数,优化器默认求最小值,因此返回负的预测值 def objective(x): x_poly = poly.transform(x.reshape(1, -1)) return -model.predict(x_poly)[0] # 多次运行全局优化器收集候选最优点 candidates = [] for _ in range(max_num_points * 3): res = differential_evolution(objective, bounds=domain, seed=np.random.randint(10**6)) candidates.append((res.x, -res.fun)) # 筛选去重得到全局最大值点 max_val = max(v for _, v in candidates) global_max_points = [] for x, v in candidates: if abs(v - max_val) < tol: # 去重判断 duplicate = False for existing in global_max_points: if np.linalg.norm(x - existing) < tol: duplicate = True break if not duplicate: global_max_points.append(x.tolist()) if len(global_max_points) >= max_num_points: break return global_max_points # 测试用例 if __name__ == "__main__": # 生成带噪声的样本,隐藏函数为f(x,y) = x² + 2y list_of_points = np.random.uniform(-2, 2, size=(100, 2)).tolist() list_of_values = [p[0]**2 + 2*p[1] + np.random.normal(0, 0.1) for p in list_of_points] domain = [[-2, 2], [-2, 2]] max_points = filter_noise_and_return_global_maxima(list_of_points, list_of_values, domain, 2) print("全局最大值点:", max_points) # 预期输出接近[[-2.0, 2.0], [2.0, 2.0]]
注意事项
- 若定义域为全实数空间R^d,多项式回归结果会在无穷远处发散,不存在全局最大值,建议先限制合理的定义域范围,或更换高斯过程回归等带核模型配合贝叶斯优化寻优
- 若维度d>30且多项式阶数>2,多项式项数会爆炸,建议换用Lasso稀疏回归、XGBoost树模型拟合,优化步骤无需修改,仅替换拟合部分代码即可
- 若需要更高的寻优精度,可调大
differential_evolution的popsize参数,或更换为Optuna等贝叶斯优化库做寻优
内容的提问来源于stack exchange,提问作者Dudi Frid
相关产品推荐
相关产品推荐

