1

tl;dr:

特定のオブジェクトの変数を列挙するための最適なパターンと、これらの変数が取る可能性のある範囲を探しています。次に、特定の変数設定に基づいてオブジェクトを構成したいと考えています。

長いバージョン:

過去に作成したいくつかの醜いハックをクリーンアップしようとして、古いコードを調べています。私は素晴らしい機械学習とデータマイニングのライブラリを持っています。このライブラリにはさまざまな統計モデル (およびその他のコンポーネント) があり、十分なデータが与えられた場合 (トレーニングと呼ばれます)、数学的最適化を通じて独自のパラメーターの多くを学習できます。ただし、入力の 1 つとしてトレーニングの前に設定される他のパラメーター (ハイパーパラメーター) があります。ハイパーパラメータは、多くの有効な設定を選択し、それぞれのモデルを構築し、勝者を選択することで「調整」できます。このプロセスで再帰を使用して、いくつかのハイパーパラメータを調整できます。

問題:

ハイパーパラメーター (より一般的にはオプション) を適切に処理するための効果的なシステムに必要なコンポーネントは次のように思われます。

  1. すべての異なるタイプ (enum、float、boolean など) のすべての異なるオプション、有効な値の範囲などを列挙する静的変数。これらは、各オプションのデフォルト値を格納することもできます。
  2. 構成を取り、このオプション設定でオブジェクトを構築するコンストラクター。
  3. あると便利: たとえば、.properties、gnu cli、または yaml から「構成」を作成する機能。

私が直面している問題:

ここでの主な問題の 1 つは 1) のようです。Javaには、静的抽象変数をサポートするための実際のメカニズムがありません。これにより、「構成可能」インターフェースを実装する特定のクラスが独自のデフォルト構成実装を格納することを強制できなくなります。これを回避する良い方法はありますか?

親のデフォルト構成は、サブクラスに渡される必要があります。

構成オブジェクトを受け取るコンストラクターを作成できますが、これを拡張して、この構成の明示 (cli、yaml、.properties) も受け取るようにするのは少し面倒です。

stackoverflow が提供できるこの問題への取り組みについてアドバイスをいただければ幸いです。私はこれについてしばらく考えていましたが、現時点では美しいコードではなく、醜いハックしかありません。

4

1 に答える 1

2

データマイニングフレームワークELKIがこれをどのように解決するかを確認することをお勧めします。パラメータ化に関するwikiページから判断すると、彼らは2、3回の反復を経てきました。現在のバージョンはプレーンJavaコンストラクターを使用しているようですが、パラメーター化を処理する静的なパブリック内部クラスです。

最適化された実装を返すなど、多くの興味深いことを実行できます(たとえば、p = 2でLp-Normを使用すると、ユークリッド距離の静的インスタンスが返されます)。さらに、最初のパラメーター化エラーで例外をスローすることはありませんが、1回の構成パスで複数のエラーを報告できます。

彼らが持っているMiniGUIUIには、コンテンツアシスト(実装や列挙値のドロップダウンなど)、ツールチップなどがあり、コマンドラインインターフェイスもあります。また、範囲の制約や使用可能な実装など、有効なパラメーター情報も一覧表示されます。

局所最適を見つけるためにパラメータを自動的に変更するツールもあるかどうかはわかりません。少なくとも、これらの方針に沿ったいくつかの計画が発表されたのを見たと思います。

于 2012-04-11T18:49:20.783 に答える