tl;博士:
我正在寻找枚举特定对象的变量的最佳模式,以及这些变量可能采用的范围。然后我想根据特定的变量设置配置对象。
长版本:
我正在检查一些旧代码,试图清理我过去所做的一些丑陋的黑客行为。我有一个很好的机器学习和数据挖掘库。该库中有各种统计模型(和其他组件),可以通过给定足够数据(称为训练)的数学优化来学习许多自己的参数。然而,还有其他参数(超参数)在训练之前设置为输入之一。可以通过选择许多有效设置、为每个设置构建模型并选择获胜者来“调整”超参数。在此过程中可以使用递归来调整几个超参数。
问题:
在我看来,优雅地处理超参数(更一般地说,选项)的有效系统所需的组件是:
- 一个静态变量,枚举所有不同的选项 不同类型(枚举、 float 、 boolean 值等)、有效值范围、 等等。它们还可以存储每个选项的默认值。
- 一个构造函数,它接受配置并使用此选项设置构建对象。
- 优点:例如,能够从 .properties、gnu cli 或 yaml 进行“配置”。
我遇到的困难:
这里的主要困难之一似乎是 1)。 Java 没有任何支持静态抽象变量的真正机制,无法强制实现“可配置”接口(interface)的给定类存储其自己的默认配置实现。有没有好的方法来解决这个问题?
父类的默认配置应该传递给子类。
我可以创建一个采用配置对象的构造函数,但将其扩展为也采用此配置的(cli、yaml、.properties)表现形式有点棘手。
我很想得到 stackoverflow 可以提供的关于解决这个问题的任何建议。我已经思考这个问题有一段时间了,目前我所拥有的只是丑陋的黑客,而不是漂亮的代码。
最佳答案
您可能想看看数据挖掘框架 ELKI 是如何工作的解决了这个问题。 从他们的维基页面 parameterization 来看,他们已经经历了几次迭代。当前版本似乎使用普通的 java 构造函数,但是处理参数化内容的静态公共(public)内部类。
它可以做许多有趣的事情,例如返回优化的实现(例如,当您使用 p=2 的 Lp-Norm 时,它将返回欧几里得距离的静态实例)。另外,它不会在第一个参数化错误时引发异常,但可以在一次配置传递中报告多个错误。
他们拥有的 MiniGUI UI 具有内容辅助(例如实现或枚举值的下拉列表)、工具提示等,并且还有一个命令行界面。它还会列出有效的参数信息,例如范围限制或可用的实现。
我不知道他们是否也有一个工具可以自动改变参数以找到局部最优值。我想我至少看到了一些类似的计划的公布。
关于用于在数据挖掘系统中配置模型的 Java 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10110402/