Получение индекса ближайшей точки данных к центридам в кластеризации Kmeans в MATLAB

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

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

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


person Hossein    schedule 09.12.2010    source источник


Ответы (3)


"Подход грубой силы", как упоминается в @ 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),:)
person Jonas    schedule 09.12.2010

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

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

person Dima    schedule 09.12.2010

Собственно, 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
person Yishai E    schedule 12.12.2016