【问题标题】:My implementation of k-means gives different results我对 k-means 的实现给出了不同的结果
【发布时间】:2018-04-30 09:30:45
【问题描述】:

我尝试实现 Lloyd 算法,但在我多次运行它之前它看起来不错。有时它给出了我想要的结果,有时它给出了奇怪的中心。 我试图改变条件,使其在收敛时停止,但这无济于事。很抱歉没有将 cmets 翻译成英文,我希望它足够清楚。

我在代码中唯一的随机性是在我的集群为空的情况下,所以我用一个随机点替换它。我不知道发生这种情况时该怎么办。

我看不到问题所在。你能告诉我结果数字可能是什么问题吗?

这是我的代码: (A是一个矩阵,其行是我的点)

% initialization of centroids; further-first method
n=size(A,1);
dim=size(A,2);
centri=zeros(k,dim); %matrix of centroids
for i=1:n
    centri(1,:)=centri(1,:)+A(i,:);
end
centri(1,:)=centri(1,:)/n;
for j=2:k %u svakom koraku postavljamo za centar onu tocku koja je najdalje od centra 1,..j-1
    maks=zeros(1,n);
    %maks(i) je najveca udaljenost te tocke do centra =max d(x(i),c), c centri
    for i=1:n
        dist=zeros(1,j-1);
        for l=1:j-1
            dist(l)=norm(A(i,:)-centri(l,:));
        end
        if(size(dist,2)==1) maks(i)=dist;
        else
            maks(i)=max(dist);
        end
        %maks(i)=0;
        %for l=1:j-1
          %  if(maks(i)<dist(l)) maks(i)=dist(l);
           % end
        %end
    end
    [maksi, ind]=max(maks);
    centri(j,:)=A(ind(1),:);
end

indeksi=zeros(1,n);
for i=1:n 
    indeksi(i)=randi(k,1);
end  
% u centrima je postavljena pocetna inicijalizacija
br_iter=0;
tic

while br_iter<=1000
    br_iter=br_iter+1;

    for i=1:n
        dist=zeros(1,k); % udaljenosti od tocke x do centra j
        for j=1:k
            dist(j)=norm(A(i,:)-centri(j,:));
        end
        [mini, ind]=min(dist); % ind je vektor za koji se poprima minimalna vrijednost
        indeksi(i)=ind(1); % uzmemo prvi po redu
    end
    % sad radimo nove centroide koji su aritmetička sredina svih vektora koji mu pripadaju
    for j=1:k
        centri(j,:)=zeros(1,dim);
        brojac=0;
        for i=1:n
            if indeksi(i)==j 
                centri(j,:)=centri(j,:)+A(i,:);
                brojac=brojac+1;
            end
        end
        if brojac 
            centri(j,:)=centri(j,:)/brojac;
        else
            ind=randi(n, 1);
            centri(j,:)=A(ind,:);
        end
    end
end 
toc
for i=1:n
    plot(A(i,1), A(i,2), '.b');
   if(i==1) hold on;
   end
end

for i=1:k
    plot(centri(i,1), centri(i,2), '+r');
end
hold off

【问题讨论】:

    标签: initialization cluster-analysis k-means centroid


    【解决方案1】:

    不推荐从中心全部为零开始的方法。 在第一次迭代之后,除了一个中心之外,所有中心都将是空的。所以随机性确实对你的结果有影响。

    您显示的结果对于 k-means 来说是典型。它不能保证喜欢最优,但它可能会陷入“局部最优”。

    所以我认为您的代码没有错误。只是开始条件的选择不是很明智,您错误地期望 k-means 总是给出好的结果。

    【讨论】:

    • 将它们设置为零只是变量的初始化。我使用进一步优先的方法初始化它们。我通过选择该集群的集群质心作为与中心的距离最大的点并将该点从其分配的集群中删除,从而解决了空集群的问题。但在这种情况下,进行 n*k 次迭代肯定不是最优的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 2013-04-20
    • 1970-01-01
    • 2013-04-22
    • 2020-05-18
    • 2021-04-21
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多