Алгоритм группировки точек на карте и кластере должен иметь одинаковую сумму 3-го признака - PullRequest
0 голосов
/ 10 марта 2020

Я ищу алгоритм для группировки точек (43429) на карте (широта / долгота):

latitude longitude expenses

603680.0 2270029.0 272.0

618559.0 2219632.0 385.0 . . .

Однако все кластеры должны иметь одинаковую сумму третьего признака (расходы ).

Алгоритм, подобный kmeans, не создает кластер с одинаковым «весом».

Знаете ли вы алгоритм для этого? Я использовал python или R

Спасибо

1 Ответ

0 голосов
/ 10 марта 2020

Это не идеальное решение, просто грубая сила. То, что вы спрашиваете, - не простая вычислительная проблема (вы можете прочитать об этом: проблема многоканального разбиения ).

вот мое грубое решение R, предполагающее, что ваши данные являются данными кадр:

k <- 3 # define how many clusters you want


#A really simple gleedy clustering algorithm, basically you start each list with an elemnt and add the next element to the lowest scoring list
clustering <- function(df,k){
clusters <- list()
for (r in 1:k) {
clusters[[r]] <- df[r,]
}
for (i in 4:nrow(df)){
  a = data.frame(sum(clusters[[1]]$expenses))
  for (j in 2:k) {
    a = rbind(a,sum(clusters[[j]]$expenses))
  }
  minimo = which.min(a[,1])
  clusters[[minimo]] <- rbind(clusters[[minimo]],df[i,])
}
return(clusters)
}

#calculate the difference between the lowest and highest list
distance <- function(){
  A <- clustering(df,k)
  for (k in 1:k) {
    start <- c(start,sum(A[[k]]$expenses))  
  }
  distance <- max(start) - min(start) 
  return(distance)
}


#repeat the process with a diferent starting point and save the clusters which has the lowest variance
max.distance = distance()
Clusters <- clustering(df,k)
for (i in 2:50) {
df <- slice(df, sample(1:n()))
g=distance()
if (max.distance>g) {
  max.distance <- distance()
  Clusters <- clustering(df,k)
}
}
...