R - Как применить функцию со всеми возможными значениями для указанного аргумента? - PullRequest
0 голосов
/ 21 мая 2019

Я хотел бы применить функцию kmeans к набору данных.

Я запускаю его несколько раз. Я увеличиваю количество центров каждый раз. Для каждого прогона я сохраняю сумму в пределах суммы квадратов в векторе, и я строю итоги в пределах суммы квадратов в зависимости от количества кластеров следующим образом:

# Dummy data
cluster1_x <- rnorm(1000, mean = 3.5, sd = .75)
cluster1_y <- rnorm(1000, mean = 4, sd = 1.13)
cluster1 <- cbind(cluster1_x, cluster1_y)

cluster2_x <- rnorm(1000, mean = 5.2, sd = .75)
cluster2_y <- rnorm(1000, mean = .9, sd = .64)
cluster2 <- cbind(cluster2_x, cluster2_y)

cluster3_x <- rnorm(1000, mean = .68, sd = .86)
cluster3_y <- rnorm(1000, mean = 0.8, sd = 1)
cluster3 <- cbind(cluster3_x, cluster3_y)

df <- rbind(cluster1, cluster2, cluster3)

# To see the dummy clusters
# plot(df, pch = 20) 

# Applying kmeans

# Vector that will be filled with the variance in the clusters
tot.within.sum.square <- rep(NA, 20)

for (nb_center in 1:20){
  tps_start <- Sys.time()
  set.seed(13)
  res.kmeans <- kmeans(df, centers=nb_center, iter.max = 30)
  tot.within.sum.square[nb_center] <- res.kmeans$tot.withinss
  tps_exec <- Sys.time() - tps_start
  print(paste0("Iteration ", nb_center, " : ", tps_exec))
}

plot(1:20, tot.within.sum.square, type = 'b', pch=20)

Я бы хотел повторить этот процесс 4 раза, каждый раз используя другой алгоритм. Существует 4 разных значения: «Хартиган-Вонг», «Ллойд», «Подделка», «МакКуин», поэтому я хочу получить 4 разных вектора длиной 20, по одному вектору для каждого алгоритма. Каждый элемент данного вектора является значением, содержащимся в res.kmeans$tot.withinss. Например, 4-й элемент векторов - это значение, соответствующее итоговой сумме в квадрате пробега kmeans для 4 центров. Я могу скопировать и вставить предыдущий код, но я ищу более элегантный способ достижения результатов.

Я могу получить то, что хочу, используя это:

sapply(algos, function(x) {
  sapply(nb_centers, function(y) kmeans(df, centers = y, algorithm = x))
})

но я не могу сохранить каждый total.withinss из каждой итерации каждого алгоритма в переменной.

Любая помощь будет оценена!

1 Ответ

1 голос
/ 21 мая 2019

Как упоминалось в комментариях @Parfait,

tot.withinss <- sapply(algos, function(x) {
  sapply(nb_centers, function(y) kmeans(df, centers = y, algorithm = x)$tot.withinss)
})

добьется цели!

...