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,效果如下:
mean与sum类似,但排除了特征数多寡的影响,更适合特征数量不一致或量纲差异大的场景。
median 与 max/min:对异常值稳健或敏感
median取中位数,异常值难以拉偏结果,适合含噪声、脏数据的真实业务数据。
max和min则反其道而行——它们对极端值极度敏感。当"某一项特征特别突出"本身就是信号时(例如交易数据中单笔大额订单、传感器数据中的峰值),用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 的思想与官方案例的选择逻辑,推荐四步法:
- 先问业务:Lens 应该回答什么问题?"整体规模"→
sum/mean;"离群程度"→l2norm/dist_mean/knn_distance_n;"内部波动"→std。 - 让数据分散,而不是聚堆:官方乳腺癌案例明确建议第二 Lens 选择有"分散性"的函数(如
l2norm),避免大量点堆在同一区间。 - 小数据先试 1 维:用默认
km.Cover(n_cubes=10, perc_overlap=0.1)快速跑一版,看节点数量与图形连通性是否合理,再调整。 - 多维度组合:把两条语义不同的 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),仅供参考