具有最小尺寸度量的 K-means 算法变化
Posted
技术标签:
【中文标题】具有最小尺寸度量的 K-means 算法变化【英文标题】:K-means algorithm variation with minimum measure of size 【发布时间】:2012-06-20 20:36:31 【问题描述】:我正在寻找一些算法,例如 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】:我对您的问题很感兴趣,但不确定如何将某种随机过程引入分组算法。如果您排列数据集(例如行的顺序),似乎 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
【讨论】:
以上是关于具有最小尺寸度量的 K-means 算法变化的主要内容,如果未能解决你的问题,请参考以下文章