运用三角不等式加速Kmeans聚类算法


引言:最近在刷《数据挖掘导论》,第九章, 9.5.1小节有提到,可以用三角不等式,减少不必要的距离计算,从而达到加速聚类算法的目的。这在超大数据量的情况下,尤为重要。但是书中并没有给出解释和证明。本文以k-means聚类算法为代表,讲解下怎么利用三角不等式减少计算过程。

三角不等式

任一三角形,两边之和大于第三边,两边之差小于第三边。可以从欧式距离扩展到多维欧几里得空间:设任意三个向量a,b,c。d(x,y)代表x,y在空间上的距离,则三角不等式满足:

\[d(a,b)+d(b,c)\ge d(a,c) , d(a,b) - d(b,c) \le d(a,c)\]

K-means算法

K-mean算法

  1. 随机选择K个数据点作为初始质心
  2. repeat
  3.   计算每一个数据点计算到现有K个质心的距离,将它归属到距离最近质心的所在簇中
  4.   重新计算质心。
  5. until 所有质心不再变动

定义

\[假设存在数据点集 X=\{x_1, x_2,..,x_n\} , 质心的集合C=\{ C_1,C_2,...,C_m\}, 对应的簇集合为S=\{ S_1,S_2,...,S_m\}。\]

三角不等式推出的引理

引理1:

\[设 C_i ,C_j(i\neq j )\in C, x \in X。如果2 d(x,C_i) \le d(C_i,C_j) ,那么d(C_i,x) \le d(C_j,x) 。
\]

引理2:

\[ 设C_i \in C, \exists C_j \in C,使得d(C_i,C_j) = min \ d(C_i,C)。对于数据点x \in X,若有2 d(x,C_i) \le d(C_i,C_j),\
那么min \ d(x,C) = d(C_i,x)。(记d(x,C)是x到所有质心的距离)\]

证明引理1:

因为有 \[2 d(C_i,x) \le d(C_i,C_j) \ (1)\]

且由三角不等式:\[ d(C_i,C_j) \le d(x,C_i) + d(x,C_j) \ (2)\]

所以 \[2 d(C_i,x) \le d(x,C_i) + d(x,C_j),即d(C_i,x) \le d(C_j,x)\]

证明引理2:

运用反证法:

假设 \[ \exists C_k \in C,使得d(C_k,x) < d(C_i,x), \]

由题干有:

\[ d(C_k,C_i) \ge d(C_i,C_j) (1) , d(x,C_i) \le d(C_i,C_j) (2)\]

又因为 \[ d(C_k,x) +d (C_i,x) \ge d(C_k,C_i) (3)\]

所以结合(1)(3):

\[ d(C_k,x) +d (C_i,x) \ge d(C_i,C_j) (4)\]

又由假设:

\[ 2d(C_i,x) > d(C_i,C_j) (5)\]

这与条件中\[2 d(x,C_i) \le d(C_i,C_j)\]相矛盾,所以可知假设不成立。

即 \[min \ d(x,C) = d(C_i,x)\]

运用引理1,引理2减少不必要的距离计算

\[对于每一个C_i,用一个hash表存放与它最近的距离 d(C_i,C_j)。\]

1.如果数据点x已经被分配

\[ 则x与它目前所在簇的质心的距离为d(C_i,x),与d(C_i,C_j)比较。 \\
如果 2 d(C_i,x) \le d(C_i,C_j),则说明不需要更换x的归属。(注意反之: 2 d(C_i,x) \gt d(C_i,C_j)),并不能说明x应该数据 C_j所在的簇,所以还需要继续计算x与每个质心的距离。)\]

2.如果数据点x还未被分配

\[ 则需要遍历计算, \forall C_i \in C, 比较 2 d(C_i ,x) \le d(C_i,C_j)是否成立,若成立,说明x应当归属 C_i ,无需再计算其他距离。\]

改进的K-means算法

K-mean算法

  1. 随机选择K个数据点作为初始质心
  2. repeat
  3.  计算k个质心间的距离,并且用hash表保存每个质心的到其他质心的最短距离。(用d(Ci,Cj)表示质心Ci和它最近质心是Cj的距离)。

    4.  repeat

        对于每个数据点x

        if(数据点x已分配在质心Ci所在簇)

         if 2d(Ci,x) <=d(Ci,Cj)

          x分配无需变动;

         else

          继续计算x到现有K个质心的距离,将它归属到距离最近质心的所在簇中

          end if

        else(数据点x未分配到任何簇)

         for i from 0 to K do

          if 2d(Ci,x) <=d(Ci,Cj)

           将x归属到Ci所在簇中

           退出for循环

          end if

          end for

        end if
  4.   重新计算质心。
  5. until 所有质心不再变动

引申

本文中只举例了使用欧几里得距离的K-means算法。其实本文中的d(x,y)不仅可以指代distance,更广义的可以指代dissimilarity。任何通过度量相异性的聚类算法都可以使用三角不等式,避免多余的计算,例如计算最近邻的DBSCAN。感兴趣的读者可以自己推导改进。

运用三角不等式加速Kmeans聚类算法的更多相关文章

  1. K-Means 聚类算法

    K-Means 概念定义: K-Means 是一种基于距离的排他的聚类划分方法. 上面的 K-Means 描述中包含了几个概念: 聚类(Clustering):K-Means 是一种聚类分析(Clus ...

  2. k-means聚类算法python实现

    K-means聚类算法 算法优缺点: 优点:容易实现缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢使用数据类型:数值型数据 算法思想 k-means算法实际上就是通过计算不同样本间的距离来判断他 ...

  3. K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  4. Kmeans聚类算法原理与实现

    Kmeans聚类算法 1 Kmeans聚类算法的基本原理 K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对 ...

  5. 机器学习六--K-means聚类算法

    机器学习六--K-means聚类算法 想想常见的分类算法有决策树.Logistic回归.SVM.贝叶斯等.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别 ...

  6. 转载: scikit-learn学习之K-means聚类算法与 Mini Batch K-Means算法

    版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <—— 目录(?)[+] ================== ...

  7. 沙湖王 | 用Scipy实现K-means聚类算法

    沙湖王 | 用Scipy实现K-means聚类算法 用Scipy实现K-means聚类算法

  8. Matlab中K-means聚类算法的使用(K-均值聚类)

    K-means聚类算法采用的是将N*P的矩阵X划分为K个类,使得类内对象之间的距离最大,而类之间的距离最小. 使用方法:Idx=Kmeans(X,K)[Idx,C]=Kmeans(X,K) [Idx, ...

  9. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析

    原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...

随机推荐

  1. WebX框架学习笔记之二----框架搭建及请求的发起和处理

    框架搭建 执行环境:windows.maven 执行步骤: 1.新建一个目录,例如:D:\workspace.注意在盘符目录下是无法执行成功的. 2.执行如下命令: mvn archetype:gen ...

  2. java学习笔记----java入门

    java基础 一.java语言跨平台原理 1.什么是跨平台? 跨平台就是一个软件可以在不同的操作系统中运行,但是不需要对其修改.换句话说,java语言编写的软件在不做修改的情况下就能在不同的系统平台上 ...

  3. JavaScript作用域链和垃圾回收机制

    作用域链 基本概念: 在了解作用域链和内存之前,我们先了解两个概念,分别是执行环境和变量对象. 执行环境:定义变量或者函数有权访问的其他数据,决定了它们各自的行为.每个对象都有自己的执行环境. 变量对 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log

    日常啰嗦 距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外,这段时间也在学习docker的相关知识,所以博客就没有继续写了,推荐一本书<Docker技术入门与实战>(第二版) ...

  5. UNIX标准

    背景 人们在UNIX编程环境和C 程序设计语言的标准化方面已经做了很多工作.虽然UNIX应用 程序在不同的UNIX操作系统版本之间进行移植相当容易,但是2 0 世 纪 80年代UNIX版本种类的剧增以 ...

  6. 常用PHP函数整理

    is_upload_file() 判断文件是不是通过HTTP POST 方式上传来的in_array() 判断变量在不在数组范围内move_uploaded_file() 将上传的临时名移到指定文件夹 ...

  7. 老李分享: 并行计算基础&编程模型与工具 2

    2.并行编程模型和工具 – MPI – MPI(Message Passing Interface)是一种消息传递编程模型,服务于进程通信.它不特指某一个对它的实现,而是一种标准和规范的代表,它是一种 ...

  8. List去除重复的元素

         有两种方法,一种是去重不带顺序的,一种是去重带顺序的. /* * 方法1: 无顺序 * Hastset根据hashcode判断是否重复,数据不会重复 */ public static Lis ...

  9. JavaWeb总结(七)—JSTL标签库

    一.JSTL标签库介绍 JSTL标签库的使用时为了弥补HTML标签的不足,规范自定义标签的使用而诞生的.使用JSTL标签的目的是不希望在JSP中出现Java逻辑代码. 二.JSTL标签库的分类 1.核 ...

  10. 【2017-04-21】Ado.Nte属性扩展

    通过对数据库表的封装,对该表的属性进行扩展. 1.例如:表中的性别是bool类,要实现显示给用户看的为“男.女” 2.通过表中的生日datetime类,来实现显示给用户看的年月日,自动计算年龄. 3. ...