1

tl;博士:

我正在寻找枚举特定对象的变量的最佳模式,以及这些变量可能采用的范围。然后我想根据特定的变量设置配置对象。

长版:

我正在浏览一些旧代码,试图清理我过去制作的一些丑陋的黑客行为。我有一个不错的机器学习和数据挖掘库。在这个库中有各种统计模型(和其他组件),可以通过给定足够数据(称为训练)的数学优化来学习它们自己的许多参数。但是,还有其他参数(超参数)在训练之前设置为输入之一。可以通过选择许多有效设置、为每个设置构建模型并选择获胜者来“调整”超参数。可以在此过程中使用递归来调整几个超参数。

问题:

在我看来,优雅地处理超参数(更一般地,选项)的有效系统所需的组件是:

  1. 一个静态变量,枚举所有不同类型的所有不同选项(枚举、浮点数、布尔值等)、有效值范围等。这些还可以存储每个选项的默认值。
  2. 一个构造函数,它接受配置并使用此选项设置构建对象。
  3. 很高兴拥有:例如,能够从 .properties、gnu cli 或 yaml 进行“配置”。

我遇到的困难:

这里的主要困难之一似乎是1)。Java 没有任何真正的机制来支持静态抽象变量,以防止强制实现“可配置”接口的给定类存储它们自己的默认配置实现。有没有解决这个问题的好方法?

父类的默认配置应传递给子类。

我可以创建一个采用配置对象的构造函数,但是将其扩展为也采用此配置的(cli、yaml、.properties)表现形式有点棘手。

我很想有任何关于解决 stackoverflow 可以提供的问题的建议。我一直在考虑这个问题,目前我所拥有的只是丑陋的黑客,而不是漂亮的代码。

4

1 回答 1

2

You might want to have a look at how the data mining framework ELKI solves this. Judging from their wiki page on parameterization, they've gone through a couple of iterations. The current version seems to use plain java constructors, but a static public inner class that handles the parameterization stuff.

It can do a number of interesting things, such as returning an optimized implementation (e.g. when you use Lp-Norm with p=2, it will return the static instance of Euclidean distance). Plus, it won't throw an exception on the first parameterization error, but can report multiple errors in one configuration pass.

The MiniGUI UI they have has content assist (e.g. a dropdown of implementations or enum values), tooltips etc., and there also is a command line interface. It will also list valid parameter information, such as range constraints or available implementations.

I don't know if they also have a tool to automatically vary the parameters to find a local optimum. I think I at least saw some plans along these lines announced.

于 2012-04-11T18:49:20.783 回答