将物理或抽象对象的集合分红由相似的对象组成的多个类的过程即为聚类,通俗的讲,就是“物以类聚,人以群分”
聚类是一种数据探索的分析方法,能够在大量的数据中找到某一种结构。
由聚类生成的簇是一组数据对象的集合,这些对象与同一个簇的对象彼此类似,与其余簇的对象相异。
聚类分析又称群分析,它是研究分类问题的一种统计方法,主要分为如下几种:
划分方法、层次方法、基于密度的方法、基于网格的方法、基于模型的方法
如下总结了划分法K-means的算法原理及步骤:python
随机从数据集中选取K个点,每一个点初始表明每一个簇的聚类中心。计算剩余各个样本到聚类中心的的距离,并将它赋给距离最近的簇,而后从新计算每一簇的平均值,整个过程不断重复(算法迭代),直到相邻两次调整没有明显变化,此时数据聚类造成的簇已经收敛。迭代终止条件也能够是如下任意一个:
a.没有对象被从新分配给不一样的聚类
b.聚类中心再也不发生变化
c.偏差平方和局部最小web
处理流程:
a.从N个数据对象任意选择K个对象做为初始聚类中心
b.循环c,d步骤
c.根据聚类对象的均值,计算每一个对象与这些中心对象的距离。并根据最小距离从新对相应的对象进行划分。
d.从新计算每一个聚类的均值,直到聚类中心再也不变化。使得E式最小
已知20个样本,每一个样本两个特征,对此数据进行分析为例,如下基于MATLAB实现聚类:算法
%% 数据准备和初始化 clc clear x=[0 0;1 0; 0 1; 1 1;2 1;1 2; 2 2;3 2; 6 6;7 6; 8 6; 6 7; 7 7; 8 7; 9 7 ; 7 8; 8 8; 9 8; 8 9 ; 9 9]; z=zeros(2,2); z1=zeros(2,2); z=x(1:2, 1:2); %% 寻找聚类中心 while 1 count=zeros(2,1); allsum=zeros(2,2); for i=1:20 % 对每个样本i,计算到2个聚类中心的距离 temp1=sqrt((z(1,1)-x(i,1)).^2+(z(1,2)-x(i,2)).^2); temp2=sqrt((z(2,1)-x(i,1)).^2+(z(2,2)-x(i,2)).^2); if(temp1<temp2) count(1)=count(1)+1; allsum(1,1)=allsum(1,1)+x(i,1); allsum(1,2)=allsum(1,2)+x(i,2); else count(2)=count(2)+1; allsum(2,1)=allsum(2,1)+x(i,1); allsum(2,2)=allsum(2,2)+x(i,2); end end z1(1,1)=allsum(1,1)/count(1); z1(1,2)=allsum(1,2)/count(1); z1(2,1)=allsum(2,1)/count(2); z1(2,2)=allsum(2,2)/count(2); if(z==z1) break; else z=z1; end end %% 结果显示 disp(z1);% 输出聚类中心 plot( x(:,1), x(:,2),'k*',... 'LineWidth',2,... 'MarkerSize',10,... 'MarkerEdgeColor','k',... 'MarkerFaceColor',[0.5,0.5,0.5]) hold on plot(z1(:,1),z1(:,2),'ko',... 'LineWidth',2,... 'MarkerSize',10,... 'MarkerEdgeColor','k',... 'MarkerFaceColor',[0.5,0.5,0.5]) set(gca,'linewidth',2) ; xlabel('特征x1','fontsize',12); ylabel('特征x2','fontsize',12); title('K-means分类图','fontsize',12);
输出结果及图形分析以下:
由上图结果,聚类效果显著svg
优势: 算法原理简单,处理快 当聚类密集时,类与类之间区别明显,效果好ui
缺点: K是事先给定的,K值选定难肯定 对孤立点、噪声敏感 结果不必定是全局最优,只能保证局部最优。很难发现大小差异很大的簇及进行增量计算结果不稳定,初始值选定对结果有必定的影响计算量大spa
对于K值取值问题能够参考博主SongpingWang的博文,本人以为写的很好,算是良心博主了
附上K值参考及SSE指标分析的博主网址:http://www.javashuo.com/article/p-blshwyjk-mu.html.net