我希望在一个新项目中使用Haskell或OCaml,因为R太慢了.我需要能够使用支持vectory机器,理想情况下将每个执行分开并行运行.我想使用一种函数式语言,我觉得这两者在性能和优雅方面都是最好的(我喜欢Clojure,但它在短期测试中并不那么快).我倾向于OCaml,因为似乎有更多支持与其他语言的集成,所以从长远来看它可能更适合(例如OCaml-R).
有没有人知道在Haskell或OCaml中进行这种分析或代码示例的好教程?
Hal Daume在博士期间撰写了几种主要的机器学习算法.(现在他是机器学习社区的助理教授和后起之秀)
在他的网页上,OCaml中有一个SVM,一个简单的决策树和一个逻辑回归.通过阅读这些代码,您可以了解如何在OCaml中实现机器学习模型.
编写基本机器学习模型的另一个好例子是用于OCaml中科学和数值计算的Owl库.
我还想提一下类似于OCaml的新的.Net语言F#.这是用F#分析国际象棋游戏数据编写的因子图模型.该研究还有一份NIPS出版物.
而FP适用于实现机器学习和数据挖掘模型.但你最能得到的不是表现.FP比支持性语言(如C#或Java)更好地支持并行计算是正确的.但实现并行SVM或决策树与语言关系不大!并行是平行的.机器学习和数据挖掘背后的数值优化通常是必不可少的,在功能上编写它们通常很难并且效率较低.使这些复杂的算法并行是算法级别的一项非常艰巨的任务,而不是语言级别.如果你想并行运行100个SVM,FP在这里有帮助.但是我没有看到在C++中运行100 libsvm parallel的困难,更不用说单线程libsvm比没有经过良好测试的haskell svm包更有效.
那么FP语言,如F#,OCaml,Haskell,给了什么?
易于测试您的代码.FP语言通常有一个顶级解释器,您可以动态测试您的功能.
几个可变状态.这意味着将相同的参数传递给函数,此函数始终给出相同的结果,因此FP中的调试很容易.
代码简洁明了.类型推断,模式匹配,闭包等.您更多地关注域逻辑,而不是语言部分.所以当你编写代码时,你的思想主要是考虑编程逻辑本身.
在FP中编写代码很有趣.
我能看到的唯一问题是OCaml并不真正支持多核并行,而GHC具有出色的支持和性能.如果您希望在多个调用中使用多个执行线程,GHC Haskell将变得更加容易.
其次,Haskell FFI比OCaml更强大(也就是说,它用更少的代码执行更多功能),并且可以使用更多的库(通过Hackage:http://hackage.haskell.org ),所以我不认为外部接口会是一个决定性因素.
就多语言集成而言,将C和Haskell结合起来非常容易,我说这是一个(不像dons)并不是真正的专家.与C完全整合的任何其他语言都不应该太复杂; 如果没有其他的话,你总是可以回到C中的瘦界面层.无论好坏,C仍然是编程的通用语言,因此Haskell在大多数情况下都是可接受的.
...但.你说你受到性能问题的激励,并且想要使用"一种功能语言".由此我推断你以前不熟悉你所询问的语言.在Haskell的定义特性中,默认情况下,它使用非严格的评估和不可变数据结构 -它们在许多方面都非常有用,但它也意味着优化Haskell的性能通常与其他语言有很大不同,并且很好 - 本能的暗示可能会让你误入歧途.您可能希望在Haskell维基上浏览与性能相关的主题,以了解问题.
这并不是说你不能在Haskell中做你想做的事 - 你当然可以.实际上,懒惰和不变性都可以被利用来获得性能优势(Chris Okasaki的论文提供了一些很好的例子).但请注意,在处理性能时会有一些学习曲线.
Haskell和OCaml都提供了使用ML系列语言的可爱好处,但对于大多数程序员来说,OCaml可能会提供更温和的学习曲线和更好的即时结果.
很难对此给出明确的答案.Haskell具有Don提到的优点,同时具有更强大的类型系统和更清晰的语法.如果你来自几乎任何其他语言,OCaml将更容易学习(这是因为Haskell与函数式语言一样起作用),并且使用可变随机访问结构在Haskell中可能有点笨拙.由于Haskell的懒惰评估,您还可能会发现OCaml代码的性能特征比Haskell更直观.
真的,如果你有时间,我建议你评价两者.以下是一些相关的Haskell资源:
http://hackage.haskell.org/package/hslibsvm
http://hackage.haskell.org/package/HSvm
真实世界Haskell:这是一本适用于Haskell的免费书籍
向您学习Haskell:本教程非常有趣
哦,如果你进一步了解Haskell,请务必注册Haskell Beginners和Haskell Cafe列表.社区很友好,渴望帮助新移民(我的偏见是什么?).
如果速度是你最关心的问题,那么请选择C. Haskell是非常好的表现,但你永远不会像C一样快.据我所知,在基准测试中唯一能胜过C的功能语言是斯大林计划,但这非常老了,没有人真的知道它是如何工作的.
我编写了基因编程库,其中性能是关键,我在C中以函数式编写它.功能样式允许我使用OMP轻松地将其并行化,并且它在单个进程内线性扩展到8个内核.你肯定不能在OCaml中做到这一点,尽管Haskell在并发性和并行性方面一直在不断改进.
使用C的缺点是我花了几个月才找到所有的bug并停止核心转储,这是因为并发性而极具挑战性.在第一次编译时,Haskell可能已经捕获了90%的错误.
那么速度不惜一切代价?回想起我希望我使用Haskell,因为如果我在开发时间保存了一个多月,我可以忍受它慢2-3倍.
虽然dons是正确的,在Haskell中更好地支持线程级别的多核并行性,但听起来你可以使用进程级并行(从你的短语:理想地将每个执行分离出来并行运行.)这在OCaml中得到了很好的支持. .Keith指出Haskell有一个更强大的类型系统,但也可以说OCaml拥有比Haskell更强大的模块系统.
正如其他人所指出的那样,OCaml的学习曲线将低于Haskell的学习曲线; 在OCaml中你可能会更快地提高工作效率.也就是说,学习OCaml是学习Haskell的一个很好的踏脚石,因为许多底层概念非常相似,所以你可以随后迁移到Haskell并找到很多熟悉的东西.正如您所指出的,有一个OCaml-R桥.
作为Haskell和Ocaml在机器学习中的一个例子,请参阅Hal Daume和Lloyd Allison主页上的内容.IMO在Ocaml中实现C++的性能要比在Haskell中更直接.通过,如前所述,Haskell有更好的社区(包,工具和支持),语法和功能(即FFI,通过类型类的概率monad)和并行编程支持.
有修补的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的贡献是最受欢迎的.