欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld。 技术交流QQ群:433250724,欢迎对算法、技术感兴趣的同学加入。我的博客写一些自己用得到东西,并分享给大家,如果有问题欢迎留言与我讨论:)

Kmeans聚类方法是(我认为)最广泛使用以及稳定、有效的聚类方法。聚类是无监督学习方法,不需要对数据本身的标签有任何了解。如果你不是很理解kmeans算法本身,建议随便找一本数据挖掘/机器学习的书来看一看,或者看下baidu[1]的内容基本就能理解。

Kmeans算法基本描述

基本算法这里只做最为简单的描述,供读者理解,下图是一个聚类后的示意图。

(1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心点;

(2) 根据每个聚类对象的均值(中心点),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;

(3) 重新计算每个(有变化)聚类的均值(中心点)

(4) 循环(2)到(3)直到每个聚类不再发生变化为止

用Parametric Bootstrap方法确定K的取值

我们知道,在实际应用中,我们并不知道数据应该被聚类成几类(K=?),因为数据往往是高维的且交杂在一起。如何确定一个好的K,本身是一个值得研究的课题,也有不少人提出过不少方法,在本文中,我具体描述一下用Parametric Bootstrap方法来确定K值,主要参考的是[2],看下来感觉方法简单实用,在这里用自己的话描述一遍,并做适当衍生。

假设下图是我们的数据样本集合(每一个点表示一个样本),打印在二维平面上:

首先,我们并不知道数据应该聚成几类(实际中我们是不太可能看得到高维数据有很明显的分割的。在这个例子中乍一看好像是3类,但是实际上,我们的数据是通过4个混合高斯分布生成的。),所以假设数据应该分成k=2类,结果是:

这样,我们通过kmeans(k=2)把数据分为两类——橘色和绿色。我们可以得到两类的均值和协方差矩阵。假设原始数据是从高斯分布中随机生成的,那我们就可以用具有所求均值和协方差矩阵的高斯分布来重新生成数据样本集合,两类,和源数据的两类size一样,结果是:

这些模拟生成的点集合 称为”bootstrap simulation“。

接下来,我们我们考察k=3的情况下聚类是否比k=2更好。我们需要一个指标来评估聚类的效果好坏,在这里简单地使用总体类内误差——total within-sum-of-squares (total WSS) ——来评估。直觉上来说,一个好的聚类它的总体类内误差WSS要比一个坏的聚类WSS值低;但是实际上,如果我们在k=2用kmeans聚类得到的WSS值,总是比k=3得到的WSS值要高,因为我们k变大以后每一个类变得更紧凑,因此WSS更低。下图是kmeans,k=3的聚类情况和WSS值,上半图是原始数据,下半图是用之前一样的方法模拟生成出来的。

在k=3情况下,我们可以画出100次模拟(100 bootstrap simulations,每次生成一样size的一个集合)的WSS密度函数(有点类似于直方图,但是是连续的,函数和x轴围成的总面积是1,在有效范围内某一个WSS值点之前的总面积是表示小于等于该值的概率,或者比例)。红线是指在真实数据下总体类内误差。



(这里稍稍延生一下,关于画这样的密度图,在R语言工具包里面有很简单的指令,见http://www.plob.org/2014/05/11/7264.html,ggplot()+geom_density(),这个网页上写的非常清楚,如果用R的同学可以参考,虽然我没用过R,=.=)

前面已经说过了,一般来说,相比k类,k+1类时kmeans得到更紧凑的聚类,使得Total WSS值降低。所以我们设计这样的策略,只要k+1类的真实数据kmeans聚类计算的Total WSS,至少比k类的模拟点(bootstrap simulations)下的Total WSS的95%要小,那么我们就接受k+1类;后面依次增加k,直到不满足小于等于的条件。下面就是在我们数据集下的每一步结果:

红线是k+1在真实数据下计算得到,密度分布曲线是k类模拟点数据的WSS密度分布,我们看到当K+1=5的时候就不满足我们的条件了,因此k=4是最好的,和真实也是相符的。

到这里就可以选择出相对合理的k值了,当然,在复杂数据下的有效性还需要验证,不过我觉得还是有一定道理的。唯一的问题是95%是人为设定的,希望可以有更合理的解释。我理解为假设检验下,显著度p=0.05的情况。

重抽样Bootstrapping方法

Bootstrapping(Bootstrap)是统计里面的方法概念[3],也是本文第二个想特别讲一讲的东西。


In statistics, bootstrapping can refer to any test or metric that relies on random sampling with replacement.


如果我们要estimate一个集合的某个统计特征,如mean,用最基本的bootstrap方法,就是从一个已知的N大小的原始数据集(称为sample)中”有放回的随机抽取样本”,直至有同样size。这个抽取得到的集合称为一个bootstrap sample,或者resample。当N足够大的时候,基本上就不能得到和原来数据完全一样的resample了。这样的重抽取过程被重复很多次,比如1000次或者更多的10000次,每一次我们可以计算resample的mean(其他统计特征都是一样的),于是我们可以得到mean的histogram,就可以看到mean的变化和分布形状。

Bootstrap另外还有很多变化,其中Parametric bootstrap和smooth bootstrap比较常见。

  • Parametric bootstrap:用于比较小的sample size;不是从原始集合抽样本,而是fit一个特定的model,比如我们上面kmeans的例子,我们认为每一个类都是由一个高斯分布产生的,那么我们就求出mean和variance来fit高斯分布model。然后resample的样本是 drawn from this fitted model,并且一样的size。这样的过程可以重复很多次,得到很多simulations。

  • smooth bootstrap:其他情况下smooth bootstrap方法可能更好。A convolution-method of regularization reduces the discreteness of the bootstrap distribution, by adding a small amount of N(0,σ2) random noise to each bootstrap sample. A conventional choice is σ=1/n−−√ for sample size n。在基本的Bootstrap方法上加上一个随机噪音,使得分布更平滑。有些统计特征,比如一个集合的median,往往只有比较少的几个值,这样分布看起来就比较稀疏了。下面是一个例子,展示了Histograms of the bootstrap distribution and the smooth bootstrap distribution。

好,差不多讲完了今天的内容。本篇介绍了聚类如何选择K的一种方法(实际上,除了kmeans以外,还可以用于很多其他的聚类方法,如果他们也要确定k。)。该方法使用的Parametric bootstrap来抽样,是统计中bootstrap方法的一种类型。我们还介绍了基本的bootstrap方法,有放回的抽取,以及更平滑的smooth bootstrap方法,这些算法都是简单而有道理,我喜欢简单的算法。希望看完了的朋友喜欢就顶一下哈。关于聚类后面如果有时间打算写一篇Density-Based Clustering Algorithms,不过平时时间有限写的比较慢,哈哈。本篇是在春节假期抽零散时间写的,祝大家2016年万事如意哈~!

参考资料

[1] http://baike.baidu.com/view/3066906.htm

[2] http://www.win-vector.com/blog/2016/02/finding-the-k-in-k-means-by-parametric-bootstrap/

[3] https://en.wikipedia.org/wiki/Bootstrapping_(statistics)

机器学习方法(七):Kmeans聚类K值如何选,以及数据重抽样方法Bootstrapping的更多相关文章

  1. kmeans 聚类 k 值优化

    kmeans 中k值一直是个令人头疼的问题,这里提出几种优化策略. 手肘法 核心思想 1. 肉眼评价聚类好坏是看每类样本是否紧凑,称之为聚合程度: 2. 类别数越大,样本划分越精细,聚合程度越高,当类 ...

  2. KMeans聚类 K值以及初始类簇中心点的选取 转

    本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法, ...

  3. kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)

    kmeans一般在数据分析前期使用,选取适当的k,将数据聚类后,然后研究不同聚类下数据的特点. 算法原理: (1) 随机选取k个中心点: (2) 在第j次迭代中,对于每个样本点,选取最近的中心点,归为 ...

  4. R语言中聚类确定最佳K值之Calinsky criterion

    Calinski-Harabasz准则有时称为方差比准则 (VRC),它可以用来确定聚类的最佳K值.Calinski Harabasz 指数定义为: 其中,K是聚类数,N是样本数,SSB是组与组之间的 ...

  5. 机器学习 - k-means聚类

    k-means简介 k-means是无监督学习下的一种聚类算法,简单说就是不需要数据标签,仅靠特征值就可以将数据分为指定的几类.k-means算法的核心就是通过计算每个数据点与k个质心(或重心)之间的 ...

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

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

  7. kmeans聚类理论篇

    前言 kmeans是最简单的聚类算法之一,但是运用十分广泛.最近在工作中也经常遇到这个算法.kmeans一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点. 本文记录 ...

  8. SparkMLlib聚类学习之KMeans聚类

    SparkMLlib聚类学习之KMeans聚类 (一),KMeans聚类 k均值算法的计算过程非常直观: 1.从D中随机取k个元素,作为k个簇的各自的中心. 2.分别计算剩下的元素到k个簇中心的相异度 ...

  9. Python笔记11------一个K-means聚类的小例子

    #导入scipy库,库中已经有实现的kmeans模块,直接使用, #根据六个人的分数分为学霸或者学渣两类 import numpy as np from scipy.cluster.vq import ...

随机推荐

  1. HDOJ.1029 Ignatius and the Princess IV(map)

    Ignatius and the Princess IV 点我跳转到题面 点我一起学习STL-MAP 题意分析 给出一个奇数n,下面有n个数,找出下面数字中出现次数大于(n+1)/2的数字,并输出. ...

  2. Codeforces Round #326 (Div. 2) B Duff in Love 简单数论 姿势涨

    B. Duff in Love time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  3. SSO解决session共享的几种方案

    之前做项目遇到了这个sso系统,当时只是理解了一部分,今天偶尔发现一篇文章,觉得写的不错,增加了sso知识: 单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用, ...

  4. Leetcode 485. 最大连续1的个数

    1.题目描述(简单题) 给定一个二进制数组, 计算其中最大连续1的个数. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 ...

  5. 【设计模式】 模式PK:策略模式VS状态模式

    1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...

  6. web开发中防止SQL注入

    一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...

  7. python测试rabbitmq简易实例

    生产者 import pika #coding=utf8 credentials = pika.PlainCredentials('guest', '密码') connection = pika.Bl ...

  8. 12.13记录//QQDemo示例程序源代码

            笔记的完整版pdf文档下载地址: https://www.evernote.com/shard/s227/sh/ac692160-68c7-4149-83ea-0db5385e28b0 ...

  9. HDU 1231 最大连续子序列 (dp)

    题目链接 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,  Nj },其中 1 <= ...

  10. Python 编码问题:出现中文乱码-- (转)

    问题描述: 在写Python代码的过程中,有用到需要输出中文的地方(python2.6.5在中文注释的地方就会出错),但是运行后会出错 我的错误显示: SyntaxError: Non-ASCII c ...