深度学习系列22:聚类及加速

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个主要阶段的。下面我们来具体看一看这个算法的原理。
在这里插入图片描述

  1. 首先使用KNN构造稀疏图(如果一个对象是另一个对象的kNN,那么这两个点之间就存在一条边)
  2. 将稀疏图划分为子簇(把kNN图划分成大量相对较小的子簇,使得边割最小)
  3. 凝聚层次聚类,基于子簇的相似度(互联性和紧邻性)反复合并子簇。

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 DBSCAN22771524
FaissFlatL222771151
FaissIVF227721.35(训练)+14.6
FaissIVF优化227721.11(训练)+0.88

最后的优化版本,即使是50w个256维向量,也只需要8+210秒,性能相当不错。

2.1 sklearn DBSCAN

在这里插入图片描述

2.2 FaissFlatL2加速

在这里插入图片描述

2.3 FaissFlatIVF加速

在这里插入图片描述

2.4 优化版

在这里插入图片描述

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值