使用向量名称转储聚类结果

时间:2013-01-23 09:51:06

标签: cluster-analysis mahout

我按this question中所述创建了我的向量,并对数据运行mahout kmeans

由于我使用的是Mahout 0.7,clusterdump命令无法按照Mahout in Action中的描述运行,但我让它像这样工作:

export HADOOP_CLASSPATH=/path/to/mahout-distribution-0.7/core/target/mahout-core-0.7-job.jar:/path/to/mahout-distribution-0.7/integration/target/mahout-integration-0.7.jar
hadoop jar core/target/mahout-core-0.7-job.jar org.apache.mahout.utils.clustering.ClusterDumper -i /clustering/out/clusters-20-final -o textout -of TEXT

我得到这样的一行:

VL-1383471{n=192 c=[0.180, -0.087, 0.281, 0.512, 0.678, 1.833, 2.613, 0.313, 0.226, 1.023, 0.229, -0.104, -0.461, -0.553, -0.318, 0.315, 0.658, 0.245, 0.635, 0.220, 0.660, 0.193, 0.277, -0.182, 0.497, 0.346, 0.658, 0.660, 0.191, 0.660, 0.636, 0.018, 0.519, 0.335, 0.535, 0.008, -0.028, 0.461, 0.229, 0.287, 0.619, 0.509, 0.566, 0.389, -0.075, -0.180, -0.461, 0.381, -0.108, 0.126, -0.728] r=[0.983, 0.890, 0.384, 0.823, 0.702, 0.000, 0.000, 1.132, 0.605, 0.979, 0.897, 0.862, 0.438, 0.546, 0.390, 0.171, 0.257, 0.234, 0.251, 0.106, 0.257, 0.093, 0.929, 0.077, 0.204, 0.218, 0.257, 0.257, 0.258, 0.257, 0.249, 0.112, 0.217, 0.157, 0.284, 0.197, 0.228, 0.229, 0.323, 0.401, 0.248, 0.217, 0.269, 1.002, 0.819, 0.706, 0.412, 0.964, 0.787, 0.872, 0.172]}

这对我来说还没有用,因为我需要每个群集中我的向量的名称。 我看到,对于文本文档,创建了一个字典文件。我如何为我的数据创建字典?

另外,使用-of CSV给我一个空文件,我做错了吗?

我采取的另一种尝试是直接访问cluster-20-final/part-m-00000文件,就像在listing 7.2 of Mahout in Action中完成的那样。事实证明它不包含WeightedVectorWritableClusterWritable,我可以从中获取Cluster个实例但不包含任何实际包含的Vector

2 个答案:

答案 0 :(得分:1)

有点晚了,但这可能会帮助某个地方某个人。

运行时

KMeansDriver.run(input, clustersIn, outputPath, measure, convergenceDelta, maxIterations, true, 0.0, false);

其中一个输出是名为clusteredPoints的目录。那里有一个部分文件,其中包含所有聚类的聚类向量。这意味着像这样的东西

    IntWritable key = new IntWritable();
    WeightedVectorWritable value = new WeightedVectorWritable();

    Path clusteredPoints = new Path(output + "/" + Cluster.CLUSTERED_POINTS_DIR + "/part-m-00000");

    FileSystem fs = FileSystem.get(clusteredPoints.toUri(), new Configuration());

    try (SequenceFile.Reader reader = new SequenceFile.Reader(fs, clusteredPoints, fs.getConf())) {

        while (reader.next(key, value)) {
            // Do something useful here
            ((NamedVector) value.getVector()).getName();
        }

    } catch (Throwable t) {
        throw t;
    }

似乎可以解决问题。使用这样的东西,我能够很好地理解在使用k-means聚类和Mahout运行测试时聚集的地方。

当我这样做时,我正在使用Mahout 0.8。

答案 1 :(得分:0)

(一个非常晚的答案,但因为我只花了一天时间想出这个想法,我会分享它)

您缺少的是其索引的Vector Dimension名称字典。 clusterdump将使用此字典为您提供向量中不同维度的名称。

运行clusterdump时,可以指定另外两个标志:

  • d:字典文件
  • dt:字典文件的类型(text | sequencefile)

以下是一个示例调用:

mahout clusterdump -i clusteringExperiment/exp1/initialCentroids/clusters-0-final -d clusteringExperiment/dictionary/vectorDimensions -dt sequencefile

,您的输出将如下所示:

VL-0{n=185 c=[A:0.006, G:0.550, M:0.011, O:0.026, S:0.000, T:0.072, U:0.096, V:0.010] r=[A:0.029, G:0.176, M:0.043, O:0.054, S:0.001, T:0.098, U:0.113, V:0.035]}

请注意,字典是一个简单的键值文件,其中键是类别名称(字符串),值是数字索引。