在OCaml或Haskell中进行机器学习?

时间:2010-02-15 21:04:30

标签: haskell machine-learning ocaml

我希望在新项目中使用Haskell或OCaml,因为R太慢了。我需要能够使用支持vectory机器,理想情况下将每个执行分开并行运行。我想使用一种函数式语言,我觉得这两者在性能和优雅方面都是最好的(我喜欢Clojure,但它在短期测试中并不那么快)。我倾向于OCaml,因为似乎有更多支持与其他语言的集成,所以从长远来看它可能更适合(例如OCaml-R)。

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

11 个答案:

答案 0 :(得分:52)

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

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

编写基本机器学习模型的另一个好例子是Owl library,用于OCaml中的科学和数值计算。

我还想提一下类似于OCaml的新的.Net语言F#。这里是用{F}编写的分析国际象棋游戏数据的a factor graph model。该研究还有一份NIPS出版物。

虽然FP适用于实现机器学习和数据挖掘模型。但你最能得到的不是表现。 FP比支持性语言(如C#或Java)更好地支持并行计算是正确的。但实现并行SVM或决策树与语言关系不大!并行是平行的。机器学习和数据挖掘背后的数值优化通常是必不可少的,在功能上编写它们通常很难并且效率较低。使这些复杂的算法并行是算法级别的一项非常艰巨的任务,而不是语言级别。如果你想并行运行100个SVM,FP在这里有帮助。但是我没有看到在C ++中运行100 libsvm parallel的困难,更不用说单线程libsvm比没有经过良好测试的haskell svm包更有效。

那么FP语言,如F#,OCaml,Haskell,给出了什么?

  1. 轻松测试您的代码。 FP语言通常有一个顶级解释器,您可以动态测试您的功能。

  2. 很少有可变状态。这意味着将相同的参数传递给函数,此函数总是给出相同的结果,因此在FP中调试很容易。

  3. 代码简洁明了。类型推断,模式匹配,闭包等。您更多地关注域逻辑,而不是语言部分。所以当你编写代码时,你的思想主要是考虑编程逻辑本身。

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

答案 1 :(得分:22)

我能看到的唯一问题是OCaml并不真正支持多核并行,而GHC具有出色的支持和性能。如果你想在多次调用中使用多个执行线程,GHC Haskell会更容易。

其次,Haskell FFI比OCaml更强大(也就是说,它用更少的代码完成更多),并且可以使用更多的库(通过Hackage:http://hackage.haskell.org)所以我不认为外部接口会是决定因素。

答案 2 :(得分:15)

就多语言集成而言,将C和Haskell结合起来非常简单,我说这是一个(不像 dons )并不是真正的专家。与C完全整合的任何其他语言都不应该太复杂;如果没有其他的话,你总是可以回到C中的瘦界面层。无论好坏,C仍然是编程的通用语言,所以Haskell在大多数情况下都是可以接受的。

...但是。你说你受到性能问题的激励,并且想要使用“一种功能语言”。由此我推断你以前不熟悉你所询问的语言。在Haskell的定义功能中,它默认使用非严格评估不可变数据结构 - 它们在很多方面都非常有用,但它也意味着优化Haskell的性能通常与其他语言截然不同,而且精心打造的本能可能会让你误入歧途。您可能需要浏览performance-related topics on the Haskell wiki以了解问题。

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

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

答案 3 :(得分:13)

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

真的,如果你有空的话,我建议你评价两者。以下是一些相关的Haskell资源:

哦,如果你进一步了解Haskell,请务必注册Haskell BeginnersHaskell Cafe列表。社区很友好,渴望帮助新人(我的偏见是什么?)。

答案 4 :(得分:9)

如果速度是你最关心的问题,那么请选择C. Haskell是非常好的表现,但你永远不会像C一样快。据我所知,在基准测试中唯一能胜过C的功能语言是Stalin Scheme但是这是非常古老的,没有人真正知道它是如何运作的。

我编写了基因编程库,其中性能是关键,我在C中以函数式编写它。功能样式允许我使用OMP轻松地将其并行化,并且它在单个进程中线性扩展到8个内核。你肯定不能在OCaml中做到这一点,尽管Haskell在并发性和并行性方面一直在不断改进。

使用C的缺点是,我花了几个月的时间才最终找到所有错误并停止核心转储,这是因为并发性而极具挑战性。在第一次编译时,Haskell可能已经捕获了90%的错误。

所以速度不惜一切代价?回想起我希望我使用Haskell,因为如果我在开发时间保存了一个多月,我可以忍受它慢2-3倍。

答案 5 :(得分:8)

虽然在Haskell中更好地支持线程级的多核并行性是正确的,但听起来你可以使用进程级并行性(从你的短语:理想地分离每次执行并行运行。)在OCaml中得到了很好的支持。 Keith指出Haskell有一个更强大的类型系统,但也可以说OCaml拥有比Haskell更强大的模块系统。

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

答案 6 :(得分:6)

作为机器学习中Haskell和Ocaml的示例,请参阅Hal DaumeLloyd Allison主页上的内容。 IMO在Ocaml中实现C ++的性能要比在Haskell中更直接。通过,如前所述,Haskell有更好的社区(包,工具和支持),语法和功能(即FFI,通过类型类的概率monad)和并行编程支持。

答案 7 :(得分:6)

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

简而言之,我会选择“OCaml的飞行员R”方法。

非常欢迎GC交互层和将R数据类型映射到OCaml的贡献。

答案 8 :(得分:2)

答案 9 :(得分:1)

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

该库实现了各种ML算法,这些算法旨在比通常的实现具有更快的交叉验证。它基于以下论文Algebraic classifiers: a generic approach to fast cross-validation, online training, and parallel training。与Weka中的相同任务相比,作者声称加速了400倍。

答案 10 :(得分:1)

对于haskell,请考虑检查hasktorch(我设法将其用于AI论文)。对于ocaml,似乎有tensorflow bindings