SD кластеров (k-средних) - PullRequest
       27

SD кластеров (k-средних)

0 голосов
/ 19 февраля 2019

Я пытаюсь выяснить, как получить SD моих кластеров, используя мой анализ k-средних.Я сделал k-средних и получил несколько выходов, один из которых является "центрами", что я предполагаю, означает.Мне нужны стандартные отклонения всех этих центров для представления моих данных, и я не знаю, как их получить?

#kmeans
resultspoorT0t <- kmeans(poor_T0v, 3)
resultspoorT0t[["centers"]]

       ALH      BCF      LIN       VAP       VCL      VSL
1 5.130483 12.66909 40.14618  69.78680 146.97313 55.51221
2 3.098673 10.11618 34.38605  29.20927  69.74657 22.70321
3 7.212529 12.98836 41.71680 111.67745 229.73901 92.12502

Я пробовал простую функцию sd(), но это делает одну SD, мне нужна SDдля каждого параметра каждого кластера

#SD
sd(resultspoorT0t$cluster, na.rm = FALSE)
[1] 0.758434

1 Ответ

0 голосов
/ 19 февраля 2019

Давайте предположим, что вы хотите простой круговой SD.Поэтому вам нужно рассчитать расстояние каждой точки от кластера до центра этого кластера.Это евклидово расстояние sqrt (сумма ((x_mean - x) ** 2 + (y_mean - y) ** 2 ...)).Тогда вы можете просто рассчитать расстояния SD для каждого кластера.Код:

# Some fake data
set.seed(2222)
df <- matrix(rnorm(6 * 50), 50)
colnames(df) <- letters[1:6]
df <- as.data.frame(df)
k_res <- kmeans(df, 3)

# SD = sd of points distances from cluster center
clusters <- k_res$cluster
centers <- k_res$centers


res_sd <- NULL
for (cl in c(unique(clusters))){
    df_part <- df[clusters == cl, ]

    # Calculate Euclidian distance between 
    # each point (row) and cluster center.
    dist <- sqrt(rowSums((df_part - centers[cl, ]) ** 2))

    # Calculate SD for each column (i.e. SD along each axis)
    sd_s <- apply(df_part - centers[cl, ], 2, sd)
    names(sd_s) <- paste("sd_", colnames(df_part), sep = "")

    res_part <- c(cluster = cl, total_sd = sd(dist), sd_s)
    res_sd <- rbind(res_sd, res_part)
}

res_sd <- as.data.frame(res_sd)
rownames(res_sd) <- res_sd$cluster
...