ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

cuML 分解模块(cuml.decomposition)完全指南:GPU 加速的 PCA、IncrementalPCA 与 TruncatedSVD

cuML 分解模块(cuml.decomposition)完全指南:GPU 加速的 PCA、IncrementalPCA 与 TruncatedSVD cuML 分解模块cuml.decomposition完全指南GPU 加速的 PCA、IncrementalPCA 与 TruncatedSVD【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cuml导读本文以 cuMLNVIDIA RAPIDS 生态中的 GPU 加速机器学习库的cuml.decomposition模块为核心系统讲解其公开的三个降维估计器PCA、IncrementalPCA与TruncatedSVD。你将掌握每个估计器的参数语义、算法选择Full 与 Jacobi 两条路径、拟合与变换的调用方式以及它们与 scikit-learn 的互操作机制文中所有结论均以当前仓库源码pca.pyx、incremental_pca.py、tsvd.pyx与测试用例为依据可直接用于实际开发与二次查阅。模块概览三个公开 API 与两层实现结构cuml.decomposition是 cuML 中面向线性降维 / 矩阵分解的公开 Python 子模块由 API 文档索引 显式收录模块入口文件init.py 中导出了三个类PCA—— 主成分分析基于协方差矩阵的特征分解IncrementalPCA—— 增量式 PCA支持分批拟合与流式更新TruncatedSVD—— 截断奇异值分解适合词频矩阵等场景的潜在语义分析LSI。从目录结构看该模块包含单机实现与多节点MG实现两层层文件说明单机 Python 实现pca.pyx、incremental_pca.py、tsvd.pyxCython 封装直接调用 C 后端多节点实现pca_mg.pyx、tsvd_mg.pyx、base_mg.py基于 RAPIDS Dask 的多 GPU 训练不属本文公共 API 范畴Cython 类型声明common.pxd声明paramsPCA/paramsTSVD结构体与solver枚举单机三个类的公共 API 签名、默认值与 scikit-learn 对齐路径如下估计器关键参数默认值_cpu_class_pathPCAn_componentsNone, svd_solverauto, whitenFalse, copyTrue, tol1e-7, iterated_power15, verboseFalsesklearn.decomposition.PCAIncrementalPCAn_componentsNone, whitenFalse, copyTrue, batch_sizeNone, verboseFalsesklearn.decomposition.IncrementalPCATruncatedSVDn_components1, algorithmfull, n_iter15, tol1e-7, random_stateNone, verboseFalsesklearn.decomposition.TruncatedSVD三者都继承自 cuML 的统一基类Base并混入InteropMixin支持与 sklearn 模型互转、FMajorInputTagMixin要求 F 序内存布局等 mixin因此统一支持output_type参数控制返回数据的宿主类型。PCAGPU 上的主成分分析算法原理与两条求解路径PCA的文档字符串pca.pyx明确了其定位通过特征的线性组合构造新分量使每个新分量捕获数据最大方差常用于数据可视化如取 3 个分量做三维散点、数据压缩与探索性分析。cuML 的 PCA 提供两条算法路径由svd_solver参数控制full默认对协方差矩阵做完整特征分解eigendecomposition再截取前 K 个特征向量jacobi迭代修正前 K 个特征向量速度显著更快但精度略低auto源码中与full走同一代码路径见_fit_dense中对solver.COV_EIG_DQ的映射pca.pyx。底层算法枚举定义在 common.pxdCOV_EIG_DQ与COV_EIG_JACOBI分别对应 DQ 特征分解与 Jacobi 特征分解。_fit_dense在构造paramsPCA结构体时填入n_components、n_rows、n_cols、whiten、n_iterations来自iterated_power与tol随后以无 GIL 方式调用 C 函数pcaFitfloat32 / float64 各有重载完成拟合后执行handle.sync()同步流。参数详解参数默认值语义与约束n_componentsNone保留的主成分个数须 特征数为None时取min(n_samples, n_features)。显式传入大于特征数的值会在fit时抛出ValueErrorpca.pyxsvd_solverautofull/jacobi/auto前两者见上文非法值抛ValueErrorwhitenFalse为True时按奇异值除以各分量并乘sqrt(n_samples)去相关使各分量单位方差、消除多重共线性利于线性回归等下游任务copyTrue为True时先复制数据再去均值为False时原数据可能被就地覆盖为去均值版本tol1e-7仅对jacobi生效容忍度越小精度越高、收敛越慢iterated_power15仅对jacobi生效迭代次数越多越精确、越慢verboseFalse日志级别取cuml.common.logger.level_*中的值output_typeNone返回结果与属性类型支持input/cupy/numpy/cudf/pandas为None时遵循cuml.global_settings.output_type拟合后的属性拟合完成后PCA实例上会挂载以下属性声明于 pca.pyxcomponents_前 K 个主成分即 SVD 分解U, S, VT svd(X)中VT.T[:, :n_components]explained_variance_各成分解释的方差即S**2explained_variance_ratio_方差占比即S**2 / sum(S**2)singular_values_前 K 个奇异值恒 0mean_按列计算的均值用于数据中心化noise_variance_依据 Bishop 1999 概率 PCA 模型估计的噪声方差可用于后续计算协方差估计。完整使用示例官方 docstringpca.pyx给出了可直接运行的示例两种导入方式等价 from cuml import PCA # 方式一 from cuml.decomposition import PCA # 方式二 import cudf import cupy as cp gdf_float cudf.DataFrame() gdf_float[0] cp.asarray([1.0, 2.0, 5.0], dtypecp.float32) gdf_float[1] cp.asarray([4.0, 2.0, 1.0], dtypecp.float32) gdf_float[2] cp.asarray([4.0, 2.0, 1.0], dtypecp.float32) pca_float PCA(n_components2) pca_float.fit(gdf_float) PCA(n_components2) pca_float.components_ 0 1 2 0 0.69225764 -0.5102837 -0.51028395 1 -0.72165036 -0.48949987 -0.4895003 pca_float.explained_variance_ 0 8.510... 1 0.489... pca_float.explained_variance_ratio_ 0 0.9456... 1 0.054... pca_float.singular_values_ 0 4.125... 1 0.989... pca_float.mean_ 0 2.666... 1 2.333... 2 2.333... trans pca_float.transform(gdf_float) pca_float.inverse_transform(trans) # 可近似还原原始数据fit_transform等价于fit(X).transform(X)pca.pyx。transform/inverse_transform均同时支持稠密与稀疏输入稠密路径调用 C 的pcaTransform/pcaInverseTransform稀疏路径则直接用矩阵乘法实现X components_.T减均值见_transform_sparsepca.pyx。稀疏输入支持与符号翻转fit接受 CSR 格式稀疏矩阵accept_sparse[csr]走_fit_sparse路径先计算稀疏协方差与均值sparse_cov_and_mean再用cp.linalg.eigh做特征分解并按降序排列同时用_flip_sign对特征向量做符号规范化保证输出的确定性。inverse_transform提供return_sparse与sparse_tol参数当输入为稀疏矩阵时可将低于sparse_tol的元素置零并以 CSR 形式返回便于在稀疏管线中传递。与 scikit-learn 的互操作PCA通过_cpu_class_path sklearn.decomposition.PCA与InteropMixin提供跨框架转换_params_from_cpupca.pyx在导入 sklearn 模型时做参数映射n_componentsmle与n_components0不支持抛UnsupportedOnGPUsklearn 的tol0.0映射为 cuML 的1e-7iterated_powerauto映射为15_params_to_cpupca.pyx反向导出时将 cuML 的tol1e-7还原为 sklearn 的0.0并把jacobi映射回auto属性通过_attrs_from_cpu/_attrs_to_cpu在 GPU 数组与 NumPy 数组之间互转components_保持 F 序。IncrementalPCA恒定内存的增量式主成分分析动机与适用场景IncrementalPCAincremental_pca.py基于 scikit-learn 0.23.1 的实现移植用于数据无法一次性放入 GPU 显存的场景。其核心特性恒定内存复杂度约为batch_size * n_features因此可以直接处理np.memmap等无需整文件载入的数据分批 SVD每批计算复杂度O(batch_size * n_features**2)内存中同时只有2 * batch_size个样本整个训练需执行n_samples / batch_size次 SVD而普通 PCA 只需 1 次O(n_samples * n_features**2)的大规模 SVD支持稀疏输入fit接受 CSR / CSC 稀疏矩阵逐批转稠密后减去均值避免在任何时刻持有整块稠密矩阵实现的是 Ross 等人的增量学习模型Incremental Learning for Robust Visual Tracking, IJCV 2008即 Sequential Karhunen-Loeve Transform 的扩展文档注释特别说明刻意省略了原论文中仅在n_samples 5/3 * n_features时才有优势的 QR 分解优化。参数与属性参数除继承PCA的n_components、whiten、copy、verbose、output_type外新增参数默认值语义batch_sizeNone每批样本数仅fit时使用为None时自动推断为5 * n_features在近似精度与内存占用之间取平衡拟合后除PCA的属性外还提供var_按特征的方差跨多次partial_fit聚合n_samples_seen_已处理的样本总数fit会重置partial_fit会累加batch_size_推断出的实际批大小n_components_当n_componentsNone时由首个批次推断为min(n_samples, n_features)。fit / partial_fit 的分批工作机制fitincremental_pca.py将数据按_gen_batches切分成行切片逐批调用partial_fit稀疏批会先.toarray()转稠密。批大小未指定时记为5 * n_features。partial_fitincremental_pca.py是核心增量逻辑维护n_samples_seen_、mean_、var_、singular_values_、components_等状态通过_incremental_mean_and_varChan-Golub-LeVeque 方差更新算法聚合统计量非首次调用时将旧奇异值 × 旧分量矩阵与新批数据含均值修正项sqrt(n_samples_seen_ * n_samples / n_total) * (mean - batch_mean)纵向拼接再对该合并矩阵做cp.linalg.svd最后用_svd_flip做符号矫正以保证输出确定性。注意partial_fit不接受稀疏输入直接抛TypeError稀疏数据请使用fit完成分批稠密化。使用示例官方 docstring 中的示例incremental_pca.py展示了稀疏随机矩阵上的拟合 from cuml.decomposition import IncrementalPCA import cupy as cp import cupyx X cupyx.scipy.sparse.random(1000, 4, formatcsr, ... density0.07, random_state5) ipca IncrementalPCA(n_components2, batch_size200) ipca.fit(X) IncrementalPCA(batch_size200, n_components2) ipca.components_ # shape (n_components, n_features) array([[ 0.23698335, -0.06073393, 0.04310868, 0.9686547 ], [ 0.27040346, -0.57185116, 0.76248786, -0.13594291]]) ipca.singular_values_ array([5.06637586, 4.59406975]) ipca.explained_variance_ array([0.02569386, 0.0211266 ]) ipca.explained_variance_ratio_ array([0.30424536, 0.25016372]) ipca.mean_ array([0.02693948, 0.0326928 , 0.03818463, 0.03861492]) ipca.noise_variance_.item() 0.0037122774558343763transform在输入为稀疏矩阵时会按batch_size分批调用_transform_sparse再vstack合并结果incremental_pca.py从而避免一次性物化整块稠密矩阵。TruncatedSVD面向稀疏文本矩阵的截断奇异值分解定位与原理TruncatedSVDtsvd.pyx用于计算大矩阵 X 的 top-K 奇异值与奇异向量。与 PCA 不同它不做均值中心化因此特别适合词频矩阵等稀疏输入在信息检索领域即著名的潜在语义索引LSI从词频矩阵中挖掘潜在主题。若输入已经过均值中心化TruncatedSVD 等价于截断 PCA。与 PCA 一致它同样提供full默认完整特征分解后截取前 K 个奇异向量与jacobi迭代修正 top-K 奇异向量更快但精度略低两条路径auto与full走同一代码路径tsvd.pyx。当所需分量数远小于特征数时 Jacobi随机化版本精度稳健且效率极高但当需要大量分量时精度会明显下降。参数详解参数默认值语义与约束n_components1保留的奇异向量/值个数须 列数否则fit_transform抛ValueErrortsvd.pyxalgorithmfullfull/jacobi/auton_iter15仅 Jacobi 求解器使用迭代越多越精确、越慢tol1e-7仅jacobi使用越小精度越高、收敛越慢random_stateNone固定随机种子以复现结果verbose/output_typeFalse/None同PCA拟合后的属性与 PCA 相同components_、explained_variance_、explained_variance_ratio_、singular_values_但不含mean_与noise_variance_。使用示例官方 docstring 示例tsvd.pyx from cuml import TruncatedSVD from cuml.decomposition import TruncatedSVD # 两种导入等价 import cudf import cupy as cp gdf_float cudf.DataFrame() gdf_float[0] cp.asarray([1.0, 2.0, 5.0], dtypecp.float32) gdf_float[1] cp.asarray([4.0, 2.0, 1.0], dtypecp.float32) gdf_float[2] cp.asarray([4.0, 2.0, 1.0], dtypecp.float32) tsvd TruncatedSVD(n_components2, algorithmjacobi, ... n_iter20, tol1e-9) tsvd.fit(gdf_float) TruncatedSVD(algorithmjacobi, n_components2, n_iter20, tol1e-09) tsvd.components_ 0 1 2 0 0.587259 0.572331 0.572331 1 0.809399 -0.415255 -0.415255 tsvd.explained_variance_ 0 0.494... 1 5.505... tsvd.explained_variance_ratio_ 0 0.082... 1 0.917... tsvd.singular_values_ 0 7.439... 1 4.081... trans tsvd.transform(gdf_float) tsvd.inverse_transform(trans) # 可近似还原原始矩阵注意两点实现细节fit内部直接调用fit_transformtsvd.pyx因为底层 C 函数tsvdFitTransform一次性完成拟合与投影inverse_transform要求输入列数等于n_components否则抛ValueErrortsvd.pyx。与 scikit-learn 的参数映射TruncatedSVD的_cpu_class_path指向sklearn.decomposition.TruncatedSVD互转时做如下映射tsvd.pyx导入 sklearn 模型tol0.0→1e-7n_iter5sklearn 默认→15algorithm统一映射为full导出到 sklearntol1e-7→0.0n_iter15→5algorithm映射为randomizedsklearn 对应 Jacobi/随机化求解。稠密 / 稀疏双路径与输入校验三个估计器都通过check_inputs/check_array来自cuml.internals.validation做输入校验统一约束数据类型仅支持float32与float64C 后端对两种精度各提供一套重载内存布局要求 F 序orderF与 libcuml 期望的输出数组布局一致输出components_等均以orderF分配最小样本/特征数ensure_min_samples2, ensure_min_features2稀疏格式PCA 的fit接受 CSRIncrementalPCA 的fit接受 CSR/CSCpartial_fit不支持稀疏TruncatedSVD 的fit_transform走稠密校验。PCA.fit中n_componentsNone时取min(n_rows, n_cols)的推断逻辑位于 pca.pyx与 sklearn 行为一致IncrementalPCA.partial_fit则额外校验首批样本数不小于n_componentsincremental_pca.py。测试用例对行为边界的验证仓库测试是理解行为边界的最佳佐证test_pca.py 覆盖test_pca_fit、test_pca_defaults、test_pca_fit_then_transform、test_pca_fit_transform、test_pca_inverse_transform、test_sparse_pca_inputs含whiten与return_sparse组合、test_noise_variance_zero当n_components min(n_samples, n_features)时噪声方差应为 0、test_exceptions与test_get_feature_names_outtest_incremental_pca.py 验证分批拟合与partial_fit的增量统计test_tsvd.py 覆盖test_tsvd_fit、test_tsvd_fit_transform、test_tsvd_inverse_transform与test_get_feature_names_out。此外三个类都通过ClassNamePrefixFeaturesOutMixin与_n_features_out属性支持 sklearn 风格的get_feature_names_out()PCA返回pca0, pca1, ...风格的特征名并有对应的test_get_feature_names_out测试保障。小结与选型建议数据规模适合整块放入显存、追求最高精度使用PCA默认svd_solverfull需要快速近似时改用svd_solverjacobi并配合iterated_power/tol调节精度。数据量超出显存、需流式或稀疏训练使用IncrementalPCA通过batch_size控制内存占用默认5 * n_featurespartial_fit可用于在线增量更新。非中心化的稀疏矩阵如 TF-IDF 词频矩阵、主题挖掘 / LSI / 信息检索使用TruncatedSVD当分量数远小于特征数时优先考虑algorithmjacobi。无论选择哪个估计器均可通过output_type统一控制返回数据的宿主cudf / cupy / numpy / pandas并通过InteropMixin与 scikit-learn 模型双向转换从而无缝嵌入现有的 CPU/GPU 混合机器学习管线。【免费下载链接】cumlNVIDIA cuML: GPU-Accelerated Machine Learning项目地址: https://gitcode.com/GitHub_Trending/cu/cuml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表