расчет силуэта в R для больших данных - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу рассчитать силуэт для оценки кластера.В R есть несколько пакетов, например cluster и clValid.Вот мой код с использованием кластерного пакета:

# load the data
# a data from the UCI website with 434874 obs. and  3 variables
data <- read.csv("./data/spatial_network.txt",sep="\t",header =  F)

# apply kmeans
km_res <- kmeans(data,20,iter.max = 1000,
               nstart=20,algorithm="MacQueen")

# calculate silhouette
library(cluster)   
sil <- silhouette(km_res$cluster, dist(data))

# plot silhouette
library(factoextra)
fviz_silhouette(sil)

Код хорошо работает для небольших данных, скажем, данных с 50 000 объектов, однако я получаю сообщение об ошибке типа «Ошибка: невозможно выделить вектор размером 704,5 ГБ», когдаРазмер данных немного велик.Это может быть проблемой для индекса Данна и других внутренних индексов для больших наборов данных.

У меня 32 ГБ ОЗУ на моем компьютере.Проблема исходит от вычисления dist (data).Мне интересно, можно ли заранее не вычислять dist (data) и вычислять соответствующие расстояния, когда это требуется в формуле силуэта.

Я благодарен вам за помощь в решении этой проблемы и за то, как я могу рассчитать силуэт для больших и очень больших наборов данных.

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Ответ Anony-Mousse идеален, особенно субсэмплинг.Это очень важно для очень больших наборов данных из-за увеличения вычислительных затрат.

Вот еще одно решение для расчета внутренних мер, таких как силуэт и индекс Данна, с использованием пакета R clusterCrit.clusterCrit предназначен для расчета индексов проверки кластеризации, для которых не требуется заблаговременно указывать всю матрицу расстояний.Тем не менее, это может быть медленным, как обсуждал Anony-Mousse.См. Ссылку ниже для документации по clusterCrit: https://www.rdocumentation.org/packages/clusterCrit/versions/1.2.8/topics/intCriteria

clusterCrit также вычисляет большинство внутренних показателей для проверки кластера.

Пример:

intCriteria(data,km_res$cluster,c("Silhouette","Calinski_Harabasz","Dunn"))
0 голосов
/ 28 мая 2019

Если можно рассчитать индекс Силуэт без использования матрицы расстояний, в качестве альтернативы вы можете использовать пакет clues, оптимизируя как время, так и объем памяти, используемый пакетом кластера.Вот пример:

library(rbenchmark)
library(cluster)
library(clues)

set.seed(123)
x = c(rnorm(1000,0,0.9), rnorm(1000,4,1), rnorm(1000,-5,1))
y = c(rnorm(1000,0,0.9), rnorm(1000,6,1), rnorm(1000, 5,1))
cluster = rep(as.factor(1:3),each = 1000)

df <- cbind(x,y)
head(df)
               x           y
[1,] -0.50442808 -0.13527673
[2,] -0.20715974 -0.29498142
[3,]  1.40283748 -1.30334876
[4,]  0.06345755 -0.62755613
[5,]  0.11635896  2.33864121
[6,]  1.54355849 -0.03367351

Сравнение времени выполнения между двумя функциями

 benchmark(f1 = silhouette(as.integer(cluster), dist = dist(df)),
           f2 = get_Silhouette(y = df, mem = cluster))
  test replications elapsed relative user.self sys.self user.child sys.child
1   f1          100   15.16    1.902     13.00     1.64         NA        NA
2   f2          100    7.97    1.000      7.76     0.00         NA        NA

Сравнение использования памяти между двумя функциями

library(pryr)
object_size(silhouette(as.integer(cluster), dist = dist(df)))
73.9 kB
object_size(get_Silhouette(y = df, mem = cluster))
36.6 kB

В заключение clues::get_Silhouette, это сокращает время и память, используемые к тому же.

0 голосов
/ 21 февраля 2019

Вы можете реализовать Silhouette самостоятельно.

Требуется только каждое расстояние дважды , поэтому сохранение всей матрицы расстояний не требуется.Он может работать немного медленнее, потому что он вычисляет расстояния в два раза, но в то же время более высокая эффективность памяти вполне может компенсировать это.

Это все равно займет ДЛИННОЕ время.

Выследует рассмотреть возможность использования только подвыборки (вам действительно нужно учитывать все баллов?), а также альтернативы, такие как упрощенный силуэт, в частности с KMeans ... Вы получаете очень мало с дополнительными данными о такихметоды.Так что вы можете просто использовать подвыборку.

...