2012-06-18 17 views
4

我正在寻找一些算法,例如用于按照距离将地图上的点分组为固定数量的一些算法。 组数已经决定了,但是技巧部分(至少对我来说)是要符合每个组的MOS总和应该在一定范围内的标准,比如说大于1.是否有任何方法可以使发生?用最小尺寸度量的K-means算法变异

ID MOS   X  Y 

1 0.47 39.27846 -76.77101  
2 0.43 39.22704 -76.70272  
3 1.48 39.24719 -76.68485  
4 0.15 39.25172 -76.69729  
5 0.09 39.24341 -76.69884 

回答

3

我对你的问题很感兴趣,但不确定如何将某种随机过程引入到分组算法中。似乎kmeans算法确实给出了不同的结果,如果你排列你的数据集(例如行的顺序)。我发现这一点的信息here。以下脚本用一组随机数据演示了这一点。该图以黑色显示原始数据,然后通过排列(颜色)将一个段绘制到每个聚类的中心。

由于我不确定您的MOS变量是如何定义的,我在数据框中添加了一个随机变量来说明如何寻找满足给定条件的聚类。计算每个群集的MOS总和,并将结果存储在MOS.sums对象中。为了重现有利的聚类,您可以使用用于排列的随机种子值,该值存储在种子对象中。你可以看到排列结果是几个不同的聚类:

set.seed(33) 
nsamples=500 
nperms=10 
nclusters=3 

df <- data.frame(x=runif(nsamples), y=runif(nsamples), MOS=runif(nsamples)) 

MOS.sums <- matrix(NaN, nrow=nperms, ncol=nclusters) 
colnames(MOS.sums) <- paste("cluster", 1:nclusters, sep=".") 
rownames(MOS.sums) <- paste("perm", 1:nperms, sep=".") 

seeds <- round(runif(nperms, min=1, max=10000)) 

    plot(df$x, df$y) 
COL <- rainbow(nperms) 
for(i in seq(nperms)){ 
    set.seed(seeds[i]) 
    ORD <- sample(nsamples) 
    K <- kmeans(df[ORD,1:2], centers=nclusters) 
    MOS.sums[i,] <- tapply(df$MOS[ORD], K$cluster, sum) 
    segments(df$x[ORD], df$y[ORD], K$centers[K$cluster,1], K$centers[K$cluster,2], col=COL[i]) 
} 
seeds 
MOS.sums 

enter image description here