作者 | Francesco Palma,Davide Burba,Lewis Tunstall,Thomas Boys
来源 | Medium
编辑 | 代码医生团队
链接至教程:
https://github.com/giotto-ai/tutorial_mapper
除非非常擅长数字,否则数据可视化仍然是数据分析的最直接,最有影响力的见解来源。功能之间的视觉交互作用提供了深刻的见解,这些见解会影响功能选择和功能选择等未来的许多选择。
都喜欢拥有很多功能。好的方面是,可能会有更多的信息。缺点是隔离此信息所涉及的困难。由于无法轻松地在三个以上维度上可视化对象,因此标准可视化方法不太适合于高维数据。
所述映射器算法提供了一种方法来可视化在单个图形数据的固有形状。该图是通过巧妙的聚类过程构建的,该过程揭示了基础数据的粗略结构。有效地,有理论结果证实了输出的拓扑精度。
在本文中将介绍Mapper算法,并提供基于giotto-learn库给出的实现的教程。它的一项很酷的功能可以与某些Mapper参数进行交互,而无需重新运行代码。
giotto-learn中提供了Interactive Mapper
映射器算法的应用
自2007年以来,Mapper已用于简化复杂交互的可视化。它提供了对大型特征空间的定性分析,适合于医学,材料科学和基因组学的应用。最近它也已被用于改善神经网络的鲁棒性。
总结以下Mapper算法的两个著名应用:
1)乳腺癌患者分析
仅200名患者参加了一项乳腺癌研究,就需要一种专门的方法来处理基因型特征空间的30k维度。Mapper算法已成功应用于患者的细分,从而大大改善了靶向疗法。对两个不同的数据集执行了相同的分析,并提供了一致的输出,证明了算法的稳定性。
2)NBA球员的分类
如果曾经打过篮球,那肯定会一直在五个位置打球:控球后卫,得分后卫,小前锋,大前锋和中锋。通过使用球员的统计数据和游戏中的表现,Mapper算法可以识别出13种反映现代篮球动态的新打法。这将使团队的总经理了解建立团队时不可错过的技能。
映射器算法
从原始文件:
并不是试图获得数据集的完全准确的表示,而是试图获得易于理解并且可以指向感兴趣区域的低维图像。
为了生成表示数据结构的粗略图形,该算法将点合并到节点中,并在不同节点共有点时将它们连接起来。
这个过程是由神经定理激发的,该定理保证Mapper输出在拓扑上等同于从中采样数据的形状。
实际上,该算法分为三个步骤:
- 过滤:使用过滤函数f将数据点映射到ℝ中。
- 覆盖:以重叠的间隔覆盖过滤器值。
- 聚类:对于每个间隔,将聚类算法应用于在该间隔中映射的观测值。
在筛选值接近的点中,将原始空间中相似的点聚在一起。只要节点共享一个点,它们就会连接起来。(来源:https://arxiv.org/abs/1904.11044)
1)过滤
映射器的第一步是通过过滤函数f:ℝⁿ → mapping将每个数据点x映射到低维空间ℝᵐ。通常选择m = 1或m = 2。
过滤器功能的选择对Mapper结果有很大影响,因为过滤器值远的点没有机会聚在一起。因此,过滤器功能用作接近度的粗略测量。
在上图中,作者使用了height函数,但是原则上任何函数都可以完成这项工作。但是一些常见的选择是:
- 轴向投影
- PCA
- 偏心率
- 密度
- 熵
2)覆盖
以覆盖所有过滤器值的方式将图像空间划分为重叠的间隔(如果m> 1则为间隔的乘积)。称这种结构为封面。
通常将封面设置为相等大小的m维间隔。例如,如果过滤器函数采用in中的值,则覆盖是由一系列具有相等长度的重叠线段组成的。
在这种情况下,要选择的参数是间隔数及其重叠百分比。在上面的示例中,有4个间隔为25%的重叠。
3)聚类
在最后一步中,在封面的每个间隔上连续执行聚类。通过每次通过过滤功能获取间隔的前像,可以在原始空间上进行聚类。输出图是通过以下方式制作的:
- 代表数据点簇的节点;
- 代表群集对之间(群集共享一些数据点)之间非空交集的边。由于间隔重叠,这是可能的。
在这一点上,每个聚类代表图的一个节点,并且边缘对应于具有共同观察结果的聚类。
教程:使用Mapper检索圣诞老人
直观地了解Mapper的工作方式的最佳方法是使用它并“播放”其参数。
Giotto是一个开源项目,其中包含giotto-learn,这是一个易于使用的拓扑数据分析工具包。它使用类似于Scikit-learn的API,并通过管道功能提供了一种适合Mapper的便捷方法。给定一个Numpy数组形式的数据集,构建图形的代码如下:
代码语言:javascript复制pipeline = make_mapper_pipeline(
filter_func=Projection(column_indices=2),
cover=OneDimensionalCover(n_intervals=10, overlap_frac=0.1),
clusterer=DBSCAN(eps=0.5),
)
graph = pipeline.fit_transform(data)
将Mapper算法应用于包含从圣诞老人形状(即所谓的“圣诞老人云”)采样的20,000个三维数据点的数据集。
左:使用CloudCompare从此处采样的数据集。右:使用不同参数的Mapper输出。
作为首次尝试,使用覆盖和聚类的默认参数以及高度上的投影作为过滤函数,即f:[ x,y,z ]↦z。通过点的平均颜色为每个节点着色:
使用默认参数,圣诞老人可能会通过烟囱。
该图不能代表数据集,因为无法区分圣诞老人身体的任何特征。该图超出了节点的任意位置,使圣诞老人看上去像蛇一样,它相当于一条连接的节点线。这表明需要更改聚类算法的默认参数,因为始终将所有过滤器间隔聚类在一起。
为了解决此问题,执行了更好的聚类:
映射器输出:DBSCAN(eps = 0.06)。
这是一个非平凡的图结构。特别是,看到了代表圣诞老人胳膊和腿的树枝的外观。但是,在此表示中,圣诞老人有4条手臂。
倾向于通过调整封面间隔之间的重叠分数来解决此问题(默认值为0.1):
映射器输出:DBSCAN(eps = 0.06),overlap_frac = 0.35。
这次可以清楚地区分腿,手臂和头部。尽管它非常简单,但通常足以捕获主要结构。
可以通过增加封面的间隔数(默认值为10)来进一步完善研究。这样看到了代表帽子的节点的外观,以及将胸部与胡须分开的分支:
映射器输出:DBSCAN(eps = 0.06),overlay_frac = 0.35,n_intervals = 20。
结论
giotto-learn库在开源中提供了Mapper算法的快速,完整的Python实现。正在分享有关3D数据的教程,现在可以用自己的Mapper图来表示高维数据集。
链接:
Github上的Giotto库
https://github.com/giotto-ai/giotto-learn
包含代码的笔记本
https://github.com/giotto-ai/tutorial_mapper/blob/master/Christmas Mapper.ipynb
网站上的更多学习资料
https://giotto.ai/