2012-08-07 56 views
4

我已经运行从亨利马乌教程合成控制数据K-均值聚类算法,并想知道如果有人可以解释如何解释输出。我跑clusterdump和接收到的输出,看起来像这样(截断为节省空间):如何阅读Mahout的集群输出

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 =质心作为向量,r =半径作为向量,然后是簇中的每个点。它是否正确?此外,我怎么知道哪个聚集点与哪个输入点匹配?即被描述为键值对的点,其中键是该点的某种ID并且该值是矢量?如果没有,我可以设置它,所以它是?

+0

对不起,因为这样碰撞,但你是如何得到聚集点?我可以得到聚类质心,但不知何故,我无法得到点与你分配的聚类之间的关系? – Marko 2014-08-28 08:55:15

回答

7

我相信你对数据的解释是正确的(我只用亨利马乌工作〜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() 
} 
+0

感谢您的回答,@JesseBuesking。我也是初学者,所以我需要一些帮助来理解你的回答。你在哪里定义点为'NamedVector'?从何处/何时可以使用'.getName()'?谢谢。 – Alison 2012-08-08 13:38:12

-1

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

+0

seqdumper可用于获取群集和文件的映射。 – user2039862 2013-04-24 13:32:04

+0

如果你想输出包含文件名而不是向量,使用命名向量属性。 – user2039862 2013-04-24 13:33:04

0

尝试添加选项-of CSV在clusterdump,你将有进一步的治疗更可利用的结果。