机器学习OCaml或Haskell?

我希望在新项目上使用Haskell或OCaml,因为R太慢了。 我需要能够使用支持vector机器,理想地分离出每个执行并行运行。 我想用一种function性的语言,我觉得就性能和优雅而言,这两者是最好的(我喜欢Clojure,但是在短期testing中速度并不快)。 我倾向于OCaml,因为似乎有更多的支持与其他语言的集成,所以它可能是一个更好的长期合适的(例如OCaml-R )。

有没有人知道这种分析的好教程,或在Haskell或OCaml的代码示例?

Hal Daume博士在博士期间撰写了几种主要的机器学习algorithm。 (现在他是机器学习社区的助理教授和后起之秀)

在他的网页上,OCaml中有一个SVM,一个简单的决策树和一个逻辑回归。 通过阅读这些代码,您可以感受到如何在OCaml中实现机器学习模型。

我还想提到F#,一种类似于OCaml的新的.Net语言。 这是一个用F#编写的分析国际象棋游戏数据的因子图模型 。 这项研究也有一个NIPS出版物。

FP适用于实现机器学习和数据挖掘模型。 但是,你最能得到的是不是performance。 FP支持并行计算比C#或Java等命令式语言更好。 但是实施并行SVM或决策树与语言的关系很小! 平行是平行的。 机器学习和数据挖掘背后的数字优化通常是必不可less的,纯function性写入通常是困难的,效率较低。 使这些复杂的algorithm并行在algorithm级别上是非常艰巨的任务,而不是在语言级别上。 如果你想并行运行100个SVM,FP在这里帮助。 但我没有看到在C ++中运行100个libsvm并行的困难,不考虑单线程libsvm比没有经过良好testing的haskell svm包更有效。

然后,像F#,OCaml,Haskell这样的FP语言能提供什么?

  1. 很容易testing你的代码。 FP语言通常有一个顶级的解释器,你可以在飞行中testing你的function。

  2. 很less有可变的状态。 这意味着将相同的parameter passing给一个函数,这个函数总是给出相同的结果,因此在FP中debugging很容易。

  3. 代码简洁。 types推理,模式匹配,闭包等。您更多地关注领域逻辑,更less关注语言部分。 所以当你编写代码的时候,你的头脑主要是想着编程逻辑本身。

  4. 在FP中编写代码很有趣。

我能看到的唯一问题是OCaml并不真正支持多核并行性,而GHC有很好的支持和性能。 如果你打算使用multithreading的执行,多次调用,GHC Haskell将会更容易。

其次,Haskell FFI比OCaml更强大(即代码更less),更多的库可用(通过Hackage: http ://hackage.haskell.org),所以我不认为外部接口将会是一个决定性的因素。

就多语言整合而言,把C和Haskell结合起来非常容易,我把它说成是一个不像Dons那样的专家。 任何与C很好融合的语言都不会太棘手。 如果没有其他的东西,你总是可以回到C中的一个简单的界面层。 不pipe怎样,C仍然是编程的通用语 ,所以Haskell在大多数情况下都是可以接受的。

…但。 你说你是出于性能问题的动机,并希望使用“function语言”。 从这我推断你以前不熟悉你问的语言。 在Haskell的定义特性中,默认情况下,它使用非严格的评估不可变的数据结构 –这在许多方面都是非常有用的,但这也意味着优化Haskell的性能往往与其他语言有很大的不同,本能的本能可能会让你迷惑不解。 您可能想浏览Haskell wiki上与性能相关的主题,以了解这些问题。

这并不是说你不能在Haskell中做你想做的事 – 你当然可以。 实际上懒惰和不可变性都可以被利用来获得性能好处( Chris Okasaki的论文提供了一些很好的例子)。 但是请注意,在处理性能方面会有一些学习曲线。

Haskell和OCaml都提供了使用ML系列语言的好处,但对于大多数程序员来说,OCaml可能会提供更温和的学习曲线和更好的立即结果。

这很难给出明确的答案。 Haskell具有Don提到的优点,具有更强大的types系统和更清晰的语法。 如果你来自几乎任何其他语言(这是因为Haskell的function与函数式语言的function相同),OCaml将更容易学习,并且在Haskell中使用可变随机访问结构可能会有点笨拙。 由于Haskell的懒惰评估,你也可能会发现你的OCaml代码的性能特征比Haskell更直观。

真的,如果你有时间,我会build议你评估一下。 这里有一些相关的Haskell资源:

呵呵,如果你进一步研究Haskell,一定要注册Haskell Beginners和Haskell Cafe列表。 这个社区是友好的,渴望帮助新来者(我的偏见是什么?)。

如果速度是你最关心的问题,那么selectC.哈斯克尔是非常好的performance,但是你永远不会像C那样快。据我所知,把C作为基准的唯一函数式语言是斯大林模式,老,没有人知道它是如何工作的。

我已经编写了遗传编程库,其中性能是关键,我用C编写了一个函数式风格。函数式让我可以使用OMP轻松地对其进行并行化处理,并在一个进程内线性扩展到8个内核。 在OCaml中,你当然不能这么做,尽pipeHaskell在并发性和并行性方面一直在提高。

使用C的缺点是花了我好几个月才终于find所有的错误,并停止核心转储,因为并发性,这是非常具有挑战性的。 在第一次编译时,Haskell可能会抓住这些错误的90%。

那么速度不惜一切代价? 回想一下,如果我在开发时间内保存了一个多月,我希望能够使用Haskell,因为我能忍受它的速度要慢2到3倍。

尽pipe在线程级别的多核并行机制在Haskell中得到更好的支持是正确的,但听起来好像你可以忍受进程级别的并行性(从你的短语中: 理想地分离出每个执行并行运行 ),这在OCaml中得到很好的支持。 Keith指出,Haskell具有更强大的types系统,但也可以说OCaml具有比Haskell更强大的模块系统。

正如其他人所指出的,OCaml的学习曲线将比Haskell的低; 你可能会在OCaml中更快速地提高生产力。 也就是说,学习OCaml是学习Haskell的一个很好的垫脚石,因为许多底层概念非常相似,所以你以后可以随时迁移到Haskell,并find很多熟悉的东西。 正如你所指出的那样,有一个OCaml-R桥梁。

作为Haskell和Ocaml机器学习的例子,请参阅Hal Daume和Lloyd Allison主页上的内容。 国际海事组织(IMO)在Ocaml中实现类似C ++的性能比在Haskell中更直接。 如前所述,Haskell具有更好的社区(包,工具和支持),语法和function(即FFI,通过types类的概率monads)和并行编程支持。

在对OCaml-R进行了改进之后,我对OCaml和R进行了集成方面的一些评论。使用OCaml来调用R代码可能是值得的,它可以工作,但还不完全简单。 所以用它来引导R是值得的。 将Rfunction更彻底地集成仍然很麻烦,例如,要以无缝的方式将Rtypes的系统和数据导出到OCaml,还有许多工作要做。 而且,R的GC和OCaml的GC的交互是一个敏感点:你在O(n ^ 2)时间内释放n个值,这是不好的(要解决这个问题,你需要一个更灵活的R API,到目前为止据我所知,或者在绑定本身作为一个大的Rarrays来实现GC之间的适当交互作用的GC)。

简而言之,我会为“OCaml的试点R”做准备。

GC交互层和将R数据types映射到OCaml的贡献是最受欢迎的。

你可能想看看这个: http : //www.haskell.org/pipermail/haskell-cafe/2010-May/077243.html

迟到的答案,但在Haskell机器学习库可在这里: https : //github.com/mikeizbicki/HLearn

这个库实现了各种MLalgorithm,它们被devise成比通常的实现具有更快的交叉validation。 它基于以下代数分类器:一种快速交叉validation,在线培训和并行培训的通用方法 。 作者声称与Weka中的相同任务相比,速度提高了400倍。