unit-testing - 如何为数学优化程序编写测试?

标签 unit-testing testing optimization mathematical-optimization

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

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

目前我使用的方法很少:

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

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

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

最佳答案

我找到了 hypothesis库对于在开发中测试优化算法非常有用。

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

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

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

关于unit-testing - 如何为数学优化程序编写测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47420792/

相关文章:

java - JUnit,比较对象

unit-testing - 单元测试私有(private)方法似乎使整个解决方案更容易

optimization - SQLite 查询优化(子查询和连接)

c# - Linq 单次调用缓慢

java - 如何在 Play Framework 中声明第二个数据库进行测试?

java - 如何为 Java 8 谓词编写 Mockito 测试

Python 如何在导入包时模拟 ImportError

python - curve_fit 和 scipy.odr 的比较 - 绝对西格玛

C# 数据源 CSV 单元测试 - 找不到第一列

java - 是否可以在 Jmeter 中验证下载的文件?