私は Clojure 用のcore.matrixの最初の作成者です。ですから、私はこの特定の分野で明確な親和性とより多くの知識を持っています. そうは言っても、私はまだあなたに正直な答えをしようとします:-)
私は 1 年ほど前にあなたと同じ立場で、スケーラブルで柔軟性があり、クラスター化されたクラウド サービスとしての展開に適した数値計算のソリューションを探していました。
次の理由から、Clojure を使用することになりました。
- 関数型プログラミング: Clojure は本質的に関数型プログラミング言語であり、他のほとんどの言語よりも優れています (ただし、Haskell ほどではありませんが....)。怠惰な無限シーケンス、永続的なデータ構造、全体にわたる不変性など。大規模な計算を扱う場合は、優雅なコードになります。
- メタプログラミング: ベクトル/計算式のコード生成を行う必要があることがわかりました。したがって、Lisp であることは大きな利点でした。「言語全体」のマクロ システムを使用してホモイコニック言語でコード生成を行うと、それに近いものを見つけるのは困難です。
- 並行性 - Clojure には、マルチコードの並行性に対する印象的で動きのあるアプローチがあります。まだ見ていない場合は、以下をご覧ください: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey
- Interactive REPL : 私が常に感じていたことは、データ作業にとって非常に重要です。コード/データを「ライブ」で操作して、そのプロパティを実際に感じられるようにしたいと考えています。インタラクティブな REPL を使用して動的に型付けされた言語を使用すると、ここで驚くほど機能します。
- JVM ベース: 巨大なライブラリ/ツール エコシステムとランタイム プラットフォームとしての JVM の優れたエンジニアリングにより、実用的な目的に大きな利点があります。
- コミュニティ: Clojure では、特にデータと分析の一般的な領域で多くの革新が行われているのを見てきました。
当時Clojureに欠けていた主なものは、行列演算用の優れたライブラリ/APIでした。Incanterには優れたツールがいくつかありましたが、それらは汎用性やパフォーマンスに優れたものではありませんでした。したがって、私は core.matrix の開発を開始しました。これは、NumPY / SciPY に相当する慣用的な Clojure フレーバーの形になりつつあります。現在はまだ作業中ですが、注意すれば本番環境での使用には十分です。
低レベルの行列サポートに関しては、vectorz-cljも維持しています。これは、Pure Java のまま (つまり、ネイティブ依存関係なし) でありながら、高パフォーマンスのベクトル/行列操作を提供する core.mattrix 実装を提供する試みです。このパフォーマンスに興味がある場合は、以下を参照してください。
Clojure の次に選んだのは Scala でした。私は、Scala のやや成熟度が高く、適切な静的型システムが気に入りました。どちらの言語も JVM ベースであるため、ライブラリ/ツール側は引き分けでした。それを決めたのは、おそらく Lisp の機能でした。