我在matlab上实现k-means算法而不使用k-means内置函数,停止标准是新的质心不会因新的迭代而改变,但是我无法在matlab中实现它,任何人都可以帮助?
由于
答案 0 :(得分:2)
将no change
设置为停止标准是个坏主意。您应该使用0更改条件的主要原因有几个
a = rand(3,3); b = a*a*inv(a); a-b
理论上这应该是0,但你会发现它不是。因此,仅这些错误可能会阻止您的程序停止a,b vs c
。下一个迭代可能是a vs b,
c下一个可能是a,b vs c
下一个......这当然是一个简化的例子,但是可能存在一些数据点可以在集群之间抖动的情况,你将最终得到一个永无止境的算法。由于重新分配了这几个点,因此更改永远不会为0 解决方案是使用增量阈值。基本上你从前一个中减去当前值,如果它们小于阈值你就完成了。这本身就很强大,但与任何循环一样,您需要一个备份逃生计划。那就是设置一个max_iterations
变量。看一下klaans的matlabs文档,即使它们有一个MaxIter
变量(默认值为100),所以即使你的kmeans没有收敛,至少它也不会无休止地运行。像这样的东西可能会起作用
%problem specific
max_iter = 100;
%choose a small number appropriate to your problem
thresh = 1e-3;
%ensures it runs the first time
delta_mu = thresh + 1;
num_iter = 0;
%do your kmeans in the loop
while (delta_mu > thresh && num_iter < max_iter)
%save these right away
old_mu = curr_mu;
%calculate new means and variances, this is the standard kmeans iteration
%then store the values in a variable called curr_mu
curr_mu = newly_calculate_values;
%use the two norm to find the delta as a single number. no matter what
%the original dimensionality of mu was. If old_mu -new_mu was
% 0 the norm is still 0. so it behaves well as a distance measure.
delta_mu = norm(old_mu - curr_mu,2);
num_ter = num_iter + 1;
end
修改强>
如果您不知道2范数基本上是欧氏距离