难以理解Matlab中的以下代码来计算两点之间的欧几里德距离,其中X是要分类的数据,标签对应于聚类成员。
label = ones(1, data_dim);
[N,~]=size(X);
[c,~]=size(clusters);
dist = zeros(N,c);
for i = 1:c
dist(:,i) = sum(bsxfun(@minus, X, clusters(i,:)).^2, 2);
end
[~,label] = min(dist,[],2);
任何人都可以解释这里发生了什么,也许可以在不使用bsxfun
的情况下从第一原则解释它吗?
答案 0 :(得分:1)
for
循环遍历clusters
中的每一行。每行可能是该群集中一个点的坐标。 bsxfun(@minus, X, clusters(i,:)
从X中的每一行中减去该特定群集行。换句话说,它会输出一个矩阵,其中第一行为X(1,:) - clusters(i,:)
,第二行为X(2,:) - clusters(i,:)
,等等。这就像从X
中的每个点到特定群集点i
的方向向量。.^2
),然后沿着每一行(sum(...,2)
)求和。这将为您提供一个列向量,其中包含从X
中的每个点到群集点的欧几里德距离的平方。这存储在矩阵'dist'中,因此它包含从X中的每个点到clusters
min(dist,[],2)
命令在dist
的每列上找到这些值的最小值,即它找到x
中每个点的最小距离。但是,忽略实际值,而是将索引存储在label
中 - 此索引对应于具有最小距离的群集