2016-11-18 2 views
1

У меня есть данные, представленные в виде нескольких разных гистограмм одной переменной. Я хотел бы определить, какие гистограммы похожи, используя неконтролируемую кластеризацию. Я также хотел бы знать оптимальное количество используемых кластеров.Гистограммы кластеров с использованием сдвигов Земли. R

Я ознакомился с метрикой расстояний между мишенями Земли и расстоянием между гистограммами, но не знаю, как использовать это в общих алгоритмах кластеризации (например, k означает).

Primary: Какие r пакетов и функций я использую для группировки гистограмм?

Вторичный: Как определить «оптимальное» количество кластеров?

Пример набор данные 1 (3 Uni-модальные кластеры):

v1 <- rnorm(n=100, mean = 10, sd = 1) # cluster 1 (around 10) 
v2 <- rnorm(n=100, mean = 50, sd = 5) # cluster 2 (around 50) 
v3 <- rnorm(n=100, mean = 100, sd = 10) # cluster 3 (around 100) 
v4 <- rnorm(n=100, mean = 12, sd = 2) # cluster 1 
v5 <- rnorm(n=100, mean = 45, sd = 6) # cluster 2 
v6 <- rnorm(n=100, mean = 95, sd = 6) # cluster 3 

Пример набор данные 2 (3 би-модальные кластеры):

b1 <- c(rnorm(n=100, mean=9, sd=2) , rnorm(n=100, mean=200, sd=20)) # cluster 1 (around 10 and 200) 
b2 <- c(rnorm(n=100, mean=50, sd=5), rnorm(n=100, mean=100, sd=10)) # cluster 2 (around 50 and 100) 
b3 <- c(rnorm(n=100, mean=99, sd=8), rnorm(n=100, mean=175, sd=17)) # cluster 3 (around 100 and 175) 
b4 <- c(rnorm(n=100, mean=12, sd=2), rnorm(n=100, mean=180, sd=40)) # cluster 1 
b5 <- c(rnorm(n=100, mean=45, sd=6), rnorm(n=100, mean=80, sd=30)) # cluster 2 
b6 <- c(rnorm(n=100, mean=95, sd=6), rnorm(n=100, mean=170, sd=25)) # cluster 3 
b7 <- c(rnorm(n=100, mean=10, sd=1), rnorm(n=100, mean=210, sd=30)) # cluster 1 (around 10 and 200) 
b8 <- c(rnorm(n=100, mean=55, sd=5), rnorm(n=100, mean=90, sd=15)) # cluster 2 (around 50 and 100) 
b9 <- c(rnorm(n=100, mean=89, sd=9), rnorm(n=100, mean=165, sd=20)) # cluster 3 (around 100 and 175) 
b10 <- c(rnorm(n=100, mean=8, sd=2), rnorm(n=100, mean=160, sd=30)) # cluster 1 
b11 <- c(rnorm(n=100, mean=55, sd=6), rnorm(n=100, mean=110, sd=10)) # cluster 2 
b12 <- c(rnorm(n=100, mean=105, sd=6), rnorm(n=100, mean=185, sd=21)) # cluster 3 
+0

EMD очень дорогой, поэтому для ускорения кластеризации вам необходимо использовать нижние границы и индексы. K-означает, что работает только для расхождений Bregman, и я не думаю, что EMD - это одно. –

ответ

1

Кластеризация Раствор для примера Dataset 1:

library(HistDAWass) 

# create lists of histogram distributions 
lod<-vector("list",6) 
lod[[1]] <- data2hist(v1, type = "regular") 
lod[[2]] <- data2hist(v2, type = "regular") 
lod[[3]] <- data2hist(v3, type = "regular") 
lod[[4]] <- data2hist(v4, type = "regular") 
lod[[5]] <- data2hist(v5, type = "regular") 
lod[[6]] <- data2hist(v6, type = "regular") 

# combine separate lists into a matrix of histogram objects 
mymat <- new("MatH", nrows=6, ncols=1, ListOfDist=lod, names.rows=c(1:6), names.cols="density") 

# calculate clusters pre-specifying number of clusters (k) 
WH_kmeans(mymat, k=3) 

# the output of this gives the expected 3 clusters 

Кластерное решение для примерного набора данных 2:

lod<-vector("list",12) 
lod[[1]] <- data2hist(b1, type = "regular") 
lod[[2]] <- data2hist(b2, type = "regular") 
lod[[3]] <- data2hist(b3, type = "regular") 
lod[[4]] <- data2hist(b4, type = "regular") 
lod[[5]] <- data2hist(b5, type = "regular") 
lod[[6]] <- data2hist(b6, type = "regular") 
lod[[7]] <- data2hist(b7, type = "regular") 
lod[[8]] <- data2hist(b8, type = "regular") 
lod[[9]] <- data2hist(b9, type = "regular") 
lod[[10]] <- data2hist(b10, type = "regular") 
lod[[11]] <- data2hist(b11, type = "regular") 
lod[[12]] <- data2hist(b12, type = "regular") 

mymat2 <- new("MatH", nrows=12, ncols=1, ListOfDist=lod, names.rows=c(1:12), names.cols="density") 

WH_kmeans(mymat2, k=3) 

# the output of this also gives the expected 3 clusters 

Определение «Оптимальное» количество кластеров:

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

Оптимальные кластеры для примера Dataset 1:

df = data.frame() 
for(i in 2:5) { 
    df = rbind(df, data.frame(n_clust = i, quality = WH_kmeans(mymat, k=i)$quality)) 
} 

ggplot(df, aes(x=n_clust, y=quality)) + geom_point(size=4) + geom_line() 

Example 1 Optimality plot

График показывает явное увеличение "качество" между 2 и кластерами 3 кластерами и небольшим улучшением над 3 кластерами. Поэтому я выбираю 3 как «оптимальный». Это имеет смысл, так как я создал исходный пример данных, чтобы иметь 3 кластера.

Например 2:

df2 = data.frame() 
for(i in 2:11) { 
    df2 = rbind(df2, data.frame(n_clust = i, quality = WH_kmeans(mymat2, k=i)$quality)) 
    # this loop errors out after k=6 for me but the answer is already clear. 
} 

ggplot(df2) + geom_line(aes(x=n_clust, y=quality)) 

Example 2 Optimality Plot

Еще раз наибольший рост quality составляет от 2 до 3 кластеров кластеров.

Кто-нибудь предложил альтернативы? Это занимает очень много времени, чтобы вычислить решения на моем фактическом наборе данных из более чем 2500 гистограмм. Аналогично, я бы предположил, что это может занять слишком много времени на других наборах данных, которые имеют гистограммы для нескольких переменных.

Смежные вопросы