1. 常见聚类方法
1.1 k-mean
选择k个中心,不断迭代直到中心不再变化
1.2 经典层次聚类
经典的层次聚类需要计算不断计算与更新距离矩阵,然后不断合并或者不断裂变构成所需要的聚类。
1.3 BIRCH聚类
层次聚类中比较新的算法有BIRCH(Balanced Iterative Reducingand Clustering Using Hierarchies利用层次方法的平衡迭代规约和聚类)主要是在数据量很大的时候使用,而且数据类型是numerical。首先利用树的结构对对象集进行划分,然后再利用其它聚类方法对这些聚类进行优化;ROCK(A Hierarchical ClusteringAlgorithm for Categorical Attributes)主要用在categorical的数据类型上;Chameleon(A Hierarchical Clustering Algorithm Using Dynamic Modeling)里用到的linkage是kNN(k-nearest-neighbor)算法,并以此构建一个graph.
该算法笼统的说,执行流程课分为两步:
一、BIRCH扫描数据库,建立一棵存放于内存的CF-树,它可以被看作数据的多层压缩,试图保留数据的内在聚类结构;
二、BIRCH采用某个选定的聚类算法对CF树的叶节点进行聚类,把稀疏的簇当作离群点删除,而把更稠密的簇合并为更大的簇。
其中,最最最关键的就是CF-树的构造。在聚类特征树中,一个聚类特征CF是这样定义的:每一个CF是一个三元组,可以用(N,LS,SS)表示。其中N代表了这个CF中拥有的样本点的数量,这个好理解;LS代表了这个CF中拥有的样本点各特征维度的和向量,SS代表了这个CF中拥有的样本点各特征维度的平方和。举个例子如下图,在CF Tree中的某一个节点的某一个CF中,有下面5个样本(3,4)、(2,6)、 (4,5)、 (4,7)、 (3,8)。则它对应的N=5; LS=(3+2+4+4+3,4+6+5+7+8)=(16,30); SS =33+22+44+44+3*3+……=(54+190)=244
对于CF Tree,我们一般有几个重要参数,第一个参数是分支因子B,表示每个非叶节点的子女的最大数目,第二个参数是阈值T,表示存储在树的叶节点中的子簇的最大直径。也就是说,叶节点对应的子簇中的所有样本点一定要在直径小于T的一个超球体内。有时还会定义叶节点的分支因子L,表示每个叶节点对应的子簇的最大样本个数。对于上图中的CF Tree,限定了B=7, L=5, 也就是说内部节点最多有7个子节点,而叶子节点对应的簇最多有5个样本。
1.4 Chamelon聚类
Chameleon的聚类效果被认为非常强大,比BIRCH好用,但运算复杂度很高,O(n^2)。
原则:如果两个簇的互连性都很高并且他们之间又靠的很近,那么就将其合并。Chamelon算法是一种多阶段层次聚类算法,同之前我们讲过的BIRCH算法一样,它也是分为2个主要阶段的。下面我们来具体看一看这个算法的原理。
- 首先使用KNN构造稀疏图(如果一个对象是另一个对象的kNN,那么这两个点之间就存在一条边)
- 将稀疏图划分为子簇(把kNN图划分成大量相对较小的子簇,使得边割最小)
- 凝聚层次聚类,基于子簇的相似度(互联性和紧邻性)反复合并子簇。
1.5 高斯聚类
一个高斯混合模型试图找到多维高斯模型概率分布的混合体,从而找到任意数据最好的模型。在最简单的场景中,GMM可以用与k-means相同的方式寻找类。由于GMM有一个隐含的概率模型,因此它也可能找到簇分配的概率结果——在Scikit-Learn中用predict_proba方法实现。这个方法返回一个大小为[n_samples, n_clusters]的矩阵,矩阵会给出任意属于某个簇的概率。
1.6 DBSCAN
DBSCAN 算法是一种基于密度的聚类算法,特点为:1.聚类的时候不需要预先指定簇的个数;2.最终的簇的个数不确定。
DBSCAN算法将数据点分为三类:
1.核心点:在半径Eps内含有超过MinPts数目的点。
2.边界点:在半径Eps内点的数量小于MinPts,但是落在核心点的邻域内的点。
3.噪音点:既不是核心点也不是边界点的点。
如下图所示:图中黄色的点为边界点,因为在半径Eps内,它领域内的点不超过MinPts个,我们这里设置的MinPts为5;而中间白色的点之所以为核心点,是因为它邻域内的点是超过MinPts(5)个点的,它邻域内的点就是那些黄色的点!这一步可以用faiss来做,统计range_search返回结果的个数即可!
• 算法流程
1.将所有点标记为核心点、边界点或噪声点;
2.删除噪声点;
3.为距离在Eps之内的所有核心点之间赋予一条边;
4.每组连通的核心点形成一个簇;
5.将每个边界点指派到一个与之关联的核心点的簇中(哪一个核心点的半径范围之内)。
2. 算法加速
基本所有的算法都需要进行遍历和距离计算,因此可以使用向量检索库Faiss进行加速,下面来进行一下对比。使用3w个256维向量进行DBSCAN聚类,结果对比如下:
算法 | 聚类结果 | 耗时(秒) |
---|---|---|
sklearn DBSCAN | 22771 | 524 |
FaissFlatL2 | 22771 | 151 |
FaissIVF | 22772 | 1.35(训练)+14.6 |
FaissIVF优化 | 22772 | 1.11(训练)+0.88 |
最后的优化版本,即使是50w个256维向量,也只需要8+210秒,性能相当不错。