如何使用存储为 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 包装器。
下面是一个简单的代码示例,说明如何做到这一点:
Listvector = 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 聚类?的主要内容,如果未能解决你的问题,请参考以下文章
如何将下面的文本转换为序列文件,该文件又将转换为 mahout kmeans 的矢量?
HBase & Mahout - 使用 HBase 作为 Mahout 的数据存储/源 - 分类
mahout demo——本质上是基于Hadoop的分步式算法实现,比如多节点的数据合并,数据排序,网路通信的效率,节点宕机重算,数据分步式存储