当前位置: 首页 > 知识库问答 >
问题:

使用地球移动器距离R的聚类直方图

臧增
2023-03-14

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

我已经读过关于地球移动者距离度量作为直方图之间距离的度量,但不知道如何在常见的聚类算法中使用它(例如,k均值)。

主:我使用什么r包和函数来聚类直方图?

第二:如何确定集群的“最佳”数量?

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

共有1个答案

楚畅
2023-03-14

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

确定集群的“最佳”数量:

我不确定最好的指标是什么,但是这个包在输出中给出了一个质量指标。因此,虽然计算几个解并对它们进行评估是低效的,但使用这是我的初始解。

最佳群集,例如数据集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))

同样,质量的最大增长是从2个集群增加到3个集群。

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

 类似资料:
  • 问题内容: 我正在使用Android Google Map utils启用标记的群集。我正在用10 当我按下按钮时,我会呼叫: 我的八个标记靠近给定区域,因此它们聚集在一起,我可以看到一个蓝色的球,其中心有数字八。其他两个标记远离另一组,但实际上彼此接近。 我现在看到的是一个带有八个标记的群集,而远处只有一个标记。仅当我放大单个标记(实际上是两个)的区域时,我才能看到两个标记。 我想显示八个标记的

  • 因此,我的文档(帖子)中有一个位置字段。此位置字段是一个地理形状。它可以是一个点或多边形。有时,我可能不得不使用地理距离过滤器来获取标记最接近某个坐标的帖子(仅具有键入地理形状,而不是多边形)。然而,在尝试使用geo_距离过滤器时,我遇到了以下错误。 是否有一种方法可以在类型的地理图形上使用地理距离过滤器?

  • 本文向大家介绍R直方图,包括了R直方图的使用技巧和注意事项,需要的朋友参考一下 示例 直方图允许对数据的基础分布进行伪绘图。

  • 我知道如何开始,也知道如何安装扫描仪和其他东西,但是在学校里,我从来没有真正学习过经纬度公式,以及如何将这些点转换成弧度。所以我几乎被困在这个Java问题上。这是我目前掌握的情况: 在JavaIDE中,他们说经度和纬度点(位于

  • 对于我的一个项目,我目前想构建一个Ionic应用程序,为iOS和Android平台编写一次代码。我正在寻找一种方法来测量两个移动设备之间的距离。一个设备应放置在特定位置,另一个设备应在其进入第一个设备的范围(或更具体地说,第一个设备所在的位置)时被检测到。 位于特定位置的设备1将连接到internet,访问该位置的设备2也是如此。 我已经读过很多不同的实现,但大多数时候它需要Android或iOS

  • 我希望使用Geopandas/Shapely实现ArcPy Generate Near表的等效功能。我对Geopandas和Shapely非常陌生,并且已经开发出一种有效的方法,但我想知道是否有更有效的方法。 我有两个点文件数据集——人口普查街区中心和餐馆。我在寻找每个人口普查街区形心到最近餐馆的距离。同一家餐厅是多个街区最近的餐厅,没有任何限制。 对我来说,这变得有点复杂的原因是因为Geopan

  • 本文向大家介绍写一个方法获取滚动条距离窗口顶部的距离相关面试题,主要包含被问及写一个方法获取滚动条距离窗口顶部的距离时的应答技巧和注意事项,需要的朋友参考一下

  • 我已经实现了一个函数,在运行K-Means聚类算法后,找到距离每个质心最近的数据点。我想知道是否有一个函数可以让我找到距离每个质心最近的M个点。