
cuML 聚类算法模块 cuml.cluster 完全指南KMeans、DBSCAN、HDBSCAN 与谱聚类的 GPU 加速实践【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cuml导读本文围绕 NVIDIA cuML 的聚类子模块cuml.cluster展开系统讲解其对外公开的全部聚类 APIKMeans、DBSCAN、AgglomerativeClustering、SpectralClustering、函数式接口spectral_clustering以及 HDBSCAN 家族HDBSCAN、all_points_membership_vectors、membership_vector、approximate_predict。读完本文你将掌握每个算法的核心原理、全部可调参数及其默认值与取值约束、GPU 上的实现细节如可扩展 KMeans 初始化、kNN 稀疏连通图、软聚类预测等并能在实际项目中直接编写可运行的 cuML 聚类代码。相关 API 入口与模块导出见 cluster/init.py。cuml.cluster是 cuML 官方文档 API 参考中定义聚类功能的核心命名空间见 cuml.cluster.rst。它覆盖了从经典划分式聚类KMeans、基于密度的聚类DBSCAN / HDBSCAN、层次聚类AgglomerativeClustering到基于图论的谱聚类SpectralClustering在内的完整算法谱系是 cuML 中算法种类最丰富的子模块之一。cuml.cluster 模块总览cuML 的聚类模块在源码层面由以下文件组成见 cluster 目录kmeans.pyxKMeans估计器实现另含多 GPU 版本KMeansMG见 kmeans_mg.pydbscan.pyxDBSCAN实现另含多 GPU 版本DBSCANMG见 dbscan_mg.pyagglomerative.pyxAgglomerativeClusteringspectral_clustering.pyxSpectralClustering与函数式接口spectral_clusteringhdbscan/hdbscan.pyxHDBSCAN及软聚类相关函数。模块顶层通过 cluster/init.py 导出全部公开符号因此以下两种导入方式等价from cuml import KMeans, DBSCAN, HDBSCAN, AgglomerativeClustering, SpectralClustering # 或 from cuml.cluster import KMeans, DBSCAN, HDBSCAN, AgglomerativeClustering, SpectralClustering值得注意的是这些估计器大多继承了InteropMixin与ClusterMixin见 kmeans.pyx#L438-L444这意味着它们与 scikit-learn 拥有良好的互操作能力KMeans._cpu_class_path sklearn.cluster.KMeans、DBSCAN._cpu_class_path sklearn.cluster.DBSCAN等属性表明这些 GPU 估计器可以经由 cuML 的 CPU 互操作机制与 scikit-learn 对应实现互相转换_params_from_cpu/_params_to_cpu负责参数映射并在遇到 GPU 不支持的参数时抛出UnsupportedOnGPU异常。KMeans可扩展 KMeans 初始化的划分式聚类核心原理KMeans是一种通过期望最大化Expectation Maximization优化的基础而强大的聚类方法算法随机选取 K 个数据点作为初始中心计算各样本与这些中心的距离完成指派随后对每个簇重新计算均值mean得到新质心如此迭代直至收敛。cuML 的 KMeans 支持可扩展 KMeansscalable KMeans初始化相比随机选点更稳定且在大规模数据上保持高效。完整参数说明参数类型 / 默认值说明n_clustersint默认 8要划分的质心簇数量必须显式指定max_iterint默认 300EM 迭代次数上限迭代越多越精确但越慢tolfloat64默认 1e-4质心均值变化小于该阈值时停止迭代的收敛判据verboseint / bool默认 False日志级别取值为cuml.common.logger.level_*系列random_stateint 或 None默认 None设置后可在重启 Python 时复现相同结果init{scalable-k-means, k-means\|\|, k-means, random}或 ndarray默认scalable-k-means初始化策略见下文n_initauto或 int默认auto使用不同随机种子运行 KMeans 的次数最终取 inertia 最低的一次结果oversampling_factorfloat64默认 2.0可扩展 KMeans 初始化中候选质心的过采样系数越大初始质心越好但内存开销越大实际采样质心总数为oversampling_factor * n_clusters * 8max_samples_per_batchint默认 32768成对距离计算的批次样本数批次内元素总数为max_samples_per_batch * n_clusters当n_clusters过大时可适当调低device_buffer_samplesint默认 0主机驻留输入时每 GPU 批次缓冲的样本数大于 0 时启用主机外out-of-core拟合路径等于 0默认时主机输入整体拷贝到设备执行标准设备拟合设备驻留输入cupy / cudf忽略此参数init_sizeint默认 0仅对主机外拟合路径生效的 KMeansPlusPlus 种子采样大小为 0 时使用min(3 * n_clusters, n_samples)output_type{None, input, cupy, numpy, cudf, pandas}默认 None输出类型None 时遵循cuml.global_settings.output_type全局设置关于init参数需要特别说明scalable-k-means或k-means||使用快速且稳定的可扩展 KMeans 初始化k-means可视为oversampling_factor0约束下的 KMeans|| 特例random从数据中随机选取n_clusters个样本作为初始质心传入 ndarray形状必须为(n_clusters, n_features)直接作为初始中心源码中对应lib.InitMethod.Array。n_initauto的行为与init联动见 kmeans.pyx#L85-L91使用k-means||或scalable-k-means时运行 1 次否则运行 10 次。底层实现与多 GPU 约束从 kmeans.pyx#L44-L91 的参数初始化逻辑可以看到若干值得注意的实现事实距离度量固定为DistanceType.L2ExpandedL2 展开距离因此输入数据的数值范围与量纲会直接影响聚类效果使用前通常需要做标准化initk-means或oversampling_factor0在多 GPU 的KMeansMG中不被支持会抛出ValueErrorKMeansMG要求显式设置非 None 的random_state以保证跨分区一致性见 kmeans.pyx#L58-L64拟合后的cluster_centers_各簇均值坐标与labels_每个样本所属簇通过ReflectedAttr暴露输出格式取决于全局输出类型配置。实战示例from cuml import KMeans import cudf import numpy as np a np.asarray([[1.0, 1.0], [1.0, 2.0], [3.0, 2.0], [4.0, 3.0]], dtypenp.float32) b cudf.DataFrame(a) kmeans_float KMeans(n_clusters2, n_initauto, random_state1) kmeans_float.fit(b) print(kmeans_float.labels_) # 每个样本的簇标签 print(kmeans_float.cluster_centers_) # 最终质心坐标适用场景与注意事项KMeans 最大的优势是速度与简单性当簇数量大致已知时它是许多实践者的首选广泛用于大数据聚类、图像分割和医疗聚类等场景。但需要注意KMeans 要求预先指定n_clusters若不确认簇数可以先从小簇数开始结合 PCA、UMAP 或 T-SNE 可视化验证簇形是否合理参见 kmeans.pyx 的 Notes 部分。DBSCAN无需预设簇数的密度聚类核心原理DBSCAN是一种强大且快速的密度聚类技术它寻找数据高度集中的区域来构造簇因此对噪声鲁棒且能发现非线性形状的簇。cuML 的 DBSCAN 通过构建邻接图adjacency graph来计算近邻点之间的两两距离见 dbscan.pyx 类注释。DBSCAN 对所选距离度量非常敏感其隐含假设是数据点需要以成组集中的方式分布才能形成有效簇。完整参数说明参数类型 / 默认值说明epsfloat默认 0.5两个点属于同一邻域的最大距离min_samplesint默认 5一个邻域内构成核心点所需的最小样本数包含该点自身metric{euclidean, cosine, precomputed}默认euclidean距离度量precomputed表示 X 为方阵距离矩阵使用 cosine 距离时输入会被临时修改恢复后的矩阵可能因数值舍入与原始输入不完全一致algorithm{brute, rbc}默认brute近邻计算的底层算法verboseint / bool默认 False日志级别max_mbytes_per_batchint64可选成对距离计算批次的显存上限MB用于在运行时间与内存间权衡遇到 OOM 时可结合设备显存调低但该值并不限制 DBSCAN 计算的总内存calc_core_sample_indicesbool默认 True是否计算核心样本索引为 False 时跳过core_sample_indices_与components_的计算以降低少量开销output_type{None, input, cupy, numpy, cudf, pandas}默认 None输出类型属性说明labels_每个样本的簇标签噪声样本标记为 -1core_sample_indices_核心样本的索引仅当calc_core_sample_indicesTrue时计算components_训练中发现的每个核心样本的副本同上。实战示例from cuml import DBSCAN import cudf import numpy as np gdf_float cudf.DataFrame() gdf_float[0] np.asarray([1.0, 2.0, 5.0], dtypenp.float32) gdf_float[1] np.asarray([4.0, 2.0, 1.0], dtypenp.float32) gdf_float[2] np.asarray([4.0, 2.0, 1.0], dtypenp.float32) dbscan_float DBSCAN(eps1.0, min_samples1) dbscan_float.fit(gdf_float) print(dbscan_float.labels_) # 0, 1, 2适用场景DBSCAN 的主要优点是不需要把簇数作为超参数并且能够发现非线性形状的簇对噪声鲁棒。它已被应用于大型强子对撞机的粒子碰撞分析、营销分析中的客户细分等场景。与 KMeans 组合使用时常见做法是先用 DBSCAN 处理噪声与任意形状簇再用 KMeans 处理大规模均匀簇。AgglomerativeClustering基于单链路的层次聚类核心原理AgglomerativeClustering递归合并使给定链路距离linkage distance增量最小的一对簇属于自底向上的层次聚类方法。cuML 当前版本仅支持single链路准则即两个观测集合间所有距离的最小值见 agglomerative.pyx#L70-L80。完整参数说明参数类型 / 默认值说明n_clustersint默认 2要发现的簇数metricstr默认euclidean计算链路的度量可选euclidean、l1、l2、manhattan、cosine当connectivityknn时仅接受euclideanconnectivity{pairwise, knn}默认knn连通矩阵的计算方式pairwise计算全连接的两两距离图对小数据集最快但需要 O(n²) 空间knn将全连接矩阵稀疏化以节省内存、支持更大输入可用c影响近邻数量linkage{single}默认single链路准则当前仅支持 singlecint默认 15间接影响connectivityknn时的近邻数量关系为n_neighbors log(n_samples) c默认值 15 对多数问题已足够verboseint / bool默认 False日志级别output_type同前输出类型属性说明n_clusters_算法实际发现的簇数labels_每个样本的簇标签形状(n_samples,)n_leaves_层次树中的叶子数n_connected_components_图中连通分量的估计数children_每个非叶节点的子节点形状(n_samples - 1, 2)。实现细节与约束从 agglomerative.pyx#L139-L208 的fit实现可以看出输入强制转换为float32且要求 C 连续布局orderC样本数至少为 2linkage非single时抛出ValueError(Only single linkage clustering is supported currently)connectivity非{knn, pairwise}时同样报错metric必须位于内部_metrics_mapping映射表内n_clusters必须满足1 n_clusters n_rows底层调用 C 层single_linkage内核在nogil块中执行结束后通过handle.sync()同步由于当前仅支持 single linkagen_connected_components_固定为 1n_leaves_等于样本数。实战示例from cuml.cluster import AgglomerativeClustering import numpy as np X np.random.rand(100, 5).astype(np.float32) model AgglomerativeClustering(n_clusters5, connectivityknn, c15) model.fit(X) print(model.labels_)SpectralClustering 与 spectral_clustering图论视角的谱聚类核心原理谱聚类基于归一化拉普拉斯矩阵normalized Laplacian的谱分解。当簇结构高度非凸或簇的中心与扩散度量无法完整描述簇形态时例如二维平面上的同心圆嵌套簇谱聚类非常有效。若亲和矩阵affinity matrix是图的邻接矩阵该方法还可用于寻找归一化图割normalized graph cuts。cuML 在调用fit时默认通过 k 近邻连通矩阵构造亲和矩阵affinityprecomputed时则使用用户提供的亲和矩阵。完整参数说明估计器版本参数类型 / 默认值说明n_clustersint默认 8要形成的簇数n_componentsint 或 None默认 None谱嵌入使用的特征向量数None 时取n_clustersrandom_stateint / RandomState / None默认 None用于 k-means 初始化与特征分解的伪随机数生成器传 int 可保证跨调用确定性n_neighborsint默认 10用近邻法构造亲和矩阵时的近邻数affinityprecomputed时忽略n_initint默认 10k-means 步骤以不同质心种子运行的次数最终取 inertia 最优的一次eigen_tolfloat 或auto默认auto特征求解器的收敛容差auto时当前使用 0.0affinity{nearest_neighbors, precomputed}默认nearest_neighbors亲和矩阵构造方式前者从输入数据计算近邻图后者将 X 解释为预计算的亲和矩阵值越大表示样本间相似度越高verboseint / bool默认 False日志级别output_type同前输出类型函数式接口 spectral_clustering模块同时提供无状态函数式接口spectral_clustering(X, *, n_clusters8, random_stateNone, n_componentsNone, n_neighbors10, n_init10, eigen_tolauto, affinitynearest_neighbors)见 spectral_clustering.pyx#L390-L459直接返回形状为(n_samples,)的簇标签数组适合一次性调用场景。两者参数语义完全一致区别仅在于是否保留估计器对象。函数式接口对affinityprecomputed的支持矩阵格式更广泛scipy 稀疏矩阵CSR、CSC、COO、cupy 稀疏矩阵CSR、CSC、COO、稠密 numpy 数组或稠密 cupy 数组均可。使用注意事项图应只包含一个连通分量否则结果意义不大该算法解决的是 k2 的归一化割问题属于归一化谱聚类。实战示例import cupy as cp from sklearn.datasets import make_blobs from cuml.cluster import SpectralClustering, spectral_clustering X, y make_blobs(n_samples100, centers3, n_features10, cluster_std0.5, random_state42) X cp.asarray(X, dtypecp.float32) model SpectralClustering(n_clusters3, random_state42) labels model.fit_predict(X) # 估计器接口 labels2 spectral_clustering(X, n_clusters3, random_state42) # 函数接口HDBSCAN带软聚类预测的层次密度聚类模块构成HDBSCAN 家族包含 4 个公开符号见 hdbscan/init.pyHDBSCAN估计器类all_points_membership_vectors为数据集中的每个点计算软聚类隶属度向量membership_vector为单个点计算软聚类隶属度向量approximate_predict对未见过的样本点做近似软聚类预测。软聚类soft clustering是 HDBSCAN 相对 DBSCAN 的重要增强它不再为每个样本给出唯一的硬标签而是输出该样本属于各簇的隶属度分布从而表达聚类结果的不确定性。典型用法from cuml.cluster import HDBSCAN from cuml.cluster.hdbscan import all_points_membership_vectors, approximate_predict import numpy as np X np.random.rand(1000, 8).astype(np.float32) # 训练 HDBSCAN hdb HDBSCAN(min_cluster_size15) hdb.fit(X) # 训练集全体点的软聚类隶属度向量 vectors all_points_membership_vectors(hdb, X) # 对新样本做近似预测 new_points np.random.rand(10, 8).astype(np.float32) labels, probabilities approximate_predict(hdb, X, new_points)适用场景HDBSCAN 适合簇密度不均匀、存在大量噪声、簇形状任意非凸的数据。与 DBSCAN 相比HDBSCAN 通过层次结构自适应选择密度阈值无需手动调eps与 KMeans 相比它无需指定簇数并能输出软聚类结果。仓库中的 hdbscan_soft_clustering_benchmark.ipynb 演示了软聚类的基准测试流程可作为深入学习参考。聚类算法的选型建议综合以上源码级分析可给出如下选型建议场景推荐算法理由大规模数据、簇数大致已知、追求速度KMeans简单快速支持可扩展 KMeans 与分批成对距离计算噪声多、簇形状任意、不想预设簇数DBSCAN无需n_clusters对噪声鲁棒簇密度不均匀、需要软聚类输出HDBSCAN层次密度聚类自动选择密度阈值支持隶属度预测需要层次结构与树状图分析AgglomerativeClustering自底向上合并输出children_、n_leaves_等树结构属性簇结构高度非凸如同心圆、环形SpectralClustering基于归一化拉普拉斯谱分解擅长发现非凸簇与图割小结cuml.cluster为 GPU 加速的聚类任务提供了从划分式、密度式、层次式到谱聚类的一站式解决方案。所有算法均遵循 cuML 统一的估计器约定支持 cudf DataFrame / cupy ndarray / numpy 数组等输入通过output_type或全局设置控制输出格式并提供与 scikit-learn 的互操作能力。多 GPU 版本KMeansMG、DBSCANMG则在单卡实现基础上扩展了跨设备数据并行能力适用于更大规模的数据集。【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cuml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考