R,按值划分空间聚类

时间:2017-05-25 15:43:46

标签: r optimization cluster-analysis spatial

我有这个简单的数据集。数据集是假设的地理单位(即邮政编码),有3个变量:经度,纬度和某些价值(销售)。

lon<-rep(1:10,each=10) lat<-rep(1:10,10) someValue<-rnorm(100, mean = 20, sd = 5) dataset<-data.frame(lon,lat,someValue)

我面临的问题是领土对齐。鉴于建议的领土数量,我需要将邮政编码分组到地区,使得地区由相邻的邮政编码组成,并且某些值的总和大致相同(指定领土数量的平均值的+/- 15%) )

我现在最好的想法是:1。首先在lon / lat上进行聚类以建立候选者; 2.使用步骤1中心的质心对someValue进行聚类,作为iter.max = 1的中心; 3迭代超过1和2直到收敛截止。

我想问一下社区:在R中实现类似这样的东西的适当方法是什么?我确实搜索了空间聚类,但无法找到任何相关的内容

1 个答案:

答案 0 :(得分:1)

只需考虑前两列(x和y),就可以使用kmeans进行聚类:

#How Many cluster do you want to have initially?
initialClasses <- 2

#clustering using kmeans
initClust            <- kmeans(dataset[,1:2], initialClasses, iter.max = 100)
dataset$classes <- initClust$cluster

initClust$cluster然后包含您的群集类。您可以将它们添加到数据框中,并使用dplyr计算一些统计信息。例如,每个群集someValue的总和:

library(dplyr)
statistics      <- dataset %>% group_by(classes) %>%summarize(sum=sum(someValue))

这里举例说明someValue超过两个类的总和:

  classes      sum
    (int)    (dbl)
1       1 975.7783
2       2 978.9166

我们假设您的数据是均匀分布的,并且您希望每个群集的某些值的总和更小。然后,您需要使用更多(即3个)类重新运行聚类:

newRun            <- kmeans(dataset[,1:2], 3, iter.max = 100)
dataset$classes <- newRun$cluster

这里有三个类的输出统计信息:

  classes      sum
    (int)    (dbl)
1       1 577.6573
2       2 739.9668
3       3 637.0707

通过将其包装在循环中并计算更多条件(即方差),您可以将聚类调整为正确的大小。希望它有所帮助。