K-means算法的变体,具有最小尺寸度量

4
我正在寻找一些像k-means这样的算法,用于将地图上的点按距离分组为固定数量的组。已经确定了组数,但是关键部分(至少对我来说)是满足每个组的MOS总和应在某个特定范围内,比如大于1。有没有办法实现这一点?
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  
1个回答

3
我对你的问题感到好奇,但不确定如何将某种随机过程引入到分组算法中。似乎kmeans算法确实会在数据集排列不同(例如行的顺序)时给出不同的结果。我在这里找到了这个信息。链接以下脚本演示了如何使用随机数据进行排列,并用每个聚类的中心绘制线段(颜色),其中包括原始黑色数据的图形。
由于我不确定您的MOS变量是如何定义的,因此我已添加了一个随机变量到数据框中,以说明您可能如何查找满足给定条件的聚类。计算每个聚类的MOS总和,并将结果存储在MOS.sums对象中。为了重现有利的聚类,您可以使用用于排列的随机种子值,该值存储在seeds对象中。您可以看到排列结果是几个不同的聚类。
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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接