【机器学习】K-means算法详解

一、算法简介

K-means算法是用来解决著名的聚类问题的最简单的非监督学习算法之一,是很典型的基于距离的聚类算法。该算法采用距离作为相似性的评价指标。即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。

k-means算法特点在于:同一聚类的簇内的对象相似度较高;而不同聚类的簇内的对象相似度较小。

二、算法步骤

  1. 从所有的观测实例中随机取出k个观测点,作为聚类的中心点;然后遍历奇遇的观测点找到各自距离最近的聚类中心点,并将其加入该聚类中。这样,我们便有了一个初始的聚类结果,这是一次迭代过程。
  2. 每个聚类中心都至少有一个观测实例,这样,我们便可以求出每个聚类的中心点,作为新的聚类中心(该聚类中所有实例的均值),然后再遍历其他所有的观测点,找到距离其最近的中心点,并加入到该聚类中。
  3. 如此重复步骤2,直到前后两次迭代得到的聚类中心点不再发生变化为止。

该算法旨在最小化一个目标函数——误差平方函数(所有的观测点与其中心点的距离之和)。

在这里插入图片描述

经过实验可见如下的迭代过程:
在这里插入图片描述

K-means算法的特点是:

  • 初始质心点通常是随机选取的
  • 不同的初始质心可能产生的聚类不同
  • 质心是一个簇中点的平均值
  • 度量使用Euclidean欧几里得距离, cosine 相似度量, 相关性度量等.
  • 对上述一般的相似性度量,K-means都会收敛
  • 大多数经过前几次迭代就能收敛
  • 通常终止条件是 簇中的点变化很少时
  • 时间复杂度为 O( nKId )
    – n = 点的个数, K = 聚类的个数,
    – I = 迭代次数, d = 属性个数

三、算法注意点

3.1 初始聚类中心问题解决方法

  1. 多次运行。多次运行,每次选择不同的初始质心,聚类效果和数据集、k有关,不一定达到好的效果
  2. 取样并使用层次聚类技术对它聚类,从层次聚类中提取k个簇,并用这些簇的质心作为初始质心(在下列情况下有效:样本相对小、k相对与样本较小)
  3. 选择分离的质心:即随机选取第一个质心,后面的质心选取应和已经选取的质心距离最远
    可能选在非稠密区
  4. 后处理:对聚类结果进行处理
  5. 使用二分 K-means,它用于对初始化问题不敏感的情况。
    K-means 的变种,可以产生划分或层次聚类
    先将所有的点分裂两个簇,再选择一个继续分裂,直到产生k个簇。
  6. 增量更新质心。可以在点到簇的每次指派之后,增量地更新质心,而不是在所有的点都指派到簇中之后才更新族质心。

3.2 K-means的局限性

  1. 当聚类的大小、密度、形状不同时,K-means 聚类的结果不理想。
  2. 数据集包含离群点时,K-means 聚类结果不理想。
  3. 两个类距离较近时,聚类结果不合理。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.2 改进的K-means算法

上面介绍的k-means 算法是一种非常简单并且使用广泛的聚类算法,但是存在如下局限性:

  • K 值需要预先给定,很多情况下 K 值的估计很困难。
  • K-means 算法对初始选取的聚类中心点很敏感,不同的中心点聚类结果有很大的不同。也就是说,有可能陷入局部最优解。
  • 对离群点敏感,聚类结果易产生误差。
  • 相似性度量的函数不同也会对聚类结果产生影响。

接下来针对 k-means 的缺陷,总结对k-means的改进。从初始中心点的选取、离群点的检测与去除、相似性度量等几个方面进行概括、比较。

具体改进的方式可以参考博客:机器学习(九)-k-means算法及优化和Python

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值