1.算法简介
K均值算法是经典的基于相似度划分聚簇的算法,其核心思想就是不断通过迭代更新聚簇中心。算法开始之前首先选取K个数据样本作为初始聚簇质心,根据聚簇中心与其他数据样本的距离,依次将其他数据对象划分到距离最近的聚簇质心的类中,划分完毕后,重新选取新的聚簇中心迭代划分,直到达到最大迭代次数或者所有的聚类中心都不在发生改变为止。
k均值聚类算法步骤如下:
输入:聚类数目K和要分类的数据
1.随机从对象集中抽取个对象作为初始聚类中心;
2.对于所有的对象,分别计算其到各个聚类中的欧氏距离,相互比较后将其归属于距离最小的那一类;
3.根据2.得到的初始分类,对每个类别计算均值用来更新聚类中心;
4.根据新的聚类中心,重复进行2.和3.直至满足算法终止条件(迭代达到最大次数或者满足设定的准则函数)。
输出:K个分类结果
流程图:
通常需要一个衡量标准对聚类结果有效性评价,学者们对于聚类有效性进行研究,提出了很多聚类有效性指标来评价聚类结果并确定最佳聚类数
列举几个常见的聚类性能指标进行说明:
DB(Davies-Bouldin)指标
DB 指标是类簇内紧致性和类簇间分离性的非线性组合。因为好的聚类结果要求类簇内的分散度iS 要小,类簇间的距离值要大,因此,DB取最小值时,聚类效果最好。
Sil (Silhouette )指标
聚类结果的优劣一般采用数据集中所有样本的平均 Sil 值进行评估,Sil 指标越大说明聚类效果越好,其范围是[0,1],Sil 值超过 0.5 说明聚类所得到的类簇能够明显区分,低于 0.3 说明一些类簇存在重叠,而 0.2 以下则说明数据集内样本数据没有实质类别区
分。
Calinski-Harabasz(CH)指标
CH 指标基于全部样本数据的类内离差矩阵和类间离差矩阵的测度,其最大值相对应的聚类数目是最佳聚类数。CH 指标不适用于聚类数目是 1 的情况。
在K均值算法中使用均方标准差作为准则函数,这个聚类标准旨在使所获得的聚类有以下特点:各聚类本身尽可能的紧凑,而各聚类之间尽可能的分开。
2.K均值算法的不足
1.聚类数K值选取需要用户判断或使用准则函数确定,不同的K值会得到不同的局部最优结果。一般情况下K值的选择需要通过给定的几个K值进行聚类,并比较结果选择聚类效果最好的K值。
2.初始聚类质心的选取有待商榷,默认的选择方法是随机选取初始质心,然后进行聚类和迭代,最终收敛到最优结果,随机选取初始质心会造成聚类结果的随机性。
3.噪声点和离群点对聚类结果有影响,算法是不断迭代划分数据中心点的,噪声和离群点会干扰中心划分计算。
4.局部最优解问题,只能发现圆形区域,对高维数据效果聚类效果不佳等。
改进算法有兴趣的可以深入了解:模拟退火算法,遗传算法,粒子群算法等。
3.MATALB仿真
两个数据集:
1.Iris数据集是在分类实验时经常用到的一种数据集,分别取自3种不同类型的鸢尾花植物样本,每一类包含50条数据,每个数据包含四种不同的属性,包括花萼长度,花萼宽度,花瓣长度,花瓣宽度,通过这些不同的属性可以预测鸢尾花卉的种属。选用鸢尾花数据的花瓣长度和宽度属性数据。
2.高斯分布数据集
高斯分布也叫正态分布,是一个比较常见的连续概率分布。
先用MATLAB自带的K均值聚类函数试一下
[idx,cen]=kmeans(data,K,'Distance','sqeuclidean','Replicates',5,'Display','Final');
%K要提前给出,sqeuclidean表示采用欧氏距离,Replicates5表示重复5次取一个最优解,可以避免局部最优。
高斯分布,鸢尾花数据同下程序:
% 第一组数据
mu1=[0 0 ]; %均值(需要生成数据的均值)
S1=[.1 0 ;0 .1]; %协方差(需要生成数据的自相关矩阵)
data1=mvnrnd(mu1,S1,100); %产生高斯分布数据
%第二组数据
mu2=[1.25 1.25 ];
S2=[.1 0 ;0 .1];
data2=mvnrnd(mu2,S2,100);
% 第三组数据
mu3=[-1.25 1.25 ];
S3=[.1 0 ;0 .1];
data3=mvnrnd(mu3,S3,100);
% 三类数据合成一个不带标号的数据类
data=[data1;data2;data3];
[u,re]=kmeans(data,K,'Distance','sqeuclidean','Replicates',5,'Display','Final');
[m,n]=size(re);
%最后显示聚类后的数据
figure;
hold on;
gscatter(data(:,1),data(:,2),u,['r','g','b','c','k'])
for i=1:m
if re(i,n)==1
plot(re(i,1),re(i,2),'m*');
else
if re(i,n)==2
plot(re(i,1),re(i,2),'m*');
else
plot(re(i,1),re(i,2),'m*');
end
end
end
hold off
自带的函数初始聚类质心的位置好像是随机的,所以只能先改变K值观察结果再做后续研究。
设置K=2,3,4,5
重复5次取最优:
鸢尾花数据集的分类结果:
高斯分布的分类结果:
不同的类用不同的颜色标注且类的中心点也明显标注出来了,可以看出K=3时,分簇结果较好,也满足没使用K均值分簇之前,我们根据经验来判断合理的分簇结果。
K均值算法改进
实际的数据挖掘和机器学习应用中,K均值算法的初始聚类质心和K值都是难以捉摸的。
在初始聚类质心的选择上,可以使用Kmeans++
K-means++按照如下的思想选取K个聚类中心:假设已经选取了n个初始聚类中心(0<n<K),则在选取第n+1个聚类中心时:距离当前n个聚类中心越远的点会有更高的概率被选为第n+1个聚类中心。在选取第一个聚类中心(n=1)时同样通过随机的方法。
K值选择可以使用大多数人提到的手肘法SSE(sum of the squared errors,误差平方和)
随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。