matlab下K-means Cluster 算法实现

一、概念介绍

      K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最有分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。

      K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

  k个初始类聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机的选取任意k个对象作为初始聚类的中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离将每个对象重新赋给最近的簇。当考察完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。如果在一次迭代前后,评价指标J的值没有发生变化,说明算法已经收敛。

二、K-means算法

 它是一种迭代的算法:

      (1) 、首选随机选择k个点作为k个Cluster的重心;

      (2)、计算每个点到各个Cluster重心的距离,将它加入到最近的那个Cluster;

      (3)、重新计算每个Cluster的重心;

      (4)、重复过程2~3,直到各个Cluster重心在某个精度范围内不变化或者达到最大迭代次数。

别看算法简单,很多复杂算法的实际效果或许都不如它,而且它的局部性较好,容易并行化,对大规模数据集很有意义;算法时间复杂度是:O(nkt),其中:n是聚类点个数k是Cluster个数,t是迭代次数。

   以上资料来源于网络摘抄;

三 、matlab下实现K-means Cluster算法,Code如下:

%matlab code
% K-means Cluster
%load data.dat
x_data = 50*rand(1,100);
y_data = 50*rand(1,100);;
% x_data = data(:,1);
% y_data = data(:,2);
data_size = length(x_data);
a = randsample(1:data_size,2);
c1_x = x_data(a(1));
c1_y = y_data(a(1));
c2_x = x_data(a(2));
c2_y = y_data(a(2));
iter = 2;
max_iter = 100;
J_1 = 1;
J_2 = 1;
figure
while J_1>0.1 && J_2>0.1 && iter<max_iter
    c1_xx = 0;
    c1_yy = 0;
    c2_xx = 0;
    c2_yy = 0;  
    c1_num = 0;
    c2_num = 0; 
    for k=1:data_size
        Distance1 = (x_data(k)-c1_x)^2 + (y_data(k)-c1_y)^2 ;
        Distance2 = (x_data(k)-c2_x)^2 + (y_data(k)-c2_y)^2 ;
        if Distance1 > Distance2
            lable(k) = 1;
            c2_xx = c2_xx+x_data(k);
            c2_yy = c2_yy+y_data(k);
            c2_num = c2_num+1;
        else
            lable(k) = 0;
            c1_xx = c1_xx+x_data(k);
            c1_yy = c1_yy+y_data(k);
            c1_num = c1_num+1;
        end
    end
    c1_xx = c1_xx/c1_num;
    c1_yy = c1_yy/c1_num;
    c2_xx = c2_xx/c2_num;
    c2_yy = c2_yy/c2_num;  
    J_1 = (c1_x-c1_xx)^2 + (c1_y-c1_yy)^2 ;
    J_2 = (c2_x-c2_xx)^2 + (c2_y-c2_yy)^2 ;
    c1_x = c1_xx;
    c1_y = c1_yy;
    c2_x = c2_xx;
    c2_y = c2_yy;
    iter = iter+3
    hold on
    plot(c1_x,c1_y,'bp','MarkerSize',iter)
    hold on
    plot(c2_x,c2_y,'mp','MarkerSize',iter)
end

% figure
% plot(c1_x,c1_y,'kp','MarkerSize',iter+2)
% hold on
% plot(c2_x,c2_y,'rp','MarkerSize',iter+2)
for idx = 1:data_size
    if lable(idx) == 1
        hold on
        plot(x_data(idx),y_data(idx),'ro')
    else 
        hold on
        plot(x_data(idx),y_data(idx),'ko')
    end
end
最后仿真效果展示如下:

      五角星代表聚类中心的变化情况,可见收敛的速度还是很快的。



原文地址:https://www.cnblogs.com/cl1024cl/p/6205070.html