聚类

来源:互联网 发布:数据挖掘算法书籍推荐 编辑:程序博客网 时间:2024/06/06 00:33

基本分类方法概述

- 划分方法
- 基于密度的方法
- 层次方法
- 基于网格的办法

划分方法

划分方法简单来说就是直接在数据层面上对数据进行分组。每一组称为一簇,各个簇间相斥划分。大部分的划分方法都是基于距离来划分的。
如果我们单纯的迭代所有的点,这个计算量是非常大的。所以我们在计算的时候使用了启发式的方法,基于启发式方法。我们有K-均值和K-中心点算法。下面我们来分析一下这两种算法。

1. k-均值 —— 基于形心的技术

总体来说我们使用一个簇的形心代表这个簇。形心可以有多种定义,例如:分配给该簇对象的均值点。当前簇的每一个点到当前簇的形心点我们都可以求得一个距离(欧式距离),对这些距离求和。我们可以这个和的大小来衡量当前簇的紧凑程度。

算法的执行过程

-从数据集D中随机的选择k(要分的目标簇数)个对象,每一对象代表一个簇的初始值或中心。对剩下的每个对象根据其与各个簇中心的欧式距离,将它分配到最相似簇。

-对于每个簇重新计算均值,选择新的中心点。然后再次求解距离。

-迭代以上操作直到重新计算均值簇内的点不改变为止。

算法使用情况

这种算法适合区分数据量小的并且球状簇。要求用户必须首先输入一个k值这是比较扯的。(一般在使用的时候我们一般指定一个范围逐个尝试看看那个k比较好。)
这种算法对异常点过于敏感,因为我们在计算均值的时候是把所有的点都考虑进去啦

2. k-中心点 —— 基于代表对象

K-中心点的与k-means的不同之处在于使用一个真实点作为一个代表。
算法执行过程也非常简单。
我们首先有一个中心点集合。现在选取一个中心点,并在这个中心点的集合中再选取一个点,看一下这个点是不是原来中心点的一个好的替代。衡量的方式就是用这个新选取的点逐个求解距离,观察当前的代价S,如果有比当前中心点更好的,则替换。重复执行这个过程。

基于密度的方法

总体这里的密度实际上是指样本分分布频度。基于密度的方法中有个使用非常多的算法DBSCAN,这种算法基于密度不断延伸下去。最终可以发现任意形状的簇。
为了下文容易阐述我们先来分析几个概念。

核心对象:若某个点的密度达到算法设定的阈值则其为核心点。

ε-邻域的距离阈值:设定的半径r.

直接密度可达:若某点p在点q的 r 邻域内,且q是核心点则p-q直接密度可达.

密度可达:若有一个点的序列q0、q1、…qk,对任意qi-qi-1是直接密度可达的,则称从q0到qk密度可达,这实际上是直接密度可达的“传播”

算法阐述

这里写图片描述

上图中:

红色的点代表中心点;黄色的点代表阈值;蓝色的点代表离群点。
现在我们来分析一下这个算法的执行流程。

-把所有的样本对象标记为unvisited

-随机选择一个unvisited样本对象p

-标记p为visited

-if p 的 ε-邻域至少有Minpts个对象

-创建一个新簇C,把p添加到C中

-用N代表刚刚创建的簇C的集合

-遍历N中所有的点 p`

-if p’ 是 unvisited,则标记p’为visited

-接着审查p’,如果p’的ε-邻域至少有Minpts个对象,把这些点加入到集合N中。

-当然如果p’还不是任何簇的成员,则把p’加入到当前簇C中。

-重复以上执行过程,最终没有合适的点为止。

综述

通过以上分析我们发现,算法可以根据密度不断的向前搜索延伸。但是问题最大在于我们需要去指定半径和Minpts两个参数,并且这两个参数还很关键,直接关系到我们进行搜索的簇的形状。

层次方法

//说点题外话,上课的时候没好好听。下课才发现这个东西还真是有点用。哈哈哈哈,于是又多花了好多时间学习。不知道在看到这段话是什么时候,但是我觉得到时候肯定会为自己的这种随心而笑。。。学会划分时间和节省时间吧。

刚开始觉得聚类的最大的作用就是分类嘛,把数据分为好几堆。。。看了层次方法后才觉得,这个方法还是有好多很有意思的用处的。比如说我们可以对一家公司各个层级的管理者角色进行分类,也可以对不同层次员工的工资进行分类。通过一个Tree状的结构来组织这些数据。我们可以方便的进行数据可视化的展示(虽然现在我也不知道这个算法有什么特别的用法。。。)

层次聚类方法分析

层次聚类方法是可以凝聚的或者分裂的,取决于层次分解是自上而下的还是自下而上的。

  • 1 凝聚的层次聚类方法
    这个就像是一棵树,从叶子开始逐步向上回溯。每一个叶子代表一个最小的簇(一般指的是这个分类样本点本身)。但是为什么两个叶子可以合并为同一个节点呢?自然而然的想到我们使用距离(距离如何起作用我们后文分析)来度量它们是不是该分到一块。

  • 2 分裂的层次聚类算法
    这个还是一棵树,如果我们仍然从下向上执行的话这棵树就是一个倒置的。刚开始我们把所有的对象置于一个簇中,然后从该簇不断分裂。

注:以上算法停止的条件都是距离达到实现设置的阈值。

聚类算法的距离度量:

|p-p’| 是两个对象或点p和p’之间的距离,mi 是簇Ci的均值,而ni是簇Ci中对象的数目。

这里写图片描述

  • 当算法使用最小距离来衡量簇间距离时,称为最近邻聚类算法。当最近的两个簇之间的距离超过用户给定的阈值时聚类过程就会终止,则称其为单连接算法(每一次这个当前簇寻找的都是是离他最近簇,那么它应当是一个簇接着一簇连接的,也就是簇与簇间是单行线,这大概也就是单连接的叫法的来源吧)。

  • 当算法使用最大距离来度量簇间距离时,称为最远邻聚类算法。如果当最近的两个粗之间的最大距离超过用户给定的阈值时聚类过程便终止,称其为全连接算法

不做过多的阐述直接上案例:

这里写图片描述

这里就不详细写啦,如果哪一天自己看的时候只要记得一个是最小距离一个是最远距离就可以啦。

基于分层的重要算法Birch—–执行效率之王!

这个算法的具体说明见博客:
http://blog.csdn.net/qll125596718/article/details/6895291

Birch算法的最大的优点在于这个CF-Tree的结构,并且这个算法思想已经被广泛的应用在多种算法中了。找到了一篇讲的非常清晰的博客,谢谢大神们花时间写的博客:
http://blog.csdn.net/u014593570/article/details/77718084

因为使用这个CF-Tree才使得算法执行速度非常快,只需要一次扫面数据库就可以分出非常好的结果。特别是对于大数据集的效果非常好。并且可以很好过滤掉噪声点,因为对于密度小的我们直接删掉就好了啊。

网格方法

http://blog.csdn.net/WOJIAOSUSU/article/details/58251769?locationNum=11&fps=1

好累,扔一篇大神文章吧。我就没啥说的啦。

原创粉丝点击