我已经在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 =作为向量的质心,r =作为向量的半径,然后是聚类中的每个点。它是否正确?此外,我如何知道哪个聚簇点与哪个输入点匹配?即被描述为键值对的点,其中键是点的某种ID,值是向量?如果没有,我可以通过某种方式进行设置吗?
答案 0 :(得分:7)
我相信你对这些数据的解释是正确的(我只和Mahout合作了大约3个星期,所以经验丰富的人应该对此有所了解。)
至于将点链接回创建它们的输入,我使用了NamedVector
,其中名称是向量的键。当您阅读其中一个生成的点文件(clusteredPoints
)时,您可以将每一行(点矢量)转换回NamedVector
并使用.getName()
检索名称。
更新以回复评论
当您最初将数据读入Mahout时,您将其转换为向量集合,然后使用该集合写入文件(points
)以便稍后在群集算法中使用。 Mahout为您提供了几种可以使用的Vector
类型,但它们还允许您访问名为Vector
的{{1}}包装类,以便识别每个向量。
例如,您可以按如下方式创建每个NamedVector
:
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
答案 1 :(得分:0)
尝试在clusterdump中添加-of CSV选项,您将获得更可利用的结果,以便进一步处理。
答案 2 :(得分:-1)
我有同样的问题,(使用mahout 0.6)。我也是初学者。我需要以集群的形式向用户显示文档。所以我需要文档名称而不是与集群对应的单词。我一直在从shell脚本中集中文本文档。