我编写了一个函数,将训练样例分配给最近的质心,作为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
这里有什么问题?
答案 0 :(得分:4)
这是因为您可能会找到与查询点共享相同距离的多个群集。 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