3

我想根据预先确定的中心点 (my_center_Points) 对经纬度列表 (my_long_lats) 进行分组。

当我跑步时:-

k <- kmeans(as.matrix(my_long_lats), centers = as.matrix(my_center_Points))

k$centers 不等于my_center_Points。

我假设 k-means 已将我的中心点调整为最佳中心。但我需要的是 my_center_Points 不改变并将 my_long_lats 分组在它们周围。

在此链接 中,他们讨论了设置初始中心,但是如何设置运行 k 均值后不会改变的中心?或者有更好的聚类算法吗?

我什至可以满足于最小化中心的移动。

我在 R 中还有很多东西要学,非常感谢任何帮助。

4

2 回答 2

4

centerskmeans在执行聚类后自动评估。实际上,确定centers是划分集群组的关键点。我认为有几个选项可以帮助你。

  1. 限制iter.max。您可以将其设置为仅1kmeans函数调用中。这不能保证中心保持固定,但如果您处理大型数据集,更改会更少。

  2. 使用虚拟数据。dummy您可以在 selected 周围的实际数据集中添加许多数据centers。这将使预先确定的额外权重centers。很可能centers将保持不变。

于 2017-12-27T22:24:20.003 回答
3

这是使用geosphere库正确计算纬度和经度距离的计算。

变量closestcenter是标识离每个点最近的中心的结果。

#define random data
centers<-data.frame(x=c(44,44, 50, 50), y=c(44, 50, 44, 50))
pts<-data.frame(x=runif(25, 40, 55), y=runif(25, 40, 55))

#allocate space
distance<-matrix(-1, nrow = length(pts$x), ncol= length(centers$x))

library(geosphere)
#calculate the dist matrix - the define centers to each point
#columns represent centers and the rows are the data points
dm<-apply(data.frame(1:length(centers$x)), 1, function(x){ replace(distance[,x], 1:length(pts$x), distGeo(centers[x,], pts))})

#find the column with the smallest distance
closestcenter<-apply(dm, 1, which.min)

#color code the original data for verification
colors<-c("black", "red", "blue", "green")
plot(pts , col=colors[closestcenter], pch=19) 
于 2017-12-28T00:27:12.313 回答