【问题标题】:How to write tests for mathematical optimization procedures?如何为数学优化程序编写测试?
【发布时间】:2018-05-05 08:54:07
【问题描述】:

我正在做一个项目,我需要通过几个变量来最小化函数,比如func(input_parameters, variable_parameters) -> min(variable_parameters)

我使用来自SciPy 的优化函数,因此最小化过程是一个灰色框:我可以在GitHub 上看到代码并阅读有关使用的算法,但我想这没关系,旨在测试我自己的项目。 不过,在这个问题中,特定的库应该无关紧要。

目前我使用几种方法:

  • 创建简单示例并手动查找全局/局部最小值并创建执行优化的测试并将其解决方案与正确的解决方案进行比较
  • 如果方法需要梯度,请将解析计算的梯度与测试中的数值近似值进行比较
  • 对于基于 SciPy 提供的迭代算法,请检查函数值序列在测试中是否单调不递增

有没有关于数学优化程序测试的书或文章?

P。 S. 我不是在谈论Test functions for optimization ,我是在询问用于测试优化过程以更快地发现错误的方法。

【问题讨论】:

  • 一个很好的问题。多年来我一直在为此苦苦挣扎;你所描述的几乎就是我过去所做的,我很想听听其他建议。

标签: unit-testing testing optimization mathematical-optimization


【解决方案1】:

我发现hypothesis 库对于测试开发中的优化算法非常有用。

您可以将其设置为根据某些规范生成随机测试用例(函数、线性程序等)。这个想法是你将这些传递给你的算法并测试已知的不变量。例如,您可以让它在您的算法中抛出随机问题或子问题并检查(例如):

  • 梯度下降法产生一系列不递增的目标
  • 本地搜索找到没有更好邻居的解决方案
  • 启发式方法保持可行性

有一个有用的 PyCon talk here 解释了基于属性的测试的想法。它更侧重于测试 API 而不是算法,但我认为这些想法是转移的。在我编写新算法时,我发现这种方法可以很好地发现意外行为的情况。

【讨论】:

    最近更新 更多