Вычисление Калински-Харабаса медленнее в R clusterCrit, чем Python sklearn - PullRequest
0 голосов
/ 14 мая 2019

Я хочу рассчитать индекс Калинского-Харабаса для большого количества наборов данных.Быстрый тест показал, что реализация 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?

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Pure R часто довольно медленный из-за переводчика.

Чтобы увидеть это, сравните dbscan из пакетов fpc и dbscan.

Если вы хотите, чтобы модуль R был быстрым, перепишите код на Fortran или C.

То же самое в значительной степени относится и к Python (хотя интерпретатор Python, кажется, немного быстрее, чем R). Но во многих случаях рабочей лошадкой является код numpy, оптимизированный для низкого уровня. А в других случаях sklearn включает в себя cython модули, то есть подмножество Python, которое можно скомпилировать в C, а затем в собственный код.

0 голосов
/ 14 мая 2019

Вы пытались запустить код в версии R, оптимизированной для Microsoft ?Я почти уверен, что вы увидите улучшение.

Кроме того, кажется, что вы не учитываете время, которое может быть использовано компиляцией на промежуточный язык для python, потому что ваши данные относительно малы, и вы запускаетекод только один раз.Меняется ли сравнение при многократном запуске?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...