在OCaml或Haskell中进行机器学习?
machine-learning
5
0

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

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

参考资料:
Stack Overflow
收藏
评论
共 9 个回答
高赞 时间 活跃
收藏
评论

改进了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上做出贡献。

收藏
评论

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

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

收藏
评论

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

正如其他人指出的那样,OCaml的学习曲线将低于Haskell的学习曲线。您可能会在OCaml中更快地提高生产力。就是说,学习OCaml是学习Haskell的重要垫脚石,因为许多基本概念非常相似,因此您以后总是可以迁移到Haskell,在那里找到很多熟悉的东西。正如您所指出的,有一个OCaml-R桥。

收藏
评论

就多语言集成而言,将C和Haskell结合起来非常容易,我说这是作为(与dons一样 )不是一个真正的专家。与C良好集成的任何其他语言都不会那么棘手。如果没有其他问题,您总是可以退回到C中的瘦接口层。无论好坏,C仍然是编程的通用语言 ,因此Haskell在大多数情况下都可以接受。

...但。您说自己受到性能问题的激励,并想使用“一种功能语言”。据此推断,您以前不熟悉所要求的语言。 Haskell的定义功能之一是,默认情况下,它使用非严格的评估不可变的数据结构 ,它们在许多方面都非常有用,但这也意味着优化Haskell的性能通常与其他语言大不相同。冲动的本能可能会以令人困惑的方式使您误入歧途。您可能需要浏览Haskell Wiki上与性能相关的主题,以了解这些问题。

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

Haskell和OCaml都提供使用ML族语言的好处,但是对于大多数程序员而言,OCaml可能会提供更缓和的学习曲线和更好的即时结果。

收藏
评论

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

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

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

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

而FP适合实现机器学习和数据挖掘模型。但是,您最能得到的不是性能。正确的是,FP比命令式语言(例如C#或Java)更好地支持并行计算。但是实现并行SVM或决策树与语言无关!平行是平行的。机器学习和数据挖掘背后的数值优化通常势在必行,纯功能地编写它们通常很困难且效率较低。在算法级别而不是语言级别,使这些复杂算法并行是一项艰巨的任务。如果要并行运行100个SVM,FP会在此处提供帮助。但是我没有看到在C ++中并行运行100个libsvm的困难,不要认为单线程libsvm比没有经过充分测试的haskell svm包更有效。

那么FP语言(例如F#,OCaml,Haskell)具有什么作用?

  1. 易于测试您的代码。 FP语言通常具有顶级解释器,您可以即时测试功能。

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

  3. 代码简洁。类型推断,模式匹配,闭包等。您更多地关注域逻辑,而较少关注语言部分。因此,在编写代码时,您的思想主要是在思考编程逻辑本身。

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

收藏
评论

如果速度是您最关心的问题,那就选择C。Haskell在性能方面相当不错,但是您永远不会像C那样快。据我所知,唯一在基准测试中提高C的函数式语言是Stalin Scheme,但这非常年代久远,没有人真正知道它是如何工作的。

我已经编写了基因编程库,其中性能是关键,我用C编写了一种功能样式。该功能样式使我可以轻松地使用OMP对其进行并行化,并且可以在单个过程中将其线性扩展至8个核心。尽管Haskell一直在改进并发性和并行性,但是您当然不能在OCaml中做到这一点。

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

那么速度不惜一切代价吗?回顾过去,我希望我能使用Haskell,因为如果我节省了一个多月的开发时间,我可以将它减慢2-3倍。

收藏
评论

对此很难给出确切的答案。 Haskell具有Don提到的优点,同时具有更强大的类型系统和更简洁的语法。如果您几乎使用任何其他语言(因为Haskell具有与功能语言一样的功能),则OCaml将会更容易学习,并且在Haskell中使用可变的随机访问结构可能会比较麻烦。由于Haskell的惰性评估,您可能还会发现OCaml代码的性能特征比Haskell更直观。

真的,如果有时间,我建议您对两者进行评估。以下是一些相关的Haskell资源:

哦,如果您进一步研究Haskell,请确保注册Haskell初学者Haskell Cafe列表。社区友好且渴望帮助新移民(我的偏见是否显示出来?)。

收藏
评论

作为Haskell和Ocaml在机器学习中的例子,请参见Hal DaumeLloyd Allison主页上的内容。 IMO在Ocaml中实现类似C ++的性能要比在Haskell中直接得多。就像已经说过的那样,Haskell拥有更好的社区(程序包,工具和支持),语法和功能(即FFI,通过类型类产生的monad)和并行编程支持。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号