我相信你对数据的解释是正确的(我只与 Mahout 合作了约 3 周,所以更有经验的人可能应该对此进行权衡)。
至于将点链接回创建它们的输入,我已经使用过NamedVector
,其中名称是向量的键。当您读取生成的点文件之一时(clusteredPoints
)您可以将每一行(点向量)转换回NamedVector
并使用检索名称.getName()
.
更新以回复评论
当您最初将数据读入 Mahout 时,将其转换为向量集合,然后将其写入文件(points
)以供稍后的聚类算法使用。 Mahout 给你几个Vector
您可以使用的类型,但它们也使您可以访问Vector
包装类称为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
.
然后,您可以读取此点文件并提取与每个向量关联的名称。它看起来像这样:
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()
}