Как указать метрику расстояния для kmeans в R?

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

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

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

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

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

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


person Derrick Zhang    schedule 23.09.2011    source источник
comment
Вы можете использовать vegan::designdist для создания собственного индекса (также см. vegan::vegdist, если он уже существует). После того, как у вас есть объект dist, вы можете использовать hclust в пакете статистики, чтобы использовать подходящий метод агрегирования.   -  person Roman Luštrik    schedule 23.09.2011
comment
@RomanLuštrik, спасибо за комментарий. Я знаю, как указать метрику расстояния с помощью hclust, но теперь мне нужно знать, как это сделать с помощью kmeans.   -  person Derrick Zhang    schedule 23.09.2011


Ответы (1)


Проверьте пакет 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>
person rcs    schedule 23.09.2011
comment
Спасибо рс! Почему я получаю сообщение об ошибке несовместимого измерения, когда я указываю dist как: family=kccaFamily(dist=function(x, y) { 1 - cor(x,y) })? - person Derrick Zhang; 24.09.2011
comment
Вам нужна функция с аргументами x и centers. См., например, исходный код flexclust::distCor - person rcs; 25.09.2011
comment
Если кто-то не понимает, как использовать distCor, попробуйте: res = kcca(data, 10, family=kccaFamily(dist=distCor)) - person Dolan Antenucci; 07.02.2013
comment
Как новичок в R, мне также потребовалось некоторое время, чтобы выяснить, какие атрибуты есть у res (используйте attributes(res) для определения и attr(res, 'second') для доступа к одному из них. - person Dolan Antenucci; 07.02.2013