如何使用存储为 CSV 的矢量数据在 mahout 中执行 k-means 聚类?

Posted

技术标签:

【中文标题】如何使用存储为 CSV 的矢量数据在 mahout 中执行 k-means 聚类?【英文标题】:How to perform k-means clustering in mahout with vector data stored as CSV? 【发布时间】:2012-02-05 19:25:07 【问题描述】:

我有一个包含数据向量的文件,其中每一行都包含一个以逗号分隔的值列表。我想知道如何使用 mahout 对这些数据执行 k-means 聚类。 wiki 中提供的示例提到了创建 sequenceFiles,但是我不确定是否需要进行某种类型的转换才能获得这些 sequenceFiles。

【问题讨论】:

您是否需要使用 mahout 来完成这项工作,或者其他什么都可以?有很多集群 api、工具、示例代码等可以很容易地做到这一点。如果您只有一个文件,您的数据点可能会非常小,理论上 Mahout 是针对大规模问题的。 我正在从这里查看聚类数据集:grouplens.org/node/73 最大的数据集可能包含 10,000 x 72,000 个数据点。这就是为什么我认为 mahout 可能是最好的,当我尝试加载较小的数据集时 WEKA 崩溃 试试glaros.dtc.umn.edu/gkhome/software,Weka也有SDK。 k-means 在大多数语言中实现起来非常简单,所以我相信你可以在 google 上找到一些代码 sn-ps 【参考方案1】:

我建议手动读取 CSV 文件中的条目,从中创建 NamedVectors,然后使用序列文件编写器将向量写入序列文件。从那里开始,KMeansDriver 运行方法应该知道如何处理这些文件。

序列文件对键值对进行编码,因此键是样本的 ID(应该是字符串),值是向量周围的 VectorWritable 包装器。

下面是一个简单的代码示例,说明如何做到这一点:

 List vector = new LinkedList();
    命名向量 v1;
    v1 = new NamedVector(new DenseVector(new double[] 0.1, 0.2, 0.5), "第一个项目");
    向量.add(v1);

    配置配置 = 新配置();
    文件系统 fs = FileSystem.get(config);

    路径 path = new Path("datasamples/data");

    //写一个SequenceFile形成一个Vector
    SequenceFile.Writer writer = new SequenceFile.Writer(fs, config, path, Text.class, VectorWritable.class);
    VectorWritable vec = new VectorWritable();
    for(NamedVector v:vector)
        vec.set(v);
        writer.append(new Text(v.getName()), v);
    
    writer.close();

另外,我建议阅读Mahout in Action 的第 8 章。它提供了有关 Mahout 中数据表示的更多详细信息。

【讨论】:

您知道如何从聚类结果中获取向量名称吗?见***.com/questions/14476706/… 您的示例中有一个小错误(顺便说一句,感谢您发布它)。而不是“writer.append(new Text(v.getName()), v);”我认为它需要是“write.append(new Text(v.getName()), vec);”。否则你会得到一个异常说“java.io.IOException:错误的值类:org.apache.mahout.math.NamedVector is not class org.apache.mahout.math.VectorWritable”【参考方案2】:

也许你可以用象鸟来写象形符格式的向量

https://github.com/kevinweil/elephant-bird#hadoop-sequencefiles-and-pig

【讨论】:

以上是关于如何使用存储为 CSV 的矢量数据在 mahout 中执行 k-means 聚类?的主要内容,如果未能解决你的问题,请参考以下文章

如何解析 CSV 文件,以便可以被 Mahout 分类

如何将下面的文本转换为序列文件,该文件又将转换为 mahout kmeans 的矢量?

用于 mahout 推荐的内存数据库

如何使用 apache mahout 实现 LDA?

HBase & Mahout - 使用 HBase 作为 Mahout 的数据存储/源 - 分类

mahout demo——本质上是基于Hadoop的分步式算法实现,比如多节点的数据合并,数据排序,网路通信的效率,节点宕机重算,数据分步式存储