mahout 实现 kmeans 的开关之一是 -c(集群)。
“输入质心,作为向量。必须是可写的序列文件,集群/Canopy。”
我不知道我应该如何制作这些质心。我已经将我的文本数据转换为 sequenceFiles 并从那里转换为 Vectors。我只需要弄清楚这一点,我就可以尝试对数据进行聚类。
mahout 实现 kmeans 的开关之一是 -c(集群)。
“输入质心,作为向量。必须是可写的序列文件,集群/Canopy。”
我不知道我应该如何制作这些质心。我已经将我的文本数据转换为 sequenceFiles 并从那里转换为 Vectors。我只需要弄清楚这一点,我就可以尝试对数据进行聚类。
您可以使用RandomSeedGenerator类为 k-means 聚类生成随机初始质心。
Path centroids = RandomSeedGenerator.buildRandom(conf,new Path("testdata2/points.seq"),new Path("testdata2/clusters"),k,new EuclideanDistanceMeasure());
只需提供要聚类的数据点(points.seq)的路径和初始质心的路径(testdata2/clusters)
如果它成功运行,您将在 testdata2/clusters 目录下拥有文件 part-randomSeed 文件。
如果您想使用具有一定数量的聚类的随机初始质心(这是一种非常常见的方法),则根本不必在聚类之前创建初始质心。
注意:如果提供了 -k 参数,则 -c 目录中的所有簇都将被覆盖,并且 -k 随机点将从输入向量中采样成为初始簇中心。
因此,初始质心目录必须存在并且可以为空 - 在运行实际聚类之前,它将用 k 个随机选择的质心填充。
下面我提供了一个我刚刚成功运行的命令行调用。我更喜欢使用更多的口头参数,因此我使用--clusters
而不是等价物-c
来定义初始质心的(空)目录,--numClusters
而不是等价物-k
来定义我总共需要 3 个集群(导致 3 个初始质心)。
mahout kmeans \
--input output/seq2sparse/001/tfidf-vectors \
--output output/kmeans/001 \
--clusters output/initial_centroids/001 \
--numClusters 3 \
--distanceMeasure org.apache.mahout.common.distance.CosineDistanceMeasure \
--maxIter 20 \
--method mapreduce