You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 14:15:03