K-means cluster

Posted qq_784583650

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K-means cluster相关的知识,希望对你有一定的参考价值。

K - means cluster
1.K均值聚类(迭代算法):
  1. C_center:初始化K个聚类中心
  2. 计算样本集合到C_center的距离(本例使用欧几里德距离)
  3. 按照最近原则进行聚类,如果聚类中心不发生改变,结束
  4. 如果发生改变,得到新的聚类中心->C_center,重复直到收敛
2.使用条件:先验知识知道样本集合能够K分类(才能得到较好的聚类效果),属于无监督学习;
3.优缺点:
  • 算法简单,收敛
  • 选出的每类代表可能并不具有代表性,算法需要进行多次迭代,把所有的数据读入内存中,大量数据可能不适用

4.样例:


训练样本很明显可以分为两类,红蓝点

X = [0,0;1,0;0,1;1,1;2,1;1,2;2,2;3,2;6,6;7,6;8,6;7,7;8,7;9,7;7,8;8,8;9,8;8,9;9,9;];

对样本X进行k_means cluster


5.代码:

--输出:

--output:训练出的K个聚类中心

--输入:

--Cluster:训练样本集合

--K:K聚类

--delta:迭代精度,用于

<span style="font-size:14px;"><span style="font-size:12px;">function [ output ] = K_means( Cluster,K,delta )
%output[nun_tezhen,K]
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
% figure(2);
%精度相同
Cluster = double(Cluster);
[num_test,num_tezhen] = size(Cluster);
%初始化K个聚类中心
C_center = zeros(num_tezhen,K);
for i = 1:K
   C_center(:,i) = Cluster(i,:)';
end

%K个聚类集合
%C_class = zeros(num_test,num_tezhen,K);
C_class = [];
num_train = 1;
flag = 1;

while flag == 1
    %hold all;
    %disp(num_train);
    num_train = num_train + 1;
    %根据聚类中心进行分类,得到每一条记录的类别
    %dist_all size K x num_test
    dist_all = dist(C_center',Cluster');
    [~,dist_min_index] = min(dist_all);

    %将这些记录分别记录到对应的类别中
    %dist_max_index size 1 x num_test
    %C_class size num_test x num_tezhen x K
    %Cluster size num_test x num_tezhen
    new_class_center = zeros(K,num_tezhen);
    for i = 1:K
        for j = 1:num_test
            if dist_min_index(1,j) == i
                 C_class = [C_class;Cluster(j,:)]; 
            end
        end
        new_class_center(i,:) = mean(C_class);
        C_class = [];
    end

    %重新确定聚类中心
    %C_class size num_test x num_tezhen x K
    %C_center size num_tezhen x K
    %mean_class[1 x num_tezhen x K]
    %new_class_center[K x num_tezhen]:代表新的K个聚类中心
    %%mean_class = mean(C_class);
    %%new_class_center = mean_class(1,:,:)';
    dist_center = dist(C_center',new_class_center');
%     disp(C_center);
%     disp(new_class_center);
%     disp(dist_center);

    %是否到达目标
    %dist_center[K x K]
    %new_class_center[K x num_tezhen]
    %C_center[num_tezhen x k]
    %如果有一个不满足条件,那么继续训练
    for i = 1:K
       if dist_center(i,i)>delta
          flag = 0; 
          disp(num_train);
%           disp(dist_center(i,i));
          break;
       end
    end

    %如果所有的都满足条件,输出,结束
    %否则继续训练
    if flag == 1
        output = C_center;
        break;
    else
        C_center = new_class_center';
        %plot(C_center(1,:),C_center(2,:),'bo','MarkerSize',num_train*10);
        flag = 1;
        if num_train > 10
            output = C_center;
            break;
        end
    end

    %while
end

end

</span></span>
<span style="font-size:14px;"><span style="font-size:12px;"></pre></p><p><span style="font-size:14px;">6.测试:</span></p><p><span style="font-size:14px;"></span><pre name="code" class="plain"><span style="font-size:12px;">%用于得到2个聚类中心+测试
close all
X = [0,0;1,0;0,1;1,1;2,1;1,2;2,2;3,2;6,6;7,6;8,6;7,7;8,7;9,7;7,8;8,8;9,8;8,9;9,9;];
[num_test,num_tezhen] = size(X);
%output[nun_tezhen,K]
result = K_means(X,2,0.01);
dist_all = dist(result',X');
[~,dist_min_index] = min(dist_all);
figure(3);
title('分类结果');
for i = 1:num_test
    hold all
    if dist_min_index(1,i) == 1
        plot(X(i,1),X(i,2),'r.');
        text(X(i,1),X(i,2),['(' num2str(X(i,1)) ','  num2str(X(i,2)) ')'])
    else
        plot(X(i,1),X(i,2),'b+');
        text(X(i,1),X(i,2),['(' num2str(X(i,1)) ','  num2str(X(i,2)) ')'])
    end
end

figure(1);
plot(X(:,1),X(:,2),'r.');
hold on 
plot(result(1,:),result(2,:),'b*');
hold on
for i = 1:2
    hold on
    text(result(1, i),result(2,i),['(' num2str(result(1,i)) ','  num2str(result(2,i)) ')'])
end
title('聚类结果');</span></span></span>

7.结果显示


蓝色的点即为训练后的k个中心;


将训练样本进行分类测试,红点代表一类,蓝点代表一类;



以上是关于K-means cluster的主要内容,如果未能解决你的问题,请参考以下文章

K-means:如何选择K(cluster的数目)

[ML L9] Clustering (K-MEANS)

k-means处理图片

解释 K-Means cluster_centers_ 输出

是否可以使用 scikit-learn K-Means Clustering 指定您自己的距离函数?

是否可以使用 scikit-learn K-Means Clustering 指定您自己的距离函数?