2

我是一名数学家,偶尔会做一些统计/机器学习分析咨询项目。我可以访问的数据通常较小,最多几百兆字节(而且几乎总是少得多),但我想了解更多关于处理和分析千兆字节/兆字节规模的数据。我需要知道什么,有什么好的资源可以学习?

  1. Hadoop/MapReduce 是一个明显的开始。
  2. 我应该学习一种特定的编程语言吗?(我现在主要使用 Python、Ruby、R,偶尔使用 Java,但似乎 C 和 Clojure 经常用于大规模数据分析?)
  3. 我对整个 NoSQL 运动并不十分熟悉,除了它与大数据有关。什么是学习它的好地方,是否有我应该熟悉的特定实现(Cassandra、CouchDB 等)?
  4. 我在哪里可以了解如何将机器学习算法应用于海量数据?我的数学背景主要是在理论方面,绝对不是在数值或近似方面,而且我猜大多数标准 ML 算法并没有真正扩展。
  5. 任何其他关于要学习的东西的建议都会很棒!
4

3 回答 3

2
  1. Apache Hadoop 确实是一个好的开始,因为它是免费的,拥有庞大的社区并且易于设置。
  2. Hadoop 是用 Java 构建的,因此可以选择这种语言。但是也可以在 Hadoop 中使用其他语言(“管道”和“流”)。我知道,例如,经常使用 Python。
  3. 如果您愿意,您可以避免将数据保存在数据库中。最初,Hadoop 使用(分布式)文件系统上的数据。但是您似乎已经知道,有可供 Hadoop 使用的分布式数据库。
  4. 你有看过Mahout吗?我认为这对你来说是一个打击 ;-) 你需要的许多工作,可能已经完成了!?
  5. 阅读快速入门并设置您自己的(伪分布式?)集群并运行字数统计示例

如果您有任何问题,请告诉我 :-) 评论会提醒我这个问题。

于 2010-05-31T22:58:11.870 回答
0

Hadoop 很棒,但设置起来可能很麻烦。这是迄今为止我读过的关于 Hadoop 设置的最佳文章。我强烈推荐它: http: //www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Single-Node_Cluster%29

Clojure 构建在 Java 之上,因此它不可能比 Java 更快。但是,它是少数几种能够很好地共享内存的语言之一,这可能有用,也可能没有帮助。我不是数学专家,但似乎大多数数学计算都非常可并行化,几乎不需要线程共享内存。无论哪种方式,您都可能想查看Incanter(它是 Clojure 的统计计算库)和clojure-hadoop,它可以让编写 Hadoop 作业变得不那么痛苦。

在语言方面,我发现性能差异最终是不变的因素。最好只找到一种你喜欢的语言并专注于改进你的算法。然而,根据Peter Norvig 引用的一些枪战(向下滚动到彩色表格,您可能想要回避 Python 和 Perl,因为它们在数组方面很糟糕。

简而言之,NoSQL 非常适合非结构化/任意结构化数据,而 SQL/RDBMS 非常适合(或至少可以容忍)结构化数据。在 RDBMS 中更改/添加字段的成本很高,因此如果经常发生这种情况,您可能希望避开它们。

但是,在您的情况下,您似乎将批量处理大量数据,然后返回答案,而不是拥有您会定期提出问题的数据?您可能只在 Hadoop 中处理 CSV/文本文件。除非您需要一种高效的方式来动态访问有关数据的任意信息,否则我不确定 SQL 或 NoSQL 是否有用。

于 2010-08-10T16:47:35.117 回答
0

我已经完成了一些大规模的机器学习(3-5GB 数据集),所以这里有一些见解:

首先,存在大规模的物流问题。您可以将所有数据加载到内存中吗?使用 Java 和 64 位 JVM,您可以访问尽可能多的 RAM:例如,命令行参数-Xmx8192M将允许您访问 8GB(如果您有那么多)。Matlab 作为一个 Java 应用程序,也可以从中受益并处理相当大的数据集。

更重要的是,您在数据上运行的算法。标准实现可能会期望内存中的所有数据。您可能必须自己实现一种工作集方法,在这种方法中,您将数据交换到磁盘和交换到磁盘,并且一次只处理一部分数据。这些有时被称为分块批处理甚至增量算法,具体取决于上下文。

您怀疑许多算法实际上无法扩展是对的,因此您可能必须寻求一个近似解决方案。好消息是,对于几乎任何算法,您都可以找到处理近似和/或讨论大规模解决方案的研究论文。坏消息是您很可能必须自己实施这些方法。

于 2010-05-30T11:53:09.657 回答