5

我在 MATLAB 中使用 K-means 进行一些聚类。如您所知,用法如下:

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

其中 IDX 给出了 X 中每个数据点的簇号,C 给出了每个簇的质心。我需要获取离质心最近的数据点的索引(实际数据集 X 中的行号)。有谁知道我该怎么做?谢谢

4

3 回答 3

5

@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),:)
于 2010-12-09T16:01:36.273 回答
1

蛮力方法是运行 k-means,然后将集群中的每个数据点与质心进行比较,并找到最接近它的那个。这在matlab中很容易做到。

另一方面,您可能想尝试k-medoids聚类算法,它为您提供一个数据点作为每个聚类的“中心”。这是一个matlab实现

于 2010-12-09T15:48:02.667 回答
1

实际上,如果我理解正确的话,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
于 2016-12-12T08:03:27.910 回答