有时我们想知道点的聚类如何随时间变化。例如,假设您的城市具有十年的人口统计属性,并且您对哪些城市是最相似的"最相似的"基于他们每十年的属性。这是一个玩具数据集,说明了这一点:
set.seed(1)
centers <- data.frame(cluster=factor(1:3),
size=c(100, 150, 50),
x1=c(5, 0, -3),
x2=c(-1, 1, -2))
year1 <- centers %>%
group_by(cluster) %>%
do(data.frame(x1=rnorm(.$size[1], .$x1[1]),
x2=rnorm(.$size[1], .$x2[1]),
year="year 1",
stringsAsFactors = F)) %>%
data.frame()
year2 <- centers %>%
group_by(cluster) %>%
do(data.frame(x1=rnorm(.$size[1], .$x1[1]),
x2=rnorm(.$size[1], .$x2[1]),
year="year 2",
stringsAsFactors = F)) %>%
data.frame()
points <- rbind(year1,year2)
我们可以使用以下内容计算每年的kmeans:
kclusters <- points %>%
select(-cluster) %>%
group_by(year) %>%
do(data.frame(., kclust = kmeans(as.matrix(.[,-3]),centers=3)$cluster)) %>%
mutate(kclust = as.character(kclust))
这是由此产生的情节:
ggplot(kclusters) +
geom_point(aes(x1,x2,color=kclust)) +
facet_wrap(~year) +
theme_bw() +
scale_color_viridis_d()
代码按预期工作,但请注意群集ID已更改。它在这里没有太大的区别,因为我正在使用原始的x1和x2绘制聚类,但我的真实例子是制作地图,并使用坐标在空间中绘制点并根据聚类(即位置)着色这一点永远不会改变)。想象一下这几年的情节 - 每年跟踪各个点的集群成员资格变得很难。有没有办法保持ID一致?