当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在OCaml或Haskell中进行机器学习?》经验,为你挑选了8个好方法。

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

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



1> Yin Zhu..:

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中编写代码很有趣.


@JonHarrop - quicksort的强大之处在于它就位,很难转换为函数式语言.另一方面,Haskell中的"我的第一个mergesort"只与一个"par"平行
"FP更好地支持并行计算".只是在理论上.在实践中,像OCaml和Haskell这样的函数语言对现有的并行编程有一些最差的支持.例如,尝试在这两种语言中编写有效的通用并行快速排序.这是非常困难的(没有充分的理由),你无法与他们获得竞争性的表现.
@JonHarrop这是可能的,但我认为这有点傻.首先,"绝对性能"差异不是正确的度量 - 因为它取决于比较函数和要排序的数据的大小.此外,"我的第一个mergesort"与链表一起使用,这也将为C代码增加巨大的性能成本.像QSort这样的东西很快,但不像非泛型那样快,因为对比较函数的所有动态调用(C++中的std :: sort避免了这个问题,Haskell也有一个特殊的pragma).所以?优化的代码往往更快......
看起来他的所有东西现在都在哈斯克尔?

2> Don Stewart..:

我能看到的唯一问题是OCaml并不真正支持多核并行,而GHC具有出色的支持和性能.如果您希望在多个调用中使用多个执行线程,GHC Haskell将变得更加容易.

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


哇,这里的讽刺是非常厚实的.我真诚地希望Cuoq和Harrop不代表OCaml和F#社区.
库克说实话.
因为所有语言都是由程序员编写的,所以我认为我不同意你的朋友.:)

3> C. A. McCann..:

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

...但.你说你受到性能问题的激励,并且想要使用"一种功能语言".由此我推断你以前不熟悉你所询问的语言.在Haskell的定义特性中,默认情况下,它使用非严格的评估不可变数据结构 -它们在许多方面都非常有用,但它也意味着优化Haskell的性能通常与其他语言有很大不同,并且很好 - 本能的暗示可能会让你误入歧途.您可能希望在Haskell维基上浏览与性能相关的主题,以了解问题.

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

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



4> Keith..:

很难对此给出明确的答案.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列表.社区很友好,渴望帮助新移民(我的偏见是什么?).


4.0 + 3.0 ;; 错误:此表达式的类型为float,但表达式的类型为int

5> Andrew..:

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

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

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

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


作为更新,我在Haskell中重写了我的库,并且代码在Haskell中非常漂亮,核心库从1200行C代码到100多行Haskell.性能比C慢大约4倍,但我现在正在考虑使用GPU加速的Data.Array库来大规模并行化许多GPU上的关键部分.我也曾在C中看过这样做,但这意味着要进行巨大的重写.

6> aneccodeal..:

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

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



7> Cfr..:

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



8> 小智..:

有修补的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的贡献是最受欢迎的.

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有