6

谷歌在这方面的结果似乎需要比我熟悉的更高级的数学(而且我可能不比五年级学生聪明,但我不打算找出答案)。

我正在寻找一种解决多元优化问题的通用方法,最好是在 c# 中,而不必深入研究矩阵和特征向量以及正态分布。

假设我有数字变量xyzw以及f这样的函数w = f(x, y, z)。我想最大化w,并且...

  • f未知
  • 和/或之间的相互依赖关系xyz如果有的话)是未知的
  • 在某些情况下,我只有事后数据集
  • 在其他情况下,我可以根据需要x改变y和重新z采样w
  • 在先验情况下,理想算法在 、 和 的试验排列最少的情况下最大化wxy每轮z采样后为每个排列选择下一个值

我对自变量有粗略的最小和最大界限。我当然不想对置换空间进行不必要的采样。我希望算法至少具有检测最明显的相互依赖关系的粗略能力,例如,当x>时收益递减,或者当、和 和超过某个上限时的2y实际恶化等。wxyz

我看过的大多数数学库都假设我知道如何在 Boigenfoodle Continuum 上执行量子 nergenflip 投影,而我只是不在那里。非数学家编码员如何做到这一点?

4

3 回答 3

5

如果您不想陷入局部最小值,可以尝试模拟退火。

基本上,从一些 x,y,z 开始。从零均值分布(正态分布或高斯分布)随机生成 dx、dy 和 dz。如果 w(x+dx,y+dy,z+dz) > w(x,y,z) 则选择此新解决方案。否则选择它的概率 w(x+dx,y+dy,z+dz)/w(x,y,z)。

Python代码

def simAnneal( w, seed_x, numSteps=100000, sigma=0.01 ):
    optimal_x = [i for i in seed_x]
    optimal_w = w(optimal_x)

    cur_w = w(seed_x)

    for i in range(numSteps):
        new_x = [i+random.gauss(0, sigma) for i in seed_x]
        new_w = w(new_x)

        if (new_w > cur_w) or (random.random() > new_w / cur_w) :
            cur_x = new_x
            cur_w = new_w
            if cur_w > optimal_w:
                optimal_w = cur_w
                optimal_x = cur_x
    return optimal_x
于 2012-05-17T00:08:39.907 回答
3

如果您可以采样 f,则可以进行一些爬山。从任意位置 (x,y,z) 开始。在 (x,y,z) 和 (x+delta,y,z) 处采样 f。如果后者更好,请移到那里。如果没有,请尝试一些较小的增量。还可以尝试负增量,以及其他两个坐标上的增量。当没有增量让您增加 f 时,您已达到最大值。

请注意,这只会给您一个局部最大值,不一定是全局最大值。如果您的增量太小,它在数值上也非常不稳定。

如果您对 f 有所了解,例如它是 x,y,z 中的低次多项式,您可以做得更好。然后您可以对系数进行最小二乘拟合,然后通过将导数设置为零来最大化多项式。

于 2012-05-16T23:07:16.470 回答
3

看起来您可以从http://www.dotnumerics.com/NumericalLibraries/Optimization/Default.aspx获得 C# 的 Nelder-Mead Simplex 优化算法的实现。使用这种方法,您所要做的就是给它一些可以评估要在任意点优化的功能的东西。它不像需要导数的方法那样有效,实际上它在数学上甚至不如 Torczon Simplex 变体 - 但人们确实使用它,而且我找不到 C# 的免费 Torczon Simplex 实现。

于 2012-05-17T05:10:15.533 回答