比试错更有效地优化多个变量的算法

时间:2012-05-16 22:57:10

标签: c# algorithm optimization multivariate-testing

谷歌的结果似乎需要比我熟悉的更高级的数学(我可能不会比五年级学生聪明,但我不打算发现)。

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

假设我有数字变量 x y z w 和函数 f ,使w = f(x, y, z)。我想最大化 w 和...

  • f 未知
  • xy 和/或 z 之间的依赖关系(如果有)未知
  • 在某些情况下,我只有事后数据集
  • 在其他情况下,我可以改变 xy z 并重新取样 w 按需
  • 在先验情况下,理想算法使 wxy >和 z ,并在每轮采样后为每个选择下一个值

我有自变量的粗略最小和最大界限。我当然不想再抽取超过必要的排列空间。我喜欢算法至少具有检测最明显的共同依赖性的粗略能力,例如,当 x >时,收益递减。当 2y {的总和时, w x 的实际恶化{1}} y 超出了某些上限等。

我看过的大多数数学库假设我知道如何对Boigenfoodle Continuum进行量子nergenflip投影,而我就不在那里。非数学家编码器将如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

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

基本上,从一些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

答案 1 :(得分:3)

看起来您可以从http://www.dotnumerics.com/NumericalLibraries/Optimization/Default.aspx获得针对C#的Nelder-Mead Simplex优化算法的实现。使用这种方法,你所要做的就是给它一些可以评估在仲裁点优化的函数的东西。它并不像需要衍生物的方法那样有效,事实上它甚至不像Torczon Simplex变体那样具有数学上的尊重 - 但是人们确实使用它,而我找不到C#的免费Torczon Simplex实现。

答案 2 :(得分:2)

如果你可以采样f,你可以做一些爬山。从任意位置(x,y,z)开始。样本f在(x,y,z)和(x + delta,y,z)处。如果后者更好,那就转移到那里。如果没有,尝试一些较小的增量。同时尝试负增量,并在另外两个坐标上进行增量。当没有delta给你增加f时,你达到了最大值。

请注意,这只会为您提供本地最大值,而不一定是全局最大值。如果您的delta太小,它在数值上也会非常不稳定。

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