2

我喜欢在命令行中运行 ELKI k-means 聚类。

与R编程相比,运行时间似乎太短了。我尝试在 R 中运行 k-means 聚类,然后花了大约 100 秒。此外,在 k=5、k=10 等之间没有变化。

file.tsv有 60,000 行和 25 列。

START=$(date +%s)
k=5
java -jar elki.jar KDDCLIApplication \
     -dbc.in "file.tsv" \
         -dbc.parser NumberVectorLabelParser \
         -parser.colsep "\t" \
     -algorithm clustering.kmeans.KMeansLloyd \
         -kmeans.k $k \
         -kmeans.initialization KMeansPlusPlusInitialMeans \
         -kmeans.maxiter 9999 \
     -resulthandler ResultWriter -out.gzip false \
         -out output/k-$k \

END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

输出是"It took 5 seconds"

START=$(date +%s)
k=10
java -jar elki.jar ...
     ...

END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

这种情况k=10也是"It took 5 seconds"

为什么集群大小没有变化?代码有问题吗?

4

1 回答 1

1

5 秒可能太快,无法获得可靠的测量结果。

此外,k结果越大,迭代次数越少。

您可能希望使用-time来查看运行实际算法所需的时间。使用您的方法,解析写入将产生不可忽视的影响。-resulthandler DiscardResultHandler将禁用输出,这对于基准测试也是合理的。

你不需要设置-kmeans.maxiter 9999. 默认情况下,ELKI 将运行 k-means 直到收敛。

我相信在 k-Means++ 初始化中存在一个实现弱点,这使得它比必要的成本更高。也许初始化、解析、编写对您的总运行时间有很大贡献。

还可以尝试使用-resulthandler LogResultStructureResultHandler -verbose以确保解析器按预期理解文件(检查维度!)-verbose您还可以检查它是否进行了合理的迭代次数。

于 2014-06-04T09:07:17.277 回答