我想在命令行中运行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"
。
为什么群集大小没有变化?代码有问题吗?
答案 0 :(得分:1)
5秒可能太快,无法让您获得可靠的测量结果。
此外,如果k
越大,结果可能会以更少的迭代收敛。
您可能希望使用-time
来查看运行实际算法所需的时间。使用您的方法,解析和编写将产生不可忽视的影响。 -resulthandler DiscardResultHandler
将禁用输出,这对于基准测试也是合理的。
您不需要设置-kmeans.maxiter 9999
。默认情况下,ELKI将运行k-means直到收敛。
我认为k-Means ++初始化存在实施方面的弱点,这使得它比必要的成本更高。也许初始化,解析,写作对你的总运行时间有很大贡献。
还尝试使用-resulthandler LogResultStructureResultHandler -verbose
来确保解析器按预期理解文件(检查维度!)使用-verbose
,您还可以检查它是否进行了合理的迭代次数。