持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
先前的算法都属于有监督学习,而聚类算法则属于无监督学习这个的大类。具体来说,就是把数据通过某种方式分出几类来。 比如说对于一堆数据,假设要分成两类,可以分成今天之前产生的,今天之后产生的。又或者假设是这种情况,两台服务器产生的数据,这一台和那一台产生的也是两类。当然这是按某一个特征进行的分类,现实情况下,需要我们通过更多的特征分类。 总而言之,对于一个要求通过聚类来分类时,可以有很多种分类方式。甚至具体到某个一种分类算法,也不好说分出的几类就一定是按照什么分类的。
但是我们仍然有一些指导思想。大体的原则基本上可以认为是按照距离,把接近的一些数据划分为一类。
对于有序属性,或者说值属性,我们可以直接使用闵可夫斯基距离。
其中k取1或者2就是我们的曼哈顿距离,k取2就是欧氏距离。
这也是所谓的范数。
对于任意的有序数据集,都可以使用闵可夫斯基距离进行kmeans的聚类。
kmeans 的基本思路比较简单,就是把数划分成k个互相之间距离近的部分。
说起来简单,但是一个很大的问题没有解决的问题是怎么分成k个部分。
为此,kmeans 在最初采取随机生成分类用的点,然后把数据中的点划归到这k个点中。通过求每一簇或者说每一部分点的中心点的方式求得新的中点。基于新的中点,再次划分数据。通过多次这样的过程迭代,最终聚类得到我们需要的几个类别。
显然可以看到,实际上聚类过程和我们需要的结果不一定有关系,很有可能它们之间的关系仅仅是类别数相同。比如需要分成男女却分成了成年和未成年两类。
实际上还有其他的距离度量指标(比如余弦),以及其他的聚类算法。但是大多同样是需要距离这个概念的。
另外还有一类所谓的无序距离,它不能直接被使用,但是前辈们为我们也提供了一些处理的方法,比如VDM。
在转换到度量之后,我们仍然可以使用kmeans之类的算法。