我想用我最喜欢的 Go 语言实现一个数值优化器。它应该找到这个问题的解决方案:最大化一个函数f(x)
,其中f
是非线性的并且x
是维度 10 或 20 的实向量。 f
是实值的。
就以下方面而言,最好的方法是什么:
- 实施简单
- 并行化的机会
该算法应该在具有多核的 x64 CPU 上运行。也许需要看不同的情况,所以我可以实现 2 或 3 个算法。
有趣的案例:
f
是有理的或者f
是有理函数的组合,exp
也许log
f
有多个最大值
这不是一个开放的问题。所以我不是在寻找列出尽可能多算法的答案。或者无休止地讨论哪种算法可能是最好的。选择算法可能有点主观,所以我想强调一个体面的解决方案,而不是一个完美的解决方案。
如果听说模拟退火在涉及多个最大值和固定域时被认为是最先进的。虽然这听起来像:如果我不修复域,虽然我可以先验地修复它,但模拟退火可能不如其他算法。
更新:次优解决方案很好,但是我想确保算法不会轻易集中在单个最大值上。
关于函数:我想对估计时间序列的函数进行最大似然拟合。就像y_{n+1} = a_1 * y_n + a_2 + y_{n-1} + ... + b_1 * epsilon_n + ... + epsilon_n
在一个简单的案例中一样。(epsilon
是 iid 噪声、y
一些时间序列a_i
和b_i
真实参数。)目前我正在通过假设epsilon
是正态分布来做到这一点,但我想更改为柯西分布。此外,我想添加一些非线性项并将其从 y 实值扩展到 y 作为实向量。不幸的是,我还不知道我到底想要什么,所以优化器的范围不应该太大。