【问题标题】:Calinski-Harabasz calculation slower in R clusterCrit than Python sklearnR clusterCrit 中的 Calinski-Harabasz 计算比 Python sklearn 慢
【发布时间】:2019-10-01 09:02:08
【问题描述】:

我想计算大量数据集的 Calinski-Harabasz 指数。快速测试表明R's clusterCrit implementation in intCriteriacorresponding 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 的速度吗?

【问题讨论】:

    标签: python r performance scikit-learn cluster-analysis


    【解决方案1】:

    由于解释器,纯 R 通常非常慢。

    要查看这一点,请比较 fpcdbscan 包中的 dbscan。

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

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

    【讨论】:

      【解决方案2】:

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

      此外,您似乎没有考虑编译为 python 的中间语言所花费的时间,因为您的数据相对较小并且您只运行一次代码。多次运行比较是否会发生变化?

      【讨论】:

      • 感谢您的建议。我没有尝试过微软的 R(不知道)。我已经尝试多次运行它,导致速度相似。
      猜你喜欢
      • 2017-11-13
      • 2015-10-24
      • 2011-12-10
      • 2014-04-13
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多