前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >独家 | 拓扑机器学习的神圣三件套:Gudhi,Scikit-Learn和Tensorflow(附链接&代码)

独家 | 拓扑机器学习的神圣三件套:Gudhi,Scikit-Learn和Tensorflow(附链接&代码)

作者头像
数据派THU
发布于 2020-03-26 07:27:17
发布于 2020-03-26 07:27:17
1.3K00
代码可运行
举报
文章被收录于专栏:数据派THU数据派THU
运行总次数:0
代码可运行

作者:Mathieu Carrière

翻译:孙韬淳

校对:和中华

本文约4500字,建议阅读10分钟

本文简要介绍了机器学习中拓扑数据分析的力量并展示如何配合三个Python库:Gudhi,Scikit-Learn和Tensorflow进行实践。

标签:数据可视化

Hi大家好。今天,我想强调下在机器学习中拓扑数据分析(TDA,Topological Data Analysis)的力量,并展示如何配合三个Python库:Gudhi,Scikit-Learn和Tensorflow进行实践。

拓扑数据分析?

首先,让我们谈谈TDA。它是数据科学中相对小众的一个领域,尤其是当与机器学习和深度学习对比的时候。但是它正迅速成长,并引起了数据科学家的注意。很多初创企业和公司正积极把这些技术整合进它们的工具箱中(比如IBM,Fujitsu,Ayasdi),原因则是近年来它在多种应用领域的成功,包括生物学、时间序列、金融、科学可视化、计算机图形学等。未来我可能会写一个关于TDA一般用途和最佳实践的帖子,所以请大家等待下。

TDA:

https://en.wikipedia.org/wiki/Topological_data_analysis

IBM:

https://researcher.watson.ibm.com/researcher/view_group.php?id=6585

Fujitsu:

https://www.fujitsu.com/global/about/resources/news/press-releases/2016/0216-01.html

Ayasdi:

https://www.ayasdi.com/platform/technology/

生物学:

https://www.ncbi.nlm.nih.gov/pubmed/28459448

时间序列:

https://www.ams.org/journals/notices/201905/rnoti-p686.pdf

金融:

https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2931836

科学可视化:

https://topology-tool-kit.github.io/

计算机图形学:

http://www.lix.polytechnique.fr/~maks/papers/top_opt_SGP18.pdf

TDA的目标是对你数据的拓扑性质进行计算和编码,这意味着记录数据集中多样的连接成分,环,腔和高维结构。这非常有用,主要是因为其他描述符不可能计算这类信息。所以TDA真的储存了一组你不可能在其他地方找到的数据特征。现实情况是这类特征已被证明对提升机器学习预测能力很有用,所以如果你以前还没见过或听过这类特征,我来带你快速了解一下。

我已经写过很多这个主题的文章,你可以在Medium找到关于TDA的很多其他帖子,所以我不打算浪费时间在数学定义上面,而是通过解释TDA文献中的典型例子,来展示如何在你的数据集上应用TDA。

文章:

https://towardsdatascience.com/mixing-topology-and-deep-learning-with-perslay-2e60af69c321

帖子:

https://towardsdatascience.com/applied-topological-data-analysis-to-deep-learning-hands-on-arrhythmia-classification-48993d78f9e6

TDA的参考示例:点云分类

这个数据集在一篇开创性的TDA文章上介绍过。它由通过下述动力系统生成的轨迹来得到的点云集组成:

开创性的TDA文章

http://jmlr.org/papers/v18/16-337.html

一个动力系统的方程

这意味着我们将从一个单位正方形内随机抽取一个初始点,并通过上面的方程生成一个点的序列。这将给我们一个点云。现在我们可以根据意愿重复这个操作,得到一堆点云。这些点云的一个有趣的属性在于,根据你用来生成点序列的r参数的值,点云会有非常不一样且有意思的结构。比如,如果r=3.5,得到的点云似乎覆盖了整个单位正方形,但如果r=4.1,单位正方形的一些区域就是空的:换句话说,在你的点云里有好多洞。这对我们是个好消息:TDA可以直接计算这些结构是否能出现。

r=3.5(左)和r=4.1(右)计算出的点云。相当明显的是后者有个洞,但前者没有

TDA跟踪这些洞的方式实际上相当简单。想象给定半径为R的每个球的圆心都在你点云的每个点上。如果R=0,这些球的并集就是点云本身。如果R为无穷,那么球的并集是整个单位正方形。但如果R被很精心的选择,球的并集可能存在很多拓扑结构,比如,洞。

球并集的例子。对于中间图的并集,它清晰的组成了一个洞。整张图片被我“不要脸”地借用自我之前的一个帖子

帖子

https://towardsdatascience.com/a-concrete-application-of-topological-data-analysis-86b89aa27586

那么,为了避免人工选择R的“好值”,TDA将针对每一个可能的R值(从0到无穷)计算球的并集,并记录每个洞出现或者消失时的半径,并对一些点使用这些半径值作为二维坐标。TDA的输出则是另一个点云,其中每个点代表一个洞:这叫做Rips持续图(Rips persistence diagram)。假设点云在一个numpy数组X中储存(shape为N*2),通过Gudhi,这个图可以用两行代码计算出来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import gudhi
rips = gudhi.RipsComplex(points=X).create_simplex_tree()
dgm = rips.persistence()

这个漂亮的持续图由r=4.1对应的点云计算出。红色的点代表相连的成分,蓝色的点代表洞

接下来我们将解决的任务则是给定点云预测r的值。

通过Gudhi+Scikit-Learn进行拓扑机器学习

持续图很简洁,是不是?它们存在的问题则是,从不同点云计算出的持续图可能有不同数量的点(因为点云可能有不同数量的洞)。所以如果你想用Scikit-Learn从持续图中预测r,不幸的是,没有直接的方法,因为这些库预期输入是一个结构化的向量。这也是为什么目前大量的工作是关于将这些持续图转化为固定长度的欧几里得向量,或者是开发对应的核。这很棒,但是你应该使用哪种呢?

不要担心!Gudhi再一次给你解决办法。通过它的表达(representation)模块,你不仅可以计算所有的向量和核,甚至也可以使用Scikit-Learn来交叉验证并且(或)选择最佳的一种。就像下面这么简单:

表达

https://gudhi.inria.fr/python/latest/representations.html

import gudhi.representations as tdafrom sklearn.pipeline import Pipelinefrom sklearn.svm import SVCfrom sklearn.ensemble import RandomForestClassifier as RFfrom sklearn.neighbors import KNeighborsClassifier as kNNfrom sklearn.model_selection import GridSearchCV

pipe = Pipeline([("TDA", tda.PersistenceImage()), ("Estimator", SVC())])param = [{"TDA": [tda.SlicedWassersteinKernel()], "TDA__bandwidth": [0.1, 1.0], "TDA__num_directions": [20], "Estimator": [SVC(kernel="precomputed")]}, {"TDA": [tda.PersistenceWeightedGaussianKernel()], "TDA__bandwidth": [0.1, 0.01], "TDA__weight": [lambda x: np.arctan(x[1]-x[0])], "Estimator": [SVC(kernel="precomputed")]}, {"TDA": [tda.PersistenceImage()], "TDA__resolution": [ [5,5], [6,6] ], "TDA__bandwidth": [0.01, 0.1, 1.0, 10.0], "Estimator": [SVC()]}, {"TDA": [tda.Landscape()], "TDA__resolution": [100], "Estimator": [RF()]}, {"TDA": [tda.BottleneckDistance()], "TDA__epsilon": [0.1], "Estimator: [kNN(metric="precomputed")]} ]model = GridSearchCV(pipe, param, cv=3)model = model.fit(diagrams, labels)

在前面的代码中,我尝试了带切片Wasserstein核和持续权重Gaussian核的核SVM、带有Persistence Images的C-SVM,带有Persistence Landscapes的随机森林,和一个带有所谓的持久图之间瓶颈距离(bottleneck distance)的简单KNN。在Gudhi中还有许多其他的可能,所以你一定要试试!如果想了解更多细节你也可以看看Gudhi的Tutorial。

带切片Wasserstein核:

http://proceedings.mlr.press/v70/carriere17a/carriere17a.pdf

持续权重Gaussian核:

http://proceedings.mlr.press/v48/kusano16.html

Persistence Images:

http://jmlr.org/papers/v18/16-337.html

Persistence Landscapes:

http://www.jmlr.org/papers/volume16/bubenik15a/bubenik15a.pdf

Gudhi的Tutorial:

https://github.com/GUDHI/TDA-tutorial/blob/master/Tuto-GUDHI-representations.ipynb

用Gudhi和Tensorflow/Pytorch进行拓扑优化

我很确信你目前已经成为了TDA的爱好者。如果你仍不相信,我还有其他的东西给你,这是受这篇论文启发。想象你现在想解决一个更难的问题:我想让你给我一个点云,这个点云的持续图有尽可能多的点。换句话说,你需要生成一个有好多洞的点云。

论文:

https://arxiv.org/abs/1905.12200

我可以看见你额头上出汗了。但我是很仁慈的,转眼间就能让你知道Gudhi(1)可以做这个。想一想:当你生成一个持续图时,这个图中不同点的坐标并不受全部的初始点云影响,是不是?对于这个持续图的一个给定点p,p的坐标仅依赖于在初始点云中组成p对应洞的点的位置,以一种简单的方式:这些坐标仅是球的并集使得这个洞出现或者消失时候的半径;或者,等价表达是,这些点中的最大的成对距离。而Gudhi(2)可以通过它的persistence_pairs()函数找出这些关系。梯度则可以简单的定义成欧几里得距离函数的导数(正式定义见这篇论文)。

Gudhi(1):

http://gudhi.gforge.inria.fr/python/latest/

Gudhi(2):

https://gudhi.inria.fr/python/latest/

这篇论文:

https://sites.google.com/view/hiraoka-lab-en/research/mathematical-research/continuation-of-point-cloud-data-via-persistence-diagram

接下来让我们写两个函数,第一个从点云中计算Rips持续图,第二个计算持续图点集的导数。为了可读性我简化了一点点代码,实际的代码可以从这里找到。

https://github.com/GUDHI/TDA-tutorial/blob/master/Tuto-GUDHI-optimization.ipynb

def compute_rips(x): rc = gd.RipsComplex(points=x) st = rc.create_simplex_tree() dgm = st.persistence() pairs = st.persistence_pairs() return [dgm, pairs]

def compute_rips_grad(grad_dgm, pairs, x): grad_x = np.zeros(x.shape, dtype=np.float32) for i in range(len(dgm)): [v0a, v0b] = pairs[i][0] [v1a, v1b] = pairs[i][1] grad_x[v0a,:]+=grad_dgm[i,0]*(x[v0a,:]-x[v0b,:])/val0 grad_x[v0b,:]+=grad_dgm[i,0]*(x[v0b,:]-x[v0a,:])/val0 grad_x[v1a,:]+=grad_dgm[i,1]*(x[v1a,:]-x[v1b,:])/val1 grad_x[v1b,:]+=grad_dgm[i,1]*(x[v1b,:]-x[v1a,:])/val1 return grad_x

现在让我们把函数封装进Tensorflow函数中(对Pytorch同样简单),并定义一个损失loss,这个损失是持续图点到其对角线的距离的相反数。这将迫使图有很多点,它们的纵坐标比横坐标大得多。这样的话,一个点云会有很多大尺寸的洞。

import tensorflow as tffrom tensorflow.python.framework import opsdef py_func(func, inp, Tout, stateful=True, name=None, grad=None): rnd_name = "PyFuncGrad" + str(np.random.randint(0, 1e+8)) tf.RegisterGradient(rnd_name)(grad) g = tf.get_default_graph() with g.gradient_override_map({"PyFunc": rnd_name}): return tf.py_func(func, inp, Tout, stateful=stateful, name=name)def Rips(card, hom_dim, x, Dx, max_length, name=None): with ops.op_scope([x], name, "Rips") as name: return py_func(compute_rips, [x], [tf.float32], name=name, grad=_RipsGrad)def _RipsGrad(op, grad_dgm): pairs = op.outputs[1] x = op.inputs[0] grad_x = tf.py_func(compute_rips_grad, [grad_dgm,pairs,x], [tf.float32])[0] return [None, None, grad_x, None, None]

tf.reset_default_graph()x = tf.get_variable("X", shape=[n_pts,2], initializer=tf.random_uniform_initializer(0.,1.), trainable=True)dgm, pairs = Rips(x)loss = -tf.reduce_sum(tf.square(dgm[:,1]-dgm[:,0]))opt = tf.train.GradientDescentOptimizer(learning_rate=0.1)train = opt.minimize(loss)

现在我们开始优化!这是epochs 0,20,90的结果:

好多洞,好漂亮。。我们是不是在梦里。如果你想往前看看,使用其它的损失,查阅这个Gudhi的tutorial。

https://github.com/GUDHI/TDA-tutorial/blob/master/Tuto-GUDHI-optimization.ipynb

最后的话

这个帖子仅是一瞥由Gudhi,Scikit-Learn和Tensorflow提供的众多可能性。我希望我可以使你相信,在你的流程中整合TDA已经成为很简单的事情。即使许多TDA应用已经在文献中出现,肯定还有更多的应用需要去发现!

原文标题:

The Holy Trinity of Topological Machine Learning: Gudhi, Scikit-Learn and Tensorflow

原文链接:

https://towardsdatascience.com/the-holy-trinity-of-topological-machine-learning-gudhi-scikit-learn-and-tensorflow-pytorch-3cda2aa249b5

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文带你了解机器学习的四大框架PyTorch、TensorFlow、Keras、Scikit-learn
点评:文章概要性地介绍了机器学习,指出其重要性日益凸显,如Geoffrey Hinton等机器学习领域的大牛被Google、Facebook等科技巨头争相聘请。文章阐述了机器学习的定义,即一种让计算机从数据中自动学习和改进的技术。同时,文章还探讨了机器学习的范围、方法,如支持向量机、聚类算法等,并强调了机器学习在大数据、深度学习及人工智能领域的广泛应用与重要影响,展现了机器学习技术推动科技进步的巨大潜力。
小白的大数据之旅
2024/11/25
1.2K1
一文带你了解机器学习的四大框架PyTorch、TensorFlow、Keras、Scikit-learn
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
总的来说,这四个工具箱各有各的优点,适合不同的任务和学习阶段。 你想盖什么样子的“房子”(解决什么问题),就选择合适的工具箱。 接下来让我们去了解一下他们吧
小白的大数据之旅
2024/11/26
1.8K0
Python深度学习框架:PyTorch、Keras、Scikit-learn、TensorFlow如何使用?学会轻松玩转AI!
机器学习神器Scikit-Learn入门教程
本篇文章通过简明快要的方式来介绍scikit-learn的使用,更多详细内容请参考官网:
算法进阶
2022/06/02
7990
机器学习神器Scikit-Learn入门教程
Scikit-Learn Cheat Sheet:Python机器学习
一个方便的scikit-learn备忘录,用于使用Python进行机器学习,包括代码示例。
iOSDevLog
2018/07/25
1.4K0
Scikit-Learn Cheat Sheet:Python机器学习
Python机器学习工具:Scikit-Learn介绍与实践
Scikit-learn 简介 官方的解释很简单: Machine Learning in Python, 用python来玩机器学习。 什么是机器学习 机器学习关注的是:计算机程序如何随着经验积累自动提高性能。而最大的吸引力在于,不需要写任何与问题相关的特定代码,泛型算法就能告诉你一些关于数据的秘密。 Scikit-learn的优点 1、构建于现有的NumPy(基础n维数组包),SciPy(科学计算基础包), matplotlib(全面的2D/3D画图),IPython(加强的交互解释器),Sy
Python中文社区
2018/01/31
9010
Python机器学习工具:Scikit-Learn介绍与实践
【Scikit-Learn 中文文档】使用 scikit-learn 介绍机器学习 | ApacheCN
使用 scikit-learn 介绍机器学习 | ApacheCN 内容提要 在本节中,我们介绍一些在使用 scikit-learn 过程中用到的 机器学习 词汇,并且给出一些例子阐释它们。 机器学习:问题设置 一般来说,一个学习问题通常会考虑一系列 n 个 样本 数据,然后尝试预测未知数据的属性。 如果每个样本是 多个属性的数据 (比如说是一个多维记录),就说它有许多“属性”,或称 features(特征) 。 我们可以将学习问题分为几大类: 监督学习 , 其中数据带有一个附加属性,即我
片刻
2018/01/15
1.3K0
【Scikit-Learn 中文文档】使用 scikit-learn 介绍机器学习 | ApacheCN
现在 tensorflow 和 mxnet 很火,是否还有必要学习 scikit-learn 等框架?
原题如下: 现在 tensorflow 和 mxnet 很火,那么对于深度学习(机器学习)准备入门的学生还有必要学习 scikit-learning,caffe 之类的框架么,以及是否有其他需要注意的地方?比如可以通过一些具体的场景描述一下这些框架的使用。 Scikit-learn 和 TensorFlow 之间有很多显著差异,非常有必要同时了解它们。 区别 1:对于数据的处理哲学不同导致了功能不同 Scikit-learn(sklearn) 的定位是通用机器学习库,而 TensorFlow(tf) 的
AI研习社
2018/03/16
8130
现在 tensorflow 和 mxnet 很火,是否还有必要学习 scikit-learn 等框架?
机器学习神器Scikit-Learn极简入门教程
Scikit-learn是一个非常知名的Python机器学习库,它广泛地用于统计分析和机器学习建模等数据科学领域。
皮大大
2022/01/12
2.6K0
机器学习神器Scikit-Learn极简入门教程
Python机器学习:Scikit-Learn教程
一个易于理解的scikit-learn教程,可以帮助您开始使用Python机器学习。
iOSDevLog
2018/07/25
2.3K0
Python机器学习:Scikit-Learn教程
如何用Neo4j和Scikit-Learn做机器学习任务?| 附超详细分步教程
图算法不是一个新兴技术领域,在开源库中已经有很多功能强大的算法实现。近两年,业内的学者与科学家都在积极探索可以弥补深度学习不可解释性,无法进行因果推断的这个缺陷,而图神经网络(GNN)成为备受关注和期待的“宠儿”。随着学界和业界越来越关注GNN,各种新工作不断被提出,基于图神经网络的框架随之产生,如大家现在都已经熟悉的DGL,两大深度学习框架PyTorch和TensorFlow中也开始支持相应的功能,大家对图(Graph)、图计算、图数据库、图机器学习等研究的关注度越发高涨。
AI科技大本营
2019/12/10
4.5K0
如何用Neo4j和Scikit-Learn做机器学习任务?| 附超详细分步教程
【Python环境】基于 Python 和 Scikit-Learn 的机器学习介绍
你好,%用户名%! 我叫Alex,我在机器学习和网络图分析(主要是理论)有所涉猎。我同时在为一家俄罗斯移动运营商开发大数据产品。这是我第一次在网上写文章,不喜勿喷。 现在,很多人想开发高效的算法以及参加机器学习的竞赛。所以他们过来问我:”该如何开始?”。一段时间以前,我在一个俄罗斯联邦政府的下属机构中领导了媒体和社交网络大数据分析工具的开发。我仍然有一些我团队使用过的文档,我乐意与你们分享。前提是读者已经有很好的数学和机器学习方面的知识(我的团队主要由MIPT(莫斯科物理与技术大学)和数据分析学院的毕业生构
陆勤_数据人网
2018/02/27
8380
从入门到精通Python机器学习:scikit-learn实战指南
在数据科学和机器学习领域,Python以其简洁的语法和强大的库支持,成为了许多开发者和研究者的首选语言。而在众多Python机器学习库中,scikit-learn以其易用性、灵活性和强大的算法集合,成为了最受欢迎的库之一。本文将深入探讨scikit-learn的原理和应用,并通过项目案例展示其在实际问题解决中的强大能力。
颜淡慕潇
2024/07/17
1.2K0
从入门到精通Python机器学习:scikit-learn实战指南
scikit-learn的五种机器学习方法使用案例(python 代码)
对于一些开始搞机器学习算法有害怕下手的小朋友,该如何快速入门,这让人挺挣扎的。 在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法。 加载数据 我们假设输入时一个特征矩阵或者csv文件。 首先,数据应该被载入内存中。 scikit-learn的实现使用了NumPy中的arrays,所以,我们要使用NumPy来载入csv文件。 以下是从UCI机器学习数据仓库中下载的数据。 import
机器学习AI算法工程
2018/03/14
1.4K0
《Scikit-Learn与TensorFlow机器学习实用指南》第9章 启动并运行TensorFlow
第9章 启动并运行TensorFlow 来源:ApacheCN《Sklearn 与 TensorFlow 机器学习实用指南》翻译项目 译者:@akonwang @WilsonQu 校对:@Lis
ApacheCN_飞龙
2018/05/16
2K0
用Python与Scikit-learn构建高效机器学习模型
文章链接:https://cloud.tencent.com/developer/article/2472162
一键难忘
2024/11/29
2250
深度学习四大名著之《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第二版
《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第二版
SeanCheney
2019/09/25
21.5K4
深度学习四大名著之《机器学习实战:基于Scikit-Learn、Keras和TensorFlow》第二版
《Scikit-Learn与TensorFlow机器学习实用指南》第2章 一个完整的机器学习项目
第2章 一个完整的机器学习项目 来源:ApacheCN《Sklearn 与 TensorFlow 机器学习实用指南》翻译项目 译者:@SeanCheney 校对:@Lisanaaa @飞龙 本章中,你会假装作为被一家地产公司刚刚雇佣的数据科学家,完整地学习一个案例项目。下面是主要步骤: 项目概述。 获取数据。 发现并可视化数据,发现规律。 为机器学习算法准备数据。 选择模型,进行训练。 微调模型。 给出解决方案。 部署、监控、维护系统。 使用真实数据 学习机器学习时,最好使用真实数据,而不是人工数
ApacheCN_飞龙
2018/05/16
2.9K0
Scikit-learn机器学习建模的万能模板!
【导读】大家好,我是泳鱼。一个乐于探索和分享AI知识的码农!今天的这篇文章带大家轻松get机器学习建模方法~
算法进阶
2023/09/15
2780
Scikit-learn机器学习建模的万能模板!
机器学习相关的python库介绍
顾名思义,机器学习是计算机编程的科学,通过它可以从不同类型的数据中学习。Arthur Samuel给出的更一般的定义是 - “机器学习是一个研究领域,它使计算机无需明确编程即可学习。”它们通常用于解决各种类型的生活问题。
XXXX-user
2019/09/12
6290
【Python篇】从零到精通:全面分析Scikit-Learn在机器学习中的绝妙应用
机器学习正在快速改变我们的世界,而Scikit-Learn作为Python生态中最为强大的机器学习库之一,是每个数据科学家和工程师不可或缺的工具。本篇文章旨在从零开始,带领你逐步掌握Scikit-Learn的核心功能与实际应用。无论你是刚刚接触机器学习的初学者,还是希望提升技能的进阶学习者,这篇文章都将为你提供一条清晰的学习路径,助你在数据科学领域中不断成长和突破。让我们一起踏上这段充满探索与发现的旅程,解锁机器学习的无限可能。
半截诗
2024/10/09
5990
推荐阅读
相关推荐
一文带你了解机器学习的四大框架PyTorch、TensorFlow、Keras、Scikit-learn
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验