【问题标题】:how to match the number of elements of matrix used in find function matlab如何匹配查找函数matlab中使用的矩阵元素的数量
【发布时间】:2016-04-20 16:24:39
【问题描述】:

作为 K-means 聚类算法的一部分,我编写了一个函数来将训练示例分配到它们最近的质心。在我看来,尺寸是满意的,并且代码有时可以正确运行。但经常,我得到错误

在赋值 A(:) = B 中,A 和 B 中的元素个数必须是 一样的。

换行

idx(i) = find(dist == value);

这里是代码

function idx = findClosestCentroids(X, centroids)

K = size(centroids, 1);
idx = zeros(size(X,1), 1);
dist = zeros(K, 1);

for i = 1:size(X,1)
   for j = 1:K
       dist(j) = sum((X(i,:) - centroids(j,:)).^2);
   end
   value = min(dist);
   idx(i) = find(dist == value);
end

这里有什么问题?

【问题讨论】:

  • rayryeng 已正确回答您的问题,但您可能有兴趣尝试矢量化方法[~, idx] = min(sum(bsxfun(@minus, X, permute(centroids, [3,2,1])).^2,2),[],3),它可以让您跳过所有循环、预分配和临时矩阵,甚至可以压缩成单行。
  • @Dan 好主意 :)... 已经是深夜了,我没有时间写下矢量化解决方案。这是一个很好的评论。

标签: matlab machine-learning cluster-analysis k-means


【解决方案1】:

这是因为您可能会发现多个集群与查询点的距离相同。 find 将满足布尔条件的 所有 值确定为参数。 idx(i) 表示您正在为idx 数组的位置分配一个单个 值,但find 可能会产生多个值,这会导致您看到的分配错误。

改为使用min 的第二个输出参数,它确定第一次出现最小值的索引,这正是您想要完成的:

function idx = findClosestCentroids(X, centroids)

K = size(centroids, 1);
idx = zeros(size(X,1), 1);
dist = zeros(K, 1);

for i = 1:size(X,1)
   for j = 1:K
       dist(j) = sum((X(i,:) - centroids(j,:)).^2);
   end
   [~,idx(i)] = min(dist); %// Change
end

【讨论】:

    猜你喜欢
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多