KeplerMapper如何选Lens:7种投影函数实战,精准捕获数据的拓扑形态
2026/8/24 15:05:52 网站建设 项目流程

KeplerMapper如何选Lens:7种投影函数实战,精准捕获数据的拓扑形态

【免费下载链接】kepler-mapperKepler Mapper: A flexible Python implementation of the Mapper algorithm.项目地址: https://gitcode.com/gh_mirrors/ke/kepler-mapper

KeplerMapper 是一款用 Python 实现的 Mapper 算法拓扑数据分析工具,而Lens(透镜)的选择直接决定了你能从数据中看到什么样的结构。选对 Lens,簇、环、分支就会自然浮现;选错 Lens,再漂亮的图也只是噪声的排列。本文带你逐一拆解 KeplerMapper 内置的 7 种投影函数(sum、mean、median、max/min、std、l2norm、dist_mean),并通过 make_circles、乳腺癌、手写数字等真实案例,教你根据数据形态快速选定最合适的 Lens。

为什么 Lens 是 Mapper 的核心

Mapper 的工作流程可以概括为四步:投影(Lens)→ 覆盖(Cover)→ 聚类(Cluster)→ 建图(Nerve)。其中投影函数负责把高维数据"压扁"到 1 维或 2 维,后续所有结构都建立在这个低维表示之上。

官方理论文档 docs/theory.rst 中这样解释:Mapper 通过投影函数引导局部聚类,从而揭示数据的线性、非线性、簇、环等基本形状。可以说:Lens 是你对数据提的问题,图是数据给出的回答。

所有投影函数都在project()方法中实现,核心代码位于 kmapper/kmapper.py。

7种内置投影函数速查表

KeplerMapper 支持用字符串直接指定投影函数,以下是内置 7 种(外加 1 个进阶函数)的速查表:

投影函数计算方式适合场景
sum每行求和默认选择,整体规模
mean每行求均值消除量纲影响的平均水平
median每行中位数对异常值稳健的中心趋势
max/min每行最大/最小值捕捉极端特征
std每行标准差度量样本内部波动
l2norm每行 L2 范数样本到原点的距离
dist_mean样本到数据均值的距离发现离群结构
knn_distance_n到 n 个最近邻的距离和密度感知的离群检测

sum 与 mean:捕捉整体规模的默认之选

sum是 KeplerMapper 的默认投影函数:对每条数据的所有特征求和,得到一个标量。它回答的问题是"这个样本整体有多大?"

经典的狮子(Lion)参考数据案例就是直接使用默认sum投影完成映射的,案例脚本见 examples/lion/lion.py,效果如下:

meansum类似,但排除了特征数多寡的影响,更适合特征数量不一致或量纲差异大的场景。

median 与 max/min:对异常值稳健或敏感

median取中位数,异常值难以拉偏结果,适合含噪声、脏数据的真实业务数据。

maxmin则反其道而行——它们对极端值极度敏感。当"某一项特征特别突出"本身就是信号时(例如交易数据中单笔大额订单、传感器数据中的峰值),用max投影往往能单独把这类样本剥离出来。

std:用波动性揭示样本的"复杂度"

std计算每行特征值的标准差,把 Lens 变成一把"波动尺":特征取值越分散的样本,投影值越大。

它特别适合识别内部结构复杂的样本,例如基因表达谱中"分化程度高"的细胞、时间序列中"变异性大"的交易日。std 投影经常能把高波动群体聚成独立的大节点,非常便于进一步核查。

l2norm:样本到原点的距离

l2norm计算每行向量的欧几里得范数,即样本到原点的距离。在乳腺癌数据集案例中,作者正是选择 L2 范数作为第二条 Lens 维度之一,因为它能把"特征总量大"的样本推开,起到数据分散的作用,避免大量点挤在一起。完整实现可参考 examples/plot_breast_cancer.py:

# 创建 L2 范数 Lens lens2 = mapper.fit_transform(X, projection="l2norm")

该案例将 Isolation Forest 异常分与 l2norm 拼成 2 维 Lens,映射结果清晰地呈现了良/恶性样本的拓扑分布:

dist_mean:发现偏离群体中心的样本

dist_mean计算每个样本到整个数据集均值向量的距离,本质是一把"离群尺"。距离越远,样本越偏离群体中心。

在噪声圆圈数据集make_circles上,用dist_mean做投影是观察环状结构的经典操作——内外两圈的半径差异会被 Lens 忠实记录,映射图因此呈现出漂亮的环形拓扑。案例代码见 examples/makecircles/make_circles_distmean.py:

进阶Lens:维度索引、knn_distance_n 与降维模型

除了字符串函数,KeplerMapper 的projection参数还支持三种进阶玩法:

  • 维度索引列表:直接取原始坐标做 Lens,如projection=[0, 1]取前两维。对于 make_circles 这类 2D 数据,取 X 轴即可还原内外圈结构,效果对比可参考 examples/makecircles/make_circles_xaxis.py 的输出:

  • knn_distance_n:写成knn_distance_5表示计算到 5 个最近邻的距离和。它在"局部密度"意义上衡量离群,比 dist_mean 更抗整体漂移。
  • scikit-learn 估计器:直接把PCA()TSNE()UMAP()实例传进去即可获得多降维 Lens。手写数字案例就用 t-SNE 把 64 维像素压到 2 维再建图,节点悬浮窗还能直接看到数字原图,见 examples/plot_digits.py:

如何选择Lens:实战四步法

结合 docs/theory.rst 的思想与官方案例的选择逻辑,推荐四步法:

  1. 先问业务:Lens 应该回答什么问题?"整体规模"→sum/mean;"离群程度"→l2norm/dist_mean/knn_distance_n;"内部波动"→std
  2. 让数据分散,而不是聚堆:官方乳腺癌案例明确建议第二 Lens 选择有"分散性"的函数(如l2norm),避免大量点堆在同一区间。
  3. 小数据先试 1 维:用默认km.Cover(n_cubes=10, perc_overlap=0.1)快速跑一版,看节点数量与图形连通性是否合理,再调整。
  4. 多维度组合:把两条语义不同的 Lens 用np.c_[]拼成 2 维 Lens,信息量往往大于单维(例如"异常分 + L2 范数")。

总结

KeplerMapper 选 Lens 的核心心法可以浓缩为一句话:Lens 即问题

  • 看整体 →sum/mean
  • 抗噪声 →median
  • 抓极端 →max/min
  • 量波动 →std
  • 测距离 →l2norm/dist_mean/knn_distance_n
  • 要降维 → PCA / t-SNE / UMAP

投影函数的实现细节都在 kmapper/kmapper.py 的project()方法中,配合 kmapper/cover.py 的覆盖参数,你几乎可以组合出任意角度去观察数据的拓扑形态。选对 Lens,拓扑图自会说话。

【免费下载链接】kepler-mapperKepler Mapper: A flexible Python implementation of the Mapper algorithm.项目地址: https://gitcode.com/gh_mirrors/ke/kepler-mapper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询