Как найти медоид набора в MATLAB

Я пытаюсь вычислить medoid в Matlab. Однако я не знаю, как это сделать. Мой набор данных состоит из нескольких точек трехмерных данных (таким образом, облако точек в системе с тремя осями). Медоид — это точка, «средняя непохожесть которой на все остальные объекты кластера минимальна» (википедия).

Кто-нибудь знает, как рассчитать медоид в Matlab?


Кстати: насколько мне известно, алгоритм k-medoid нельзя использовать для расчета медоида (эффективно), поэтому я ищу другой способ.


person Community    schedule 22.02.2012    source источник


Ответы (1)


Это не должно быть сложно сделать после того, как вы предоставите метрику. Вот реализация для скаляров:

     function m = medoid(set,metric)
          [X,Y] = meshgrid(set,set); %Create all possible pairs
          dist = metric(X,Y);  %Run metric

          %Each distance is calculated twice, that doesn't matter. 
          %Also addition of zeros doesn't matter because we are looking for minimum.
          totalDist = mean(dist,1); 

          [~,i] = min(totalDist);
          m = set(i);
     end

И вариант использования:

metric = @(x,y) ( abs(x-y));
m = medoid([1 2 3 3 3 3 3], metric)

Вы можете распространить его на векторы, я оставлю это в качестве упражнения для читателя. (Или кто-то, кто хочет добавить улучшенный ответ).

person Andrey Rubshtein    schedule 22.02.2012
comment
В вашем примере вы используете данные 1d, верно? Как это будет работать для 3D-данных (со значениями x, y, z)? - person ; 22.02.2012
comment
@SamuelKiely, это не сработает. Я написал это, чтобы дать общее направление. - person Andrey Rubshtein; 22.02.2012