我在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 1
删除为for i=1:iteration
。但它仍然不能像我想的那样工作。有谁知道怎么做?
所有答案都将受到赞赏。
谢谢。
答案 0 :(得分: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
...