1. K-Means原理解析

2. K-Means的优化

3. sklearn的K-Means的使用

4. K-Means和K-Means++实现

1. 前言

上一篇博文K-Means原理解析简单清晰的阐述了K-Means的原理和过程。但是还有一些在使用K-Means过程中会遇到的问题,我们本文进行分析和讨论。比如:如何选取初始质心的位置,如何处理距离计算的时候效率低的问题。

2. 选取初始质心的位置

假设我们已经通过上一篇K-Means原理解析确定了质心k的大小,那如何确定k个质心的位置呢?用过K-Means的同学都知道k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心。如果仅仅是完全随机的选择,有可能导致算法收敛很慢。K-Means++算法就是对K-Means随机初始化质心的方法的优化。

K-Means++的对于初始化质心的优化策略也很简单,如下:

  1. 从输入的数据点集合中随机选择一个点作为第一个聚类中心\(\mu_1\).
  2. 对于数据集中的每一个点\(x_i\),计算它与已选择的聚类中心中最近聚类中心的距离.
    \[
    D(x_i) = arg\;min|x_i-\mu_r|^2\;\;r=1,2,...k_{selected}
    \]
  3. 选择一个新的数据点作为新的聚类中心,选择的原则是:\(D(x)\)较大的点,被选取作为聚类中心的概率较大
  4. 重复2和3直到选择出k个聚类质心。
  5. 利用这k个质心来作为初始化质心去运行标准的K-Means算法。

3 处理距离计算效率低

3.1 elkan K-Means

在传统的K-Means算法中,我们在每轮迭代时,要计算所有的样本点到所有的质心的距离,这样会比较的耗时。那么,对于距离的计算有没有能够简化的地方呢?elkan K-Means算法就是从这块入手加以改进。它的目标是减少不必要的距离的计算。那么哪些距离不需要计算呢?

elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。

第一种规律是对于一个样本点\(x\)和两个质心\(\mu_{j1},\mu_{j2}\)。如果我们预先计算出了这两个质心之间的距离\(D(j_1,j_2)\),则如果计算发现\(2D(x,j_1)≤D(j_1,j_2)\),我们立即就可以知道\(D(x,j_1)≤D(x,j_2)\)。此时我们不需要再计算\(D(x,j_2)\),也就是说省了一步距离计算。

第二种规律是对于一个样本点\(x\)和两个质心\(\mu_{j1},\mu_{j2}\)。我们可以得到\(D(x,j_2)≥max\{0,D(x,j_1)-D(j_1,j_2)\}\)。这个从三角形的性质也很容易得到。

利用上边的两个规律,elkan K-Means比起传统的K-Means迭代速度有很大的提高。但是如果我们的样本的特征是稀疏的,有缺失值的话,这个方法就不使用了,此时某些距离无法计算,则不能使用该算法。

3.2 大样本优化Mini Batch K-Means

在统的K-Means算法中,要计算所有的样本点到所有的质心的距离。如果样本量非常大,比如达到10万以上,特征有100以上,此时用传统的K-Means算法非常的耗时,就算加上elkan K-Means优化也依旧。在大数据时代,这样的场景越来越多。此时Mini Batch K-Means应运而生。

顾名思义,Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。

在Mini Batch K-Means中,我们会选择一个合适的批样本大小batch size,我们仅仅用batch size个样本来做K-Means聚类。那么这batch size个样本怎么来的?一般是通过无放回的随机采样得到的。

为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

4. 总结

本文主要介绍的是如何对传统K-Means算法的优化过程,下一篇博文会重点介绍如何用sklearn来使用K-Means,对数据进行聚类。

最新文章

  1. angular input标签只能单向传递数据的问题
  2. SQL Server数据库性能优化(三)之 硬件瓶颈分析
  3. iscroll简单使用说明
  4. java中this关键字
  5. php file_get_contents 绕过
  6. http状态码介绍
  7. Magento架构分析,Magento MVC 设计分析
  8. C++三大库boost、loki、stlport
  9. HDU5087——Revenge of LIS II(BestCoder Round #16)
  10. iOS 网络 -- cocoaPods 安装和使用教程
  11. HDU-1036 Average is not Fast Enough!
  12. NPC
  13. H5前端性能测试总结
  14. java笔记(Idea,Maven):误删maven项目的target的class,怎么再生成target
  15. 第十八节、基于传统图像处理的目标检测与识别(HOG+SVM附代码)
  16. python自动化开发-[第十五天]-jquery
  17. torch随机数 manual_seed
  18. 实战ELK(6)使用logstash同步mysql数据到ElasticSearch
  19. Kafka 0.10 DelayedTaskQueue的用法和实现
  20. ionic+微信js-sdk集成初步融合,在子路由页引入js操作dom节点

热门文章

  1. k8s实战读书笔记
  2. android dialog加载中动画效果
  3. 如何禁用Visual Studio 2013的浏览器链接功能
  4. 【java】详解java多线程
  5. Centos 安装GIT 1.7.1
  6. HTML <video> 标签
  7. Sublime Text增加Build system类型,打造一个全能IDE
  8. How to compare dates in Java
  9. photoshop,钢笔工具锚点类型
  10. AndroidStudio创建项目时一直处于building“project name”gradle project info的解决办法