聚类系列 (二)——HDBSCAN算法详解
在进行组会汇报的时候,为了引出本研究动机(论文尚未发表,暂不介绍),需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候,发现网络上对于DBSCAN算法的介绍非常多与细致,但是对于OPTICS或者HDBCCAN算法的介绍要么是直接照抄一个在线文档的算法介绍,要么就是未能完整的讲出该算法的原理。为了能够给大家提供一个都能看懂的HDBSCAN算法介绍,于是有了该篇文章。
下面进入关于HDBSCAN算法的正文内容,主要包括:HDBSCAN算法提出的动机、HDBSCAN算法的原理、HDBSCAN算法的优缺点、HDBSCAN算法的优缺点、HDBSCAN算法的实例介绍等。
文章目录
- 从DBSCAN到HDBSCAN
- DBSCAN
- OPTICS
- OPTICS 算法的优化与原理
- HDBSCAN
- HDBSCAN 的引入
- HDBSCAN 算法的原理与具体步骤
- 1. 样本点互达距离计算(距离空间变换)
- 压缩层次聚类树
- 提取稳定簇(打标签)
- HDBSCAN算法的优势
- HDBSCAN算法的不足
- 总结
- Reference
从DBSCAN到HDBSCAN
DBSCAN
为了理解HDBSCAN,首先需要理解DBSCAN算法的原理。
DBSCAN(Density-based Spatial Clustering of Applications with Noise)是一种基于密度扩展的聚类算法。顾名思义,从该算法名称中可以发现,该算法的核心思想在于样本密度的定义以及如何基于样本的密度扩展类簇。
DBSCAN算法认为类簇是由一系列被稀疏区域分隔开来的密集区域组成的。
该算法通过两个关键参数:Eps(邻域半径)和MinPts(邻域内包含的最小样本数量),定义样本的密度。
-
如果一个样本点在用户指定的邻域半径中,包含至少MinPts个样本,那么该样本被定义为一个**核心对象**。核心样本邻域内的其他样本被称为直接可达对象 。如何直接可达对象满足Eps和MinPts参数约束,其也是一个核心对象。核心对象可以用来吸引其他对象加入同一个簇。
-
对于位于核心对象邻域内、但是不满足核心对象定义的样本,被称为边界对象。
-
既不是核心对象,也不是边界对象的样本则被称为噪声点。通过该定义,可以发现DBSCAN算法能够识别噪声点的原因。
DBSCAN算法的原理就是通过寻找核心对象,并不断扩展加入核心对象邻域内的样本(判断是否为核心对象,然后继续扩展),从而形成一个簇。不在任何核心对象邻域内的样本且无法形成核心对象的样本则被视为异常值,不被分配到任何簇。
DBSCAN算法能够发现任意形状和大小的簇,并且能够识别噪声,对噪声具有很强的鲁棒性。但是同时,由于这两个参数是全局的,导致DBSCAN算法无法发现不同密度(尤其是密度差异较大、并且与密集簇邻近分布)的簇。
此外,这两个参数的设置依赖于对数据集的先验认知(也可以使用网格搜索等方法进行参数优化)。
OPTICS
为了克服DBSCAN算法参数设置的局限性,学者Ankerst等提出了OPTICS(Ordering Points to Identify the Clustering Structure)算法。OPTICS 是 DBSCAN 的一种改进版本,它不再需要通过固定的全局参数(Eps 和 MinPts)来定义密度,而是通过一种排序方式来揭示数据集中的聚类结构,从而解决DBSCAN算法参数设置的困难。
OPTICS 算法的优化与原理
OPTICS 的核心思想是通过记录每个点的 核心距离(Core Distance)和 可达距离(Reachability Distance),以一种可视化的方式展示数据的聚类结构。具体来说:
-
核心距离 (Core Distance):
- 对于一个点,如果其邻域内有足够的点(至少 MinPts 个点),则核心距离定义为该点到其邻域内第 MinPts 个最近点的距离(点到邻域内点的最大距离)。
- 如果一个点的邻域内不足 MinPts 个点,则核心距离未定义Undefined(表示为无穷大)。
-
可达距离 (Reachability Distance):
-
对于两个点 A 和 B,点 B 相对于点 A 的可达距离是点 A 的核心距离和点 A 到点 B 的欧氏距离之间的较大值。
-
直观上,可达距离表示一个点从另一个点“被密度连接”的难易程度,量化了两个样本点之间被密集区域所连接的最大距离。可达距离越小,说明两个点之间连线经过的稀疏区域越小,它们之间的密集程度越高。
-

- 数据排序:
- OPTICS 通过一个类似于 DBSCAN 的过程对数据进行排序,优先处理核心距离较小的点(即更密集区域的点),将点按照密度从高到低进行访问。
- 每个点在被访问时,会更新其邻域中未访问点的可达距离。
- 密度聚类结构:
- OPTICS 不直接输出聚类结果,而是生成一个可视化的“可达距离图”(Reachability Plot)。通过观察图中呈现的“山谷”(低可达距离的区域),可以识别不同密度的簇。

OPTICS算法的优点包括:不需要提前固定Eps参数,可以通过核心距离和可达距离动态调整密度阈值,能够发现不同密度的簇。其次,与 DBSCAN 类似,OPTICS 也能够识别噪声点(即在可达距离图中位于高可达距离的点)。
然而,OPTICS算法也存在一定的局限性,主要体现在:**复杂度较高(**需要维护可达距离和排序)。其次,簇提取困难(OPTICS输出一个有序的点序列,不显式给出聚类结果,仍需要额外的步骤和方法从序列中提取真正的簇)。参数敏感性(仍然需要指定参数minPts
,其选择对最终聚类结果有很大影响,尤其是在处理高维数据或密度分布不均匀的数据集时)。可达距离的局限性(不对称,仅考虑了从一个点到另一个点的距离)
HDBSCAN
HDBSCAN 的引入
为了进一步改进密度聚类算法的灵活性和效率,学者们提出了 HDBSCAN(Hierarchical Density-Based Spatial Clustering of Applications with Noise)算法。HDBSCAN 是 DBSCAN 的一种层次化扩展,结合了密度聚类和层次聚类的思想,其核心在于通过一个密度分层树(Density Hierarchy Tree)来表征数据的聚类结构。
- 密度定义的改进:
- HDBSCAN使用相对密度的概念,而不是固定的绝对密度阈值(如DBSCAN的固定Eps参数)。相对密度考虑了数据点与其核心距离(core distances)的比较,而不是单纯的邻域半径,这使得算法能够自动适应不同区域的密度差异。
- 通过计算互达距离(Mutual Reachability Distance)来定义点之间的密度连接关系,而不是简单的欧式距离。互达距离更加稳健(保持密集区域的数据点密度不变,降低稀疏区域的数据点的密度),能过更好处理不同密度的区域,从而识别出不同密度的轨迹。(互达距离其实是对OPTICS算法中可达距离的一种改进,同时考虑两个样本点的局部点分布)
- 密度层次化聚类:
- HDBSCAN 通过对密度逐步降低的过程进行跟踪,生成一个密度分层树。
- 在密度分层树中,叶子节点代表高密度区域的簇,而根节点表示整个数据集。
- 自动化簇提取:
- 与 OPTICS 需要手动观察可达距离图不同,HDBSCAN 提供了一个自动化的簇提取方法,通过定义一个稳定性指标(Stability)来评估每个簇的持久性,并自动选择最稳定的簇作为最终聚类结果。
HDBSCAN 算法的原理与具体步骤
关于HDBSCAN算法的原理与步骤,目前网络上最出名的两个博客分别是:https://www.biaodianfu.com/hdbscan.html和https://hdbscan.readthedocs.io/en/latest/how_hdbscan_works.html,前者其实是后者的中文版。网络上的其他博客大多也会这两个内容的搬运,本文在撰写的过程中也难免会借鉴其中的内容,但是会加上自己对该算法的思考以及更加详细的原理讲解,确保提供一个大家都能看到的HDBSCAN原理介绍博客。
1. 样本点互达距离计算(距离空间变换)
在开源的各种聚类算法的代码库中,我们可以发现有一个参数metric
,该参数的可取值包括:Euclidean, pre-computed 等。其中pre-computed表示提前计算好样本数据之间的距离,直接输入一个 N ∗ N N*N N∗N的距离矩阵 (其中 N N N是样本数据的数量)。该距离可以是欧式距离,网络距离,曼哈顿距离等。
在HDBSCAN算法中,需要将输入的预先计算好的原始距离矩阵(如欧式距离)进行一个距离空间转换(原始距离空间转换为互达距离(mutual reachability distance)空间)。距离空间转换旨在更好地识别数据中的密集区域和稀疏区域。
距离空间转换需要解决以下两个问题:
- 密度差异问题:在同一数据集中,可能存在密度相差很大的聚类。简单使用原始距离可能会导致密度较低的聚类被忽略。距离空间转换可以"放大"稀疏区域,使得不同密度的聚类能够被更好地识别。
- 噪声数据识别问题:噪声数据通常分布较为稀疏,与聚类之间的距离较远。使用原始距离可能难以区分噪声与真实聚类。距离空间转换通过"压缩"密集区域,从而使噪声点与聚类之间的距离差异更加明显,有助于识别噪声数据。
HDBSCAN算法采用了一种称为互达距离(mutual reachability distance)的距离空间转换方式。具体来说,对于任意两个样本点 p p p和 q q q,首先计算他们各自的核心距离,反应其局部密度:
- 计算点 p p p到其所有 k k k近邻点的核心距离,取最大值作为 p p p的核心距离 c o r e k ( p ) core_k(p) corek(p)
- 计算点 q q q到其所有 k k k近邻点的核心距离,取最大值作为 q q q的核心距离 c o r e k ( q ) core_k(q) corek(q)
然后取他们的核心距离和原始距离之间的最大值作为互达距离。可以看出,互达距离“放大了"稀疏区域的距离,同时"压缩"了密集区域内的距离。这种转换能更好地反映数据本身的密度分布特征,有利于后续的聚类分析。
d m r e a c h − k ( p , q ) = m a x { c o r e k ( p ) , c o r e k ( q ) , d ( p , q ) } d_{mreach-k}(p,q)=max\{{core_k(p),core_k(q),d(p,q)}\} dmreach−k(p,q)=max{corek(p),corek(q),d(p,q)}

在新的距离空间中,基于数据点之间的互达距离构建一个最小生成(MST)。每个节点代表一个数据点,边的权重为两个节点之间的互达距离。
数据点之间的互达距离矩阵首先会形成一个加权的完全连通图(图上任意两个节点都是连通的)。为了有效地表示数据点的密度连接关系并降低计算复杂度,需要从完全连通图中提取一个最小生成树(MST)。
最小生成树提供了一种划分数据的自然方式。通过移除MST中权重最大的边,整个图就被分割成了两个连通分量,对应着两个密集的数据簇。重复这个过程,移除下一个最大权重的边,整个图就被进一步分割成更多的连通分量。这个连续的裁剪过程会产生一个分层的簇结构,从而揭示出数据的层次聚类关系。
在具体实现中,可以选择Prime算法构建生成树。Prime算法的原理为:
-
选择一个任意节点作为起始节点,并将其添加到
MST
中。 -
创建一个优先队列
Q
,用于存储与MST
中节点相邻的边,并按照边的权重(互达距离)升序排列。 -
将起始节点的所有邻边添加到
Q
中。 -
重复以下步骤,直到
MST
中包含n-1
条边:-
从
Q
中取出权重最小的边。 -
如果该边连接的另一个节点不在
MST
中,则将该边和节点添加到MST
中,并将该节点的邻边添加到Q
中。
-
生成的MST
包含了所有数据点,并且边的权重总和最小。这棵树保留了数据点之间最重要的密度连接信息,并为后续的层次聚类提供了基础。
注意:MST可能不是唯一的,如果有多个权重相同的最小生成树,算法会返回其中一个。
下图给出了一个简单的构建的最小生成树的示例:[在这里插入图片描述](https://i-

基于最小生成树构建层次聚类树(Hierarchy Tree)是HDBSCAN算法的核心步骤。最小生成树的每个节点表示一个数据点,边的权重表示数据点之间的互达距离。为了生成层次聚类树,可以按照如下步骤:
-
初始化:将 MST 中的每条边按照其权重(即两点之间的可达距离)排序。
-
构建层次结构:初始化一个森林,每个数据点都是一个独立的簇。然后便利排序后的MST,从权重最小的边开始,逐步添加边到聚类树中。每当添加一条边时,都会有两种可能情况:
- 该边连接的两个点属于两个不同的簇,则将这两个簇合并为一个新簇;
- 该边连接的两个点在同一个簇内,则不进行合并操作。
重复这个过程,直到遍历完所有的边,得到一个包含多层次结构的层次树结构。
如下的GIF图是基于上述示例的最小生成树构建层次聚类树的动态过程。
根据如图所示的层次聚类树,为了得到不同的簇,我们可以直接画一条水平线将层次树切分为不同的簇(其实就是根据一个单一的互达距离的阈值将层次树分为不同的子树,每个子树表示一个簇),如下图所示。

但是这样根据一个全局、单一的互达距离阈值,存在以下问题:
- 无法处理不同密度的簇。由于使用了全局阈值,在密集区域可能会将不同的簇合并在一起,而在稀疏区域可能会将本应属于同一簇的点分割开来。
- 噪声点可能会被错误地划分到某个簇中。全局阈值无法很好地区分真正的簇和噪声点。
- 无法识别层次结构中最稳定的簇 - 某些簇可能在较宽的距离范围内都保持稳定,而另一些簇可能仅在特定距离下才显著。单一阈值无法捕获这种差异。
因此,我们需要一个更加稳健的方法从构建的聚类层次结构中提取簇。
压缩层次聚类树
在层次聚类树构建完成后,需要进行树的压缩,即将一颗大的层次树压缩为多个小的子簇结构。
在压缩树的过程中,HDBSCAN定义了一个参数:minimum cluster size,用于控制层次聚类树的拆分,这是一个自顶向下的过程。具体来说:
- ① 从层次树的根节点开始,将整个数据集视为一个大簇。
- ② 对于当前簇,如果其包含的数据点数量小于minimum cluster size,则将其标记为"噪声簇",不予考虑。
- ③ 如果当前簇的大小大于或等于minimum cluster size,则进一步检查它的子节点(子簇):
- 如果所有子簇的大小都小于minimum cluster size,则将当前簇标记为一个稳定簇,保留下来。
- 如果存在子簇的大小大于或等于minimum cluster size,则对这些大的子簇递归执行步骤②和③,继续向下拆分。
- ④ 重复步骤②和③,直到没有可拆分的大簇为止。
- 最终,层次树被拆分成多个互不相交的子树,每个子树的根节点都minimum cluster size的约束。
通过这种自顶向下的拆分策略,HDBSCAN逐步将原始的整体层次树压缩为规模较小、互不重叠的子树结构。每个子树代表一个相对稳定、大小合理的簇。同时,噪声簇和过小的簇被剔除。
通过这种方式,HDBSCAN能够自动确定合适的簇数量,而不需要人为指定簇数或其他聚类参数。生成的簇的形状、大小和密度也可以是任意的。
该压缩过程的关键是minimum cluster size参数,它控制着簇被切分或保留的阈值。较大的值会导致更大规模、更扁平的簇,较小的值会产生更多层次细节。因此,可以根据具体应用场景调整该参数来获得理想的聚类粒度。
提取稳定簇(打标签)
虽然通过上述压缩树的方式,我们将一颗大的层次树分解为多个小的子簇(每个子簇满足minimum cluster size约束),但是这样会忽略簇的稳定性与生命周期,因为我们希望所提取的簇不仅能够稳定存在而且具有更长的生命周期,能在较大密度范围内保持簇的稳定性。为了达到这目标,HDBSCAN引入了对簇稳定性与生命周期的考量。
具体来说,HDBSCAN 引入两个重要概念:簇的稳定性和用于度量簇稳定性的指标 λ {λ} λ。
λ {λ} λ被定义为数据点之间互达距离的倒数,即 λ = 1 / d i s t a n c e λ=1/distance λ=1/distance。基于 λ {λ} λ,HDBSCAN通过引入 λ b i r t h {λ_{birth}} λbirth和 λ d e a t h {λ_{death}} λdeath和 λ p {λ_p} λp 对簇的稳定性和生命周期进行了量化,其中:
- λ b i r t h {λ_{birth}} λbirth 指使得当前簇作为独立簇存在的最大 λ {λ} λ值。
- λ d e a t h {λ_{death}} λdeath 指使当前簇不再作为一个独立簇(簇的消失)、开始分裂为更小子簇的λ值,即当前簇失去独立性的密度阈值。这个值表示在该密度水平下,簇不再作为一个独立的实体存在,而是被分解为更小的子簇。
- λ p {λ_p} λp 则是指簇中数据点 p p p "脱离簇’'时的 λ {λ} λ值。对于簇内的每个点 p p p,其 λ λ λ 值介于 λ b i r t h {λ_{birth}} λbirth和 λ d e a t h {λ_{death}} λdeath, λ p {λ_p} λp实际上反映了点 p p p到所在簇的最小“边缘”距离。如果 p p p接近 λ b i r t h {λ_{birth}} λbirth,说明点 p p p 处于簇的内部,离群倾向较小;如果 λ p {λ_p} λp接近 λ d e a t h {λ_{death}} λdeath,说明点 p p p 处于簇的边缘,离群倾向较大,如果 λ p {λ_p} λp小于 λ d e a t h {λ_{death}} λdeath(密度与距离相反,距离越大,密度相对越小),说明点 p p p 已经不再属于该簇。 λ p {λ_p} λp
值可以作为评估点 p p p 相对于簇的内外倾向的一个度量标准。HDBSCAN利用了这一度量,在提取稳定簇时,保留 λ p {λ_p} λp值较小的内部点,剔除 λ p {λ_p} λp值较大的边缘噪音点,从而获得相对稳定的簇结构。
因此,簇的稳定性(stability)可以定义为:
s c l u s t e r = ∑ p ∈ c l u s t e r ( λ p − λ b i r t h ) s_{cluster}=\sum_{p∈cluster} (λ_p-λ_{birth}) scluster=p∈cluster∑(λp−λbirth)
当所有点的 λ p {λ_p} λp都等于 λ d e a t h {λ_{death}} λdeath时, s c l u s t e r = 0 s_{cluster}=0 scluster=0, 表示簇内所有点具有相同的密度水平。否则 s c l u s t e r s_{cluster} scluster小于0,因为 λ d e a t h ≤ λ p {λ_{death}}≤{λ_p} λdeath≤λp≤ λ b i r t h {λ_{birth}} λbirth,所以 s c l u s t e r ≤ 0 s_{cluster}≤0 scluster≤0。
压缩簇是自顶向下分裂的过程,提取簇则是自底向上合并簇和过程。
具体提取的过程如下:
① 自底向上遍历压缩树
② 对每个节点:
- 计算该节点的稳定性 s c l u s t e r s_{cluster} scluster;
- 计算其直接子节点的稳定性总和;
- 比较这两个值,选择稳定性更大的方案
- 当遇到“子簇稳定性之和 > 父簇自身稳定性”的情况时 (分裂成两个簇更好) :将保留子簇们作为独立的平坦簇输出,而放弃父簇(不会作为一个独立的簇输出)。
- 该簇的稳定性被设置为子簇稳定性之和
- 该簇的所有子簇保留"选定"状态。
- 当遇到“父簇稳定性 >= 子簇稳定性之和”的情况时 (两个子簇合并为一个簇更好) :将保留父簇作为平坦簇输出,而放弃子簇们(不会被单独输出)。
- 该簇被"选定";
- 该簇所有子簇的"选定"状态被取消;
- 当遇到“子簇稳定性之和 > 父簇自身稳定性”的情况时 (分裂成两个簇更好) :将保留子簇们作为独立的平坦簇输出,而放弃父簇(不会作为一个独立的簇输出)。
③ 遍历完成后,根节点处的"选定"簇就是要输出的平坦簇集合
这样的策略可以确保输出的每个平坦簇不仅满足最小簇大小,而且具有良好的生命周期和stability,即规模合理、内部紧密且在较大密度范围内保持稳定(稳定持久的簇结构)。同时,它避免了将稳定性较低的簇不适当地保留或合并。每个输出的平坦簇代表一个在全局上相对分离且内部相对紧凑的数据模式。
- 提取的簇满足最小尺寸要求
- 簇具有足够的稳定性
- 避免过度分裂或不当合并
- 保留数据中最显著的层次结构
HDBSCAN算法的优势
- HDBSCAN是一种基于密度的层次聚类算法,能够自动确定簇的数量,不需要提前指定簇的数量或者借助其他手段评估可能的簇数量。
- 与DBSCAN一样,能够发现任意形状的簇,但是相比DBSCAN算法无法区分不同密度的簇(尤其是密度差异较大的簇),HDBSCAN算法能够处理密度分布差异较大的数据集。
- 不同于 OPTICS,HDBSCAN 提供了自动的簇提取机制,无需手动调整参数或观察可达距离图。
- 更少的参数依赖,HDBSCAN 只需要一个主要参数 MinClusterSize(最小簇大小),易于设置。
HDBSCAN算法的不足
虽然HDBSCAN在处理不同形状和密度的簇方面表现出色,但也存在一些局限性:。
- **参数敏感性: **HDBSCAN 的性能仍受
min_cluster_size
和min_samples
参数的影响。min_cluster_size
控制最小簇的大小,min_samples
影响单个点的密度估计。不合适的参数设置可能导致识别出过少或过多的簇,或者产生不符合预期的簇结构。 - 计算复杂度: HDBSCAN 需要构建层次聚类树并计算每个点的核心距离,这在大型数据集上可能非常耗时。虽然有一些优化策略可以提高计算效率,但在大规模数据场景下,HDBSCAN 的计算成本仍然较高。
-
总结
DBSCAN、OPTICS 和 HDBSCAN 都是基于密度的聚类算法,它们在处理复杂数据分布、发现任意形状簇和识别噪声点方面表现良好。DBSCAN 是密度聚类的基础算法,OPTICS 改进了其对不同密度簇的适应性,而 HDBSCAN 进一步结合了层次聚类的思想,并提供了自动化的簇提取方法,适用于更广泛的场景。
Reference
[1] Ester M, Kriegel H P, Sander J, et al. A density-based algorithm for discovering clusters in large spatial databases with noise[C]//kdd. 1996, 96(34): 226-231.
[2] Campello R J G B, Moulavi D, Sander J. Density-based clustering based on hierarchical density estimates[C]//Pacific-Asia conference on knowledge discovery and data mining. Berlin, Heidelberg: Springer Berlin Heidelberg, 2013: 160-172.
[3] Ankerst M, Breunig M M, Kriegel H P, et al. OPTICS: Ordering points to identify the clustering structure[J]. ACM Sigmod record, 1999, 28(2): 49-60.
[4] Schubert E, Sander J, Ester M, et al. DBSCAN revisited, revisited: why and how you should (still) use DBSCAN[J]. ACM Transactions on Database Systems (TODS), 2017, 42(3): 1-21.
[5] https://hdbscan.readthedocs.io/en/latest/how_hdbscan_works.html#condense-the-cluster-tree
[6] https://www.biaodianfu.com/hdbscan.html
相关文章:
聚类系列 (二)——HDBSCAN算法详解
在进行组会汇报的时候,为了引出本研究动机(论文尚未发表,暂不介绍),需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候,发现网络上对于DBSCAN算法的介绍非常多与细致,但…...
【JavaEE】—— SpringBoot项目集成百度千帆AI大模型(对话Chat V2)
本篇文章在SpringBoot项目中集成百度千帆提供的大模型接口实现Chat问答效果: 一、百度智能云 百度千帆大模型平台是百度智能云推出的一个企业级一站式大模型与AI原生应用开发及服务平台。 注册地址:https://qianfan.cloud.baidu.com/ 注册成功后&…...
一种更激进的Hook实现方案猜想
XXX原创不原创不清楚,暂定为原创。毕竟windows 大神很多XXX 昨天才发现不是原创,这种方案是VEH HOOK的一种实现方案。VEH HOOK很久很久以前都被广泛使用了。只是自己没听说过。好悲哀呀。。。。 激进的猜想: 如果VEH HOOK在内核态处理异常…...
HTML5实现好看的端午节网页源码
HTML5实现好看的端午节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 端午节由来界面1.4 端午节习俗界面1.5 端午节文化界面1.6 端午节美食界面1.7 端午节故事界面1.8 端午节民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 H…...
微信小程序获取图片使用session(上篇)
概述: 我们开发微信小程序,从后台获取图片现实的时候,通常采用http get的方式,例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…...
RT-DETR融合YOLOv9的下采样模块ADown
RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information》 一、 模块介绍 论文链接:https://arxiv.org/abs/2402.13616 代码链接&…...
【机器学习案列】学生抑郁可视化及预测分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
CES 2025|美格智能高算力AI模组助力“通天晓”人形机器人震撼发布
当地时间1月7日,2025年国际消费电子展(CES 2025)在美国拉斯维加斯正式开幕。美格智能合作伙伴阿加犀联合高通在展会上面向全球重磅发布人形机器人原型机——通天晓(Ultra Magnus)。该人形机器人内置美格智能基于高通QC…...
Linux第一个系统程序---进度条
进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念,我们用一张图来简单的理解一下: 在计算机语言当中: 换行符:\n 回车符:\r \r\n:回车换行 这时候有人可能会有疑问:我在学习C…...
黑马跟学.苍穹外卖.Day04
黑马跟学.苍穹外卖.Day04 苍穹外卖-day04课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常…...
人生第一次面试之依托答辩
今天收到人生的第一场面试,是东华软件集团。答的那是依托答辩,就面了20分钟,还没考算法。其实依托答辩的效果是意料之中的,这次面试也只是想练练手。 目录 静态变量什么时候加载的? 重写和重载有什么区别࿱…...
STM32 : PWM 基本结构
这张图展示了PWM(脉冲宽度调制)的基本结构和工作流程。PWM是一种用于控制功率转换器输出电压的技术,通过调整信号的占空比来实现对负载的精确控制。以下是详细讲解: PWM 基本结构 1. 时基单元 ARR (Auto-reload register): 自动…...
【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用
系列文章目录 大模型(LLMs)基础面 01-大模型(LLM)面试全解:主流架构、训练目标、涌现能力全面解析 02-【大模型(LLM)面试全解】深度解析 Layer Normalization 的原理、变体及实际应用 大模型&…...
《浮岛风云》V1.0中文学习版
《浮岛风云》中文版https://pan.xunlei.com/s/VODadt0vSGdbrVOBEsW9Xx8iA1?pwdy7c3# 一款有着类似暗黑破坏神的战斗系统、类似最终幻想的奇幻世界和100%可破坏体素环境的动作冒险RPG。...
学习threejs,导入babylon格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.BabylonLoader babyl…...
Django 社团管理系统的设计与实现
标题:Django 社团管理系统的设计与实现 内容:1.摘要 本文介绍了 Django 社团管理系统的设计与实现。通过分析社团管理的需求,设计了系统的架构和功能模块,并使用 Django 框架进行了实现。系统包括社团信息管理、成员管理、活动管理、财务管理等功能&…...
2025 GitCode 开发者冬日嘉年华:AI 与开源的深度交融之旅
在科技的浪潮中,AI 技术与开源探索的火花不断碰撞,催生出无限可能。2025 年 1 月 4 日,由 GitCode 联合 CSDN COC 城市开发者社区精心打造的开年首场开发者活动:冬日嘉年华在北京中关村 • 鼎好 DH3-A 座 22 层盛大举行࿰…...
嵌入式系统 tensorflow
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 探索嵌入式系统中的 TensorFlow:机遇与挑战一、TensorFlow 适配嵌入式的优势二、面临的硬件瓶颈三、软件优化策略四、实…...
Web无障碍
文章目录 🟢Web Accessibility-Web无障碍🟢一、Web Accessibility-Web1. web无障碍设计2. demo3.使用相关相关开源无障碍工具条(调用可能会根据网络有点慢) 如有其他更好方案,可以私信我哦✒️总结 🟢Web Accessibility-Web无障碍…...
Qt使用MySQL数据库(Win)----2.配置MySQL驱动
使用Everything软件,找到mysql.pro文件。并使用qt creator打开mysql.pro。 导入外部库 选择外部库 点击下一步,勾选。 为debug版本添加‘d’作为后缀取消勾选,然后点击下一步 添加后的Pro文件。 这样文件应该是改好了,选择releas…...
记录一下vue2项目优化,虚拟列表vue-virtual-scroll-list处理10万条数据
文章目录 封装BrandPickerVirtual.vue组件页面使用组件属性 select下拉接口一次性返回10万条数据,页面卡死,如何优化??这里使用 分页 虚拟列表(vue-virtual-scroll-list),去模拟一个下拉的内容…...
java 中 main 方法使用 KafkaConsumer 拉取 kafka 消息如何禁止输出 debug 日志
pom 依赖: <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.5.14.RELEASE</version> </dependency> 或者 <dependency><groupId>org.ap…...
前端性能优化全攻略:加速网页加载,提升用户体验
前端性能优化全攻略:加速网页加载,提升用户体验 在当今互联网时代,用户对于网页的加载速度和性能要求越来越高。一个快速响应、流畅加载的网页能够极大地提升用户体验,增加用户留存率和满意度。前端性能优化是实现这一目标的关键…...
关于内网外网,ABC类地址,子网掩码划分
本文的三个关键字是:内网外网,ABC类地址,子网掩码划分。围绕以下问题展开: 如何从ip区分外网、内网?win和linux系统中,如何查询自己的内网ip和外网ip。开发视角看内外网更多是处于安全考虑,接口…...
【C++多线程编程:六种锁】
目录 普通互斥锁: 轻量级锁 独占锁: std::lock_guard: std::unique_lock: 共享锁: 超时的互斥锁 递归锁 普通互斥锁: std::mutex确保任意时刻只有一个线程可以访问共享资源,在多线程中常用于保…...
【LeetCode】力扣刷题热题100道(16-20题)附源码 容器 子数组 数组 连续序列 三数之和(C++)
目录 1.盛最多水的容器 2.和为K的子数组 3.最大子数组和 4.最长连续序列 5.三数之和 1.盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴…...
WHAT - devicePixelRatio 与像素分辨率
目录 语法理解 devicePixelRatio常见值应用场景注意事项在高分辨率屏幕下的视觉效果 devicePixelRatio 是一个浏览器属性,用来表示设备的物理像素与 CSS 像素之间的比例。它是屏幕显示清晰度的重要指标,特别是在高分辨率屏幕(如 Retina 显示屏…...
【cs.CV】25.1.8 arxiv更新速递
—第1篇---- ===== ConceptMaster: 面向扩散Transformer模型的多概念视频定制,无需测试时调优 🔍 关键词: 文本到视频生成, 扩散模型, 多概念定制, 身份解耦 链接1 摘要: 文本到视频生成通过扩散模型取得了显著进展。然而,多概念视频定制(MCVC)仍然是一个重大挑战。…...
C#使用MVC框架创建WebApi服务接口
第一步,使用VS2019新建MVC-Web API应用程序 创建BridgeApi 第二步,运行将生成默认的示例网页,网页Url为 https://localhost:44361/home/index 右键 项目 添加 WebAPI控制器类 添加 我们可以看到App_Start目录下 有三个文件: BundleConfig.cs代表 捆绑文件的引用 有脚本文件…...
慧集通(DataLinkX)iPaaS集成平台-智能体(Agent)API
功能简介: 该功能下主要是用来管理集成平台对外开放接口得管控以及调用日志信息得查看操作,并支持日志得重放等操作;注:所有触发类单据得日志也可以在此查看(如使用数据触发组件自动触发流程得日志信息) 1.第三方调用接口类日志查…...
BigDecimal:高精度数值运算类
介绍: BigDecimal是一个用于高精度数值运算的类,它比基本的double或float类型更精确,非常适合需要精确计算的场景,如金融计算、科学计算等,因为这些领域对数值精度要求非常高,不能容忍浮点运算带来的误差。…...
11. C 语言 作用域与变量使用技巧
本章目录: 前言一、作用域的分类局部变量示例: 全局变量示例:示例: 形式参数示例: 二、作用域的细节与常见误区块级作用域示例: 静态变量与全局变量的对比示例: 未初始化变量的影响示例: 三、实…...
大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
大模型WebUI:Gradio全解11——Chatbots:融合大模型的聊天机器人(2) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...
课题推荐——基于GPS的无人机自主着陆系统设计
关于“基于GPS的无人机自主着陆系统设计”的详细展开,包括项目背景、具体内容、实施步骤和创新点。如需帮助,或有导航、定位滤波相关的代码定制需求,请点击文末卡片联系作者 文章目录 项目背景具体内容实施步骤相关例程MATLAB例程python例程 …...
HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构
HQChart使用教程30-K线图如何对接第3方数据44-DRAWPIE数据结构 效果图DRAWPIEHQChart代码地址后台数据对接说明示例数据数据结构说明效果图 DRAWPIE DRAWPIE是hqchart插件独有的绘制饼图函数,可以通过麦语法脚本来绘制一个简单的饼图数据。 饼图显示的位置固定在右上角。 下…...
张朝阳惊现CES展,为中国品牌 “代言”的同时,或将布局搜狐新战略!
每年年初,科技圈的目光都会聚焦在美国拉斯维加斯,因为这里将上演一场被誉为 “科技春晚” 的年度大戏 ——CES 国际消费电子展。作为全球规模最大、最具影响力的科技展会之一,CES 吸引了来自 160 多个国家的创新者和行业领导者,是…...
堆排序+选择排序详解
目录 1.选择排序的定义 2.选择排序的优缺点 2.1优点 2.2缺点 3.思考 4.优化后的选择排序的实现 5.选择排序的代码 6.堆排序 7.向上/向下调整算法 8. 向下向上调整代码 9.堆排序代码 1.选择排序的定义 选择排序(SelectSort),以第一个为开始值,…...
【Arthas命令实践】heapdump实现原理
🎮 作者主页:点击 🎁 完整专栏和代码:点击 🏡 博客主页:点击 文章目录 使用原理 使用 dump java heap, 类似 jmap 命令的 heap dump 功能。 【dump 到指定文件】 heapdump arthas-output/dump.hprof【只 …...
python-leetcode-判断子序列
392. 判断子序列 - 力扣(LeetCode) class Solution:def isSubsequence(self, s: str, t: str) -> bool:i, j 0, 0 # i 指向 s,j 指向 twhile i < len(s) and j < len(t):if s[i] t[j]:i 1j 1return i len(s)...
【Verdi实用技巧-Part2】
Verdi实用技巧-Part2 2 Verdi实用技巧-Part22.1 Dump波形常用的task2.1.1 Frequently Used Dump Tasks2.1.2 Demo 2.2 提取波形信息小工具--FSDB Utilities2.3 Debug in Source code view2.3.1 Find Scopes By Find Scope form 2.3.2 Go to line in Souce code View2.3.3 Use B…...
常用的AT命令,用于查看不同类型的网络信息
文章目录 1. ATCSQ:2. ATCREG:3. ATCOPS:4. ATCGATT:5. ATCGPADDR: 在AT命令集中,用于查看网络信息的命令有多种,具体取决于所使用的设备和模块。以下是一些常用的AT命令࿰…...
【应用篇】09.实现简易的Shell命令行解释器
一、shell和bash的关系 shell是命令解释器,它接收用户的命令并将其传递给内核去执行。bash,即GNU Bourne-Again Shell,是shell的一种实现方式,也是大多数linux系统下默认的shell。 bash的原理 大多数的指令进程(除了内建命令&…...
负载均衡技术【内网去外网运营商出口负载均衡】
1 负载均衡概述 LB(Load Balance,负载均衡)是一种集群技术,它将特定的业务(网络服务、网络流量等)分担给多台网络设备(包括服务器、防火墙等)或多条链路,从而提高了业务…...
【广西乡镇界】arcgis格式shp数据乡镇名称和编码2020年内容测评
【广西乡镇界】arcgis格式shp数据乡镇名称和编码2020年内容测评...
半导体数据分析: 玩转WM-811K Wafermap 数据集(一) AI 机器学习
在半导体行业,工程师依靠 CP Yield(生产过程中芯片的合格率)、WAT(晶圆验收测试)和 Particle 的晶圆图模式来识别工艺问题。然而,在没有人工干预的情况下将这些晶圆图模式分类是一项重大挑战。许多论文都研…...
mongodb安装并设置用户验证登录
下载地址 https://www.mongodb.com/try/download/community-kubernetes-operator 偶数版是稳定版,基数版是开发版 ,对32位支持不好 --------------------------------CentOS下安装mongodb--------------------------------------------------- 解压安装包…...
《零基础Go语言算法实战》【题目 1-16】字符串的遍历与比较
《零基础Go语言算法实战》 【题目 1-16】字符串的遍历与比较 给出两个字符串,请编写程序以确定能否将其中一个字符串重新排列后变成另一个字符串, 并规定大小写是不同的字符,空格也作为字符考虑。保证两个字符串的长度小于或等于 5000。 …...
VUE3封装一个Hook
在 Vue 3 中,Composition API 让我们能够封装和复用代码逻辑,尤其是通过 setup 函数进行组件间的复用。为了提高代码的可复用性,我们可以把一些常见的 API 请求和状态管理逻辑封装到一个单独的 hook 中。 以下是一个简单的例子,我…...
【Linux】Linux常见指令(上)
个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统,Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…...
嵌入式 C 语言:一维数组
目录 一、定义 二、内存布局 三、数组的初始化 3.1. 完全初始化 3.2. 部分初始化 3.3. 不指定大小初始化 四、使用数组 4.1. 访问数组元素 4.1.1. 通过索引访问数组元素 4.1.2. 通过指针访问数组元素 4.2. 遍历数组 4.3. 数组作为函数参数 五、应用场景 5.1. 数据…...