【问题标题】:Cluster histograms using Earth Movers Distance R使用 Earth Mover Distance R 的聚类直方图
【发布时间】:2017-04-02 21:00:48
【问题描述】:

我将数据表示为单个变量的多个不同直方图。我想使用无监督聚类确定哪些直方图相似。我还想知道要使用的最佳集群数量。

我已经阅读了有关 Earth Mover Distance 度量标准作为直方图之间距离度量的信息,但不知道如何在常见的聚类算法中使用它(例如,k 均值)。

Primary:我使用哪些包和函数来聚类直方图?

次要:如何确定“最佳”集群数量?

示例数据集 1(3 个单模式集群):

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

【问题讨论】:

  • EMD 非常昂贵,因此您需要使用下限和索引来加速集群。 K-means 仅适用于 Bregman 散度,我不认为 EMD 是其中之一。

标签: r histogram cluster-analysis k-means


【解决方案1】:

示例数据集 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 指标。因此,虽然计算多个解决方案然后评估它们效率低下,但使用这是我最初的解决方案。

示例数据集 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()

该图显示 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))

quality 的最大增幅再次从 2 个集群增加到 3 个集群。

有人提出了替代方案吗?在我超过 2500 个直方图的实际数据集上计算解决方案需要很长时间。同样,我认为在其他具有多个变量直方图的数据集上可能需要很长时间。

【讨论】:

  • 嗨,Brian,感谢几年后对这个问题的如此有用的回答!我正在尝试测试集群的稳定性。我有 700 个直方图,我正在考虑将这种方法应用于 30% 的数据,然后将该聚类方案应用于整个数据集,然后将整个过程重复两到三遍,以查看每个聚类是否导致相同的分类时间。但我不知道如何将聚类方案应用于另一组数据。有任何想法吗?如果您需要更多说明,或者如果这值得单独提问,请告诉我。
  • 这是一个很好的问题!我建议将此作为一个单独的问题提出。我的第一反应是在返回的对象上使用predict 方法(例如,fit = WH_kmeans(trainMatH, ...); predict(fit, testMatH);。但是,据我所知,包作者还没有实现 predict 方法。我建议在他们的 github 问题上提交问题页面:github.com/Airpino/HistDAWass/issues
猜你喜欢
  • 1970-01-01
  • 2017-12-14
  • 2020-08-23
  • 2019-12-25
  • 2012-08-11
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多