无法获得集群输出Mahout

时间:2014-08-25 11:47:11

标签: cluster-analysis mahout k-means

我在Mahout中运行kmeans,作为输出我得到文件夹clusters-x,clusters-x-final和clusteredPoints。

如果我理解得很好,cluster-x是每次迭代中的质心位置,cluster-x-final是最终的质心位置,clusteredPoints应该是聚类的点,其中簇ID和权重表示属于簇的概率(取决于点与其质心之间的距离)。另一方面,cluster-x和clusters-x-final包含聚类质心,元素数量,质心的特征值和聚类的半径(质心与其最远点之间的距离。

如何检查此输出?

我成功地将群集转储器用于终端的clusters-x和clusters-x-final,但是当我使用clusteredPoints时,我得到了一个空文件?什么似乎是问题?

我怎样才能从代码中获取这些值?我的意思是,质心值和属于群集的点?

FOr clusteredPoint我在一个while循环中使用IntWritable作为键,使用WeightedPropertyVectorWritable作为值,但它传递循环,就像clusteredPoints中没有元素一样?

这更奇怪,因为我使用clusterDumper获取的文件是空的?

可能是什么问题?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

我相信你对这些数据的解释是正确的(我只和Mahout合作了大约3个星期,所以经验丰富的人应该对此有所了解。)

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

更新以回应评论

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

例如,您可以按如下方式创建每个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()
}

答案 1 :(得分:0)

检查名为“clusterClassificationThreshold”的参数。

clusterClassificationThreshold应为0。

您可以查看http://mail-archives.apache.org/mod_mbox/mahout-user/201211.mbox/%3C50B62629.5020700@windwardsolutions.com%3E