如何在 R 中使用归一化权重执行加权 k 均值聚类?

How do I perform weighted k-means clustering with normalized weights in R?

我想探索空间数据——一堆 (x,y) 坐标——以及每个位置的人口。

假设我们用

生成样本数据
set.seed(1337)    
x <- c(runif(25,0,33), runif(25, 33, 67), runif(25, 67, 100))
y <- c(runif(25,0,33), runif(25, 33, 67), runif(25, 67, 100))
coordinates <- scale(cbind(x,y))
weights <- scale(c( rep(5, 40), rep(2,35) ))
this_data <- data.frame(cbind(coordinates,weights))
colnames(this_data) <- c("x", "y", "weights")

那么数据会是这样的

           x          y   weights
1 -1.2490708 -1.0839889 0.9291573
2 -0.8814155 -0.8601006 0.9291573
3 -1.5086446 -1.3284672 0.9291573
4 -1.1373619 -0.9263723 0.9291573
5 -0.6717665 -1.2870855 0.9291573
6 -1.1669900 -0.7871885 0.9291573
...
           x         y   weights
70 0.6288477 1.0054889 -1.061894
71 0.5050766 0.6968253 -1.061894
72 1.6129723 1.1435093 -1.061894
73 1.5478380 0.6823836 -1.061894
74 1.4146971 1.4278767 -1.061894
75 0.9271628 1.3399865 -1.061894

kmeans() 的简单应用产生

fit <- kmeans(coordinates, 3)
plot(x,y, axes = FALSE, col = fit$cluster, pch = fit$cluster, xlab = "", ylab = "")

人口数据可能有数百万人,所以我不想采用频率方法(即为 "weight" 多次复制行)。有没有办法让我仍然可以将 "weight" 变量合并到 k-means 聚类中?这应该得到与图片中不同的结果。

将权重集成到 k-means 中是微不足道的。

但我认为 R 中的开箱即用版本不支持此功能,因此您必须自己编写代码。请注意 R 解释器真的很慢。您使用的 k-means 函数是 Fortran,这就是它如此之快的原因。 flexcluster 可能支持权重,但对其进行基准测试以查看性能有多差。