百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

用于拓扑机器学习的Python库giotto-learn入门

toyiye 2024-06-21 12:01 8 浏览 0 评论

由Lewis Tunstall,ColinK?lin,Francesco Palma和Thomas Boys撰写

介绍

在L2F,我们围绕giotto学习和拓扑机器学习遇到的最常见问题之一是"我从哪里开始?"。

在本指南中,我们概述了基本概念和工作流程,以便您可以在机器学习管道中开始使用giotto-learn。 可以在GitHub上获得用于重现分析的代码。

什么是拓扑机器学习?

拓扑机器学习是指将代数拓扑中的元素与统计学习结合在一起的一组技术。 通过关注数据的整体属性(例如形状和连接性),这些拓扑方法可以捕获传统机器学习方法可能会遗漏的模式。

例如,拓扑机器学习已在药物设计和图形分类中产生了最先进的结果,并导致了对蛋白质结合的新颖见解。

这些技术的主要成分被称为持久同源性。 持久同源性度量了各种长度范围内拓扑不变性(如连接的组件,孔和空隙)的存在。 这些不变量的"出生"和"死亡"通过持久性图表进行了总结,这是生成新型特征以馈送到下游机器学习任务的最常见,最直观的方式。 有关这些概念的出色概述,请参见Gary Koplik的文章或Matthew Wright的视频。

Birth and death of a hole by connecting neighbouring points with circles of increasing radius (left). The corresponding persistence diagram is also shown (right). Credit:

概括地说,拓扑机器学习的关键步骤是:

  • 使用持久性同源性从输入数据中提取拓扑特征。
  • 使用监督或非监督方法将这些功能与机器学习方法结合起来。

giotto学习库旨在简化这些步骤,并使更广泛的数据科学界可以访问拓扑机器学习。 它基于scikit-learn的fit-transform范例,并与流行的框架紧密集成。 giotto-learn入门就像运行一样简单:

pip install giotto-learn


预测分子性质

为了展示giotto-learn的作用,我们将使用Kaggle上Predicting Molecular Properties竞赛中的CHAMPS数据集。 此处的任务是预测分子中两个原子之间的磁性相互作用或"标量耦合常数"。 由于这些耦合取连续值,因此学习任务是一种回归。

For a given molecule, the learning task is to predict the strength of the couplings between each atom pair.

探索数据

训练数据由分子中的原子对组成,每对原子均以标量耦合的类型和每个原子的(x,y,z)坐标为特征。 为了简化分析,我们将重点介绍100个最大的分子,即原子数最大的分子。 如下图所示,这些分子具有五种不同的偶联,其强度取决于偶联的类型。

Coupling strength per coupling type for the 100 largest molecules in the data.


从数据到持久图

我们的拓扑机器学习管道的第一步是从训练数据构建持久性图。

在giotto-learn中,有两种主要方法可以实现此目的:

  • 将数据表示为点云:将每个观测值视为空间中的一个点,并使用度量标准来计算成对的观测值之间的距离。 在我们的上下文中,单个分子的点云可以简单地是每个原子相对于所有原子的平均值(x?,y?,z?)的(x,y,z)坐标。 在下面的代码片段中,homology_dimensions指定要跟踪的拓扑不变量的类型(" 0"表示连接的组件," 1"表示孔," 2"表示空隙),而欧几里得定义了我们希望在持久性同源性中应用的度量 计算。
import giotto.homology as hl

# represent data as a point cloud
point_cloud = ...

# define topological features to track
homology_dimensions = [0, 1, 2]

# define simplicial complex to construct
persistence = hl.VietorisRipsPersistence(
    metric="euclidean", homology_dimensions=homology_dimensions
)

# calculate persistence diagram
persistence_diagram = persistence.fit_transform(point_cloud)
  • 将数据表示为距离矩阵:计算每个观测值之间的成对距离,其中"距离"不必一定是度量。 如果我们将单个分子视为图,则两个原子之间的距离可能是沿着连接它们的最短路径的边数。 在下面的代码片段中,我们只需要指定度量是预先计算的,并确保输入是距离矩阵即可。
import giotto.homology as hl

# represent data as a matrix of pairwise distances
distance_matrix = ...

# define topological features to track
homology_dimensions = [0, 1, 2]

# define simplicial complex to construct
persistence = hl.VietorisRipsPersistence(
    metric="precomputed", homology_dimensions=homology_dimensions
)

# calculate persistence diagram
persistence_diagram = persistence.fit_transform(distance_matrix)

对于每个输入点云或距离矩阵,我们得到一个持久性图。 在训练数据中,每个观察都是一个原子对,因此将这些对分组以形成100个分子时,我们获得100个点云,从而获得100个余辉图。

持久性图中距离对角线死亡=出生线最远的点对应于最持久的拓扑特征。

A point cloud for a single molecule (left) and its corresponding persistence diagram (right). Connected components (H0) are shown in red, holes (H1) in cyan, and voids (H2) in purple.

从持久性图到机器学习功能

尽管持久性图是数据的有用描述符,但是它们不能直接用于机器学习应用程序。 这是因为不同的持久性图可能具有不同的点数,并且没有很好地定义基本操作(例如,图的加法和乘法)。

为了克服这些限制,已经提出了各种建议,以通过嵌入或内核将持久化图"向量化",这些嵌入或内核非常适合机器学习。 在giotto-learn中,我们通过giotto.diagrams模块提供对最常见矢量化的访问。

例如,可以通过选择度量来实现计算持久性图的"振幅",如下面的代码片段所示。

import giotto.diagrams as diagrams

# calculate persistence diagram
persistence_diagram = ...

# define type of amplitude to calculate
amplitude = diagrams.Amplitude(metric="wasserstein")

# calculate amplitude of diagram
persistence_diagram_amplitude = amplitude.fit_transform(persistence_diagram)

另外,您可以创建自己的自定义拓扑功能! 由于giotto-learn中的持久性图是出生-死亡-维三元组的数组,因此使用NumPy或Pandas操作它们很简单。 例如,下面的代码片段显示了如何计算每个homology_dimension点的平均寿命。

import pandas as pd

# define topological features to track
homology_dimensions = [0, 1, 2]

# calculate persistence diagram
persistence_diagram = ...

# convert NumPy array of triples to DataFrame
persistence_table = pd.DataFrame(
    persistence_diagram, columns=["birth", "death", "homology_dim"]
)

# calculate the lifetime per point
persistence_table["lifetime"] = persistence_table["death"] - persistence_table["birth"]

# calculate average lifetimes per homology dimension
average_lifetimes = [
    persistence_table.query(f"homology == {homology_dim}")["lifetime"].mean()
    for homology_dim in homology_dimensions
]

在对CHAMPS数据集的全面分析中,我们提取了各种各样的拓扑特征-有关详细信息,请参见随附的代码。

训练模型

有了拓扑特征,下一步就是训练回归器。 在scikit-learn约定中,这等于将所有相关功能和目标变量组合到数组X和y中。 对于本指南,我们采用本Kaggle提交中采用的方法,并使用XGBoostRegressor进行预测。 为了评估功能部件对性能的影响,我们比较了具有和不具有拓扑功能部件的经过5倍交叉验证训练的模型的结果。 此步骤的代码段是标准的,并在下面复制。

def cv_model(X, y, features, n_fold=5, random_state=45245, params=None):
    """Evaluate a score by cross validation.
    
    Parameters
    ----------
    
    X : pandas.DataFrame
        The data to fit.
        
    y : pandas.DataFrame or pandas.Series
        The scalar coupling constants as target variables.
        
    features : list
        The list of features to use during training.
        
    n_fold : int, default `5`
        The number of fold to use in cross validation.
    
    random_state : int, default `45245`
        The seed for the KFold split
        
    params : dict, default `None`
        The parameter dictionary for XGBRegressor
        
    Returns
    -------
    
    results_mean : list
        List of the scores for each coupling type, averaged over all folds.
        
    results_details : list
        List of all the scores as a list of lists.
    """

    X = X[features]

    folds = KFold(n_splits=n_fold, shuffle=True, random_state=random_state)
    model = XGBRegressor(**params)
    results_mean = []
    results_details = []

    for fold_n, (train_index, valid_index) in enumerate(folds.split(X)):
        X_train, X_valid = X.iloc[train_index], X.iloc[valid_index]
        y_train, y_valid = y.iloc[train_index], y.iloc[valid_index]
        model.fit(X_train, y_train)
        y_pred = model.predict(X_valid)
        scores = group_mean_log_mae(y_pred, y_valid, X_valid["type"])
        results_mean.append(scores[0])
        results_details.append(list(scores[1]))

    print(
        "After {}-fold CV: Mean: ".format(n_fold),
        np.mean(results_mean),
        "Std.:",
        np.std(results_mean),
    )
    return results_mean, results_details

得分预测

最后一步是对我们模型的预测进行评分。 竞赛的指标是平均绝对误差的对数的平均值(是的,这有点复杂-可以将其视为多个分数,每种债券类型均得分。对于每种类型,计算平均绝对误差,取对数, 这些结果,最后计算所有债券类型的均值):

这里:

  • T是标量耦合类型的数量(在我们的示例中为5)
  • n?是类型t的观测数
  • y?是观测的标量耦合常数
  • ??是预测的标量耦合常数

由于对数,我们可以获得负值,因此说-0.5的得分比-0.3的得分更好。

下图显示了每种耦合类型的分数,并将包含拓扑特征的模型与没有拓扑特征的模型进行了比较。

我们可以清楚地看到,拓扑功能有助于将分数提高多达5.5%,平均提高3.6%。 在Kaggle竞赛中,这些小的改进可以在最终排行榜中产生很大的不同,并很好地演示了拓扑如何为常规特征提取方法提供补充信息。

展望及下一步

本指南仅简单涉及了giotto学习可能的内容。 除了我们的回归示例之类的核心机器学习任务外,该库当前还支持将持久同源性应用于图形和时间序列数据。

例如,giotto-learn已用于检测股市崩溃,研究甲虫种群的种群动态,或预测分子是否抑制HIV的传播。

如果您对如何使用giotto学习有疑问,请随时通过Slack与我们联系。

如果您想了解有关拓扑机器学习的更多信息,请查阅以下内容。

参考

  • 拓扑数据分析简介:数据科学家的基本和实践方面
  • 基于持久同源性的机器学习及其应用—一项调查

(本文翻译自Lewis Tunstall的文章《Getting started with giotto-learn》,参考:https://towardsdatascience.com/getting-started-with-giotto-learn-a-python-library-for-topological-machine-learning-451d88d2c4bc)

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码