В чем разница между stat: kmeans и «наивным» k-means - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь понять, что stat: kmeans делает иначе, чем простая версия, описанная, например, в Википедии.Я, честно говоря, в высшей степени невежественен.

Читая справку по kmeans, я узнал, что по умолчанию используется алгоритм Хартигана-Вонга, а не более базовый метод, поэтому должна быть разница, но я поиграюсь с некоторыми нормальными распределенными переменными.Не удалось найти случай, когда они существенно и предсказуемо отличались.

Для справки, это мой ужасный код, с которым я тестировал

##squre of eudlidean metric
my_metric <- function(x=vector(),y=vector()) {
  stopifnot(length(x)==length(y))
  sum((x-y)^2)
}

## data: xy data
## k: amount of groups
my_kmeans <- function(data, k, maxIt=10) {

  ##get length and check if data lengths are equal and if enough data is provided
  l<-length(data[,1])
  stopifnot(l==length(data[,2]))
  stopifnot(l>k)

  ## generate the starting points
  ms <- data[sample(1:l,k),]

  ##append the data with g column and initilize last
  data$g<-0
  last <- data$g

  it<-0
  repeat{
    it<-it+1
    ##iterate through each data point and assign to cluster
    for(i in 1:l){
      distances <- c(Inf,Inf,Inf)
      for(j in 1:k){
        distances[j]<-my_metric(data[i,c(1,2)],ms[j,])
      }
      data$g[i] <- which.min(distances)

    }

    ##update cluster points
    for(i in 1:k){
      points_in_cluster <- data[data$g==i,1:2]
      ms[i,] <- c(mean(points_in_cluster[,1]),mean(points_in_cluster[,2]))
    }

    ##break condition: nothing changed
    if(my_metric(last,data$g)==0 | it > maxIt){
      break
    }
    last<-data$g
  }

  data
}

1 Ответ

0 голосов
/ 25 июня 2019

Во-первых, это было дублирование (как я только что выяснил) этого поста . Но я все же попытаюсь привести пример: когда кластеры разделены, Ллойд стремится оставить центры внутри кластеров, в которых они начинаются, что означает, что некоторые могут оказаться разделенными, в то время как другие могут быть объединены вместе

...