0

我在 MATLAB 上使用 k-means。要处理有效的集群,它需要进行循环,直到集群位置不再改变。因此,循环超过 10 次迭代是可能的。而且可能需要很长时间。

所以,我想让用户设置迭代。示例:用户输入“3”进行迭代,然后迭代将持续到 3 次迭代。这是迭代过程的片段:

   while 1,
            d=DistMatrix3(data,c);   % calculate the distance 
            [z,g]=min(d,[],2);      % set the matrix g group

            if g==temp,             % if the iteration doesn't change anymore
                break;              % stop the iteration
            else
                temp=g;             % copy the matrix to the temporary variable
            end
            for i=1:k
                f=find(g==i);
                if f                % calculate the new centroid 
                    c(i,:)=mean(data(find(g==i),:),1);
                end
            end
  end

我所知道的是我必须定义一个变量来让用户输入迭代次数。该变量将用于循环/迭代过程。我已经尝试通过删除while 1for i=1:iteration. 但它仍然不能像我想要的那样工作。有人知道怎么做吗?

所有的答案将不胜感激。

谢谢你。

4

1 回答 1

3

你很亲密。for i=1:iteration不起作用的原因是您i在内部循环中使用变量:for i=1:k. 当该内循环完成时,无论外循环在做什么,i都会有一个值。k大多数编译器都会抱怨这样的事情——但默认情况下,Matlab 不会......要解决这个问题,您需要做的就是为外循环使用唯一变量,例如itNum

for itNum = 1:iterationCount  % <<<< new line, ensures at most "iterationCount" iterations
  d=DistMatrix3(data,c); % calculate the distance 
  [z,g]=min(d,[],2);     % set the matrix g group

  if g==temp,            % if the iteration doesn't change anymore
    break;               % stop the iteration
  else
    temp=g;              % copy the matrix to the temporary variable
  end

  for i=1:k
    f=find(g==i);
    if f                 % calculate the new centroid 
      c(i,:)=mean(data(find(g==i),:),1);
    end
  end

end                      % end of for itNum... loop

i顺便说一句,当人们将其用作变量时,这是我的烦恼。Matlab 有一个内置变量i,其值为sqrt(-1). 当您为其分配新值时,它会失去内在价值,这可能会破坏其他一些代码......

风格/效率的另一点:您的代码

        for i=1:k
            f=find(g==i);
            if f                % calculate the new centroid 
                c(i,:)=mean(data(find(g==i),:),1);
            end
        end

通常被认为是低效的。如果可能,请避免使用find; 如果您确实使用它,请确保使用结果。例如(避免find):

for i=1:k
  if any(g==i)
    % calculate the new centroid 
    c(i,:)=mean(data(g==i,:), 1);
  end
end

或者(重新使用 的结果find):

for i=1:k
  f = find(g==i)
    if f
      % calculate the new centroid 
      c(i,:)=mean(data(f,:), 1);
  end
end

其中哪个更有效将取决于...的g大小

于 2013-06-18T04:45:48.200 回答