Я хочу рассчитать индекс Калинского-Харабаса для большого количества наборов данных.Быстрый тест показал, что реализация clusterCrit в intCriteria намного медленнее, чем соответствующая функция из 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
Я также пытался использовать функцию calinhara из пакета fpc , но это также довольно медленно.
В любом случае, я могу улучшить скорость Калински-Харабасса (и, возможно, другихиндексы валидности кластера) R?