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

时间:2016-03-22 03:53:47

标签: r cluster-analysis

我想探索空间数据---一堆(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 = "")

人口数据可能在数百万人中,因此我不想做频率方法(即为“重量”多次复制行)。有没有办法让我仍然可以将“权重”变量纳入k-means聚类?这应该得到与图片不同的结果。

1 个答案:

答案 0 :(得分:0)

将重量整合到k-means中是微不足道的。

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