聚类算法在数据挖掘中经常使用,思想简单直接。
在系统中,自己也实现过几个聚类算法,做针对性的优化也并无它难度。
由于其方式的简单,开始也未对它有过深入思考。
但是,如果你想让数据自己说话,还是离不开聚类。
因此调研了很多聚类算法,做一些总结。
--------------------------------------------------------------------------------------------------------
聚类算法大体分四类
1.层次聚类(顶下和底上及改良)
2.划分聚类(Kmeans及改良)
3.密度聚类(DBSCAN、SNN及改良)
4.模糊聚类(FCM及改良)
当然它们并不是天然分割的,之间互有交叉。当然具体怎么分也是仁者见仁的事情。这种分类方式是根据 聚类核心依据 划分的。
按我自己看来,它们之间的关系如下:
由于聚类是非监督的,因此是非意识的。可是,我们仍然希望通过尽可能的先验来提高聚类的效果。
也就是说,聚类算法仍然希望给它指明一个方向,这个方向在我们通常的做法就是告诉它:实际上这个数据集有几类(包括噪音点也自成一类)。
所以,这也就是我想表达的为什么把划分聚类和模糊聚类归为先验聚类。
但实际情况经常是,那么大的数据集,鬼知道几类。
对,没人知道。但我们想让数据自己告诉我们。
可没有先验,数据凭什么告诉我们?
这里我举两个例子:
1) 图片
将一张图的颜色压缩为0/1黑白两色后如下。
就单单让你看这张图,你会划分几类?
你可能说1 类 、 2类 、3类都有可能。
是呢,你都不知道,那数据自己怎么知道?
2) 文本文本聚类是很普遍的一件事了。就假设现在是简单的词袋模型。
下面是文本文档向量的示意图(可以想象成N维)。
在数据库里其实你看到的也就是这么一堆向量值,那这次你又怎么分?
可能这个文档集的构造是:
1.我喜欢苹果手机。
2.我喜欢三星手机。
文档集是100篇关于手机的评价,其中50篇主语用 苹果,另外50篇主语用 三星。
所以,如果用户想知道两种手机的情况,那是两类。如果用户想知道手机的情况,那就是一类。
那么数据自己如何分呢?
数据也不知道。
因此针对不同的应用场景,需要人为的加入先验来提高聚类效果。
Kmeans和FCM都有一个固定的先验K,导致先验聚类存在一个优化目标,因此即使Kmeans有诸多问题,但是其聚类效果仍然不错。
优化目标:
这也就是为什么 Kmeans每次迭代更新中心点为类内均值的原因。
写了这么多,并不是说先验聚类优于自发聚类,自发聚类其实也有一定程度的先验(各类阈值,纯先验)。
重要的是面对不同的问题,需要使用针对性的方法。重要的东西说一遍也可以。
不具备普遍性是由于聚类算法自身的限制而导致的。
似乎有一直在夸先验聚类的嫌疑,下面举个例子说明自发聚类的应用场景。
图像压缩
RGB(255,255,255)的三元组,但是空间不足那么多,把8bit*3 压缩为 4bit*3(简单的话做hash映射)。
压缩前:
压缩后:
最后,聚类的非监督决定了其不具普适性。因此根据场景灵活运用各种聚类算法,非常重要。
之后还会写一篇各类聚类算法的优缺点比较~
未经博主允许,不能转载任何文章。