2

ILNumerics を採用して、独自の機械学習パッケージのコーディングを開始しています。

私は間違いなくニューラルネット、SVM、カーネルメソッドに取り掛かり、その後、よりベイジアンなフレームワークに移行し始めます.

ILNumerics がすでにいくつかの「機械学習ツールボックス」を提供していることは知っていますが、一部の機能が (まだ?) 存在しないため、貢献を追加して独自のアルゴリズムをコーディングしたいと考えています。

まず、よく理解できれば、今のところ最適化パッケージは含まれていません。私が間違っていることを願っています。そうでない場合は、ILNumerics を使用して実装する方法についての提案をいただければ幸いです。これは単に、既存のコードを混在させるとパフォーマンスに影響するのでしょうか? ILArray と他のベクトル/マトリックスを混在させることは賢明ですか? クイック ガイドに記載されている推奨事項を順守するだけで、優れたパフォーマンスを活用できますか?

または、必要に応じて、ビルド済みの利用可能な最適化パッケージ/ライブラリを ILNumerics と組み合わせて使用​​することをお勧めしますか?

いつものようにヒント/アドバイス、推奨事項をありがとう、

GL

4

2 に答える 2

2

あなたはすべての点で正しいです。現在、ILNumerics で利用できる最適化パッケージはありません。ただし、ご存知のように、.NET の大きな利点の 1 つは、外部パッケージを簡単に組み込むことができることです。ここにはいくつかのオプションがあります。

PInvoke (ネイティブ モジュール)

ほとんどの既存の最適化パッケージはネイティブ モジュールとして存在するため、PInvoke はあなたの味方です。自動 DLLImport 署名生成用のツールがいくつかあります。個人的には、これらの署名を手動で作成することを好みます。特に、ほとんどの科学パッケージは単純な署名を公開しているため、.NET に非常に簡単に組み込むことができます。ただし、ネイティブ コードからマネージ コードへのコールバックや、複雑な構造体のマーシャリングでは問題が発生する可能性があります。(だから、私たちはあなたがそれらすべてを解決するのを手伝います...

.NET モジュール

既存の .NET 最適化モジュールが見つかる場合があります。この投稿 ( C# の無料最適化ライブラリ) を参照するか、Microsoft Solver Foundation を試してください。より良いモジュールが既に存在する可能性があります - 私はしばらく探していませんでした。実装が非常に慎重に行われない限り、メモリ管理が不十分な (なし) ためにパフォーマンスが低下する場合と、影響を受けない場合があります。(私の知る限り、ILNumerics ほど効率的にメモリを追跡するプロジェクトは他にありませんか?)。ただし、これらのライブラリとのインターフェイスは簡単です。DLLImport 署名は必要ありません。しかし、ILNumerics メモリ管理から利益を得るには、「ILNumerics」側で配列メモリを管理する必要があります。したがって、System.Array を他の .NET 関数に渡すパターンは次のようになります。

 .... inside ILNumerics function
 using (ILScope.Enter(inparameter1,inparameter2)) {
    ....
    ILArray<double> A = zeros(1000,1000);  // allocate memory for external use
    var aArray = A.GetArrayForWrite();     // fetch reference to underlying System.Array  
    callOtherLib(aArray);                  // let other lib use and fill the array
    // proceed normally with A... 
    return A + 1 * 2 ... ; 
 }

他のライブラリが指定された配列のみから読み取っている場合、A.GetArrayForRead() を使用するとパフォーマンスが向上する可能性があります。そのスキームを使用することで、少なくとも実装の ILNumerics 側で、最も効率的なメモリ使用が保証されます。

両側のデータ構造を混在させても害はありませんが、通常はあまり利点もありません。混合行列の実装には結合演算子がないため、便利な構文が失われることがよくあります。また、パフォーマンスの低いソリューションにつながる可能性のある要素ごとの操作への行列アクセスを分解することを余儀なくされることがよくあります。したがって、API を明確に分離したモジュール設計をお勧めします。

上記のメモリ スキームは、ネイティブ ライブラリとのインターフェイスにも適用できます (推奨されます)。

ILNumerics のみを使用する

もちろん、もう 1 つの方法は、ILNumerics の組み込み関数と配列機能を使用して、一部のモジュールを独自に再実装することです。パッケージが公式の ILNumerics ディストリビューションに組み込まれるためには、この方法が必須です。これにはいくつかの利点があります。便利な ILNumerics 構文を利用でき、効率的な ILNumerics メモリ管理から自動的に利益を得ることができ、最終的にコードは完全にプラットフォームに依存しなくなります。また、これにより、アルゴリズムに必要な機能に関して最も柔軟になります。

于 2013-08-27T07:57:58.847 に答える