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