因此,我和其他一些同事开发了一种分层聚类算法,基本上可以根据特定城市(如伦敦市(找到涉及农业产业的主要集群。。我们在R中构造了这个算法。它运行得很好。因此,根据我们在算法中插入的过滤器,我们能够生成6个伦敦城市的聚类场景。例如,第一个场景生成2个集群,第二个场景生成5个集群,依此类推。因此,我希望得到一些关于如何选择最合适的集群的帮助。我看到有一些包在这个过程中有帮助,比如pvclust
,但我无法将其用于我的案例。我在下面插入一个简短的可执行代码来展示我想要的东西的本质。
欢迎任何帮助!如果你知道如何使用另一个包,请随意描述。
谨致问候。
library(rdist)
library(geosphere)
library(fpc)
df<-structure(list(Industries = c(1,2,3,4,5,6),
+ Latitude = c(-23.8, -23.8, -23.9, -23.7, -23.7,-23.7),
+ Longitude = c(-49.5, -49.6, -49.7, -49.8, -49.6,-49.9),
+ Waste = c(526, 350, 526, 469, 534, 346)), class = "data.frame", row.names = c(NA, -6L))
df1<-df
#clusters
coordinates<-df[c("Latitude","Longitude")]
d<-as.dist(distm(coordinates[,2:1]))
fit.average<-hclust(d,method="average")
clusters<-cutree(fit.average, k=2)
df$cluster <- clusters
> df
Industries Latitude Longitude Waste cluster
1 1 -23.8 -49.5 526 1
2 2 -23.8 -49.6 350 1
3 3 -23.9 -49.7 526 1
4 4 -23.7 -49.8 469 2
5 5 -23.7 -49.6 534 1
6 6 -23.7 -49.9 346 2
>
clusters1<-cutree(fit.average, k=5)
df1$cluster <- clusters1
> df1
Industries Latitude Longitude Waste cluster
1 1 -23.8 -49.5 526 1
2 2 -23.8 -49.6 350 1
3 3 -23.9 -49.7 526 2
4 4 -23.7 -49.8 469 3
5 5 -23.7 -49.6 534 4
6 6 -23.7 -49.9 346 5
>
也许可以尝试这样的方法(注意,我不确定这种方法的数学严谨性(:
library(tidyverse)
library(geosphere)
clustered_df <-
df %>%
arrange(Latitude, Longitude) %>%
mutate(
dist_diff = c(0, geosphere::distVincentyEllipsoid(cbind(.$Latitude, .$Longitude))),
separate_clust = dist_diff > median(dist_diff[-1]),
cluster_no = 1 + cumsum(separate_clust)
) %>%
select(Industries, Longitude, Latitude, Waste, cluster_no))
library(leaflet)
leaflet(clustered_df) %>%
addTiles() %>%
addAwesomeMarkers(lat=~Latitude, lng = ~Longitude, label=~as.character(cluster_no))