R clusterCrit 中的 Calinski-Harabasz 计算比 Python sklearn 慢

Calinski-Harabasz calculation slower in R clusterCrit than Python sklearn

我想计算大量数据集的 Calinski-Harabasz 指数。快速测试显示 R's clusterCrit implementation in intCriteria is much slower than the corresponding function from Python' sklearn。这是测试用例(如果需要,我可以分享 test.tsv)。

import numpy as np
import time
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabaz_score

d = np.loadtxt('test.tsv', delimiter='\t')
km = KMeans(n_clusters=2, max_iter=10000)
k = km.fit(d)
start = time.time()
ch = calinski_harabaz_score(d, k.labels_)
end = time.time()
print 'CH:',ch,'time:',(end - start)

运行它(使用Python 2.7)

python CH.py
#CH: 482.766811373 time: 0.434059858322

在 R 中做同样的事情

library(clusterCrit)

d <- as.matrix(read.table('test.tsv', sep='\t'))
k <- kmeans(d, 2, iter.max = 10000, nstart=10)
start <- Sys.time()
ch <- intCriteria(d, k$cluster, 'Calinski_Harabasz')
end <- Sys.time()
cat('CH:', ch[[1]], 'time:',end-start)

运行 它在 R (3.4.4)

source('CH.R')
# CH: 482.7726 time: 1.770816

我也尝试过使用 fpc package 中的 calinhara 函数,但那也很慢。

有什么方法可以提高 Calinski-Harabasz(以及其他可能的集群有效性指数)R 的速度?

您是否尝试过运行ning R optimized by Microsoft 版本中的代码?我很确定你会看到改善。

此外,您似乎没有考虑 python 编译为中间语言所花费的时间,因为您的数据相对较小,而且您 运行 您的代码只用了一次.当你多次 运行 比较时,比较会改变吗?

由于解释器的原因,Pure R 通常很慢。

要了解这一点,请比较 fpcdbscan 包中的 dbscan。

如果您希望 R 模块更快,请用 Fortran 或 C 重写代码。

这在很大程度上也适用于 Python(尽管 Python 解释器似乎比 R 的解释器稍快)。但在许多情况下,主力是 numpy 低级优化的代码。在其他情况下,sklearn 包括 cython 模块,这是 Python 的一个子集,可以编译成 C,然后编译成本地代码。