UMAP 降维复现完整指南:20 行代码跑通示例、原理与源码落点

发布时间:2026/8/24 1:14:22
UMAP 降维复现完整指南:20 行代码跑通示例、原理与源码落点 UMAP 降维复现完整指南20 行代码跑通示例、原理与源码落点【免费下载链接】umapUniform Manifold Approximation and Projection项目地址: https://gitcode.com/gh_mirrors/um/umap本文以官方论文paper.md与核心源码umap/umap_.py为复现依据走一遍 UMAPUniform Manifold Approximation and Projection降维的完整链路先用 20 行代码跑通最小示例再用 5 个公式拆解「高维模糊图 低维优化」两段式机制最后给出参数调优表与工程加速建议支撑一次完整的 UMAP 降维复现。二十行代码跑通 UMAP 最小可运行示例准备环境只需两步# 拉取源码并安装pip install umap-learn 亦可 git clone https://gitcode.com/gh_mirrors/um/umap pip install -e .最小复现代码如下数据用 Iris150 条、4 维、3 类标签import umap from sklearn.datasets import load_iris import matplotlib.pyplot as plt iris load_iris() # n_neighbors 控制邻域大小min_dist 控制低维点的最小间距 model umap.UMAP(n_neighbors50, min_dist0.001, random_state42) emb model.fit_transform(iris.data) # 输出形状 (150, 2) plt.scatter(emb[:, 0], emb[:, 1], ciris.target, cmaptab10) plt.title(UMAP embedding of the Iris dataset) plt.show()预期结果三个类别在二维平面上几乎完全分离同类样本聚成致密团块、异类之间留有清晰间隔。把min_dist调到0.001会让簇压得更紧这是官方示例examples/iris/iris.py同款配置它是怎么工作的UMAP 三段式机制拆解UMAP 的思路可以概括为一句话先在原始空间里画出一张「带强度的邻接网络」再到低维空间里训练另一张网络让两者的边分布尽可能一致。第一段k 近邻 模糊隶属强度生活化类比给每个样本发一张「好友榜」榜单上的人越近你与它的「关系强度」越高。对每个样本 $i$其近邻 $j$ 的隶属强度定义为$$p_{ij} \exp!\left(-\frac{d_{ij} - \rho_i}{\sigma_i}\right)$$其中 $d_{ij}$ 是高维距离$\rho_i$ 是该样本的最近邻距离模糊半径小于它的边强度直接记为 1$\sigma_i$ 是尺度参数。$\sigma_i$ 不是拍的而是二分搜索解出来的目标是让每行的平均概率逼近 $\log_2 k$$k$ 即n_neighbors$$\sum_j p_{ij} ;\approx; \log_2 k$$这相当于用一条连续曲线「平滑」了离散的 k 近邻距离使得 $k$ 可以取非整数。第二段模糊并集把两张好友榜合成一张无向网近邻关系是单向的$i$ 选 $j$ 不等于 $j$ 选 $i$。UMAP 用模糊集合的「概率并」把两条边合并成对称权重$$w_{ij} p_{ij} p_{ji} - p_{ij}p_{ji}$$直观上如果双方都把对方排进好友榜这条边就是强边只有单方入围则是弱边。合并后的整张图以稀疏 COO 矩阵存储非零边数量约等于 $n \times k$这是内存友好的关键。第三段谱初始化 交叉熵优化先给初值。随机起点很容易把数据揉成一团UMAP 默认initspectral用稀疏图上的谱嵌入umap/spectral.py中的spectral_layout得到第一版低维坐标让大致的块状结构在优化开始前就已就位。再跑优化。低维空间同样按距离定义边强度用的是一条可导曲线$$q_{ij} \frac{1}{1 a, r_{ij}^{,2b}}$$$r_{ij}$ 是低维欧氏距离$a, b$ 由find_ab_params(spread, min_dist)拟合一个「截断指数衰减」得到min_dist与spread因此成为控制点团松紧的两个旋钮。优化目标就是让高维边分布 $p$ 与低维边分布 $q$ 的交叉熵最小$$L \sum_{i,j} \left[ p_{ij}\log\frac{p_{ij}}{q_{ij}} (1-p_{ij})\log\frac{1-p_{ij}}{1-q_{ij}} \right]$$实现上并不遍历所有点对正样本按隶属强度加权采样负样本按 word2vec 风格以negative_sample_rate默认 5比例抽取每轮只更新被抽到的边配合动量学习率退火整段用 numba 编译成原生循环。源码走读三个核心函数的设计落点 与其逐行翻译不如盯住三个函数的「为什么这么写」。smooth_knn_distumap/umap_.py对每个样本做最多 64 轮二分搜索解出使行概率和逼近 $\log_2 k$ 的 $\sigma_i$。设计意图是把「选 k 个邻居」升级为「k 可以连续变化的模糊集基数字」这样邻域大小在密度不同的区域可以自适应伸缩。函数带numba.njit(parallelTrue)逐样本循环走prange并行。fuzzy_simplicial_setumap/umap_.py串起近邻搜索、smooth_knn_dist与compute_membership_strengths产出稀疏矩阵后执行模糊并/交插值set_op_mix_ratio1.0为纯并0.0为纯交。设计意图是所有中间产物保持 COO 三元组形态全程不生成 $n\times n$ 稠密矩阵百万级样本才跑得动。optimize_layout_euclideanumap/layouts.pySGD 主循环。注意epochs_per_sample是按隶属强度反比分配的——强边更新得更频繁弱边更久才被抽中一次等价于一种隐式的重要性采样负样本轮询器epoch_of_next_negative_sample独立维护避免每步全量重算。parallelTrue时切换为 numba 并行版本但一旦设置了随机种子会自动退回串行以保证可复现这是个值得注意的工程取舍。另外两个配角nearest_neighborsumap/umap_.py内部委托给 pynndescent 的 NNDescent 做近似近邻breadth_first_search同文件用于检测被disconnection_distance剪枝后完全断开的孤立点。UMAP 参数调优速查与高频坑点参数作用推荐范围说明n_neighbors局部邻域大小2~100常用 5~50小值保局部细节大值偏全局结构min_dist低维最小点距0.01~0.5默认 0.1调小→簇更紧调大→更摊开metric高维距离稠密数值用 euclidean文本/词袋用 cosine 或 hellinger高维稀疏数据尤其敏感n_epochs优化轮数默认 500增加轮数收益递减主要影响收敛平滑度learning_rate初始学习率0.1~1.0过大易震荡过小前期收敛慢local_connectivity局部连通度1.0 附近调大后低密度区域更连贯三类高频坑点结果不可复现近似近邻与采样都带随机性固定random_state后再对比参数注意并行路径本身不保证确定性。部分点散在远处/断成孤岛先确认数据是否标准化推荐StandardScaler再看日志中的 disconnected 警告用umap.utils.disconnected_vertices定位离群点。高维文本/基因数据上簇糊成一片换metriccosine或对计数类稀疏数据用hellinger这类数据用欧氏距离会严重失真。工程化要点性能与内存优化⚡ 三条策略对应三个瓶颈收益都比较直接近邻搜索用近似算法精确 kNN 是 $O(n^2)$nearest_neighbors走 NNDescent 随机投影森林播种整体降到接近 $O(n \log n)$这是百万样本能跑完的前提。数据已有距离矩阵时直接传metricprecomputed跳过搜索这一步。numba JIT 并行热路径smooth_knn_dist、隶属强度计算、SGD 主循环全部njit编译prange展开到多线程n_jobs控制近邻搜索线程数。首次运行有编译开销cacheTrue的函数可跨进程复用。稀疏存储 low_memory邻域图全程 COO 稀疏三元组内存约为 $O(n \times k)$ 而非 $O(n^2)$近邻搜索端可开low_memoryTrue进一步压缩 NNDescent 的中间图。配合float32距离数组内存占用再降一半。延伸方向与总结复跑通基础流程后这三个方向值得接着做半监督嵌入fit传入y含NaN表示未标注并设target_metriccategorical标签会作为第二张模糊图与结构图做模糊交集标签稀缺场景尤其有用DensMAPdensmapTrue在交叉熵之外补一项密度保持正则点团大小可映射回原空间密度端到端 ParametricUMAPumap/parametric_umap.py用 Keras 编码器 同样的交叉熵损失让新数据直接过网络出嵌入省去 landmark 插值。 总结来看UMAP 的贡献在于把「模糊拓扑结构 交叉熵对齐」这套数学写成了能扛百万样本的工程实现高维端用自适应尺度的模糊图压缩局部结构低维端用可导曲线和负采样把优化成本摊薄源码里稀疏三元组贯穿始终、numba 热路径编译、并行与种子互斥等细节正是论文公式与生产可用之间的差距。复现路径本身也不复杂——先跑通二十行示例再对照三段机制逐函数走读基本就能把 UMAP 降维复现完整吃透。【免费下载链接】umapUniform Manifold Approximation and Projection项目地址: https://gitcode.com/gh_mirrors/um/umap创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻