Рассмотрим проблему кластеризации, когда известны истинные метки классов (скажем, g
).
Предположим, p
обозначает прогнозируемые метки кластера (могут быть получены любым подходом кластеризации).
Итак, и g
, и p
разделяют набор данных в некоторых группах, хотя количество групп не обязательно должно быть одинаковым в двух случаях.
Среди этих двух наборов групп в некоторыхслучаи, когда одна группа на g
будет идентична другой группе на p
, хотя их метки в двух случаях могут быть разными.Я хочу узнать количество таких групп, то есть я хочу найти количество случаев, когда метод кластеризации может точно определить класс.
Я понимаю, что это не стандартный способ оценки кластеризации (RandРекомендуется индекс, индекс Данна и т. Д.), Но я заинтересован в этом.Я также понимаю, что это число будет очень маленьким в большинстве реальных данных, может быть даже 0
, но набор данных, с которыми я сейчас работаю, имеет большое количество (около 1500) классов с наибольшим количеством наблюдений.в одном классе не более 15. Таким образом, в этом случае это число, вероятно, будет довольно большим.
Вот воспроизводимый пример и моя попытка (работа) по решению:
# true labels
g <- c(1, 1, 2, 2, 2, 1, 3, 3, 3, 4)
# predicted labels
p <- c(3, 3, 1, 1, 1, 3, 4, 4, 1, 2)
# correctly detected groups
n_correct <- 2 # (1st class and 3rd cluster), (4th class and 2nd cluster)
# attempt
distinct_class_labels <- unique(x = g)
counter <- 0
for (i in seq_along(along.with = distinct_class_labels))
{
cluster_labels_of_obs_in_ith_class <- subset(x = p,
subset = (g == distinct_class_labels[i]))
unique_cluster_labels_of_obs_in_ith_class <- unique(x = cluster_labels_of_obs_in_ith_class)
if (length(x = unique_cluster_labels_of_obs_in_ith_class) == 1)
{
class_labels_of_obs_in_this_cluster <- subset(x = g,
subset = (p == unique_cluster_labels_of_obs_in_ith_class))
if (length(x = unique(x = class_labels_of_obs_in_this_cluster)) == 1)
{
counter <- (counter + 1)
}
}
}
counter
#> [1] 2
Создано в 2019-05-22 с помощью пакета Представить (v0.3.0)
Это работает правильно, но требует времени (а я неткак этот метод).Я полагаю, можно использовать dplyr::group_by
с обоими g
и p
по отдельности и как-то сравнивать группы этих двух объектов.Я думаю, что есть и другие лучшие подходы к этому, и я буду очень признателен за такие ответы.
Спасибо.