Как указать метрику расстояния для Kmeans в R? - PullRequest
13 голосов
/ 23 сентября 2011

Я делаю кластеризацию kmeans в R с двумя требованиями:

  1. Мне нужно указать свою собственную функцию расстояния, теперь это коэффициент Пирсона.

  2. Я хочу сделать кластеризацию, которая использует среднее число членов группы в качестве центроидов, а не какой-то фактический член.Причина этого требования в том, что я думаю, что использование среднего в качестве центроида имеет больше смысла, чем использование фактического члена, поскольку члены всегда находятся не рядом с реальным центроидом.Пожалуйста, исправьте меня, если я ошибаюсь в этом.

Сначала я попробовал функцию kmeans в пакете stat, но эта функция не позволяет использовать метод произвольного расстояния.

Тогда я нашел pam функцию в пакете cluster.Функция pam позволяет использовать пользовательскую метрику расстояния, принимая в качестве параметра объект dist, но мне кажется, что при этом она принимает действительные элементы в виде центроидов, что не является тем, чего я ожидаю.Поскольку я не думаю, что он может выполнять все вычисления расстояния только с помощью матрицы расстояний.

Так есть ли в R простой способ сделать кластеризацию kmeans, которая удовлетворяет обоим моим требованиям?

1 Ответ

17 голосов
/ 23 сентября 2011

Проверьте пакет flexclust:

Основная функция kcca реализует общую структуру для Кластерный анализ k-центроидов, поддерживающий произвольные измерения расстояния и вычисление центроида.

В пакет также входит функция distCor:

R> flexclust::distCor
function (x, centers) 
{
    z <- matrix(0, nrow(x), ncol = nrow(centers))
    for (k in 1:nrow(centers)) {
        z[, k] <- 1 - .Internal(cor(t(x), centers[k, ], 1, 0))
    }
    z
}
<environment: namespace:flexclust>
...