一、概念介绍
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最后仿真效果展示如下:
五角星代表聚类中心的变化情况,可见收敛的速度还是很快的。