谷歌的结果似乎需要比我熟悉的更高级的数学(我可能不会比五年级学生聪明,但我不打算发现)。
我正在寻找一种解决多变量优化问题的通用方法,最好是在c#中,而不必深入研究矩阵和特征向量以及正态分布。
假设我有数字变量 x , y , z ,和 w 和函数 f ,使w = f(x, y, z)
。我想最大化 w 和...
f
未知x
,y
和/或 z
之间的依赖关系(如果有)未知x
,y
和 z
并重新取样 w
按需w
,x
, y
>和 z
,并在每轮采样后为每个选择下一个值我有自变量的粗略最小和最大界限。我当然不想再抽取超过必要的排列空间。我喜欢算法至少具有检测最明显的共同依赖性的粗略能力,例如,当 x
>时,收益递减。当 2y
, {的总和时, w
或 x
的实际恶化{1}} , y
超出了某些上限等。
我看过的大多数数学库假设我知道如何对Boigenfoodle Continuum进行量子nergenflip投影,而我就不在那里。非数学家编码器将如何实现这一目标?
答案 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中的低次多项式一样。然后你可以对系数进行最小二乘拟合,然后通过设置等于零的导数来最大化多项式。