我按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中完成的那样。事实证明它不包含WeightedVectorWritable
但ClusterWritable
,我可以从中获取Cluster
个实例但不包含任何实际包含的Vector
。
答案 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时,可以指定另外两个标志:
以下是一个示例调用:
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]}
请注意,字典是一个简单的键值文件,其中键是类别名称(字符串),值是数字索引。