web-dev-qa-db-ja.com

OCamlまたはHaskellの機械学習?

Rが遅すぎるため、新しいプロジェクトでHaskellまたはOCamlを使用したいと考えています。サポートベクターマシンを使用できるようにする必要があります。理想的には、各実行を分離して並列に実行します。関数型言語を使用したいのですが、パフォーマンスとエレガンスに関する限り、この2つが最高だと感じています(Clojureは好きですが、短いテストではそれほど速くありませんでした)。私はOCamlに傾いています。なぜなら、他の言語との統合のサポートが強化され、長期的にはより適切になる可能性があるからです(例: OCaml-R )。

HaskellまたはOCamlのいずれかで、この種の分析のための優れたチュートリアル、またはコード例を知っていますか?

62
griffin

Hal Daume は、博士号取得中にいくつかの主要な機械学習アルゴリズムを作成しました。 (現在、彼は助教授であり、機械学習コミュニティの新星です)

彼のWebページには、SVM、単純な決定木、ロジスティック回帰がすべてOCamlにあります。これらのコードを読むことで、OCamlで機械学習モデルがどのように実装されているかを感じることができます。

基本的な機械学習モデルを作成するもう1つの良い例は、OCamlでの科学計算と数値計算の Owlライブラリ です。

OCamlに似た新しい.Net言語であるF#についても言及したいと思います。 ファクタグラフモデル チェスのプレイデータを分析するF#で記述されています。この研究には、NIPSの出版物もあります。

FPは機械学習とデータマイニングモデルの実装に適しています。ただし、ここで最も得られるのはパフォーマンスではありません。FPは並列計算をサポートしていますC#やJavaなどの命令型言語よりも優れていますが、並列SVMまたは決定木を実装することは、言語とはほとんど関係がありません!並列は並列です。これらの洗練されたアルゴリズムを並列化することは、言語レベルではなく、アルゴリズムレベルで非常に難しいタスクです。100SVMを並列で実行する場合、FPが役立ちますしかし、シングルスレッドlibsvmが十分にテストされていないhaskell svmパッケージよりも効率的であることを考慮しないために、C++で100個のlibsvmを並列実行することは困難ではありません。

それでは、F#、OCaml、HaskellなどのFP言語はどうしますか?

  1. コードを簡単にテストできます。 FP言語には通常トップレベルのインタープリターがあり、関数をその場でテストできます。

  2. いくつかの変更可能な状態。つまり、同じパラメーターを関数に渡すと、この関数は常に同じ結果を返すため、FPでのデバッグは簡単です。

  3. コードは簡潔です。型推論、パターンマッチング、クロージャなど。言語部分ではなく、ドメインロジックに重点を置きます。したがって、コードを書くとき、あなたの心は主にプログラミングロジック自体について考えています。

  4. FPでコードを書くのは楽しいです。

52
Yin Zhu

私が見ることができる唯一の問題は、OCamlはマルチコア並列処理を実際にはサポートしていないが、GHCには優れたサポートとパフォーマンスがあることです。複数の呼び出しで複数の実行スレッドを使用する場合、GHC Haskellの方がはるかに簡単です。

第二に、Haskell FFIはOCamlよりも強力です(つまり、より少ないコードでより多くのことを実行します)。また、より多くのライブラリが利用可能です(Hackage経由: http://hackage.haskell.org )外部インターフェイスが決定要因になるとは思わないでください。

23
Don Stewart

多言語統合に関する限り、CとHaskellの組み合わせは非常に簡単で、これは(donsとは違います)いずれかの専門家の。 Cとうまく統合できる他の言語はそれほど複雑ではありません。他に何もない場合は、いつでもCの薄いインターフェイス層にフォー​​ルバックできます。良くも悪くも、Cは依然としてプログラミングのlingua francaであるため、ほとんどの場合、Haskellは許容範囲を超えています。

...だが。パフォーマンスの問題に意欲的で、「関数型言語」を使いたいと言います。このことから、あなたは以前あなたが尋ねる言語に慣れていないと推測します。 Haskellの定義機能の中には、デフォルトで非厳密な評価不変データ構造-を使用するというものがあります。これらは両方とも非常に便利ですが、同時にHaskellのパフォーマンスを最適化することは、多くの場合他の言語とは劇的に異なります。よく練られた本能は、あなたを困惑させるような道に迷わせるかもしれません。 Haskell wikiのパフォーマンス関連のトピック を参照して、問題の感触をつかむことができます。

Haskellでやりたいことを実行できないと言っているわけではありません。確かに実行できます。実際には、遅延と不変性の両方がパフォーマンス上のメリットのために悪用される可能性があります( Chris Okasakiの論文 はいくつかの素晴らしい例を提供します)。ただし、パフォーマンスの処理に関しては、多少の学習曲線があることに注意してください。

HaskellとOCamlはどちらもMLファミリ言語を使用することの利点を提供しますが、ほとんどのプログラマーにとって、OCamlはより穏やかな学習曲線とより良い即時結果を提供する可能性があります。

15
C. A. McCann

これについて決定的な答えを出すのは難しい。 Haskellには、Donが言及した利点に加えて、より強力な型システムとわかりやすい構文があります。 OCamlは、他のほぼすべての言語から来ている場合に学習しやすくなります(これは、Haskellが関数型言語と同じように機能するためです)。また、Haskellの遅延評価により、OCamlコードのパフォーマンス特性がHaskellよりも直感的であることに気付くでしょう。

時間があれば、両方を評価することをお勧めします。関連するHaskellのリソースを次に示します。

ああ、Haskellをさらに詳しく調べる場合は、必ず Haskell Beginners および Haskell Cafe リストにサインアップしてください。コミュニティは友好的で、新規参入者を支援することに熱心です(私の偏見は示していますか?)。

13
Keith

速度が最優先事項の場合は、Cを選択してください。Haskellは非常に優れたパフォーマンスを発揮しますが、Cほど速くなることは決してありません。古くて誰もそれがどのように機能するかを本当に知りません。

パフォーマンスが重要な遺伝的プログラミングライブラリを作成し、Cで関数型スタイルで記述しました。関数型スタイルを使用すると、OMPを使用して簡単に並列化でき、単一プロセス内で最大8コアまで線形にスケーリングできます。 Haskellは並行性と並列性に関して常に改善していますが、OCamlでそれを行うことはできません。

Cを使用した場合の欠点は、最終的にすべてのバグを見つけてコアダンプを停止するのに数か月かかったということでした。これは同時実行性のために非常に困難でした。 Haskellは、おそらく最初のコンパイルでこれらのバグの90%をキャッチしたでしょう。

だから、どんな速度でスピード?振り返ってみると、Haskellを使用して、1か月以上の開発期間で節約できた場合、2〜3倍遅くなるので我慢できたらと思います。

9
Andrew

スレッドレベルでのマルチコア並列処理がHaskellでより適切にサポートされていることはdonsが正しいことですが、プロセスレベルの並列処理(フレーズから:理想的には、実行する各実行を分離する)並行して。)これはOCamlで非常によくサポートされています。キースは、Haskellにはより強力な型システムがあると指摘しましたが、OCamlにはHaskellよりも強力なモジュールシステムがあるとも言えます。

他の人が指摘したように、OCamlの学習曲線はHaskellの学習曲線よりも低くなります。 OCamlの方が生産性が向上します。とはいえ、OCamlの学習はHaskellの学習に向けた大きな足がかりであり、基礎となる概念の多くは非常に似ているため、後でHaskellにいつでも移行して、そこで多くのことを知ることができます。そして、あなたが指摘したように、OCaml-Rブリッジがあります。

8
aneccodeal

機械学習におけるHaskellとOcamlの例として、 Hal Daume および Lloyd Allison のホームページをご覧ください。 IMOは、HaskellよりもOcamlでC++のようなパフォーマンスを達成する方がはるかに簡単です。既に述べたように、Haskellのコミュニティ(パッケージ、ツール、およびサポート)、構文と機能(FFI、型クラスを介した確率モナド)、および並列プログラミングのサポートは、はるかに優れています。

6
Cfr

OCaml-Rを改良して、OCamlとRを統合することについていくつかコメントがあります。OCamlを使用してRコードを呼び出すことは価値があるかもしれませんが、動作しますが、まだ簡単ではありません。したがって、Rのパイロットに使用する価値はあります。 Rの型システムとデータをシームレスにOCamlにエクスポートするためにやらなければならないことが多くあるため、R機能をより完全に統合することは依然として面倒です(やらなければなりません)。さらに、RのGCとOCamlのGCの相互作用は微妙なポイントです:O(n ^ 2)時間でn個の値を解放しますが、これはニースではありません(この点を解決するには、より柔軟なR APIが必要です私が理解したように、またはGC間の適切な相互作用のための大きなR配列としてバインディング自体にGCを実装します)。

簡単に言えば、「OCamlからのパイロットR」アプローチに行きます。

GCインタラクションレイヤーおよびRデータ型のOCamlへのマッピングに関する貢献を歓迎します。

6
yziquel

あなたはこれを見てみたいかもしれません: http://www.haskell.org/pipermail/haskell-cafe/2010-May/077243.html

2

遅い答えですが、Haskellの機械学習ライブラリはここから入手できます: https://github.com/mikeizbicki/HLearn

このライブラリは、通常の実装よりもはるかに高速な相互検証を持つように設計されたさまざまなMLアルゴリズムを実装します。次の論文に基づいています 代数分類器:高速な相互検証、オンライントレーニング、および並列トレーニングへの一般的なアプローチ 。著者は、Wekaでの同じタスクと比較して400倍のスピードアップを主張しています。

1
RUser4512