我的问题是:是否有最小化算法,最好用Python实现,可以在一个慢速(~1-10s)的函数上运行,并从实时系统中获取数据,这不会超过几个几小时完成?
我有一个FPGA,它运行一些传感器数据的过滤器,并使用此过滤器的输出来提高另一个设备的性能。我想找到最佳的过滤器。我对系统建模和使用各种信号处理技术的尝试没有产生足够的结果,所以现在我将尝试在实时系统本身上解决这个问题(如果有的话,只是为了证明这样的最佳滤波器是可能的)。
可以通过串行线对滤波器进行编程,可以通过串行线测量其他器件的性能。
所以我可以构建一个函数:
这意味着我有一个可以用作最小化目标的函数。以下是问题:
要对滤波器进行编程大约需要1.5秒,要获取数据来测量滤波器的良好性大约需要6s。总而言之,每个函数调用接近8秒。换句话说,只召唤500次就需要一个多小时。即使加快通信和计算速度也可能不会改变一个数量级。
(注意下面的x
是我目标函数的参数空间中的向量。)
简而言之,x1 == x2
并不意味着 f(x1) == f(x2)
。由于系统的噪音,在参数空间的同一点对目标函数f(x)
进行采样可能会因系统的噪音而产生不同的结果。
我遇到的第一件事就是让目标函数实际平均几次测量,并增加我正在运行的任何最小化程序的容差值。但是在查看实际数字时,在最坏的情况下,我可以在整个参数范围内将f(x)
的(平均)值改变2.0,但样本标准偏差为1.6。这意味着如果我想将标准误差(s/sqrt(n)
)减少到0.1,我需要测量相同的点 250 次,这使得每次测量都 30分钟。耶。
我可以通过一些技巧来改善这一点,比如在参数范围内摆动~20,在任何给定点都有0.25的标准偏差。但这些技巧还有其他的权衡时间。
从好的方面来看,在整个优化空间(我已经确认确实存在全局最小值)上绘制函数(大大平均),表明事物实际上相当平滑,最小值不是太尖锐了。另一个好的方面是,度量只需要优化为两个或三个有效数字。如果它不是那么慢,那么优化就很容易。
我已经开始查看minimisation routines in SciPy了,但由于许多参数都没有记录或相互依赖,所以在黑暗中有点散步(每个步骤需要几个小时)。
令我感到震惊的是,我真正需要的是一种已知在最少数量的函数调用中工作的优化算法;虽然可能还有另一种我没有考虑过的方法。
答案 0 :(得分:3)
软件包scikit-optimize(skopt)专为此设置而设计:缓慢,嘈杂的目标函数。它使用高斯过程来模拟目标函数,并在不确定的评估点(改进模型)和可能是好的点之间切换。他们的例子使用~100次评估来恢复最小值。甚至还有一个针对物理实验的界面,它提出试验值,运行实验,提供结果,并提出更多的试验值。
答案 1 :(得分:2)
我认为这是Metropolis optimization的合理用例。这是马尔可夫链蒙特卡罗的早期示例之一,可以或多或少地应用于您的用例。
在每个步骤中,您在参数空间中建议一个随机步骤,并将适应度定义为exp(-(1/thing_to_minimize))
。接受健身增长的任何建议步骤和其他随机分数current_fitness/previous_fitness
。在运行一段时间后,简单的开始平均参数空间中的位置。
您可以通过将平均步长减小为时间的函数来添加模拟退火方面,以获得额外的褶边。
我已经在Stack Overflow a few times before上写过这个,但你会在Software to Tune/Calibrate Properties for Heuristic Algorithms找到我最完整的描述。
答案 2 :(得分:0)
这不是一个解决方案,而是一个需要考虑的东西。我会使用类似下面的过程:使用N个样本近似函数,根据近似值选择一个新点,并迭代:我在具有大量参数的噪声数据上使用了类似的技术。继承人更多细节
使用N值近似函数(可能以某种方式加权)。一些选项是:
您选择的那个取决于您对错误行为的期望。
根据近似函数选择一个新的样本位置并移动该值 进入N,抛出其他N分之一。有几种方法可以做到这一点。它部分取决于您选择的近似函数。一些选项包括:
还有很多其他选择。
你如何抛弃其中一个N分也值得辩论。选项可能是: