K-означает повторение для тех же данных в 10 раз - PullRequest
0 голосов
/ 29 марта 2020

Я более свеж к R. Попытка оценить, могу ли я получить оптимизацию K-средних (используя R), итеративно вызывая процедуру k-средних для того же набора данных и того же значения для K (то есть, k = 3 в моем случай) 10/15 раз и посмотреть, если может дать мне хорошие результаты. Я вижу изменения кластеризации при каждом вызове, даже общая сумма квадратов и внутренностей начинает меняться, но я не уверен, как остановиться в лучшем случае.

Кто-нибудь может мне помочь?

код:

run_kmeans <- function(xtimes)
{

  for (x in 1:xtimes) 
    {
    kmeans_results <- kmeans(filtered_data, 3) 
    print(kmeans_results["totss"]) 
    print(kmeans_results["tot.withinss"])
  }   
  return(kmeans_results)
}
kmeans_results = run_kmeans(10)

1 Ответ

1 голос
/ 29 марта 2020

Не уверен, что я понял ваш вопрос, потому что это не обычный способ выбора лучшего раздела (метод локтя, метод силуэта и т. Д. c.)

Допустим, вы хотите найти раздел kmeans, который минимизирует сумму квадратов внутри кластера.

Давайте возьмем пример из ?kmeans

x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 2),
           matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 2))
colnames(x) <- c("x", "y")

Вы можете написать, что для повторного запуска kmeans:

xtimes <- 10
kmeans <- lapply(seq_len(xtimes), function(i){
  kmeans_results <- kmeans(x, 3)
})

lapply всегда предпочтительнее for. Вы выводите список. Чтобы извлечь внутри и увидеть, какой из них минимален:

perf <- sapply(kmeans, function(d) as.numeric(d["tot.withinss"]))
which.min(perf)

Однако, если я не понял вашу цель, это странный способ выбрать наиболее эффективный раздел. Обычно это количество кластеров, которое оценивается; не разные разделы, созданные с одинаковыми образцами данных и одинаковым количеством кластеров.

Отредактируйте из своего комментария

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

x <- rbind(matrix(rnorm(100, sd = 0.3), ncol = 3),
           matrix(rnorm(100, mean = 1, sd = 0.3), ncol = 3)
)
colnames(x) <- c("x", "y","z")

combinations <- combn(colnames(x), 2, simplify = FALSE)
kmeans <- lapply(combinations, function(i){
  kmeans_results <- kmeans(x[,i], 3)
})

perf <- sapply(kmeans, function(d) as.numeric(d["tot.withinss"]))
which.min(perf)
...