Получение индекса ближайших данных к центриодам в кластерах Kmeans в MATLAB - PullRequest
4 голосов
/ 09 декабря 2010

Я делаю кластеризацию с использованием K-средних в MATLAB.Как вы, возможно, знаете, использование приведено ниже:

[IDX,C] = kmeans(X,k)

, где IDX дает номер кластера для каждой точки данных в X, а C - центроиды для каждого кластера. Мне нужно получить индекс (номер строкив фактическом наборе данных X) ближайшей точки данных к центроиду.Кто-нибудь знает, как я могу это сделать?Спасибо

Ответы [ 3 ]

5 голосов
/ 09 декабря 2010

«Подход грубой силы», как упоминается @ Dima , будет выглядеть следующим образом

%# loop through all clusters
for iCluster = 1:max(IDX)
    %# find the points that are part of the current cluster
    currentPointIdx = find(IDX==iCluster);
    %# find the index (among points in the cluster)
    %# of the point that has the smallest Euclidean distance from the centroid
    %# bsxfun subtracts coordinates, then you sum the squares of
    %# the distance vectors, then you take the minimum
    [~,minIdx] = min(sum(bsxfun(@minus,X(currentPointIdx,:),C(iCluster,:)).^2,2));
    %# store the index into X (among all the points)
    closestIdx(iCluster) = currentPointIdx(minIdx);
end

Чтобы получить координаты точки, ближайшей к центру кластера k, используйте

X(closestIdx(k),:)
1 голос
/ 09 декабря 2010

Метод грубой силы заключается в том, чтобы запустить k-средних, а затем сравнить каждую точку данных в кластере с центроидом и найти ближайшую к нему точку.Это легко сделать в Matlab.

С другой стороны, вы можете попробовать алгоритм кластеризации k-medoids , который дает вам точку данных в качестве «центра» каждогокластер.Вот реализация matlab .

0 голосов
/ 12 декабря 2016

На самом деле, kmeans уже дает вам ответ, если я вас правильно понимаю:

[IDX,C, ~, D] = kmeans(X,k); % D is the distance of each datapoint to each of  the clusters
[minD, indMinD] = min(D); % indMinD(i) is the index (in X) of closest point to the i-th centroid
...