Mahout 支持一些集群算法实现(都是使用 Map-Reduce 编写的),它们都有一组各自的目标和标准:
Canopy:一种快速集群算法,通常用于为其他集群算法创建初始种子。
k-Means(以及 模糊 k-Means):根据项目与之前迭代的质心(或中心)之间的距离将项目添加到 k 集群中。
Mean-Shift:无需任何关于集群数量的 推理知识的算法,它可以生成任意形状的集群。
Dirichlet:借助基于多种概率模型的集群,它不需要提前执行特定的集群视图。
从实际的角度来说,名称和实现并不如它们生成的结果重要。了解了这一点之后,我将展示 k-Means 的运行原理,而其余内容将由您自己去研究。请记住,要有效运行每个算法,您需要满足它们各自的的需求。
简单来说(详细信息见下文),使用 Mahout 创建数据集群的步骤包括:
准备输入。如果创建文本集群,您需要将文本转换成数值表示。
使用 Mahout 中可用的 Hadoop 就绪的驱动程序运行所选集群算法。
计算结果。
如果有必要,执行迭代。
首先,集群算法要求数据必需采用适合处理的格式。在机器学习中,数据通常被表示为 矢量,有时也称作 特征矢量。在集群中,矢量是表示数据的一组权重值。我将使用通过 Wikipedia 文档生成的矢量来演示集群,但是也可以从其他地方获取矢量,比如说传感器数据或用户资料。Mahout 随带了两个 Vector表示:DenseVector和 SparseVector。根据所使用的数据,您需要选择合适的实现,以便实现良好的性能。通常而言,基于文本的问题是很少的,因此应该使用 SparseVector来处理文本。另一方面,如果大多数矢量的大多数值都是非零的,则比较适合使用 DenseVector。如果您对此不确定,可以尝试这两种实现来处理数据的一个子集,然后确定哪种实现的运行速度更快。
通过 Wikipedia 内容生成矢量的方法如下(我已经完成了此工作):
将内容索引编入 Lucene,确保存储相关字段(用于生成矢量的字段)的 term 矢量。我不会讨论这方面的详细信息 —不在本文讨论范围之内 —但我会提供一些简要提示以及 Lucene 上的一些参考资料。Lucene 提供了一个称为 EnWikiDocMaker的类(包含在 Lucene 的 contrib/benchmark包中),该类可以读取 Wikipedia 文件块中的内容并生成编入 Lucene 索引的文档。
使用 org.apache.mahout.utils.vectors.lucene.Driver类(位于 Mahout 的 utils模块中)通过 Lucene 索引创建矢量。此驱动程序提供了大量用于创建矢量的选项。Mahout wiki 页面 “Creating Vectors from Text” 提供了更多信息(见 参考资料)。
运行这两个步骤的结果是生成一个文件,该文件类似于与您从 Getting started with Mahout 入门部分下载的 n2.tar.gz 文件。需要说明一下,n2.tar.gz 文件中的矢量是通过由 ant install方法之前下载的 Wikipedia “块” 文件中的所有文件的索引创建的。矢量将被格式化为 Euclidean 格式(或者 L2格式;请参见 参考资料)。在使用 Mahout 时,您可能希望尝试采用不同的方法来创建矢量,以确定哪种方法的效果最好。
评估结果
可以采用多种方法来评估集群结果。许多人最开始都是使用手动检查与随机测试相结合的方法。但是,要实现令人满足的结果,通常都需要使用一些更加高级的计算技巧,比如说使用一些准则开发一个黄金标准。有关评估结果的更多信息,请参见 参考资料。在本例中,我使用手动检查来判断结果集群是否有意义。如果要投入生产,则应该使用更加严格的流程。
创建了一组矢量之后,接下来需要运行 k-Means 集群算法。Mahout 为所有集群算法都提供了驱动程序,包括 k-Means 算法,更合适的名称应该是 KMeansDriver。可以直接将驱动程序作为单独的程序使用,而不需要 Hadoop 的支持,比如说您可以直接运行 ant k-means。有关 KMeansDriver可接受的参数的更多信息,请查看 build.xml 中的 Ant k-means 目标。完成此操作之后,您可以使用 ant dump命令打印输出结果。
成功在独立模式中运行驱动程序之后,您可以继续使用 Hadoop 的分布式模式。为此,您需要 Mahout Job JAR,它位于示例代码的 hadoop 目录中。Job JAR 包可以将所有代码和依赖关系打包到一个 JAR 文件中,以便于加载到 Hadoop 中。您还需要下载 Hadoop 0.20,并依照 Hadoop 教程的指令,首先在准分布式模式(也就是一个集群)中运行,然后再采用完全分布式模式。有关更多信息,请参见 Hadoop 网站及资源,以及 IBM 云计算资源(参见 参考资料)。
Canopy:一种快速集群算法,通常用于为其他集群算法创建初始种子。
k-Means(以及 模糊 k-Means):根据项目与之前迭代的质心(或中心)之间的距离将项目添加到 k 集群中。
Mean-Shift:无需任何关于集群数量的 推理知识的算法,它可以生成任意形状的集群。
Dirichlet:借助基于多种概率模型的集群,它不需要提前执行特定的集群视图。
从实际的角度来说,名称和实现并不如它们生成的结果重要。了解了这一点之后,我将展示 k-Means 的运行原理,而其余内容将由您自己去研究。请记住,要有效运行每个算法,您需要满足它们各自的的需求。
简单来说(详细信息见下文),使用 Mahout 创建数据集群的步骤包括:
准备输入。如果创建文本集群,您需要将文本转换成数值表示。
使用 Mahout 中可用的 Hadoop 就绪的驱动程序运行所选集群算法。
计算结果。
如果有必要,执行迭代。
首先,集群算法要求数据必需采用适合处理的格式。在机器学习中,数据通常被表示为 矢量,有时也称作 特征矢量。在集群中,矢量是表示数据的一组权重值。我将使用通过 Wikipedia 文档生成的矢量来演示集群,但是也可以从其他地方获取矢量,比如说传感器数据或用户资料。Mahout 随带了两个 Vector表示:DenseVector和 SparseVector。根据所使用的数据,您需要选择合适的实现,以便实现良好的性能。通常而言,基于文本的问题是很少的,因此应该使用 SparseVector来处理文本。另一方面,如果大多数矢量的大多数值都是非零的,则比较适合使用 DenseVector。如果您对此不确定,可以尝试这两种实现来处理数据的一个子集,然后确定哪种实现的运行速度更快。
通过 Wikipedia 内容生成矢量的方法如下(我已经完成了此工作):
将内容索引编入 Lucene,确保存储相关字段(用于生成矢量的字段)的 term 矢量。我不会讨论这方面的详细信息 —不在本文讨论范围之内 —但我会提供一些简要提示以及 Lucene 上的一些参考资料。Lucene 提供了一个称为 EnWikiDocMaker的类(包含在 Lucene 的 contrib/benchmark包中),该类可以读取 Wikipedia 文件块中的内容并生成编入 Lucene 索引的文档。
使用 org.apache.mahout.utils.vectors.lucene.Driver类(位于 Mahout 的 utils模块中)通过 Lucene 索引创建矢量。此驱动程序提供了大量用于创建矢量的选项。Mahout wiki 页面 “Creating Vectors from Text” 提供了更多信息(见 参考资料)。
运行这两个步骤的结果是生成一个文件,该文件类似于与您从 Getting started with Mahout 入门部分下载的 n2.tar.gz 文件。需要说明一下,n2.tar.gz 文件中的矢量是通过由 ant install方法之前下载的 Wikipedia “块” 文件中的所有文件的索引创建的。矢量将被格式化为 Euclidean 格式(或者 L2格式;请参见 参考资料)。在使用 Mahout 时,您可能希望尝试采用不同的方法来创建矢量,以确定哪种方法的效果最好。
评估结果
可以采用多种方法来评估集群结果。许多人最开始都是使用手动检查与随机测试相结合的方法。但是,要实现令人满足的结果,通常都需要使用一些更加高级的计算技巧,比如说使用一些准则开发一个黄金标准。有关评估结果的更多信息,请参见 参考资料。在本例中,我使用手动检查来判断结果集群是否有意义。如果要投入生产,则应该使用更加严格的流程。
创建了一组矢量之后,接下来需要运行 k-Means 集群算法。Mahout 为所有集群算法都提供了驱动程序,包括 k-Means 算法,更合适的名称应该是 KMeansDriver。可以直接将驱动程序作为单独的程序使用,而不需要 Hadoop 的支持,比如说您可以直接运行 ant k-means。有关 KMeansDriver可接受的参数的更多信息,请查看 build.xml 中的 Ant k-means 目标。完成此操作之后,您可以使用 ant dump命令打印输出结果。
成功在独立模式中运行驱动程序之后,您可以继续使用 Hadoop 的分布式模式。为此,您需要 Mahout Job JAR,它位于示例代码的 hadoop 目录中。Job JAR 包可以将所有代码和依赖关系打包到一个 JAR 文件中,以便于加载到 Hadoop 中。您还需要下载 Hadoop 0.20,并依照 Hadoop 教程的指令,首先在准分布式模式(也就是一个集群)中运行,然后再采用完全分布式模式。有关更多信息,请参见 Hadoop 网站及资源,以及 IBM 云计算资源(参见 参考资料)。