【问题标题】:How to read Mahout clustering output如何读取 Mahout 聚类输出
【发布时间】:2012-08-04 14:10:02
【问题描述】:

我已经对 Mahout 教程中的合成控制数据运行了 k-Means 聚类算法,并且想知道是否有人可以解释如何解释输出。我运行了 clusterdump 并收到了如下所示的输出(截断以节省空间):

CL-592{n=57 c=30.726, 29.813...] r=[3.528, 3.597...]}
Weight : [props - optional]: Point:
1.0 : [distance=27.453962995925863]: [24.672, 35.261, 30.486...]
1.0 : [distance=27.675053294846002]: [25.592, 29.951, 34.188...]
1.0 : [distance=28.97727289419493]: [30.696, 32.667, 34.223...]
1.0 : [distance=21.999685652862784]: [32.702, 35.219, 30.143...]
...
CL-598{n=50 c=[29.611, 29.769...] r=[3.166, 3.561...]}
Weight : [props - optional]:  Point:
1.0 : [distance=27.266203490250472]: [27.679, 33.506, 23.594...]
1.0 : [distance=28.749781351838173]: [34.727, 28.325, 30.331...]
1.0 : [distance=32.635136046420186]: [27.758, 33.859, 29.879...]
1.0 : [distance=29.328974057024624]: [29.356, 26.793, 25.575...]

有人可以向我解释如何阅读这个吗?据我了解,CL-__是一个簇ID,后跟n=簇中的点数,c=centroid作为向量,r=radius作为向量,然后是簇中的每个点。它是否正确?此外,我如何知道哪个聚类点与哪个输入点匹配?即点是否被描述为键值对,其中键是点的某种 ID,值是向量?如果没有,我可以通过某种方式进行设置吗?

【问题讨论】:

  • 对不起,我这样撞到了,但是你是怎么得到聚集点的?我可以得到簇质心,但不知何故我无法得到点和你被分配到的簇之间的关系?

标签: mahout


【解决方案1】:

我相信您对数据的解释是正确的(我只与 Mahout 合作了大约 3 周,因此可能需要更有经验的人来权衡一下)。

至于将点链接回创建它们的输入,我使用了NamedVector,其中名称是向量的键。当您读取其中一个生成的点文件 (clusteredPoints) 时,您可以将每一行(点向量)转换回 NamedVector 并使用 .getName() 检索名称。

根据评论更新

最初将数据读入 Mahout 时,会将其转换为向量集合,然后将其写入文件 (points) 以供稍后用于聚类算法。 Mahout 为您提供了几种您可以使用的 Vector 类型,但它们还允许您访问名为 NamedVectorVector 包装类,这将允许您识别每个向量。

例如,您可以按如下方式创建每个NamedVector

NamedVector nVec = new NamedVector(
    new SequentialAccessSparseVector(vectorDimensions), 
    vectorName
    );

然后您将NamedVectors 的集合写入文件,如下所示:

SequenceFile.Writer writer = new SequenceFile.Writer(...);
VectorWritable writable = new VectorWritable();

// the next two lines will be in a loop, but I'm omitting it for clarity
writable.set(nVec);
writer.append(new Text(nVec.getName()), nVec);

您现在可以将此文件用作其中一种聚类算法的输入。

使用您的点文件运行其中一种聚类算法后,它将生成另一个点文件,但它将位于名为clusteredPoints 的目录中。

然后您可以读取此点文件并提取与每个向量关联的名称。它看起来像这样:

IntWritable clusterId = new IntWritable();
WeightedPropertyVectorWritable vector = new WeightedPropertyVectorWritable();

while (reader.next(clusterId, vector))
{
    NamedVector nVec = (NamedVector)vector.getVector();
    // you now have access to the original name using nVec.getName()
}

【讨论】:

  • 感谢@JesseBuesking 的回答。我也是初学者,所以我需要一些帮助来理解您的回复。您在哪里将点定义为NamedVector?我可以从哪里/何时使用.getName()?谢谢。
【解决方案2】:

尝试在 clusterdump 中添加选项 -of CSV,您将获得更可利用的结果以进行进一步处理。

【讨论】:

    【解决方案3】:

    我有同样的问题,(使用 mahout 0.6)。我也是初学者。我需要以集群的形式向用户显示文档。所以我需要文档名称而不是与集群对应的单词。我一直在从 shell 脚本中对文本文档进行聚类。

    【讨论】:

    • 可以使用seqdumper获取集群和文件的映射关系。
    • 如果您希望输出包含文件名而不是向量,请使用命名向量属性。
    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2014-10-15
    • 2016-09-06
    • 2013-06-05
    • 2014-08-07
    相关资源
    最近更新 更多