聚类算法(三)--K-means方法

来源:互联网 发布:mac 测量图片尺寸工具 编辑:程序博客网 时间:2024/06/06 03:20

本文主要K-means聚类算法的原理、优缺点及其改进,以及如何用R语言实现K-means聚类算法。

一、概述

K-means是一种较为经典的划分聚类算法,由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。

1.算法原理

k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。这个过程不断重复,直到准则函数收敛。通常,采用平方误差准则,其定义如下:这里写图片描述
这里E是数据库中所有对象的平方误差的总和,p是空间中的点,mi是簇Ci的平均值,E值越小,簇内样本相似度越高。

2.算法步骤

  (1)任意选择k个对象作为初始的簇中心;
  (2)计算每个样本点与各个簇中心的距离,根据距离最近法则确定样本点的簇标记;
  (3)重新计算每个簇的质心;
  (4)重复(2)、(3),直至簇不发生变化或者达到最大迭代次数。

用一张图可以很清楚的看出K-means方法的整个过程,这里k=2。
这里写图片描述

二、优缺点及其改进

1.优点

  • 算法快速、简单,且准确率较高;
  • 对大数据集有较高的效率并且是可伸缩性的;

2.缺点

  • K是事先给定的,这个K值的选定非常难以估计;
  • 聚类结果不能保证是全局最优解,也即容易陷入局部最优解,且聚类结果与初始点的选择关系较大,这样就会导致聚类结果容易不稳定
  • 离群值可能有较大干扰;
  • 不能处理非球形的簇,不能处理不同尺寸、不同密度的簇。

3.如何克服缺点

克服缺点一:

  • 使用层次聚类法对初始样本进行聚类,选取适当的K。
  • 观测样本的散点图:对于二维和三维的样本,可以通过观测数据散点图来确定类的个数。

克服缺点二:

  • 选取多组不同的初始点多跑遍k-means,然后取其中使得平方误差最小的结果。这种策略简单,但是效果可能不好,这取决于数据集和寻找的簇的个数。
  • 取所有点的质心作为第一个点,然后对于每个后继初始质心,选择离已经选取过的初始质心最远的点。使用这种方法,确保了选择的初始质心不仅是随机的,而且是散开的。但是,这种方法可能选中离群点。
  • 在层次聚类的基础上提取K个簇,并用这些簇的质心作为初始质心。该方法通常很有效,但仅对下列情况有效:样本相对较小;K相对于样本大小较小。

克服缺点三:

  • 先行剔除离群值,然后再进行聚类。

克服缺点四:

  • 换用其他的聚类算法(如基于密度方法)。

三、实例

#读取数据集newiris <- iris[,-5]#建模iriskmeans <- kmeans(newiris, centers = 3)#可视化聚类结果,用不同的颜色代表不同的聚类结果,不同的形状代表训练数据集的原始分类情况,并画出各类的中心点plot(newiris[c("Sepal.Length", "Sepal.Width")], col = iriskmeans$cluster, pch = as.integer(iris$Species))  points(iriskmeans$centers[,c("Sepal.Length", "Sepal.Width")], col = 1:3, pch = 8, cex=2)#将聚类结果与源数据集进行比较table(iriskmeans$cluster, iris$Species)

这里写图片描述

这里写图片描述

参考资料:
【1】四种聚类方法之比较
【2】K-means聚类算法
【3】R语言实现聚类分析
【4】使用R完成Kmeans聚类

原创粉丝点击