磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)

新闻资讯2026-04-21 20:46:25

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

原文:https://towardsdatascience.com/discovering-exoplanets-using-neural-networks-9345c8642638?source=collection_archive---------45-----------------------

完成应用计算硕士项目中神经网络学科学分的项目。因为我必须展示一个实验和一篇文章,所以知识库将会有所有的实验代码,这个中间故事将会展示大部分关于我的工作的有价值的内容。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第1张

“艺术家概念。美国宇航局的开普勒太空望远镜发现了 100 多颗行星,其中包括四颗地球大小的行星,围绕着一颗矮星运行。正如我们所知,其中两个行星太热,无法支持生命,但其中两个位于恒星的“宜居”区,表面可能存在液态水。 演职员表:NASA/JPL

2009 年,美国宇航局发射了开普勒太空天文台,旨在回答这个问题:

“我们银河系中的其他地球出现的频率如何?”。

该天文台自 2014 年以来正在进行第二次任务,并已标记了超过 10,000 颗可能的系外行星。

开普勒在 2016 年扫描了 1284 颗新的系外行星。与 2017 年一样,总共确认了超过 3000 颗系外行星(使用所有探测方法,包括地基方法)。天文台仍在工作,并继续寻找其他系外行星。

我们这个项目的目标是使用开普勒太空天文台在 Kaggle 收集的数据,建立一个神经网络模型解决方案,考虑到开普勒收集的特征,这是可行的,可以识别系外行星。我不会深入讨论数据清理或我正在使用的特征,那是为了一个未来的故事项目。

我们的恒星是太阳,看着黑暗的天空,那是我们星系中的其他多颗恒星。这些恒星中的每一颗都可以或不可以有我们的行星绕着它们转,所以它们有自己的太阳系。那些行星是系外行星,我们也可以说系外行星是太阳系以外的行星。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第2张

“当一颗行星从它的恒星前面穿过时,被观测者称为凌日。” 演职员表:NASA 艾姆斯

美国宇航局这次任务的另一个重要目标是寻找“其他地球”。开普勒任务概述称,其目标之一是“确定在各种恒星的可居住区或附近的类地行星和更大行星的百分比”。那些是体积是地球一半或两倍的行星。下面你可以找到适合居住的行星的例子。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第3张

“在过去的九年中,美国宇航局开普勒任务对小型宜居行星的搜索。第一颗比地球小的行星是开普勒-20e,它于 2011 年 12 月被发现,每六天绕着一颗比我们的太阳稍微冷一点、小一点的类日恒星运行一周。但是它是灼热的,无法维持大气或液态水海洋。开普勒-22b 在同一个月宣布,作为第一颗位于类太阳恒星可居住区的行星,但它的大小是地球的两倍多,因此不太可能有固体表面。开普勒-186f 于 2014 年 4 月被发现,是第一颗在一颗小而冷的 M 矮星的可居住区发现的地球大小的行星,这颗矮星的大小和质量大约是我们太阳的一半。开普勒-452b 是与太阳非常相似的恒星的可居住区中的第一颗近地大小的行星。” 鸣谢:NASA 艾姆斯/w·斯滕泽尔

使用的机器是 MacBook Pro 2017,采用 Mac OS Mojave 操作系统,500Gb 固态硬盘,RAM 16Gb,处理器为 2.9 GHz 四核英特尔酷睿 i7。使用的编程语言是 Python 3.6,而 PyTorch 库用于构建神经网络。

数据库是由 Kaggle 平台拍摄的。而数据清理是基于 Ismael Araujo 的工作。7803 个样本有 38 个特征,其中一个是外行星候选者那一个将成为标签。最后,我有 37 个不同的特征用作输入和二进制输出。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第4张

演职员表:作者图片。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第5张

演职员表:作者图片。

数据分为三部分,其中 70%用于培训,15%用于验证,15%用于测试。使用最小-最大缩放对特征进行标准化,验证和训练转换为使用 PyTorch 的数据加载器。参见下面的代码:

因为我相信媒体社区在解释机器学习主题方面非常丰富,所以我不会深入定义这个实验中使用的算法的理论部分。虽然这个aye bilge gündüzpost如果你没有理论背景的话有非常好的数学基础。

我使用了三个不同的神经网络:一个更简单的感知器和两个多层感知器,一个有三个隐藏层,另一个有两个。它们的激活功能也各不相同。最后,构建了五个神经网络,下表是为了更好地理解其中的每一个:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第6张

演职员表:作者图片。

所使用的所有神经网络在其输出层上具有 Sigmoid 函数,0.5 的阈值用于最终分类。下图显示了三种不同架构的代表:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第7张

感知器。演职员表:作者图片。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第8张

图 3:具有 3 个隐藏层拓扑的 MLP。演职员表:作者图片。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第9张

图 2:具有两个隐藏层拓扑的 MLP。演职员表:作者图片。

下面你还可以看到一个多层感知器的代码,有两个隐藏层,使用 PyTorch 构建。你可以注意到它的最后一层有 Sigmoid 函数。

使用 Adam 作为优化器,使用 0.01 作为学习率,使用均方误差作为损失函数进行训练。进行了两次不同的训练,一次 100 个周期,另一次 50 个周期。培训的所有其他配置保持不变。这样总共做了 10 次实验。

两个实验的训练损失图:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第10张

图 5:实验 b 过程中的训练损失.鸣谢:图片由作者提供。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第11张

图 4:实验 a 过程中的训练损失.鸣谢:图片由作者提供。

你可以看到,使用 50 个历元的训练是使用 100 个历元的训练的简短版本,记住种子在所有训练中保持不变是很重要的。尝试 50 个时代的原因是为了了解是否有可能用更少的努力获得相同的结果。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第12张

演职员表:作者图片。

上面的表格显示了使用所有 10 种不同网络配置的结果。这里我们将 100 个历元的实验称为实验 A ,50 个历元的实验称为实验 B 。

正如我们可以看到的,实验的结果都具有非常接近的性能值,作为结论,最不复杂的神经网络可以给我们带来与具有更多层的神经网络非常相似的结果。是什么让我们相信一个感知器会对我们的问题执行一个好的分析算法。

所有的数据和代码都可以在github库中找到。

原载于https://github.com/blendaguedes/find-exoplanets/

原文:https://towardsdatascience.com/discovering-the-matrix-determinant-11b56616d99a?source=collection_archive---------13-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第13张

由 Ricardo Gomez Angel 在 Unsplash 拍摄的照片

线性代数中有一些概念,第一次出现时很容易理解。可能是因为它们的应用和用例相对来说比较明显,概念也比较明确。

然而,矩阵行列式的概念对我来说却完全相反——与其说是启发,不如说是困惑。我的困惑主要源于这样一个事实,我严重缺乏直觉——我无法想象行列式的意义和目的。

在接下来的几节中,我们将建立一些直觉,学习一些计算行列式的程序,并初步了解它的应用。

行列式描述了将矩阵映射到标量的函数。它是由所有特征值的乘积定义的,允许一个稍微不那么抽象的,更具几何意义的解释。

根据矩阵的维数,行列式也可以分别解释为面积体积。粗略地说,它告诉我们乘以给定的矩阵会拉伸或收缩多少空间。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第14张

几何解释的一个例子[图片由作者提供]

假设我们有一个行列式为零的矩阵。乘以矩阵,会缩小空间,把所有东西都挤到一行上。因此,面积也将等于零。

现在,我们获得了一些基本的直觉,我们可以列出一些关于行列式的事实来进一步理解:

  1. 行列式只为方阵(M×M)定义。
  2. 一个矩阵只有一个行列式,因为它是一个标量,包含矩阵的信息。
  3. 奇异矩阵的行列式等于零。或者换句话说——具有线性相关性的矩阵,秩r < M,具有零行列式。
  4. 行列式通常被表示为下列之一:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第15张

:要记住一件事——行列式在理论上很重要,但在实践中很难计算,因为计算“大”矩阵时会出现数值不稳定。

在上一节中,我们学习了一些关于行列式的基本知识以及如何解释行列式。但是我们怎么计算呢?

计算行列式的过程相当繁琐。幸运的是,有一些快捷方式,只适用于小矩阵(2x2,3x3)。我们先谈捷径,再谈一般程序。

注意:幸运的是,我们不必手动计算行列式,因为内置的 NumPy 函数 numpy.linalg.det(a) 会为我们完成这项工作。

2×2 矩阵的行列式相对容易计算。我们只需将主对角线上的每个元素相乘,然后减去非对角线元素的乘积。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第16张

让我们来看一些数字示例:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第17张磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第18张

在第一个例子中,我们使用快捷方式来计算一个 2 乘 2 单位矩阵的行列式,等于 1。我们也可以把这个解想象成一个平面的面积,其中一边由单位向量 v=[1,0]定义,另一边由单位向量 w=[0,1]定义。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第19张

2x2 单位矩阵的行列式[图片由作者提供]

奇异矩阵的行列式为零,这正是我们在第二个例子中看到的。由于两列彼此线性相关,我们有一个秩亏矩阵,导致行列式为零。从几何学的角度考虑这个解决方案,我们必须想象两个向量形成一条面积为零的直线。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第20张

奇异 2x2 矩阵的行列式[图片由作者提供]

3 乘 3 矩阵的行列式的计算已经更加复杂,但是相对类似于 2 乘 2 的捷径。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第21张

我们对从左上到右下的所有对角线元素的乘积求和,并减去从右上到左下的所有非对角线元素的乘积之和。我们可以用两种不同的方式来想象这个过程。

  1. 一种方法是通过级联来扩充矩阵:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第22张

增强矩阵可视化[图片由作者提供]

2.另一种方法是想象沿着对角线“环绕”:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第23张

环绕矩阵可视化[图片由作者提供]

现在,事情变得非常复杂。因此,以下示例将仅基于 4×4 矩阵。

通常,该过程是迭代第一行的每个元素,通过排除当前第一行元素的列来创建子矩阵(3x3),计算子矩阵的行列式并乘以当前第一行元素。这将产生四个数字,我们将以交替模式[+,-,+,-]对它们进行加减运算。

我们应该把解开复杂描述的过程形象化:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第24张

我们可以看到程序要复杂得多。对于相对较小的 4x 4 矩阵,我们必须计算 4 个子矩阵的 4 个行列式,其中我们还需要计算子矩阵的行列式,等等。因此,该算法可以递归应用,因此计算量很大。

然而,这个通用程序可以扩展到任何规模的矩阵——幸运的是,我们不必手工计算。

我们现在知道行列式是什么,如何解释它,如何计算它,但有一个问题仍然没有答案——它是用来做什么的?

例如,它的一些应用提供了一种寻找给定矩阵的逆矩阵或特征值的方法。后者尤其重要,因为特征值和特征分解在主成分分析中起着中心作用。

假设我们有一个 2 乘 2 的矩阵,并且我们已经知道了行列式。将矩阵元素放在等式的一边,将行列式放在等式的另一边,可以让我们求解矩阵的特定元素。

让我们考虑一个数字例子,让事情变得更加明显。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第25张磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第26张磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第27张

现在,如果我们基于这一想法,从主对角线上的实数中减去多个未知数,并推广该方程,我们将获得矩阵的特征多项式

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第28张

特征多项式是有用的,因为它不仅允许我们用多项式来表示矩阵,而且允许我们计算矩阵的特征值。如果特征多项式设置为零,λ——多项式的根——描述矩阵的特征值。

在本文中,我们学习了矩阵行列式的概念。如何解读和计算,以及它的一些应用。

两个最重要的应用是矩阵求逆的计算,也许更有趣的是发现特征值。

正如我们前面简要提到的,矩阵行列式在理论上是一个很好的概念,但在实践中很难计算,特别是对于“大”矩阵,由于数值的不稳定性。为了避免这样的问题,例如当计算特征值时,存在一整族的迭代算法(例如幂法)。

尽管有实际的问题,行列式仍然是一个需要了解和理解的重要而基本的概念。

感谢您的阅读!确保保持联系&在 Medium 、 Kaggle 上关注我,或者在 LinkedIn 上说“你好”

喜欢这篇文章吗?成为 中等会员 继续无限学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@marvinlanhenke/membership

参考资料/更多资料:

  • 深度学习(Ian J. Goodfellow,Yoshua Bengio 和 Aaron 库维尔),第二章,麻省理工学院出版社,2016 年。
  • 迈克·科恩博士。线性代数:理论,直觉,代码。
  • 3 蓝色 1 棕色—行列式

原文:https://towardsdatascience.com/discovering-the-treasures-of-22-r-exploratory-analysis-packages-9bb1c5b4e6f8?source=collection_archive---------13-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第29张

@fergregory/AdobeStock

ython 如今在数据科学领域风靡一时;然而,R 多年来一直在悄悄地发展,并收集了目前包含在近 17K 包中的惊人功能(在撰写本文时)。所以可以毫不夸张地说,它已经在数据科学的许多领域积累了大量的软件包,其中之一就是探索性数据分析(ed a)。使用 EDA 这个词,我们封装了以下功能:

  • 一般数据框架描述:维度、数据类型(连续/离散)、缺失情况。
  • 单变量统计:均值、方差和其他变量统计,用表格或图表表示,如直方图和箱线图。
  • 双变量统计:变量关系,用表格或图表形式的相关性、散点图等表示。
  • 离群值,即与其他数据点显著不同的数据点。

正如您所预料的,许多 EDA 功能在各种 R 包中被复制,因此筛选共性是很重要的。在这篇文章中,我们将执行数据集的 EDA,并获得 EDA 包,这样对于每个 EDA 步骤,我们都会给出一些最佳选项。

L 让我们先熟悉一下我们将要探索的包的名字。以下是按字母顺序排列的:**AEDA、化学计量学、corrplot、DataExplorer、dataMaid、ExPanDaR、extremevalues、funModeling、ggcorrplot、Hmisc、inspectdf、OutlierDetection、outlier、PerformanceAnalytics、ggcorplot、Ggally、mvoutlier、prettyR、psych、RtutorR、skimr、summarytools。**我们将使用的辅助包: dplyr,ggplot2,guardian,plotly,gmodels。

我们的数据集是 professor-salaries.csv (可在 Kaggle 上获得)。数据集的尺寸为 397 X6。这六栏分别是教授的职级(可以是助理教授、副教授、正教授)学科(可以是 A 或 B)、获得博士学位的年限(yrs sinf . PhD .)、服务年限(yrs service)、性别(性别)、工资*。最初,数据集没有缺失值,但是,因为我们希望在有缺失案例时检查各个包的行为,所以我们在 yrs.since.phd 列中引入了安娜,在 yrs.service 列中引入了安娜。*

在此之前,我们将获得关于数据集维度、变量数量/类型、唯一行、重复数据和缺失数据的信息。我们提出一个问题,每个问题之后都有代码和代码输出。在每个代码片段中,第一个命令库(包)显示了我们使用的包。如果没有包含库语句,那么使用的函数来自 base R 包。

问:我的数据集的维度是什么?

基础包中的 dim() 有答案,其中 sal 是我们数据集的名称。

问:我的数据集有多少个变量,它们的类型是什么?

来自基地的 str() 告诉我们。部分输出如下所示。

问:如果有的话,有多少重复的行?

这里我们使用基础包中的 unique() 函数。如下所示,有四个重复的行。

问:为了进一步探究,哪些是重复的行?

的看门人有这个函数 get_dupes() 。部分输出如下所示。

问:是否有任何数据缺失?

函数introduce()from packagedata explorer给我们答案。如下所示,有两个值缺失。

问:为了进一步探究,哪些变量有缺失值?

来自 base R 的多功能 apply() 函数给了我们答案。我们看到变量yers。因为. phd* 、yers . service各有一个缺失值。*

问:这些丢失的值出现在哪些行中?

没有被 complete.cases() 选中的行就是答案。

3.1 单变量列统计

前面提到的 R 包中有很多函数,它们报告单变量统计数据。我发现以下内容最有用:

  • 对于基本的单变量统计信息:来自基础包的 summary() 函数。此函数报告以下统计数据:连续变量的最小值、最大值、平均值、中值、第一/第三四分位数、NA 的数量以及分类变量的每个级别的观察数量。
  • ***详细的单变量统计信息:*来自 psych 包的 describe() 函数。它的输出包括最小值、最大值、中值、平均值、修整平均值、范围、偏斜度、峰度。
  • ***为了便于报告:*dataMaid包中的 makeDataReport() 函数创建了一个方便的 HTML 文件,其中包含每个连续变量的以下信息:最小值、最大值、中值、第一/第三四分位数、缺失观测值的数量、唯一值的数量和直方图。对于分类变量,它提供了关于每个级别的观察次数的信息。

summarytools、inspectdf、Hmisc、prettyR、funModeling、skim r 的单变量描述函数可以在我的 github 目录下的 R 脚本中找到(路径在文末给出)。

有时,我们想知道连续变量(如薪水*)的统计数据如何受到分类变量(如性别)不同水平的影响。以下是实现这一点的两种方法:*

  • 对于一些基本信息:我们可以使用基础包中的 tapply() 函数。下面, tapply() 报道了男女教授的平均工资。

  • 更详细的群组信息:来自 psych 包的 describeBy() 信息:

  • 对于复杂的分组和报告:我们可以使用非常流行的 dplyr 函数 filter()group_by()summary()。下面是一个例子,我们根据级别显示了专业 A 的男女平均工资:

  • ***因为一张图胜过千言万语:*箱线图和条形图,用 ggplot2 函数创建。

下面的图 1 和图 2 提供了有价值的见解:

(a)一些男教师的工资非常高。

(b)女教师的工资被压向低端

©正教授比助理教授或副教授多得多

(d)在所有级别上,男性教员都多于女性教员。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第30张

图一。男性和女性工资的箱线图。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第31张

图二。等级条形图,颜色由教员的性别决定。

4.1 交互式散点图

查看两个变量之间关系的标准方法是散点图。如果我们把散点图做成交互式的,我们可以让它包含更多的信息。这可以通过包装来实现*。要在 plotly.com 的*上查看您的图,Chart studio 上获得一个帐户,然后在您的 R 会话中存储您的认证凭证(用户名、API 密钥),如下所示:

plotly.com上的互动情节*,也可以嵌入到你的在线出版物中,如图 3 和图 4 所示。这是变量年交互式散点图的代码。自. phd薪水,v 变量性别用于给地块的点着色。*

图 3。交互式散点图。

plotly 也允许创建交互式 3D 情节,我们可以放大,改变视角等。图 4 显示了薪水年数、自博士年数、服务的 3D 图,其中颜色由变量性别提供。

图 4。交互式 3D 绘图

相关性是查看两个变量之间关系的另一种方式。R 中的几个软件包计算相关性,并以数字或图形方式显示它们。

stats 包有 cor() 函数,以表格形式显示数值变量的相关性:

为了确定相关性是否具有统计显著性,我们可以使用 cor。test()stats 包的方法。比如工资年数的相关性。服务*具有统计显著性,因为它产生了 p 值=6.901e-12*

corrplot 是一个包,它提供了许多有见地的方法来查看数字相关性。你可以选择你的主要形状(圆形、方形、饼形、椭圆形等),相关程度通过改变形状的大小和/或颜色来显示。在下面的图 5 中,我们使用了饼形。相关性越弱,饼形越不完整,颜色也越浅。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第32张

图 5。数字变量的相关性

ggcorrplot 产生数字和图形相关输出。它的数字输出非常类似于包 stats 产生的输出,它的图形输出类似于 corrplo t 产生的输出,所以我们不会在这里展示它。

PerformanceAnalytics 包含函数图表。Correlation(),它在上半部分面板中显示数值变量的相关性,在对角线中显示数值变量的直方图,在下半部分显示变量对的散点图(图 6)。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第33张

图 6。图表的输出。相关性()。

现在,我们将看看三个包( DataExplorer、psych 和 GGally ),它们与数值变量相关性一起,也包括分类变量信息。包 DataExplorer 包含函数 plot_correlation() 以彩色单元格显示相关性。有趣的是,它还显示了不同分类变量水平的相关性,如下图所示(图 7)。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第34张

图 7。plot_correlation()的输出。

psychGgally 提供函数对。面板()ggpairs() 分别显示相关性、直方图和散点图。我最喜欢的是 ggpairs() 的输出,它让您可以鸟瞰数据集的变量及其关系,也包括分类变量(图 8)。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第35张

图 8。ggpairs()函数的输出。

虽然不是探索性分析的传统部分,但我个人从对列联表进行独立性测试中获得了许多有用的见解。这些表格至少有两行和两列,显示至少两个分类变量的多元频率计数。统计测试,如卡方测试和 Fisher 测试,可用于确定显示的分类变量是否独立。

**卡方费歇尔检验产生相似的 p 值 ( 卡方检验 p 值 =0.0140,费歇尔检验 p 值 =0.0114),表明等级和性别不独立(显著性水平为 0.05)。

关于连续变量,我们经常想知道连续变量是否在两组之间变化。例如,我们想知道男性教员的工资在统计上是否与女性教授的工资不同。如下图,一个 t 型测试可以帮助我们回答这个问题:

t 检验得出一个 p 值 =0.002664(显著性水平=0.05),这意味着男女教员的工资在统计上是不同的。更进一步,我们想知道这种差异是否是由于不同级别的男女人数不同造成的。所以为了消除等级的影响,让我们对男女正教授的工资做一个 t 检验(等级 =’ 教授’)。该测试表明,当变量等级固定时(p 值 p 值 = 0.3098,显著性水平=0.05),两组的工资在统计上没有差异

极限是远离变量总体分布的点。它们可能是完全无用的,例如由测量误差引起的,或者在异常检测应用中是有用的。在这里,我们将讨论如何检测它们,而不是我们是否或如何删除它们。我们将区分单变量和多变量异常值检测。在单变量的情况下,我们要对抗单个变量的极值。在多变量的情况下,我们感兴趣的是发现多维离群值,例如,这在聚类应用中非常有用。

在这里,我们将检查三种单一异常值检测方法,它们利用了:(a)箱线图(b)包极值* ©包异常值检测。*

(a)箱线图:在箱线图中,离群值被确定为位于胡须下方或上方距离大于四分位数间距 1.5 倍的点。R 中的方框图标记了异常值,但是,它们没有显示它们的值。如前所述,我们可以使用 plotly 使它们交互,这样,用户可以点击离群值并查看它们的值:

图 9。交互式箱线图

通过点击图 9 中最大的男性异常值,我们看到它的值是$231,545.00。接下来的两个异常值(实际上重叠)的值分别为$205,500.00 和$204,000.00。

*(b)软件包 extremevalues :它提供了一个函数,使用对数据子集的回归来发现异常值( getOutliers() )。在使用函数 *outlierPlot(),创建的图 10 中,我们再次看到三个值被识别为异常值。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第36张

图 10。离群值的 QQ 图。

©包 OutlierDetection :它提供了UnivariateOutlierDetection(),这个函数的默认离群点检测方法是 bootstrapping。这种方法基于一个巧妙的观察,即异常值有时不包括在 bootstrap 估计中[1]。从下面的图 11 中可以看出,它确定了远不止 3 个异常值,但是位置 44、365、250 处的三个最远的异常值对应于直方图中确定的薪金值$231,545、$205,500、$204,000。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第37张

图 11。UnivariateOutlierDetection()的输出

这里我们将讨论 OutlierDetectionchemometrics 包中的方法。

(a)程序包 OutlierDetection 提供了一个同名函数,该函数给出了两个变量(在我们的示例中为 salaryyers。service* ,创建一个散点图,用红色表示异常值,如图 12 所示。关于下面代码的一些注意事项:(a)我们需要删除 NAs ,以便从 OutlierDetection() 获得正确的输出。如果你还记得,我们在变量yers . service中引入了一个 NA 。(b)在第四行中,我们颠倒了数据帧的列,以使变量 salary 在图上显示为变量 2,从而获得与上面图 11 中方向相同的图。©最后,因为 NA 移除从我们的数据框架中移除了一行,所以图 12 中所示的工资异常值的指数是图 11 中所示的工资异常值的指数的-1(43,249,364)。*

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第38张

图 12。OutlierDetection()的输出

(b)包化学计量学有一个函数 Moutlier() ,它使用测量两点之间距离的马氏距离来检测异常值。与欧几里德距离相比,马氏距离考虑了点值的相关性,并且距离是相对于质心来测量的。只有当这些点不相关时,马氏距离才等于欧氏距离。

如上所述,位置 43 处的点具有最高的 Mahalanobis 距离,其次是点 282、131、330 等。如果我们回头看图 12,我们可以看到这些数字对应于图上看到的一些最远的异常值,因此在确定异常值时,Mahalanobis 距离方法和 bootstrapping 方法之间总体上是一致的。最后,程序包mv 离群值也使用马氏距离来计算离群值,但是,它使用马氏距离的稳健估计。结果类似于常规的马氏距离,尽管排序不同。

最后,让我们讨论一下自动 EDA,也就是说,用一个命令就能创建一个完整的(描述性的、单变量的、双变量的)EDA 报告。我们将讨论提供这一功能的四个包:

  • 数据浏览器
  • AEDA (可从https://github.com/tuanle618/AEDA获得)
  • 扩展器
  • RtutoR

*DataExplorer ,是一个流行的 EDA 包,其 EDA 报告(*report.html)生成如下:

它很好地总结了缺失数据、单变量分布(直方图、QQ 图、条形图)、相关性分析、双变量分析(箱线图、散点图),由目标变量指导。它还包括主成分分析。

AEDA(main report . rmd)的 EDA 报告创建为:

通过加载可以创建 HTML 格式的报告。rmd* 报告 Rstudio 并点击针织按钮。它的优点是数字变量的详细报告,包括偏度、峰度和高级分析,包括聚类摘要报告、主成分分析、多维标度报告和因子分析报告。*

ExPanDaR 的 auto-EDA 的优点是它允许你启动一个闪亮的应用程序:

这个闪亮的应用程序允许交互指定多个变量,包括:

  • 显示条形图的因子(包括在同一图表上选择附加因子)。
  • 要显示直方图的数字变量(包括单元格编号的说明)。请注意,在显示每个直方图后,还会报告极端观察值。
  • 要显示散点图的变量对。此外,它还允许指定反映在绘图颜色中的变量。
  • 回归分析的目标变量和自变量。也是固定效应的分类变量的规范。

最后,包 RtutorR 提供了一个简洁、基本但方便的 Powerpoint EDA 报告:

其单变量分析包含数值变量的直方图(以及最小值、最大值、百分位信息)以及分类变量的条形图(以及每一水平的出现次数)。其双变量分析包含按分类变量分组的数值变量箱线图和数值变量散点图(以及相关系数)。

你可以在我的 github 目录https://github.com/theomitsa/R-EDA中找到我的 R 脚本和前述包的 pdf 版本的自动化 EDA 报告

auto-EDA 报告的 HTML 版本可在 HTML 链接找到

感谢阅读!

[1] Singh,k .和 M. Xie,Bootlier 绘图-基于 Bootstrap 的异常值检测绘图,第 65 卷,第 3 部分,第 532–559 页,2003 年。

原文:https://towardsdatascience.com/discovery-neuroimaging-analysis-part-ii-b2cdbdc6e6c3?source=collection_archive---------35-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第39张

回波平面成像(图片由作者提供)

这是该系列的第二篇文章,即“腹侧颞叶皮层时空功能磁共振成像的认知计算模型”。如果你想了解整个系列,请点击下面的链接。

https://github.com/cankocagil/Cognitive-Computational-Modelling-for-Spatio-Temporal-fMRI-in-Ventral-Temporal-Cortex

我将介绍发现神经影像分析的主题,它们在大脑解码研究中的用例。让我们开始吧。

所有相关资料都放在我的 GitHub 页面上。别忘了去看看。如果你是一个纸质爱好者,你可以阅读这一系列文章的纸质版,也可以在我的回购中找到。

https://github.com/cankocagil/Cognitive-Computational-Modelling-for-Spatio-Temporal-fMRI-in-Ventral-Temporal-Cortex

在本文中,我们利用最先进的解释性神经成像技术,如回波平面、感兴趣区域(RoI)、统计图、解剖学和玻璃脑方法,来可视化和预分析 fMRI 样本的视觉结构。

像在 ML 问题中一样,在处理之前理解、分析和可视化数据是至关重要的。

在这里,我们利用“Nilearn”框架,这是建立在“Scikit-Learn”之上的统计计算和神经成像平台,使研究人员能够管理、屏蔽、预处理和解码神经科学数据。在上一篇文章中,我展示了如何安装和导入 Nilearn framework。别担心。我将在本文中重复这个过程。让我们开始吧。

通过神经成像发现功能磁共振成像分析

我基于神经成像技术进行了预分析,以可视化数据集。为了实现这一点,我利用回波平面平均进行四维可视化,感兴趣区域(RoI),统计地图,解剖,玻璃脑可视化工具嵌入在统计学习和神经成像框架中。

从现在开始,我将介绍不同的技术和可视化工具,以及它们在 Python 中简单而有效的实现。系好安全带!

但是,在此之前,如果您错过了上一篇文章(第一部分),我提供如下安装指南。

安装代码

进口

正在获取哈克斯比数据

现在,我们可以开始实际的可视化过程。

fMRI 体积和 EPI 的四维可视化

回波平面成像是一种非常快速的磁共振(MR)成像技术,能够在几分之一秒内获得完整的 MR 图像[18]。在单次回波平面成像中,图像的所有空间编码数据都可以在单次射频激发后获得[18]。在这里,我们从额部、轴部和侧部区域的切面来可视化 Haxby 实验的受试者的 EPI。EPI 可视化提供了对大脑中激活区域的现实洞察,这在时空大脑解码中起着至关重要的作用。为了简单起见,我提供了与文章开头相同的图像。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第40张

功能磁共振成像体积(图片由作者提供)

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第41张

回波平面成像(图片由作者提供)

感兴趣区域分析

分析 fMRI 数据的一种常见方法是执行感兴趣区域(RoI)分析,包括从特定区域提取信号。ROI 分析在理论上最不可知的用途是简单地探索全脑体素分析背后的潜在信号[17]。在提取统计上有意义的区域后,我们可以对多个统计测试而不是大脑中的大量体素执行校正的严重性。此外,大多数 ML 解码器是在对象的 RoI 上执行的,而不是在全脑介质上执行的。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第42张

RoI 可视化(作者图片)

统计地图

统计参数映射是指构建和评估空间扩展的统计过程,用于测试关于功能成像数据的假设[5]。一般来说,统计 fMRI 的前一步是创建一个阈值统计图,代表活跃的区域(高于阈值)[17]。因此,它在检查神经科学实验中记录的大脑活动差异方面是有用的。

统计地图计算

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第43张

统计地图可视化(图片由作者提供)

直接 fMRI 可视化

fMRI 数据的简单和紧凑的可视化在神经成像的背景下是一个非常重要的课题,因为它使研究人员能够观察大脑皮层的活动。因此,我直接绘制了受试者 2 的时间平均 fMRI 数据,以便进一步可视化。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第44张

fMRI 数据的可视化(图片由作者提供)

解剖可视化

我将受试者 2 的时间平均 fMRI 数据获得的 fMRI 解剖结构可视化(默认为 3 个切面:正面、轴向和侧面),以在解码前产生洞察力。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第45张

解剖可视化(图片由作者提供)

玻璃脑

玻璃大脑是一种最先进的实时大脑可视化技术,创建于 Unity 3D 游戏引擎上,由英伟达的 GPU 计算提供支持[19]。它的输入包括从高分辨率 MRI-DTI 大脑扫描获得的个人大脑结构,包括组织和纤维束结构。使用高密度 EEG(脑电图)将实时大脑活动和网络间的功能交互叠加在大脑结构上[19]。这里,我投影了 5 号受试者的时间平均 fMRI 数据的正面、轴向和侧面。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第46张磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第47张

玻璃脑视觉(图片由作者提供)

如果您想更进一步,以交互式 3D 方式可视化数据,下面是代码。

耶!本文到此为止。我深入讨论了最常见的 fMRI 数据可视化技术。

恭喜你!你完成了第二篇文章,并通过认知计算方法对人脑解码迈出了一步。

在下一篇文章中,我们将执行功能连接和相似性分析,以进一步捕捉人脑的统计特性。

  1. 发表文章

https://cankocagil.medium.com/introduction-to-cognitive-computational-modelling-of-human-brain-part-i-90c61e0e24c9

https://cankocagil.medium.com/discovery-neuroimaging-analysis-part-ii-b2cdbdc6e6c3

https://cankocagil.medium.com/functional-connectivity-and-similarity-analysis-of-human-brain-part-iii-c427c88ca5bb

https://cankocagil.medium.com/unsupervised-representation-learning-on-distributed-regions-in-the-human-brain-part-iv-55fecf4e1b6f

2.在路上(即将到来…)

  1. 第五部分的占位符
  • 【https://www.hindawi.com/journals/cmmm/2012/961257/

我在机器学习和神经科学方面的研究中使用了以下参考文献列表。我强烈建议复制粘贴参考资料,并简要回顾一下。

[1]巴、基罗斯和辛顿。图层归一化,2016。

[2] L. Buitinck,G. Louppe,M. Blondel,F. Pedregosa,A. Mueller,O. Grisel,V. Niculae,P. Prettenhofer,A. Gramfort,J. Grobler,R. Layton,J. VanderPlas,a .乔利,B. Holt,10 和 G. Varoquaux。机器学习软件的 API 设计:scikit-learn 项目的经验。在 ECML PKDD 研讨会:数据挖掘和机器学习的语言,第 108–122 页,2013。

[3]褚,田,王,张,任,魏,夏,沈。双胞胎:重新审视《视觉变形金刚》中空间注意力的设计,2021。

[4] K .克拉默、o .德克、j .凯舍特、s .沙莱夫-施瓦兹和 y .辛格。在线被动攻击算法。2006.

[5] K. J .弗里斯顿。统计参数映射。1994.

[6]格罗斯、罗查-米兰达和本德。猕猴下颞皮质神经元的视觉特性。神经生理学杂志,35(1):96–111,1972。

[7] S. J .汉森、t .松坂和 J. V .哈克斯比。用于物体识别的腹侧颞叶组合编码。

[8]哈克斯比、戈比尼、富里、伊沙伊、斯豪滕和彼得里尼。《视觉物体识别》,2018。

[9]赫克曼、哈伊纳尔、贾巴尔、吕克特和哈默斯。结合标记传播和决策融合的自动解剖脑 mri 分割。神经影像,33(1):115–126,2006。

10d .亨德里克斯和 k .金佩尔。高斯误差线性单位(gelus),2020。

[11]黄少华,邵文伟,王明林,张德庆.人脑活动视觉信息的功能解码:简要综述。国际自动化和计算杂志,第 1-15 页,2021。

[12] R. Koster、M. J. Chadwick、Y. Chen、D. Berron、A. Banino、E. Duzel、D. Hassabis 和 D. Kumaran。海马系统内的大循环复发支持跨发作的信息整合。神经元,99(6):1342–1354,2018。

[13]马奥尔。勾股定理:4000 年的历史。普林斯顿大学出版社,2019。

[14] K. A. Norman、S. M. Polyn、G. J. Detre 和 J. V. Haxby 超越读心术:功能磁共振成像数据的多体素模式分析。认知科学趋势,10(9):424–430,2006。

[15]奥图尔、江、阿卜迪和哈克斯比。腹侧颞叶皮层中物体和面孔的部分分布表征。认知神经科学杂志,17(4):580–590,2005。

[16] F .佩德雷戈萨、g .瓦洛夸、a .格拉姆福特、v .米歇尔、b .蒂里翁、o .格里塞尔、m .布隆德尔、p .普雷登霍弗、r .魏斯、v .杜伯格、j .范德普拉斯、a .帕索斯、d .库尔纳波、m .布鲁彻、m .佩罗特和 e .杜切斯内。sci kit-learn:Python 中的机器学习。机器学习研究杂志,12:2825–2830,2011。

17 r . a .波尔德拉克。功能磁共振成像的感兴趣区域分析。社会认知和情感神经科学,2(1):67–70,2007。

[18] M. Poustchi-Amin、S. A. Mirowitz、J. J. Brown、R. C. McKinstry 和 T. Li。回波平面成像的原理和应用:普通放射科医师回顾。放射学,21(3):767–779,2001。

[19] R. P. Reddy,A. R. Mathulla 和 J. Rajeswaran。心理健康专家的观点采择和情绪传染的初步研究:移情的玻璃脑观点。印度心理医学杂志,0253717620973380,2021 页。

[20]史密斯、米勒、萨利米-科尔希迪、韦伯斯特、贝克曼、尼科尔斯、拉姆齐和伍尔利奇。功能磁共振成像的网络建模方法。神经影像,54(2):875–891,2011。

21 田中先生。下颞叶皮层和物体视觉。神经科学年度评论,19(1):109–139,1996。

[22] M. S .特雷德。Mvpa-light:一个多维数据的分类和回归工具箱。神经科学前沿,14:289,2020。

[23] M. P .范登赫维尔和 H. E .波尔。探索大脑网络:静息态功能磁共振成像功能连接综述。欧洲神经精神药理学,20(8):519–534,2010。

[24] G. Varoquaux,A. Gramfort,J. B. Poline 和 B. Thirion。大脑协方差选择:使用群体先验的更好的个体功能连接模型。arXiv 预印本 arXiv:1008.5071,2010。

[25] Y. Wang,J. Kang,P. B. Kemmer 和 Y. Guo。一种利用偏相关估计大规模脑网络功能连接的有效可靠的统计方法。神经科学前沿,10:123,2016。

26s . Wold、K. Esbensen 和 P. Geladi。主成分分析。化学计量学和智能实验室系统,2(1–3):37–52,1987。

27s . Wold、K. Esbensen 和 P. Geladi。主成分分析。化学计量学和智能实验室系统,2(1–3):37–52,1987。

原文:https://towardsdatascience.com/discrete-random-variables-and-pmfs-explained-using-python-23b15948f9bc?source=collection_archive---------20-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第48张

在 Unsplash 上由 Max Duzij 拍照

当我刚开始学习统计学的时候,我多次使用随机变量的概念,但并不真正知道随机变量是什么。我们在假设检验、模型拟合和无数其他领域使用它。在本帖中,我们将基于之前建立的概率基础来理解随机变量有多重要。

让我们从形式定义开始

(数学定义)随机变量是一个映射函数x:ω→ℝ,它给每个结果ω分配一个实数 X(ω)。

ω和ω应该看起来很熟悉,因为我们在以前的帖子中已经详细讨论过它们。然而,由于几个原因,这个定义可能会令人困惑。首先,我们将每个结果分配给什么实数?还有,我们为什么要给实数赋值呢?为什么我们需要随机变量?

这些问题都会有答案,继续看下去就好。

让我们把这个概念和流行文化联系起来。在之前的帖子中,我们讨论了漫威电影宇宙(MCU)中的无限宝石。这些宝石是贯穿 MCU“阶段”的故事的核心,也被称为“无限传奇”。

让我们从给每个代表其整体能力的无限宝石赋值开始。假设我分配了以下总分数:

  1. 灵魂:6(最强大)
  2. 功率:5
  3. 时间:4
  4. 头脑:3
  5. 现实:2
  6. 空间:1(最弱)

我想我选择这些值的原因是为了另一天。我们让随机变量 X 是选择的两个无限宝石的分数之和。我意识到每个宇宙只有六块石头,所以让我们也假设我们从一个使用量子领域的另一个现实中借用了六块相同的石头。我们知道在样本空间ω中有 36 种可能的样本结果:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第49张

所以,现在我们有了随机变量配方中的所有成分,首先,我们描述了实验(选择两个无限宝石),其次,我们给每个样本结果赋予一个值。这组值 X 被认为是一个随机变量。请记住,随机变量不像代数中那样采用单一值,它可以采用给定集合中的任何值({2,3,4,5,6,7,… })。它随机假设这些值中的任何一个,因此被称为“随机”变量。这和概率有什么关系?让我们来看看下面的符号

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第50张

这是以下内容的“简写”:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第51张

“ℙ(X = x”简单来说就是随机变量 x 取值 x 的概率是多少,所以让我们回到我们的例子来真正理解这个方程。假设我们在选择了两个无限大的石头后,构建了一个分数总和的矩阵:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第52张

力量值等于 10 的概率是多少?嗯,本质上这个问题是问ℙ(X = 10) =?。我们知道这一点

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第53张

你有它!现在我们明白随机变量和概率的关系了!我们刚刚讨论的例子被认为是两种随机变量中的一种。它被称为离散随机变量,因为它可以假设有可数个值。第二种随机变量被称为连续随机变量。

现在,如果有一个函数来描述获得一个随机变量可以假设的所有不同值的概率之间的关系,那不是很好吗?正好有这样的功能!该函数被称为概率函数,对于离散随机变量
,我们将该函数称为概率质量函数 (PMF),定义如下:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第54张

那么,让我们用 python 这种奇妙的语言来更好地理解概率函数的威力吧!我们不会详细讨论代码,我们假设你们大多数人都具备 python 的工作知识。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第55张

正如你所看到的,PMF 允许我们可视化一个随机变量,并使我们能够轻松地回答问题,如ℙ(X ≤ 6)。这种说法本质上是在问:选择两块石头导致总分小于等于 6 的概率是多少?现在,如果我们看我们的 PMF 图形,我们可以看到它是对称的,以 7 为中心。我们也知道所有的概率需要加到 1。所以只要做以下事情:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第56张

我们使用强大的 PMF 来确定有 42%的机会选择 2 颗总分不超过 6 分的无限宝石。

在这篇文章中,我们定义了一个离散的随机变量,提供了一个例子,编码,并演示了如何使用 PMF 可视化和研究随机变量。

原文:https://towardsdatascience.com/discretized-conical-emission-in-multimode-optical-fibers-fd3e15dae151?source=collection_archive---------40-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第57张

照片由约翰·亚当斯在 Unsplash 拍摄

非线性光学是光学的一个分支,它研究的是由于光引起的物质光学性质的改变而产生的现象。光纤是研究非线性现象的一种非常有吸引力的介质。由于纤芯的小尺寸和光纤的几何形状允许光传播很长的距离,即使初始脉冲的功率相对较低,波导也会表现出非线性。

光纤中非线性现象研究的重要部分涉及单模光纤。由于它们的设计,对于给定的光频率,它们只允许一种模式传播。在实践中,它们被用于光纤网络传输信息。最近,对多模光纤的兴趣带来了关于时空非线性效应和模间频率转换的有趣结果[1–3]。**这种兴趣与多模光纤在电信网络中的潜在用途有关。**在这种类型的光纤中,对于给定的频率,存在许多被引导的光的空间分布。以不同模式发送信息允许吞吐量的进一步倍增,尽管这需要开发以多种模式同时发送、重定向和接收信息的方法【4】。

多模光纤可以支持给定波长的多种导模。它们的数量由所研究光纤的光频和折射率分布决定。**每种导模都以特定的方式传播,这可以表现为其电磁场分布。**线偏振(LP)模式的识别基于确定沿两个场横截面的极值数量:径向和横向。根据波长和折射率分布,相同模式的场分布可能略有不同。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第58张

*多模光纤中模式解的电磁场归一化分量示例。*图片作者。

同时,我们可以把多模光纤看作是块体材料和单模光纤之间的过渡材料。这使得它们成为探索这两种物质介质中发生的非线性现象之间的联系的理想选择。这种非线性现象之一是圆锥形发射,大量观察到围绕中心光点的彩色环【5,6】。此外,在我们最近的工作中,我们将体介质中描述的锥形波的概念推广到结构化介质,如多模光纤,其中只有离散和有限数量的模式可以传播[7,8]。

我们比较了模拟多模光纤中非线性传播的两种数值方法:广义多模非线性薛定谔方程(MM-GNLSE) [9],它考虑了电场的模式分解和模间非线性耦合,以及单向脉冲传播方程(UPPE) [10,11],它已被广泛用于研究大块透明介质和气体中的非线性光学。

在这两种方法中,我们可以区分色散项和非线性项。一般来说,作为一个严格的规则,色散部分决定了介质中的光速和一些电磁损耗,而非线性部分与光纤中观察到的非线性效应有关(特别是可以以一些频移的形式观察到)。通常使用分步傅里叶变换方法(SSFM)分离和描述色散和非线性,该方法在所有用于这类问题的比较数值方案中花费最少的计算时间。

数值工具为在多模光纤中发生的非线性现象的计算研究中深入检查光传播提供了极好的机会。此外,获得的数值模拟结果支持实验工作,并允许表明诱人的现象。通过数值模拟,人们可以获得关于光在整个传播距离上的所有信息(不仅仅在输出上测量)。此外,可以打开和关闭求解方程的不同项(事实上不包括特定的现象),以理解潜在的物理学。

然而,大多数时候,导出的数值模型仅支持定性的实验结果,特别是当涉及的模式数量变得显著(即高于 10)并且超宽带频率转换过程(即超过一个倍频程)也发生时。迫切需要阐明数值模型的潜力和适用范围,以促进未来非线性和多模光纤器件的精确设计。

在我们的研究中,我们研究了超短脉冲在多模光纤中的传播(输入激光脉冲的持续时间为飞秒),其峰值功率在临界功率附近,临界功率被定义为可以施加到材料上而不破坏它的最高可能功率。我们观察到的形成,我们称之为离散锥形波,确切地说是离散 X 波。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第59张

*所考虑设置的示意图。*图片作者。

在色散非线性体介质中,特别是在成丝机制中,已经对锥形发射进行了深入研究[6]。对正常色散(群速度随光频增加而降低)中的光丝的解释通常呈现典型特征,如脉冲分裂和锥形发射,并且可以假设脉冲为自发出现的非线性 X 波来解释。更具体地说,离轴(圆锥形)尾出现在输入波长的蓝移侧和红移侧,形成圆锥形发射的通用清晰 X 形图案。发现输入脉冲可以向最终稳态演化,最终稳态具有正常色散范围内的 X 波或异常色散范围内的 O 波的形式(其中群速度随着光学频率的降低而降低)。非线性 X 波和 O 波因其明显的 X 形和 O 形而得名,它们分别出现在近场和远场中。

色散的符号决定了飞秒细丝的动力学,并因此决定了相关超连续谱的时间-频率内容(产生的白光由非常宽的频率范围组成)。已经证明,色散景观是准确模拟锥形发射的关键因素,因为它决定了锥形发射模式的具体形状:正常色散为 X 形,异常色散为 O 形,或者当泵浦接近零色散时为鱼形。在多模光纤的情况下,只有离散数量的导模可用,并且期望离散的锥形发射。每种模式中锥形波成分的光谱位置可以通过使用实验得出的相位匹配条件来预测[7]。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第60张

两种建模方法传播 2 厘米后的模式数分辨 X 波锥形发射光谱。白色方块表示每个空间模式中的中心相位匹配频率。在 MM-GNLSE 的情况下,我们只研究了 15 种模式,它们可以在所研究的光纤中传播。图片作者[8]。

当比较使用两种模型获得的结果时,我们看到关于与自聚焦相关的强光谱展宽以及来自基模 LP01 的高阶模中的能量扩散的定性一致。我们还指出了 X-模式形成的典型特征。然而,与 UPPE 方法相比,MM-GNLSE 显然高估了整体非线性响应,从而导致更大的频谱、时空域中更高的峰值功率以及高阶模式中更大的功率谱密度。

在我们的实验中,我们通过比较两种众所周知的建模方法,数值研究了超短脉冲在多模阶跃折射率石英光纤中传播的高度非线性机制。

我们的主要结果显示了非线性响应的频率色散对飞秒范围内脉冲分裂和超连续谱动力学的强烈影响。从实验的角度来看,这种容易实现的泵浦方式似乎是揭示近似数值模型(如 MM-GNLSE)的一些局限性的良好起点。此外,我们表明,由此产生的时空动力学与锥形波的形成。

波兰国家科学中心共同资助的项目(项目编号 2018/30/E/ST7/00862,索纳塔 BIS 8 计划)。

原载于 2021 年 8 月 18 日https://majsylw . netlify . app

[1] W. H .伦宁格和 F. W .怀斯。渐变折射率多模光纤中的光孤子。《自然通讯》, 4:1716–1719,2013。

[2] L. G. Wright、D. N. Christodoulides 和 Frank W. Wise多模光纤中可控的时空非线性效应。《自然光子学》, 2015 年 9:306–310。

[3] K .克鲁帕、a .托内洛、a .巴泰勒米、t .曼苏尔扬、v .库德尔茨、g .米洛特、p .格雷卢、d .莫托托、S. A .巴宾和 s .瓦布尼茨。多模非线性光纤,时空大道。APL 光子学,4(11):110901,2019。

[4] D.J .理查森、约翰·菲尼和林恩·纳尔逊。光纤中的空分复用。《自然光子学》, 7:354–362,2013 年 5 月。

[5]阿尔法诺和夏皮罗。*在玻璃中通过四光子耦合在 4000 到 7000 范围内发射。*物理评论快报,24:584–588,1970 年。

[6] D. Faccio,A. Couairon 和 P. Di Trapani。锥形波、细丝和非线性成丝光学。阿拉卡内,罗马,2007 年。

[7] B .基布勒和 p .贝约特。多模光纤中的离散锥形波。物理评论快报,126(2):023902,2021。

[8] K. Tarnowski、S. Majchrowska、P. Bejot 和 B. Kibler。多模光纤中超短脉冲传播和锥形发射的数值模拟。美国光学学会学报 B,38(3):732,2021。

[9]波莱蒂和霍拉克。描述超短脉冲在多模光纤中的传播。美国光学学会杂志 B,25:1645–1653,2008。

[10] M .科莱西克、J . V .莫洛尼和 M .姆莱涅克单向光脉冲传播方程。物理评论快报,89(28):283902,2002。

11j . Andreasen 和 M. Kolesik。光在结构化介质中的非线性传播:广义单向脉冲传播方程。物理评论 E —统计、非线性和软物质物理学,86(3):1–9,2012。

https://www.osapublishing.org/josab/abstract.cfm?uri=josab-38-3-732

原文:https://towardsdatascience.com/discuss-the-dog-image-classification-project-with-cnn-bc5c90ee4fec?source=collection_archive---------19-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第61张

维基上的照片由 Aphex34 拍摄

今天我想展示一个例子,如何计算一个简单的卷积神经网络的形状和参数数量,还包括一些其他的经验。它以狗分类项目为例。这是入门级的,不精通技术,但欢迎您的专业意见,以帮助我更好地理解这个主题。

我们开始吧。

问题 1:计算 CNN 模型的形状和参数个数

假设您了解 CNN 的架构。一个 CNN 模型有五个卷积层,包括池层,三个全连接层,1000 个输出分类,如下图所示。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第62张

图片来自 Udacity DL ND

请提醒:

我们需要为全连接层 1 的空间维度计算 CNN 模型的形状,并且我们不需要计算模型的参数数目来构造 CNN 模型,但是必须知道卷积层中的参数数目。

CNN 模型中的参数:

假设__init__函数中的卷积层使用以下格式:

self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding)
self.pool = nn.MaxPool2d(kernel_size,stride)
self.fc = nn.Linear(in_features, out_features)

将使用的参数有:

  • in_channels -输入的数量(深度),例如 RGB 图像为 3。
  • out_channels -输出通道的数量,即构成卷积层的过滤“图像”的数量,或者将应用于输入的唯一卷积核的数量。
  • kernel_size -指定(平方)卷积内核和池内核的高度和宽度的数字。
  • in_features -每个输入样本的大小
  • out_features -每个输出样本的大小

除了全连接第 1 层的 in_features(这是计算模型形状的目标)之外,所有参数都将给出(由您决定)。

现在让我们检查给定的 CNN 模型。它包含卷积层、批量标准化层、激活函数、池层和完全连接层。

计算卷积层的形状

当我们说卷积层的形状时,它包括空间维度和层的深度

卷积层的 空间维度 (x,y)可以计算为: ***(W_in−F+2P)/S+1*** *.*

卷积层的 深度 将始终等于滤波器的数量 *K*

  • K -卷积层中的滤波器数量
  • F -卷积滤波器的高度和宽度
  • S——回旋的大步
  • P -填充
  • W_in -前一层的宽度/高度(平方)

同时:

  • K = out_channels
  • F = kernel_size
  • S = stride
  • W_ininput_shape元组的第一个和第二个值(比如 224*224,W_in=224)。

代码给出的参数:

input_shape元组:224* 224* 3(RGB)

out_channels从 conv1,2,3 是:32,64,128

kernel_size =F : 3x3,

padding =1 用于三个卷积层

stride在 conv1,2,3=1

stride在 maxpool=2

我们来计算一下:

Conv1 输入:W_in =224,F=3,P=1,S=1,in_channels=3,out_channels=32

Conv1 输出:conv1 输出的(x,y)大小:(224–3+2 x1)/1+1 = 224,depth_1=out_channels=32。

池化第 1 层输入:W_in=224,kernel_size=2,stride=2

池层 1 输出:
最大池层后输出的 x-y 大小:224/2(kernel_size)=112

Conv2 输入:W_in=112,内核大小=3,in_channels=32,out_channels=64

Conv2 输出:conv2 输出的 x-y 尺寸:(112–3+2 x1)/1+1 = 112,depth_2=64

池化第 2 层输入:W_in=112,kernel_size=2,stride=2

第 2 层输出池:112/2=56

Conv3 输入:W_in=56,内核大小=3,in_channels=64,out_channels=128

Conv3 输出:conv3 输出的 x-y 尺寸:(56–3+2 x1)/1+1 = 56,depth3=128

池化第 3 层输入:W_in=56,kernel_size=2,stride=2

池化第 3 层输出:56/2=28

来自池层 3 的输出大小:2828128=100352,将作为全连接层的输入。

FC1:尺寸变为 1003521,输出 25001

FC2:尺寸从 25001 到 5001

FC3:尺寸从 5001 到 1331

现在我们看看 1282828 是怎么来的。理论上,一旦我们得到了形状,模型的设计就完成了,但我们最好知道这个模型有多少参数,以便更清楚地了解这个过程。

计算卷积层中的参数数量

卷积层中参数的数量取决于所提供的filters/out_channelskernel_sizeinput_shape的值。

  • D_in -前一层的深度
  • F -卷积滤波器的高度和宽度
  • K -卷积层中滤波器的数量

同时:

K = out_channels

F = kernel_size

D_ininput_shape元组中的最后一个值,通常为 1 或 3(分别为 RGB 和灰度)。

计算过程为:

  • 每个过滤器都有F*F*D_in重量
  • 卷积层由K滤波器组成
  • 卷积层中权重的总数是K*F*F*D_in
  • 每个滤波器有一个偏差项,卷积层有K偏差
  • 卷积层中的 参数数量 ***K*F*F*D_in + K***

对于每一层:

**输入层:**输入层所做的就是读取输入图像,所以这里没有你可以学习的参数。

池层:该层没有需要学习的参数。

卷积层:

conv1 :每个滤波器有 333 个权重,该层由 32 个滤波器组成,该层的权重数为 33332,加上 32 个偏差,该层的参数数为 33332+32=896

conv2 : k=64,F=3,D_in=32,参数个数= 6433*32+64=18496

conv3 : k=128,F=3,D_in=64,参数个数=12833*64+128=73856

FC1 :在全连接层中,所有输入单元对每个输出单元都有单独的权重。对于 100352 个输入和 2500 个输出,权重数为 100352*2500=250880000。此外,该层对于每个输出节点都有一个偏差,因此有(100352+1)*2500=250882500 个参数。

FC2:(2500+1)* 500 = 1250500

FC3 : (500+1)*133=66633

现在我们看看有多少参数将被模拟。

附加信息:

  • 添加 BatchNorm2d 层有助于通过最小化内部协变量偏移来提高测试精度。
  • “放弃”设置为 0.2,以消除过度拟合效果。

我知道这个过程很长,可能会很无聊:-),但这是基本的,如果一旦理解了这个案例,对理解类似的案例会有很大的帮助。

问题 2:自己验证空间维度公式***(W_in−F+2P)/S+1***

如何验证空间维度公式?可以参考cs 231n 课程链接查看理论。但对我来说,一个例子会帮助我牢牢记住它。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第63张

来源:图片由作者提供

情况 1: padding =0,stride=0,输入:6x6,滤波器:3x3,输出(x,y)大小怎么样?(6–3)/1+1=4

情况二:填充=1,步幅=0,输入:6x6,滤波器:3x3,输出(x,y)大小怎么样?(6–3+2)/1+1=6

没有公式,你有什么答案?以及你的答案是否符合公式(W_in-F+2p)/S+1 的结果?

我们可以看到,填充保持了目标与输入具有相同的大小,这将减少信息损失。

问题 3:图像转换器的一些隐含知识和规则

****一些隐性知识更好地了解:

OpenCV 的检测器需要输入的图像是灰度的,但对大小没有要求。

VGG16、VGG19 和 ResNet 接受 224x224 的图像大小,而 Inception V3 和 Xception 接受 299×299 的图像大小。

使用 ImageNet 中的图像创建 CNN 事实上,您可以选择自己的图像大小,不同于 VGG16: 240x240 或 256x256,但您必须确定大小,因为 ImageNet 中的图像大小是多种多样的。

图像数据集

CIFAR-10:包含 10 个固定大小的类图像:32x32x3,有 60000 个图像,每个类包括 6000 个。这十类是飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。

MNIST:包含 60,000 个 28×28 像素的灰度图像,手写的位数在 0 到 9 之间。

ImageNet:ImageNet 中的图像有各种尺寸,如 224×224、227×227、256×256 和 299×299 等。

一些规则:

图像预处理我没有找到确切的规则,只有一些零散的规则。有欢迎分享。下面的规则是我从这个 StackOverflow 线程中搜索到的,很有帮助:

  1. " 随机数据扩充只允许在训练集上进行,您可以将数据扩充应用于验证集和测试集,前提是这些扩充都不是随机的"。
  2. “当您在验证和测试集上使用规范化时,您必须使用与您在训练集上使用的完全相同的因子。”
  3. 需要调整大小然后居中裁剪是因为 val 集需要来自训练集的同一域,因此,如果前者被随机调整大小并裁剪为 224,则 val 集需要确定性地调整大小和裁剪。

在今天的故事中,我将重点讨论计算一个简单 CNN 模型的形状和参数数量,并包括一些其他挑战。

感谢您的阅读。

参考资料:

  1. **【https://pytorch.org/docs/stable **
  2. Udacity 深度学习纳米学位
  3. https://cs231n.github.io/convolutional-networks

原文:https://towardsdatascience.com/discussing-privacy-at-hacker-news-an-explorative-text-mining-analysis-f94c62802df9?source=collection_archive---------32-----------------------

我们用 Google BigQuery 汇编了一个数据集,并用简单的文本挖掘方法分析了关于隐私的帖子。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第64张

凯文·Ku 在 Unsplash 上的照片

作为 NGI 前进项目的一部分,德拉布·UW正在支持欧盟委员会的下一代互联网计划,确定与互联网相关的新兴技术和社会问题。我们的团队一直在尝试各种自然语言处理方法,以发现不同类型的在线媒体中的趋势和隐藏模式。您可以在 https://fwd.delabapps.eu 找到我们的工具和演示。

近年来,隐私一直是科技讨论的关键话题之一。虽然自 GDPR 问世以来已经过去了近 3 年,但隐私争论仍未尘埃落定。事实上,新的发展每天都在出现:仅举几个最近几周的新闻,例如“ cookie 启示录”、围绕新的热门社交媒体平台 Clubhouse 的数据实践的问题,或者 Whatsapp 隐私政策的争议性更新。因此,鉴于这一领域发生了如此多的事情,我们想更深入地了解是什么推动了 infosec 社区中的对话。

在这个分析中,我们关注黑客新闻中的帖子和评论。使用谷歌的 BigQuery,我们收集了 2018 年 1 月至 2021 年 1 月期间所有带有“隐私”一词的帖子。要查看我们关于 BigQuery 和黑客新闻的教程(以及我们如何设法收集帖子的所有评论——这是一项需要一些 SQL 技巧的任务),请前往这个 Kaggle 笔记本。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第65张

数据收集的分步指南在这里

我们的数据集包含大约 65000 个故事(帖子),收到了近 50000 条评论。每个故事的平均评论数是 7.6,但是,它们的分布非常不均匀,因为 69%的故事没有收到任何评论。另一方面,评论最多的故事吸引了 626 条评论。

每月的故事和评论数量如图 1 所示。平均每月有 175 篇报道被发布,收到 1330 条评论。虽然随着时间的推移,这些价值观的演变并没有显示出强劲的趋势,但在 2018 年 4 月,就在 GDPR 被采纳前后,评论和帖子都出现了显著上升。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第66张

图一。每月故事/评论的分布

首先,让我们找出评论最多的故事:

1.1.1:快速、隐私优先的消费者 DNS 服务

告诉 HN: Triplebyte 逆转,邮件道歉

告诉 Triplebyte 面试?您的个人资料即将公开

问 HN:Gmail 的最佳替代品是什么?

Zoom 需要清理其隐私法

这些标题让我们知道是什么样的故事在推动参与:交流对隐私保护技术(如 DNS 解析器、电子邮件服务)的见解,并讨论有争议的数据处理实践。

为了更全面地了解热门报道,让我们关注评论数量最多的 20%的报道(最少 8 条评论)。在对标题进行标记并删除停用词之后,最常见的二元模型被识别出来,如图 2 所示。除了常见的疑点(如数据隐私、隐私安全等),列表中还可以找到一些有趣的概念。这样的例子是 差分隐私 ,这是一套新兴的方法学,在包含个人信息的数据库中保护个人用户的匿名性。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第67张

图二。标题中最常见的二元结构

我们可以更进一步,给我们的研究增加一个新的维度:情绪。使用 VADER 我们计算了每个评论的综合情感得分,并根据评论的平均情感得分对故事进行了排序。VADER 将社交媒体文本文档分为三类:正面(> 0.05 分)、中性(> -0.05 和< 0.05)和负面(< -0.05)。为了对这些故事有一个总体的了解,让我们来看看 10 个最积极和最消极的故事的标题:

阳性(得分在 0.75 — 0.59 之间)

问 HN:iPad 作为以 SSH 为中心的开发机器准备好了吗?

向 HN 展示:米德——我是如何反击媒体的

问 HN:我如何准备一份实施顾问的工作?

我们是 Mozilla 新的创业孵化器。AMA

Windows 10 vs. Mac,什么更能避免遥测隐私问题?

启动 HN:测序生物(YC S19)——纽芬兰的药物发现遗传学

展示 HN:用于互联网透明和数据隐私的开源 Chrome 扩展

用 Tor?您的隐私可能被泄露

发布 HN: Papercups (YC S20) —开放核心内部通信替代方案

问 HN:生活在贫困线上,你如何省钱?

阴性(得分在-0.32 — -0.17 之间)

DuckDuckGo 的隐私滥用——当前、历史和代理

是时候换一个隐私浏览器了

第九巡回法庭更进一步,在边界设备搜索中保护隐私

问 HN:科技人群——你对利用科技解决枪支暴力有什么想法?

隐私不平等:你所能想象的最残酷的不平等形式

谷歌和脸书在国会面前滔滔不绝地谈论隐私

为什么隐私很重要,即使“你没什么好隐瞒的”

苹果在数据隐私上是个伪君子

问 HN:为什么我们允许谷歌的滥用?

《我没什么好隐瞒的》和其他对隐私的误解(2007)

为了更深入,让我们也检查一下属于这些故事的评论中最常见的二元模型(图 3)。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第68张

图三。评论中的二元模型(10 个最积极/消极的帖子)

标题和评论的洞察力为我们提供了这些讨论的地图。黑客新闻是创业公司介绍自己的热门地点(例如发布 HN 系列),因此一些关注隐私的新创企业和开源项目被捕获。该列表还包括精通技术的用户认可的工具(例如,用 iPad 连接到远程工作站或提供隐私信息的开源浏览器扩展)。

另一方面,负面评论的帖子不仅涉及隐私和常见嫌疑人(广告业务中的科技巨头),还涉及关于用技术解决社会挑战的辩论,如枪支暴力。最负面的故事也包括意想不到的嫌疑人,如保护隐私的搜索引擎 Duckduckgo。然而,仔细研究后,似乎 Duckduckgo 上的故事有最多的负面评论,因为用户对帖子中的论点提出了质疑。

其余正面和负面故事中的评论如何?图 4。列出了前 50 个故事中的二元模型,不包括我们已经讨论过的前 10 个。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第69张

图 4。评论中的二元模型(前 11-50 个帖子)

虽然正面评论没有提供更多信息,但负面评论介绍了技术和政策方面的关键概念:被遗忘的权利言论自由,面部识别(狗屎?可能没那么重要)。

在 Google BigQuery 的帮助下,我们在 Hacker News 上收集了一组涉及隐私的帖子。这个练习表明,即使是简单的探索性分析(频繁的二元模型和情感分析)也能为技术社区讨论的两极分化的话题提供有意义的见解。数据的潜力要大得多:首先,数据结构支持其他关系的分析,比如评论中的同现。第二,可以实现各种更高级的方法,例如从维度减少或网络分析空间。

请在 Kaggle 随意探索数据集,如果有想法,请与我们联系!

原文:https://towardsdatascience.com/discussing-trust-ethics-and-responsibility-in-ml-at-icml-vldb-and-iclr-46b85b368375?source=collection_archive---------48-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第70张

由安迪·凯利在 Unsplash 上拍摄

人工智能研究和相关讨论正在如火如荼地进行——这对任何人来说都不奇怪。另一方面,“负责任的人工智能”的说辞还有待改进。根据去年的一项调查,目前只有 25%的公司认为无偏见的人工智能是一个有价值的目标。大型科技公司已经采取措施来改变这种状况,但总的来说,私营部门还没有把负责任的人工智能作为优先事项。

与此同时,当你申请银行贷款时,通常是机器根据交叉引用年龄、性别、邮政编码和语言等因素的算法来决定你是被批准还是被拒绝。许多工作申请现在也是这样评估的。当你进入一辆现代汽车,语音识别被使用,你被理解的程度(或者根本不被理解)取决于你的口音。自然,这些因素引起了对 ML 模型如何构建和实现的合理关注。

一些世界领导人非常清楚受控和良好维护的人工智能实践的重要性。例如,去年,欧洲议会发表了一份 100 页的综合报告,内容是关于与不受控制的人工智能发展相关的潜在问题。WEF 和经合组织也公开反对黑箱算法和不道德的数据使用。

显然,ML 科学家今天从事和监督的研究有着深远的影响。这种发展必须为透明管道留出空间,以适应公平和道德的决策,避免歧视和不公正。或者至少没有损坏的数据——这将是第一个危险信号,接下来会有更多的麻烦。

世界各地的许多 ML 研讨会和会议已经开始定期关注这些关键问题,希望有所作为。让我们来看看今年最有趣的三个例子。

→负责任的人工智能:对公平性、可解释性、安全性、健壮性和超越性之间的实际限制和权衡的跨学科视角

作为今年 ICLR 会议的一部分,5 月 7 日举行了一次跨学科研讨会。该研讨会聚集了各个人工智能子领域的专家,从学术界和商业到政府-包括研究人员和从业人员。目的是从公平性、安全性和可解释性的角度评估 ML 管道。通过一系列谈话,该活动提出了反映在道德和法律准则和实践中的透明度和偏见(黑盒算法)问题,其中包括刑事司法、医学和教育。

演讲者

所有的谈话都被记录下来,可以在这里找到。

📣这篇题为“负责任的解释:仅有良好的意愿是不够的”的演讲是由谷歌大脑的科学家贝金博士发表的。金从社会责任的角度提出了她对曼梯·里未来的看法。她展示了一系列作品,并重新审视了可解释 ML 中的目标和方法。

📣下一个演讲的题目是“作为一名社会科学家与计算机科学家一起工作的挑战和机遇”,由南加州大学的副教授埃里克·赖斯博士主讲。Eric 讨论了人工智能的当代研究,分享了他对人工智能驱动的干预计划的见解,并介绍了他对无家可归的青少年进行艾滋病毒预防干预的 3 项主要研究结果。

📣另一个题为“创造人们可以使用的模型:来自健康应用的经验”的演讲是由哈佛大学副教授约翰·l·勒布和 T2 的压轴博士多希-维勒兹做的。Finale 讨论了人类受试者实验,这些实验测试了旨在促进人工智能和临床医生在抗抑郁治疗背景下的交互的界面。她揭示了临床医生提出的最常见的改进要求,以及他们对正确和不正确的人工智能建议的反应。

关于 ICLR

学习表征国际会议(ICLR)是每年春天举行的国际 ML 会议。第一届 ICLR 会议于 2013 年举行,自那以来已经成为计算机科学家的主要聚会。今年有近 3000 篇论文提交,30%的接受率,今天大会被认为是人工智能和人工智能领域的前三大全球活动。

→规模化众包数据管理中的信任、道德和卓越

作为 VLDB 今年第 47 期的一部分,一个群体科学研讨会将在会议的最后一天,即 8 月 20 日举行。该研讨会名为“大规模众包数据管理中的信任、道德和卓越”,将涵盖数据标签众包方法的三个主要问题:大规模数据卓越、人群-人工智能相互作用以及信任和道德。

在研讨会期间,三位主旨发言人将考察众包在大规模研究中的作用,重点是众包工作者的福利和注释数据的可信度。

扬声器

📣题为“计算与组织”的第一个研讨会演讲由获奖作者、斯坦福大学副教授迈克尔·伯恩斯坦博士主讲。迈克尔将研究工作和在线平台的未来。他将讨论未来如何组织工作,以及当前的基础设施如何导致权利被剥夺和异化。然后,他将从工程和设计的角度以及政策的角度描述应对这些负面结果的可能对策。

📣第二个演讲的题目是“健康字节:培育群体工作的可持续未来”,由荷兰代尔夫特理工大学助理教授 Ujwal Gadiraju 博士主讲。虽然大多数与众包市场相关的问题和解决方案主要集中在数据质量上,但加迪拉朱博士将研究该领域鲜为人知的问题——大众工作者的福祉。通过使用 MTurk 和 perspective 作为例子,研究人员将从那些完成任务的人的角度剖析微任务众包,包括他们的薪酬和身心健康。将讨论管理众包的合同法的必要性。

📣题为“数字社区驱动的众包”系列的最后一个演讲由Wuraola oye wus主讲,他是尼日利亚数据科学的研究和创新负责人。演讲者将提供她对众包“人性化”方面的见解,即众包工作者不仅可以与众包平台互动,还可以在全球和区域社区内互动。将讨论众包背景下人与人之间的学习和反馈,并提供新的员工培训模式。

关于 VLDB

成立于 1975 年的超大型数据库国际会议 (VLDB)是致力于数据库管理的研究人员和开发人员最重要的年度聚会之一。由美国 VLDB 基金会组织,每年在不同的国家举行,备受期待的 2021 年 VLDB 奥运会将于 8 月 16 日至 20 日在丹麦哥本哈根举行。

→社会责任 ML

作为 ICML 今年第 38 期的一部分,一个虚拟研讨会将于 7 月 24 日举行。该研讨会将汇集理论和应用研究人员,目的是讨论如何建立对社会负责的 ML 管道。在其他主题中,将提出易受安全和隐私攻击、数据泄露以及种族和性别偏见等问题。该研讨会将讨论缺乏透明度的问题,以及它如何导致现实生活中故意或意外的数据扰动。

关于 ICML

机器学习国际会议(ICML)是人工智能和人工智能领域的领先全球会议。首次于 1980 年在匹兹堡举行,这一年度活动致力于统计和数据科学,重点是机器视觉,计算生物学,语音识别和机器人技术。这是目前世界上发展最快的人工智能聚会之一。今年的会议日期是 7 月 18 日至 24 日。

主要外卖

随着人工智能研究的进展,道德和公平的问题变得日益重要。对透明和建造良好的 ML 管道的需求是这种日益增长的关注的中心。目标是确保新兴技术的明显优势不会被不负责任的人工智能开发带来的问题所掩盖。本文中提到的研讨会详细研究了这些伦理问题,并提供了一些解决方案。

原文:https://towardsdatascience.com/displaying-a-gridded-dataset-on-a-web-based-map-ad6bbe90247f?source=collection_archive---------10-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第71张

(图片由作者提供,使用https://www.openstreetmap.org/**holo viewsSRTM 高程数据 )**

你的老板/客户刚刚给你安排了一项新任务。他们在 GeoTIFF 文件中有一些地理信息,你必须“把它放在像谷歌地图这样的地图上,你知道,有街道,缩放和滚动”然后在网上提供。可视化应该使数据第一眼看上去是一幅真实的彩色图像。此外,在鼠标悬停时,用户还应该看到该位置的实际数据值和精确坐标。此外,GeoTIFF 文件相当大(高达几百或几千兆字节),因此将其全部加载到浏览器中并不是一个好选择。

你并不担心,尽管你从未尝试过这样的事情。这听起来像是一种很常见的情况,所以网络上应该充满了开箱即用的解决方案和工作示例。但事实并非如此。据我所知,没有一个例子或教程展示过类似的东西。现有的方法有很多种,我们将在本文的最后讨论它们。但是与上述规格相比,它们都有所不足。

我将向您展示如何使用 Rioxarray 读取数据文件,然后使用 Holoviews + Bokeh 将结果显示在覆盖在地图上的图像层上,并使用 Datashader 处理一些自动调整大小的魔术。本文的目标读者是除了 Python 的一些基本经验之外,不需要任何先验知识就可以从事这项工作的任何人。你们中的一些人可能有广泛的 GIS、web 开发和数据可视化背景,而其他人没有。如果您只想查找代码,请向下滚动到“加载和理解数据”部分。

任务是将 GeoTIFF 文件中的数据以某种方式放到基于图块的地图上。首先,我们来看看我们对这些东西本身了解多少。

GeoTIFF 文件(如果非常简化的话)就像一个 excel 表,其中每个单元格(像素)包含一个数字,而行和列的名称是坐标。这些值可以是任何值:慕尼黑的人口密度地图、马来西亚的卫星夜灯地图、德克萨斯州的温度记录,或者出于本文的目的,肯尼亚的高程地图。

知道坐标意味着我们可以精确地知道这个数据网格在地图上的位置:不仅仅是角落,还包括其中的每个像素。需要注意的是,该文件仅包含原始数据;它没有任何颜色信息。因此,传统的图像文件(如 bmp、jpeg 或 png)将包含左上角像素的信息,即它是“红色的”,而 GeoTIFF 文件将包含一个数值(如它具有以米为单位的“123”高程)。由我们来告诉我们的可视化系统每个值对应什么颜色。

大多数图像查看器应用程序可以使用默认的色阶打开和显示 TIFF 文件,通常假设最低值应该是黑色,最高值应该是白色,以及介于各种灰色阴影之间的所有内容。但是,重要的是要记住 TIFFs 本身并不是彩色的,它们只包含数据,我们需要通过使用色彩映射表来给它们着色。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第72张

一个图像浏览器应用程序如何使用默认灰度色图显示 TIFF 文件的例子。(图片由作者提供)

另一个需要考虑的重要因素是文件的分辨率,也就是一个像素覆盖的区域大小。可以有两个类似的 GeoTIFF 文件,两者覆盖相同的总面积,一个具有 50x50 米像素,另一个具有 5000x5000 米像素。很容易理解,第一个需要比第二个多 100 * 100 = 10000 倍的像素才能覆盖同样的面积。因此,这将是更大的文件大小,但会给我们更多的细节。第二个文件要小得多,但是每 25 平方公里只有一个数据点。在本练习中,我们将使用这两种分辨率。我们从一个低分辨率的原型开始,一旦我们学会如何在不冻结一切的情况下使用它,我们就切换到高分辨率的数据集。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第73张

低分辨率和高分辨率数据的区别。(图片由作者使用https://www.openstreetmap.org/holo viewsSRTM 高程数据 )****

事实上,在地理标志中会发生更多的奇迹。为了简单起见,我们假设我们的 GeoTIFF 包含一个“区带”(就像包含一个工作表的 excel 文件)。此外,我们并不关心它的云优化图像金字塔的内部细节或精确的坐标参考系统。然而,我强烈推荐阅读这些只是为了好玩。

基于磁贴的地图是我们都熟悉的谷歌地图。用户有一个交互式视口,他们可以四处拖动、放大和缩小,地图提供商服务器向他们发送适当大小的地图切片,以查看该缩放级别的合理详细信息。虽然将谷歌地图集成到您的应用程序中需要开发者密钥和付费订阅,但我们可以使用许多免费的地图提供商。幸运的是,大多数图表库使它们易于导入。

这里重要的是不要将 tilemaps 与“绘制的地图”(根据上下文和格式,也称为 geo maps、geojsons、vector maps、shapefiles)混淆。后者主要是国家或其他地区的静态轮廓,没有这里提到的任何功能。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第74张

显示在平铺地图和矢量地图上的肯尼亚地区。(图片由作者使用https://openstreetmap.org/)****

Rioxarray (及其依赖项 xarray 和 rasterio )是一个相当强大的模块,可以像 GeoTIFF 一样处理网格地理数据集,因此我们将使用它来打开和转换我们的数据,但没有必要了解太多。

然而,Holoviz 生态系统(包含 Holoviews、Bokeh、Datashader 等等)是一个更加令人兴奋的实体。这是一套开源工具,由 Nvidia 和 Anaconda 等公司出资。

Bokeh 是一个制图工具:它让你用 Python 创建交互式 web 图表,并通过 JavaScript 中的 BokehJS 库自动在浏览器中显示它们。如果你熟悉的话,这有点类似于 Plotly。一个主要的区别是,Bokeh 本身有一个内置的 web 服务器,所以它可以创建深度交互的图表,其中浏览器中的用户交互(如拖动滑块)被发送到服务器,Bokeh 在服务器上修改数据并无缝地发回结果。(Plotly 用破折号也是为了同样的效果。)这也是将要在这个笔记本中发生的事情:每次我们创建一个交互式可视化,一个散景网络服务器将在后台旋转并为我们服务,而我们不必担心它。

Holoviews 在层级中的位置更高一些。在 Bokeh 中,你必须手动创建所有的图表(即使有许多合理的默认值和帮助函数),而 Holoviews 希望给你一个工具,用你想要的可视化来描述你的数据,然后让绘图模块(如 Bokeh)做琐碎的工作。区别有点像烹饪,你必须处理过程中的每个细节,而去餐馆只是描述你想要的食物,让员工制作而不必处理细节。虽然有了 Holoviews,如果你想按照你需要的方式做一些步骤,你也可以进入厨房(绘图模块)。

Holoviews 还允许您使用各种绘图库。我们将让它在这里使用散景,因为我们将需要一些特定的功能。在许多其他情况下,只需将一个关键字转换为“plotly”或“matplotlib ”,就可以得到在这些系统中创建的完全相同的图表。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第75张

相同的代码以默认设置显示在 Matplotlib、Bokeh 和 Plotly 中。(图片由作者提供。)

正如我们将要看到的,Holoviews 擅长用几行代码创建真正的高级功能。

另一方面,Datashader 只做很少的事情,但是实现得很好。也就是说,它可以根据数据以任何方式创建图像。通常基于大量的数据。比如数十亿个独特的点或数十亿字节的网格数据,否则这些数据是不可能显示的。

我与 Holoviz 生态系统没有任何关系,但我觉得它是一组被严重低估的工具,应该在数据科学社区中获得更大的关注。它没有得到它的一个可能的原因是,对于某些功能,文档落后于它的实际能力,特别是当一个人必须在没有先验知识的情况下理解正在发生的事情时。这就是为什么本教程会遍历可能的陷阱,并试图让一切工作方式变得透明,希望让这些工具更容易被更广泛的受众使用。

  • NASA/CGIAR 地球引擎的 SRTM 数字高程数据第 4 版
  • 肯尼亚国家边界从到OSM 边界的公开街道地图
  • 由作者在地球引擎中截取到 OSM 国家边界并导出的数据。

我们将使用 Google Colabs,这是一个免费的 Jupyter 笔记本环境,可以很容易地进行实验和分享结果。你可以通过 Colab 笔记本跟随整篇文章,也可以在你看完这个之后用它来做实验。

它已经预装了许多模块,但我们还需要更多,而且我们想知道我们是否有我们需要的完全相同的版本。

我们可以通过在命令行前添加!来运行命令行命令,因此我们将使用它来运行 pip 并在 2021-04-16 为这些模块安装最新版本。我们可能会遇到一些底层依赖的不兼容错误,但是它们不会给这个练习带来任何问题。

接下来,我们用他们的短手导入所有必要的模块。我们会经常用到这些快捷键,所以如果您不确定我们使用的一些函数来自哪里,请随时回来。我们还展示了一些模块的版本,以确保一切正常。

**Versions:  {'holoviews': '1.14.3', 'bokeh': '2.3.1', 'rioxarray': '0.3.1'}**

我们还需要数据本身。我已经将肯尼亚的海拔地图作为云优化的 GeoTIFF 文件从 Earth Engine 导出到我的 Google Drive。(如果你对如何使用各种可用数据集完成这项工作的教程感兴趣,请在评论中告诉我。)

通过预装的gdown工具,谷歌可以将公开共享的文件从 Drive 下载到 Colab。

如果你想将自己的数据集导入 Google Colab,只需将你的 Google Drive 文件分享给“任何有链接的人”。你会得到这样一个链接:

https://drive.google.com/file/d/16 dkulax 8 rkkuodqualrariwtg _ IBD msz/查看?usp =共享

这不是直接下载链接。它会在 Google Drive 预览窗口中打开文件。要获得一个可以用来下载文件的链接,你需要复制你的原始链接的 ID 部分(在上面的例子中用粗体标出)并放入这个链接: https://drive.google.com/u/0/uc?id=idcomesere&export = download

你最终的结果会是这样: https://drive.google.com/u/0/uc?id=16 dkulax 8 rkkuodqualrariwtg _ IBD msz&export = download

这是一个你的文件的直接下载链接,所以我们可以用下面的方式把这个作为 *source_location* *gdown*:**

*gdown -O local_destination source_location*

由于 Google Colab 的默认工作目录是/content,我们首先创建一个名为kenya的目录,然后将我共享的两个示例文件下载到该目录中。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第76张

在下载日志中,你可以看到较小的文件是 60.3KB,较大的 329MB。这是一个巨大的差异,所以首先,我们从较小的一个开始。

我们将使用 rioxarray 模块将文件中的数据加载到一个 xarray 数据结构中。

旁注:如果 Google Colab 单元格包含的最后一行只有一个变量,它将以一种有意义的方式显示它。从现在开始,我们将使用它来查看每一步的结果。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第77张

不用深入研究这种数据格式的细节,我们可以看到我们的数据有一个 218 乘 179 的维度,只有一个波段:高程数据本身。我们还可以看到,x 值大约在 30 到 42 之间,而 y 值大约在-5 到 5 之间,因此它们看起来像是合理的坐标值。

为了更熟悉我们的数据,我们可以很容易地将其转换成熊猫数据集并显示出来。我们可以看到它确实是一个网格数据集,坐标是行和列标题,以米为单位的高程数据是值。(当我将数据裁剪成肯尼亚的边界形状时,一个数字值显示缺少的值。)

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第78张

这完全没有必要,甚至毫无意义,但为了强调“我们正在处理无色的网格数据,而不是实际的图像”这一点,我们甚至可以将数据导出并下载为 CSV 文件,如果我们愿意,可以在 Excel 中打开它。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第79张

Excel 中显示的同一个数据集。(图片由作者提供。)

在继续之前,我们将设置一些配置值,从我们的色彩映射表开始。通常,我们可以给 Holoviews 一个颜色列表或一个现有颜色图的名称,但我喜欢为当前数据集使用颜色图的特定子集。我不打算在这里解释细节,因为您自己的数据不需要这个。只要知道我们取了terrain色图的 25%-100%部分,并得到了一个在该范围内分布有 192 种颜色的列表就足够了。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第80张

产生的颜色列表

下一步,我们设置所有 Holoviews 元素从现在开始将使用的默认选项。在这里和这里见它们的文档。我们确保使用我们的颜色图和宽度/高度设置,显示颜色条。我们还打开了悬停工具提示,以及通过鼠标滚轮或触摸板滚动来放大和缩小的功能。

只有两件事需要多解释一下。

  1. 我将在每个单元格的开头包含hv.extension('bokeh', logo=False)行。这让 Holoviews 知道我希望它显示带有散景的元素(但不是每次在输出中都显示散景标志)。如果你在本地运行你的脚本(不是在 Google Colab 上),你只需要这样做一次。据说也有可能让 Colab 笔记本记住它而不重复,但事实证明这对我来说有点不可靠,所以我更喜欢这样使用它。
  2. 该数据不包含肯尼亚边界以外的数值。默认情况下,它会显示为灰色区域,但我们不希望这样,所以用clipping_colors参数,我强制它不可见(#00000000 RGBA 代码的最后两位数字表示 0 不透明度)。

现在我们已经做好了一切准备,让我们将数据加载到一个数据集中。变化不大,但 Holoviews 稍后将需要这种格式的数据。dataarray[0]指我们dataarray中的第一个波段。我们还让它知道要使用的值('elevation')和坐标(['x', 'y']),就像我们在上面定义它们一样。

我们将立即看到为什么这是方便的,因为现在使用我们的默认配置,将这个数据集输入到 Holoviews 图像并让 Holoviews 自动显示它是非常容易的:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第81张

正如你所看到的,我们有一个很好的显示,有交互图标、缩放、颜色条等。我们可以在坐标轴上看到图像的坐标,y 轴以 0 为中心,肯尼亚在赤道上。我们甚至有一个自动悬停工具提示(上面用tools=['hover']配置创建的),如果鼠标在图像上,它会显示精确的坐标和高度值。

现在,让我演示一下 TIFF 只包含原始数据而没有任何颜色信息的好处。

下面你可以看到我们用和上面完全相同的数据创建的完全相同的 Holoviews 图像。我刚刚给了他们另外两张彩色地图。第一种使用inferno连续色彩映射表,将较低值涂成黑色,较高值涂成紫色、橙色和黄色。第二个使用了用于分类可视化的Dark2颜色图:仅仅通过使用这个颜色方案,我们立即将我们的数据分类到 8 个不同的海拔高度,而不改变数据本身。

你可以在这里阅读更多可用的色彩映射表。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第82张

但是让我们回到手头的任务。这是一件好事,我们有我们的形象,但我们也需要一个 tilemap。幸运的是,很容易得到一个。你可以在 Holoviews 网站上看到所有不同的选项(黑暗、光线和地形)。

我们现在要选择开放的街道地图。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第83张

好的,那是一张地图,可以缩放,什么都有,但是它是空的。这就是 Holoviews 的“它只是工作”魔力发挥作用的地方:使用*操作符,我们只是将图像放在我们的地图上,并期待最好的结果:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第84张

嗯,这是尴尬的…图像是可见的,但不是在地图上,而是在白色背景上,轴也显示一些奇怪的坐标…

为了理解这种现象(这导致了 StackOverflow 上绝大多数“地图上的图像很奇怪”的问题,不管使用什么工具),我们需要了解一点关于坐标系的知识,这通常过于简单。

我们的图像使用一个平面坐标系,其中的值通常在-180 到 180 度之间。它很棒,因为它让我们可以使用像地球这样的球形物体上的位置。另一方面,每个可用的 tilemap 引擎都使用 Web 墨卡托坐标系,该坐标系以米为单位测量所有事物。墨卡托经过优化,可以在平面上显示地图,也就是我们的屏幕。这可能非常令人困惑,因为这些墨卡托地图确实向我们显示了轴上的平面坐标(因为这些数字是每个人都熟悉的)。但那只是一个显示功能;内部都是用米。因此,当你给他们一个平面坐标约为-4.2151 或 32.14 的数据集时,这些值应该被理解为-4.2151 度和 32.14 度。同时,tilemap 会将它们解释为距离原点-4.2151 米和 32.14 米。虽然 360 度足够绕地球一周,但 360 米是一个非常非常小的距离。

结果是,我们的图像确实显示在地图上,就在 0,0 点周围,向每个方向延伸几米。因为 Holoviews 元素自动放大地图以显示完整的数百米图像,所以地图被放大到甚至不能显示海洋中部的任何分辨率的地图切片。如果你开始缩小,你就能看到这种情况发生,就像这张 g if 上看到的那样:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第85张

现在我们明白了为什么会发生这种情况,让我们做点什么吧。我们需要将数据转换到适当的坐标系。平面坐标和墨卡托坐标之间的转换不是我们应该手动完成的。不仅仅是因为试图找出如何将一个或多或少呈球形的对象转换为 2D 是一件非常痛苦的事情,而且在现实中,数据集可能会使用许多略有不同的平面坐标系,我们绝对不想处理这些坐标系。(编程 101:永远不要试图重新实现处理日期、时区、翻译或坐标系统细节的功能。)

我们只是碰巧运气好,因为我们用来读取 GeoTIFF 的rioxarray模块有一个处理这种确切情况的函数。我们只需要给它所需投影的代码(在这种情况下,墨卡托的代码是'EPSG:3857')。让我们重新开始,这次用正确的投影。

注意:重新投影一个巨大的文件会消耗大量资源,所以在生产环境中,我建议将结果保存在一个 Parquet 文件中,然后在显示数据时用 Dask 加载,但是这已经超出了我们的范围。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第86张

这次我们已经可以在 x 值中看到(使用科学记数法,3.775e+06意为3.775 * 10^6)它们在 3775000 到 4666000 之间。这些数字肯定比以前大得多,正如我们现在用米来计量时所预期的那样。让我们运行与之前完全相同的步骤(没有仍然有效和可用的配置部分):

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第87张

万岁,成功了!有点…

我们有地图,我们在正确的位置上有它上面的图像,我们可以缩放和拖动,我们甚至有一个悬停工具提示…现在坏了:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第88张

叹气。这是有道理的:这一次,我们给了系统墨卡托坐标来显示,所以地图也不能在工具提示中显示熟悉的平面坐标。相反,我们得到的所有东西都是以米为单位的,尽管如此,这对于我们的大多数用户来说毫无用处。

因此,当我们显示悬停工具提示时,我们必须动态地将墨卡托坐标转换回平面坐标。为此,我们需要使用一些 JavaScript。如果你不熟悉它,不要害怕,你可以把它作为一个复制粘贴解决方案,然后忘掉它。

如果你还记得,我提到过全息视图可以使用多个绘图库,在这个例子中,我们使用的是散景。它是一个 python 模块,让你编写 Python 代码,然后它将代码翻译成 JavaScript,并在浏览器中用 BokehJS 库显示。幸运的是它有一个专门的工具可以将墨卡托坐标转换回平面坐标。虽然到目前为止,我们甚至没有直接使用 python Bokeh 模块,但是这个设置让我们可以直接向 BokehJS 提供一些关于如何显示悬停工具提示的信息。

让我们再试一次,这次使用新创建的定制工具。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第89张

完美!

Pfew。那是一次旅行…

房间里有一头大象:到目前为止,我们只使用了每个像素覆盖 5 公里 5 公里的小数据集。由于这一点,整个压缩文件的大小是 60KB,所以我们可以很容易地在服务器上解压缩数据,并将整个内容发送到浏览器。我们为此付出的代价是,我们的图像非常像素化,尤其是放大后。*

这在某些情况下可能行得通,但是我们理论上的老板/客户有他们想要使用的非常详细的地图。该地图上的每个像素覆盖 50 米 50 米,因此整个数据集约为 22,000 像素高,18,000 像素宽。这将让我们显示更多的详细信息,如果我们的用户需要特定位置的值,这可能是至关重要的。问题是,对于高分辨率数据,即使是压缩的 GeoTIFF 也超过 300MB。如果我们试图一次显示整个数据集,解压缩后的数据将以千兆字节计算,这会导致巨大的下载时间,并保证浏览器中的内存冻结。*

这样做似乎也有点不必要。想想看,当用户在默认缩放级别下看到整个图像时,他们会看到所有的 22k*18k 像素。他们的屏幕分辨率低得多,所以分辨率低得多的快照就足够了。更高分辨率的图像只有在越来越放大时才有意义。但是当这种情况发生时,他们只能看到图像越来越小的部分,所以把不可见的部分也发给他们是没有用的。

这意味着我们需要一个解决方案

  1. 它可以捕捉当前的视窗和缩放级别,
  2. 向浏览器发送仅覆盖可见区域的图像
  3. 并以合理的分辨率完成。

这听起来像是一个企业级的功能,我们将花费余生来开发。除了 Holoviews 与 Datashader 模块集成,它们一起可以精确地完成这一点。

(快速补充说明:Datashader 是一个不可思议的工具,可以从不可显示的大数据集生成可显示的图像。它可以让您显示数十亿个独立的坐标,或者在我们的例子中,显示否则无法使用的网格数据集。如果你打算使用全息视图,你绝对应该 查看数据。)

让我们再重复一遍我们上面所做的,但最后是大数据集。

请注意,这一次我没有显示结果图像。原因在于,根据具体的数据集,要么 Colab 内核会完全崩溃,要么整个进程会一直挂起,直到您的浏览器因内存不足而崩溃。

我们没有将这个hv.Image()直接与地图结合,而是首先基于它创建一个动态图像。我们只需将它放入 Holoviews 提供的 Datashader 函数中,并将其导入为 hd.regrid。然后,我们将这个新创建的动态图像与地图结合起来。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第90张

如果我们缩放和平移,我们可以看到令人惊叹的事情正在发生,我们自动获得更高分辨率的图像。但与此同时,图片会被奇怪地重新着色,而且颜色条每次都在变化。这些事情以前没有发生过。

对此的解释是,之前,我们的小部件使用了整个低分辨率数据集,因此它知道最低值和最高值。由此,它可以创建一个强大的色标,覆盖从大约 0 到大约 5000 米的整个数据光谱。这意味着无论我们在哪里缩放,相同的值总是得到相同的颜色。

然而,我们新的动态系统的显示部分只接收数据集的可见部分。每次用户交互时,小部件都必须使用当前可见的最低和最高值来拉伸它们之间的色阶。如果我们放大到最高值只有几百米的平坦区域,该区域现在将被着色为保留给最高值的颜色(白色),棕色、黄色和绿色覆盖其下的值。相反,如果我们放大到一个山顶,即使是最低的可见点也在 2000 米以上,那么从这个高度开始,它将被染成绿色、黄色、棕色和白色。这就是为什么图像每次都被重新着色,为什么颜色条显示新的值。这实际上在很多情况下可能是一个有价值的功能,因为它使我们关注的任何小细节突出出来,真正突出了微小的差异,但如果你想有一个一致的图像,这真的很糟糕。

为了解决这个问题,我们将查询数据集并获得整个数据集的实际最小值/最大值。

**(-20.0, 5035.0)**

接下来,我们将颜色范围限制更新为这些值。我们不更新默认选项,因为此信息与此数据密切相关。如果我们想在它旁边显示一些其他的数据集,使用这些限制也是不合理的。相反,我们将它们直接应用于我们的组合元素。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第91张

希望你的客户/老板接受 Colab 笔记本作为最终结果。否则,您将需要一种更专业的方式来发布您的小部件。我们将在未来可能的文章中探讨这个主题。

现在,让我举一个简单的例子,说明我们已经发现的一些特性是如何在一个交互式小部件中呈现的。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第92张

您可以查看 Colab 笔记本中的实例:

https://colab . research . Google . com/drive/15 ag 8 abyv 6 mwrkvk 7 is R3 j 5 wlgyo i2t j 0?usp =共享

无论你不想或不能使用上述解决方案的原因是什么,我知道有一些替代方案,它们都有一些警告。

在同一个 Holoviz 生态系统中,有一个模块专门用于处理这类任务: Geoviews 。假设hv.element.tiles.OSM() * hd.regrid(gv.util.load_tiff('your/file.tif'))行本身给你的结果与上面的整个代码相同(尽管我没有测试它),所以选择它看起来是显而易见的。

然而,它有两个问题。一个是严重缺乏该特性的文档,因为甚至他们自己的网站也只在一个发布说明中提到过一次“load_function”字符串。另一个是 Geoviews 能够在后台做许多令人惊叹的 GIS 魔术,因为它严重依赖于许多科学 GIS 模块。其中一些需要手动安装,这需要花费大量的时间、精力和经验。喜欢,很多。我做过几次,都获得了不同程度的成功,但这真的很痛苦。例如,基于论坛,我甚至不确定是否有可能在 Google Colabs 上设置它。如果你有一个轻松的 Linux 服务器,你只需要设置一次,并且你可以长时间使用同一个环境,那么它可能是你最好的解决方案。如果你像我一样,通过本地 Windows 开发从 Colab 跳到任何 Linux 服务器或无服务器产品,你最好不要依赖于你不确定下次还能不能安装的东西。

开发者知道这个问题。希望他们能够重构和重写模块,只需要较少麻烦的依赖,因为它是一个非常天才的工具。但目前来看,事实就是如此。

破折号和情节上有点类似于商业领域,就像 Holoviz 生态系统对于科学领域一样。可以说,他们的学习曲线不太陡峭,文档也更全面。

然而,他们没有像我们一样将网格数据集放到地图上的方法,至少在写这篇文章的时候没有。这是一个遗憾,因为他们有各种网格表示的图表(如 px.imshow,go.image,go.heatmap),他们对基于图块的地图有很好的支持,但没有办法将它们结合起来。这是可悲的,因为他们甚至有全息视图和数据阴影集成。因此,你可以做的最好的事情是遵循他们的 Plotly+Datashader 教程之一,这将允许你把一个视觉图像(即使是由 Datashader 创建的)放到地图上,但你不会访问数据本身,所以没有悬停工具提示。如果您不需要访问数据,而您需要将您的项目集成到 Dash 应用程序中,这可能是一个合理的折衷方案。

顺便说一下:如果在任何时候 Plotly 将能够在地图上显示网格数据,由于 Holoviews-Plotly 的集成,我们上面的整个练习只需要一个改变:hv.extension('plotly', logo=False),然后一切都应该显示在 Plotly 中,准备在 Dash 中显示。手指交叉。

你可以做的另一件事是将你的 GeoTIFF 转换成这些地图已经使用的相似 tileset,并将那个 tileset 放在原始地图的上面。Mapbox.com 切片服务是实现这一点的一种方式,但还有一个名为 Terracotta 的 python 模块,它可以获取您的地理信息,创建地图切片,并按需作为服务器提供服务。从那里你只需要一张可以使用它们的地图。

有很多选择,但Dash-leaf是最好的选择之一。这是流行的 LeafletJS 映射库的 Python 实现,移植它的人甚至有一个terra cotta-Dash-Leaflet demo来展示完全相同的东西,所以很容易安装和运行。它与 Plotly+Dash 解决方案具有相同的缺点。由于浏览器只接收来自服务器的可视图像,所以它没有办法在悬停工具提示上显示数据。然而,它有一个聪明的解决办法,在鼠标点击时,它可以向服务器发送请求,并在该位置获得准确的数据。它不像工具提示那样无缝,但是如果您只需要在很少的情况下查看数据,这可能是一个很好的解决方案。此外,如果您有任何问题,Dash 传单库的创建者 Emil 在 Dash 论坛上提供了一些企业级支持。

但是正如我提到的,有多种方法可以创建和提供 tilesets,如果你有,你可以使用几乎任何图表库,可以显示基于 tile 的地图,所以你这样做。

你知道其他方法吗?请在评论中告诉我!

感谢菲利普·鲁迪格、布莱恩·范·德·Ven、詹姆斯·a·贝德纳尔和马克·斯科夫·麦德森,不仅仅是因为他们对 Holoviz 生态系统的贡献,也因为他们回答了我不断提出的问题。

还要感谢谷歌的@blois 立即调查了 Colab 和 Holoviews 在交互功能方面的一些不兼容问题。

原文:https://towardsdatascience.com/displaying-aws-ecs-fargate-logs-in-airflow-ui-7b302321fd09?source=collection_archive---------34-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第93张

照片由 Unsplash 上的 Aditya Saxena 拍摄

在我从事的一个项目中,我使用 AWS 弹性容器服务来运行 Fargate 任务。为什么?我有需要运行的作业,所以很容易打包到 Docker 容器中,并部署在 Fargate 上,只需为使用的资源付费。我用气流来安排这些任务。因为 Airflow 在 Fargate 上运行任务,所以所有的作业日志都是在 Fargate 任务(Docker 容器)中创建的。幸运的是,Fargate 支持将日志流式传输到 CloudWatch,但如果您有十几行日志,在 CloudWatch 中浏览就不是超级友好的了(例如在线阅读和分页)。幸运的是,Airflow ECS Operator 支持在 Airflow UI 中显示来自 Fargate 任务的日志,这对我来说更好也更有用,因为我把所有东西都放在一个地方,我不必去 CloudWatch 调查。

我在配置 Airflow/Fargate 来显示日志时遇到了问题,所以我想描述一下我的方法和我的理解。通常,当显示来自 CloudWatch 的日志出现问题时,气流日志中会出现异常:

An error occurred (ResourceNotFoundException) when calling the GetLogEvents operation: The specified log group does not exist.

并且气流任务被标记为失败。我的问题是正确设置日志配置,以便 Airflow 可以读取它(这可能是由于缺乏 CloudWatch 日志如何工作的知识造成的)

当设置 Fargate 任务和容器部分时,有日志配置选项,我选中“自动配置 CloudWatch 日志”,然后一切都是预定义的,当然,也可以设置自定义值。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第94张

使用这些设置,云观察中的日志组会随后自动创建。

在我的例子中,容器名和 Fargate 任务名都是“fargate_logging”。

在 Airflow ECSOperator 中,我用这些值设置日志:

awslogs_group“/ecs/fargate_logging”

awslogs_stream 为**“ECS/fargate _ logging”**(开头不带“/”)。

任务可能如下所示(非完整配置):

task = ECSOperator(
    dag=dag,
    task_id=task_id,
    task_definition=task_definition,
    cluster=cluster,
    region_name=region_name,
    launch_type=launch_type,
    overrides = {},
    awslogs_group='/ecs/fargate_logging',
    awslogs_stream_prefix='ecs/fargate_logging'
)

在 CloudWatch 中检查是否创建了日志组,以及那里是否确实有日志:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第95张

我们看到日志流(名称)由“ECS/fargate _ logging”+某个数字组成

Fargate 任务执行后,Airflow ECS 操作员正在读取 CluodWatch 日志和流作为 Airflow 日志,这是核心部分。我们看到它正在解析 task_id ,并与 awslogs_stream_prefix 一起将 stream_name 放在一起。Task_id 是执行的 Fargate 任务的 id。

self.log.info('ECS Task logs output:')
task_id = self.arn.split("/")[-1]
stream_name = "{}/{}".format(self.awslogs_stream_prefix, task_id)
self.log.info("aws log group {}".format(self.awslogs_group))
self.log.info("stream name: {}".format(stream_name))
self.log.info("task_id: {}".format(task_id))
for event in self.get_logs_hook().get_log_events(self.awslogs_group, stream_name):
    dt = datetime.fromtimestamp(event['timestamp'] / 1000.0)
    self.log.info("[{}] {}".format(dt.isoformat(), event['message']))

我添加了日志行,以查看在我设置值后什么会作为 stream_name。这是我在气流日志界面上看到的:

[2021-03-31 07:23:53,773] {ecs_operator.py:172} INFO - ECS Task logs output:
[2021-03-31 07:23:53,774] {ecs_operator.py:175} INFO - aws log group /ecs/fargate_logging
[2021-03-31 07:23:53,774] {ecs_operator.py:176} INFO - stream name: ecs/fargate_logging/571504e3bf504615b39d2fdbea15a987
[2021-03-31 07:23:53,774] {ecs_operator.py:177} INFO - task_id: 571504e3bf504615b39d2fdbea15a987

重点是 awslog_groupstream_name 和 Cloud Watch 里的相匹配。

例如,在 CloudWatch 中,我们有一个名为 ecs/fargate_logging/571504 E3 BF 504615 b 39 D2 FD bea 15 a 987 的日志流, awslogs_stream_prefix 是“ECS/fargate _ logging”。

我在调试时使用了下面的代码片段来直接读取日志:

import boto3
client = boto3.client('logs')
response = client.get_log_events(
    logGroupName='/ecs/fargate_logging',
    logStreamName='ecs/fargate_logging/571504e3bf504615b39d2fdbea15a987'

)
print(response)

同样,在配置 Airflow 时,ECS Operator awslog_group 和 awslogs_stream_prefix 必须与 CloudWatch 中的内容相匹配(而不是相反)!!!

在 Airflow 中,您不需要设置您想要的值,而是在 CloudWatch 中设置它们,以便您可以正确读取它们。当我最初设置气流(对 ECS 没有太多经验)时,我认为我是在为日志设置它应该如何配置(它们将如何编写),但正如我已经强调的那样,情况正好相反。

我希望这将帮助那些有类似问题的人。

原文:https://towardsdatascience.com/displaying-geographic-information-using-custom-map-tiles-c0e3344909a4?source=collection_archive---------14-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第96张

由卡尔文·汉森在 Unsplash 拍摄的照片

交互式地图现在是我们日常数字生活的主要部分。我们用它们来了解我们的行踪,计划下一次旅行,或者回顾我们过去的旅行。在专业环境中,地图成为各种商业规划、运营和分析的无价工具。

一个交互式地图显示了一个拼凑的方块,每个方块包含完整图像的一小部分。基于云的服务通过从缓存中检索或动态生成来提供这些切片。地图软件管理显示,就像显示连续的位图,但是在后台以图块为基础操作。无论何时需要,地图软件都会向服务请求新的切片,并在不再需要时将其丢弃。当用户更改缩放级别或向任何方向平移地图时,会出现这种情况。

放大或缩小时,地图软件会在检索新级别的图块时拉伸或压缩当前显示。然后,它将新的瓷砖覆盖在旧的瓷砖上,提供了令人愉快的视觉连续性。

没有什么比一个现场地图示例更能帮助你建立对幕后发生的事情的直觉。请点击前面的链接并选择“显示磁贴边框”选项。浏览地图,查看软件如何处理切片,如何拉伸切片,以及如何替换和刷新内容。将光标悬停在每个单幅图块上时,软件会显示该单幅图块的坐标。

我们可以将整个 tileset 设想为一个二维空间,其中每个 tile 接收一组唯一的整数坐标,用于任何缩放级别。第一个缩放级别包含整个可绘制的地球表面,并将其放入一个单幅图块。每个后续缩放级别将前一个级别的平铺分割为四个,从而使细节和整数坐标的范围加倍。在第一级缩放时, xy 坐标的范围在 0 到 1 之间,而在第二级缩放时,它们在 0 到 3 之间变化。此过程重复进行,直到达到支持的最大缩放级别,通常在 18 到 23 之间。我们可以说元组( xyzoom )唯一地标识一个图块。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第97张

上图显示了缩放级别 3 的单幅图块坐标范围。(图片来源:微软— 必应地图磁贴系统)

像传单和它的 Python 包装器叶子这样的交互式地图软件在发布服务器请求时使用这种类型的图块寻址。服务器将这些坐标转换成图块的地理空间形状,即纬度和经度空间中的正方形,并使用这些来查询底层数据。通过这些数据,服务器渲染切片的图形内容,并将其发送回地图软件客户端。

我们也可以通过其对应的四键来寻址每个图块。四键将图块唯一编码为单个字符串或数字,便于缓存或字典键。根据整数编码方案,我们可以包含缩放级别或将其作为上下文信息。四键非常方便,因为我们可以很容易地从瓷砖坐标计算它们。我们将在这里使用它们来编码本地切片缓存的文件名,作为数据库关键字,并作为代数的基础,这将减轻大量的计算。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第98张

上图说明了如何根据位置和细节层次导出四键代码。请注意第 3 级图块坐标如何映射到其对应的四键。(图片来源:微软— 必应地图磁贴系统)

我们可以使用字符串或 64 位整数对四键进行编码。字符串编码在每个缩放级别使用一个字符,可以是零个、一个、两个或三个字符,并且具有将缩放级别保持为字符串长度的优点。它最大的缺点是存储每个四键所需的存储空间。

幸运的是,很容易将字符串编码压缩成更易于管理的东西,一个 64 位整数。一旦我们认识到四键的字符串表示只不过是一个基数为 4 的数,转换就相对容易了。最直接的转换是将字符串编码成整数,但会丢失缩放级别信息。我们必须以某种方式,隐式或显式地将缩放级别信息存储在其他地方。或者,我们可以使用整个 64 位来编码键和缩放级别信息,但是这个解决方案只将我们限制在 23 个级别。在本文中,我使用前一种编码,因为缩放级别总是可以从上下文中获得,并且它支持对所需的 26 个缩放级别进行编码。

上述函数在字符串和整数表示之间转换四键编码。注意,到字符串的转换需要期望的缩放级别,并且整数表示不包括缩放级别。(图片来源:作者)

以上图为例,右下角图块的字符串编码“333”对整数 63 进行编码。但是四键编码并不像看上去那么简单。使用字符串或整数编码,我们可以立即导出封闭缩放级别的平铺键。对于字符串编码,我们删除最右边的字符,而对于整数编码,我们执行整数除以 4。当处理代表图块的 256x256 位图时,该属性具有令人兴奋的含义——每个图块像素是另一个向下缩放八个级别的图块,这将为我们创造奇迹。

交互式地图通过叠加地理信息来实现其用途。交互式地图软件通常允许叠加两种不同类型的数据:矢量和位图。在这里,我们关注一种特殊的位图数据,平铺覆盖。切片叠加的工作方式与底图切片相同,为每个底图切片提供一个地理内容切片。

每个拼贴是一个正方形位图,与地图拼贴具有相同的尺寸,并使用 alpha 合成来显示底层地图信息。这样,叠加图创建者可以只绘制要在正确的地理位置显示的数据,而不关心底层地图是如何显示的,这就是我们在本文中遵循的方法。

为了说明这种技术,让我们从 OpenStreetMap 服务器中挑选一个与我们的研究区域(美国密歇根州的安阿伯市)相匹配的图块。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第99张

上图显示了坐标为 4381,6067,14 的 OpenStreetMap 图块。这就是前面提到的底图。(图片来源:OpenStreetMap)

使用基础切片的坐标,我们现在可以提取相应的地理数据并生成覆盖切片。在这种情况下,我们计算每个采样位置的二元正态分布,并将其添加到地图中。密度较高的区域将以绿色显示。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第100张

上面的图块覆盖对应于之前的底图图块。白色区域是透明的。每个点代表一次 GPS 观测,绿色区域对应更高的密度。(图片来源:作者)

通过使用 alpha 合成合成上面的两幅图像,我们得到了最终的位图(见下图)。请注意,地图软件会自动处理这一过程。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第101张

通过组合前面的两个图块,我们得到了上面的图像。(图片来源:作者)

您在覆盖图块中看到的每个点实际上是一个使用二元正态分布生成的圆。分布的中点是位置,我们考虑一个单像素标准差的对角协方差矩阵。因此,位置扩展到以下强度矩阵。最终图像是所有位置相加的总和。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第102张

上面的矩阵显示了如何使用二元正态分布将单个位置转换为“密度圆”。将所有位置加在一起后,呈现代码将根据缩放级别范围为每个单元格分配一种颜色。(图片来源:作者)

为了避免二元正态分布固有的无限大小,当每个单元格的值低于 0.00001 时,我决定切断表示。空单元格反映了这种情况。

切片生成是一个分三步的过程。第一步包括数据收集和转换成适合快速查询和检索的格式。服务器使用准备好的数据绘制图块位图,并将其存储在文件缓存中,以便在第二步中重用。本文展示了第二步的一个惰性版本,其中服务器软件按需生成并缓存切片。如果切片存在于缓存中,服务器会立即将其传送给客户端。在此过程中,服务器代码可以将缓存的切片生成日期与当前日期进行比较,并确定是否需要刷新。该过程将保持图块数据是最新的。流程的最后一步是将瓷砖交付给客户。在这里,我用一个简单的基于 Flask 的 API 来说明这个过程。

在我们开始探索瓷砖一代的三步流程之前,我们必须了解最终产品。正如您在上面看到的,我们的目标是显示一组道路的交通密度信息,因此我将每个位置转换为正态二元分布,并将它们相加以生成一个颜色编码的密度图。

我们的图块的源数据是一长串地理空间位置,编码为纬度和经度对。对于本文,我使用的是我已经在探索一段时间的车辆能源数据集数据。

正如我之前所说的,交互式地图软件一次请求一个图块,然后将它们粘贴在一起以创建最终的地图或覆盖图。服务软件在检索图块数据时需要速度很快,以改善用户体验。根据缩放级别,可能需要收集大量信息,因为缩放级别越低,切片包含的信息越多。我解决这一挑战的方法是预先计算所有图块,并存储每个支持的缩放级别的数据。四键在这里是救命稻草。

正如我们之前看到的,每个瓷砖都可以通过一个四键代码进行唯一寻址。每个拼贴由一个 256x256 像素的位图组成,这意味着我们可以将每个像素作为另一个四键代码进行寻址,更深入八个缩放级别(256 = 2⁸).这种洞察力允许对切片数据进行高效编码,以便在生成阶段进行检索。

我对这个问题的解决方案是使用一个 SQLite 数据库,通过每个缩放级别使用一个表,将所有图块数据按像素聚合。每个表的结构都很简单,只有三列。下面我展示了最低缩放级别的 SQL 表创建脚本。请注意,通过在缩放级别 26 聚合地理数据,我们只能绘制最高级别 18 的切片。

上面的 SQL 脚本创建了包含最详细缩放级别数据的表。所有其他缩放级别都是通过简单的聚合从这个缩放级别派生出来的。(图片来源:作者)

第一列包含缩放级别为 26 的单个像素的 64 位编码四键代码。因此,我们可以非常快速地将该值转换为图块中的像素坐标,并根据计算的亮度值(表的第三列)绘制像素。

第二列对封闭图块进行编码,也是 64 位四键代码。我们为该列创建了一个非唯一索引,以使图块数据检索非常快,并将其计算为像素四键代码除以 256,即 2⁸.

当整个第 26 级计算完成后,我们可以通过简单的聚合立即得到第 25 级,如下面的 SQL 脚本所示。

上面的脚本通过将像素和平铺四键代码除以 4 并对强度值求和,从 26 级数据生成 25 级数据。请注意,它假设 25 级表与 26 级表具有相同的结构。(图片来源:作者)

为了计算所有的缩放级别,我们需要对最高级别重复这个过程,在我们的例子中是 8 级。

上面的代码基于级别 26 生成从 25 到 8 的所有级别。(图片来源:作者)

我们现在可以执行数据准备的最后一步,即计算每个缩放级别的亮度范围。此信息对于绘制平铺位图时的着色过程至关重要,因为值范围映射到预定义的颜色渐变。

上面的函数遍历缩放级别来计算每个级别的范围。它将结果存储在一个表中,以便将来渲染图块。缩放级别范围对于根据单个像素强度分配像素颜色非常有用。(图片来源:作者)

现在,数据已经完全准备好了,我们可以继续进行切片生成和服务流程描述。

对于本文,我设计了一个简单的基于 Flask 的 API 来服务 tile 文件。API 端点接收图块坐标作为参数,并返回相应的图块 PNG 文件。这里我使用一个通用函数来完成所有繁重的工作。

上面的清单显示了渲染密度切片的 Flask API 入口点。(图片来源:作者)

作为参数,该函数接受切片坐标、包含切片数据的 SQLite 数据库的路径以及文件缓存文件夹的路径。该过程首先将缩放级别限制在可接受的范围内,在 1 到 18 之间。超过这些限制,它只会返回默认的空(完全透明)图块。

上面的清单显示了通用的图块生成函数。如上所述,它使用结构化数据生成切片。请注意,切片的数据内容可能会根据您的需求而有所不同。您需要提供适当创建的数据库和用于缓存的文件夹。(图片来源:作者)

对于适当的缩放级别,该函数使用图块四键代码计算目标图块文件名,如果该文件已经存在于缓存中,则立即提供该文件。对于不存在的文件,该函数必须在提供文件之前渲染并保存文件。

生成新图块的过程从建立到包含缩放级别数据的数据库的连接开始。然后,它在数据库中查询所有图块的像素强度。如果图块为空,该函数将提供默认的透明图块。

该代码使用单个像素坐标的元组列表作为四键代码,以及它们各自的强度来用数据表示图块。然后,这些列表必须转换为基于图块的像素坐标,这意味着每个图块的左上角具有(0,0)坐标。然后,该功能收集手边缩放级别的亮度范围信息。有了这些信息,我们现在可以绘制瓷砖了。

在研究从 Python 代码创建 PNG 文件时,我遇到了一个优雅的包: PyPNG 。这个包可以将 NumPy 数组转换成 PNG 文件,这似乎是一个好主意。下面是如何创建一个表示 256x256 RGBA 图像的 NumPy 数组,可编码为 PNG:

上面的函数创建了一个 256x256x4 的 NumPy 数组,用给定的红色、绿色、蓝色和 alpha 通道初始化。完全透明的拼贴将所有这些值都设置为零。(图片来源:作者)

绘制图块只是简单地将各个像素值设置为适当的颜色。下一个函数使用像素列表、颜色渐变和合适的缩放范围来绘制图块。

上面的函数生成了一个 NumPy 数组,其中包含了图块内容的位图表示。(图片来源:作者)

渐变列表中的每个颜色值都是一个四维 NumPy 向量,每个通道组件一个,因此设置像素是一个简单的任务。生成渐变列表的函数也将 alpha 通道值设置为 50%。

上面的函数创建了一个颜色渐变,并将其作为 NumPy 数组返回。(图片来源:作者)

使用 PyPNG 包将切片保存为 PNG 格式的文件非常简单。下面的代码演示了这个过程。请注意保存前所需的数组整形。

上面的函数将 NumPy 数组保存为 PNG 位图。(图片来源:作者)

最后,API 可以通过创建一个响应对象来服务图块文件。

API 入口点通过在图块文件周围创建一个响应对象来结束,无论是数据图块还是默认的空图块。(图片来源:作者)

要使用这段代码,首先将 GitHub 库克隆到您的本地机器上。第一步是执行前两个编号的 Jupyter 笔记本来创建支持数据库。这将从分布数据集中读取数据,并将其导入本地 SQLite 数据库。

接下来,您必须创建并填充支持 SQLite tile 数据库。您可以通过运行以下脚本来实现这一点:

python generate_densities.py

请注意,在 VED 数据上运行该脚本可能需要很长时间。预计总运行时间超过一小时。完成后,您可以使用以下脚本启动图块 API:

python tileapi.py

该命令启动一个监听端口 2310 的 Flask 服务器。要查看 tile 服务器的运行情况,请运行 Jupyter 十号笔记本。你会看到一张以密歇根州安港为中心的地图。如果一切顺利,您应该开始看到地图上的瓦片被渲染。平移和缩放时,切片服务器将生成、缓存和提供适当的切片。

在本文中,我们探讨了交互式地图切片的概念以及如何生成它们来动态传达自定义地理信息。交互式绘图软件使用正方形位图平铺来构建整个地图。为了使这些地图有用,我们可以叠加矢量或光栅图像来传达地理参考信息。叠加地图切片显示此类信息方便快捷,但通常需要一些冗长的预处理。本文向您介绍了交付一个定制解决方案的步骤,您可以进一步调整该解决方案。

平铺层示例

GitHub 资源库

joo Paulo Figueira 在葡萄牙里斯本的TB . LX by Daimler Trucks and bus担任数据科学家

原文:https://towardsdatascience.com/displaying-lithology-data-using-python-and-matplotlib-58b4d251ee7a?source=collection_archive---------11-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第103张

测井曲线,伽马射线、中子孔隙度和体积密度数据与岩性数据一起绘制。作者创造的形象。

将岩性信息添加到测井曲线可以增强岩石物理或地质解释。它可以用来理解为什么一些日志响应会有这样的行为。该数据可能来源于之前的矿物学解释或泥浆测井。

在我的上一篇文章中:用绘图填充增强测井曲线的可视化,我们看到了:如何在曲线和轨迹边缘之间应用固定颜色填充,如何应用密度-中子交叉填充,以及如何根据绘制的曲线值应用可变填充。

在本文中,我们将介绍如何使用一个可变的填充来应用颜色和阴影。使用这两个选项,我们可以生成岩性填充。

这篇文章是我的 Python &岩石物理学系列的一部分。完整系列可以在这里找到。对于下面的例子,你可以在我的 GitHub 知识库中找到我的 Jupyter 笔记本和数据集,链接如下。

https://github.com/andymcdgeo/Petrophysics-Python-Series

接下来,Jupyter 笔记本可以在上面的链接中找到,这篇文章的数据文件可以在 Python &岩石物理学库的数据子文件夹中找到。

第一步是引入我们将在本文中使用的库。我们将只使用两个库: pandas 和 matplotlib 。这将允许我们将数据加载到数据框中,并在图上显示出来。

导入熊猫和 matplotlib。

我们将在本文中使用的数据集来自 Xeek 和 FORCE(https://xeek.ai/challenges/force-well-logs/overview)最近举办的岩性预测机器学习竞赛。竞赛的目的是从由 98 口训练井组成的数据集中预测岩性,每口井的测井完整性程度不同。目的是根据测井测量预测岩相。要下载该文件,请导航到上面链接的数据部分。

可以使用pd.read_csv()加载数据。由于这是一个相当大的数据集,我们将使用其中的一个单独的井来处理,我们还将只取我们需要的曲线(列)。我们可以通过这样的数据子集来实现:

为单井的特定测井曲线过滤 pandas 数据帧。

为了简单起见,我们将把FORCE_2020_LITHOFACIES_LITHOLOGY列重命名为LITHOLOGY。这是通过在数据帧上使用 rename 函数并传递旧名称和新名称的字典来完成的。注意,使用inplace=True参数将替换原始数据帧中的列名。

重命名熊猫数据框架中的列。

当我们使用data.head()调用我们的数据框架时,我们可以看到我们的数据集很小,我们的岩性列已经被重命名。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第104张

我们的熊猫数据框的前五行包含伽马射线(GR)、体积密度(RHOB)、中子孔隙度(NPHI)和岩性。

岩性栏中当前列出的岩性包含一系列数字。我们可以将它们映射到一个嵌套字典中,在这个字典中,我们有岩性的全名、简化的数字(如果需要转换的话)、阴影样式和填充的颜色。

这些颜色是基于堪萨斯地质调查局的网站。但是,在 matplotlib 的默认设置中,剖面线符号受到限制。在未来的文章中,我将介绍如何创建自定义阴影和岩性。

包含岩性信息的 python 嵌套字典。

我们可以像这样使用 from_dict 函数,快速地将我们的嵌套字典转换成 pandas 数据帧,使人们更容易阅读。

嵌套字典到熊猫数据框架的转换。

这将返回一个格式良好的表格,我们可以看到每个岩性代码的颜色和阴影。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第105张

从嵌套字典生成的熊猫数据帧。

仅仅看字典,很难理解这些单词的样子。为了解决这个问题,我们可以快速创建一个简单的图像,显示每种岩性的不同阴影和颜色。

为此,我们将首先为两个新变量 x 和 y 定义一些坐标。然后,我们将使用子图形设置 matplotlib 图形和轴:

fig, axes = plt.subplots(ncols=4, nrows=3, sharex=True, sharey=True, fig size=(10,5), subplot_kw={'xticks':[], 'yticks':[]})

这允许我们定义绘图的大小(4 列乘 3 行)、图形大小,并关闭两个轴上的刻度线。

然后,我们希望遍历展平的轴和嵌套的字典,将数据和阴影颜色填充添加到每个子情节中。当我们处理一个嵌套的字典时,我们需要多次使用方括号[ ][ ]来进入两个层次。第一层是键,第二层是嵌套字典的键。例如,要检索颜色,我们可以通过键入lithology_numbers[30000]['color']来访问它

循环遍历嵌套字典中的每一项并将其绘制在子情节上的简短代码片段。

这将生成下面的图例,我们稍后可以参考它。请注意,岩性符号并不 100%匹配堪萨斯地质调查局的图表。我们将在以后的文章中看到如何解决这个问题。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第106张

使用 matplotlib 的颜色和阴影的图形表示。作者创建的图像。

在以前的文章中(用绘图填充增强测井曲线的可视化和用测井曲线数据进行勘探数据分析),我已经动态地设置了绘图并传入了我正在处理的数据帧。在本文中,我将创建一个简单的 makeplot 函数,我们可以将数据帧传递给它。

假设曲线名称相同,这使我们可以轻松地将代码重新用于其他数据帧。这可以进一步完善,使其更加通用。这个新函数接受三个参数,dataframe、top_depth 和 bottom depth。

该代码将生成一个有 3 条轨迹的测井曲线,一条用于伽马射线,一条包含中子孔隙度和体积密度,最后一条包含我们的地质岩性数据。

一个 python 函数,用于绘制包含伽马射线、体积密度和中子孔隙度以及岩性的测井图。

确保 matplotlib 中的岩性fill_betweenx函数创建可变填充的关键代码如下所示。我们所做的就是遍历字典中的每个键,为字典中的特性分配简单的变量名,然后使用fill_betweenx函数检查我们的岩性列中的值是否等于字典键。如果是这样,那么它会将相关的颜色和阴影应用到填充中。然后,它将移动到下一个键并重复,直到所有键都循环通过。

循环通过嵌套字典并基于岩性数据应用可变填充。

一旦我们建立了一个函数图。我们可以简单地传递我们的数据框架和我们想要绘制的深度。在本例中,我们将重点关注一小部分数据,以便能够看到绘图填充的变化。

调用 makeplot 函数。

一旦我们这样做了,下面的情节就会出现。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第107张

matplotlib 生成的测井曲线,地质岩性数据覆盖 2600 至 3100 米。作者创造的形象。

要更详细地查看岩性填充,我们可以通过更改深度范围值来放大。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第108张

matplotlib 生成的测井曲线,地质岩性数据覆盖 2900 至 3100 米。作者创造的形象。

在本文中,我们介绍了如何使用 matplotlib 的fill_betweenx()函数设置和显示岩性数据。我们看到了如何使用嵌套字典来存储每个岩性的参数,然后使用 for 循环调用它来填充正确的颜色和阴影。

将这些数据添加到绘图中可以增强地球科学家或岩石物理学家将电测井测量与地质相关联的方式。

感谢阅读!

如果您觉得这篇文章很有用,请随时查看我的其他文章,这些文章介绍了 Python 和测井数据的各个方面。你也可以在GitHub找到我在这篇文章和其他文章中使用的代码。

如果你想联系我,你可以在LinkedIn或者在我的 网站 找到我。

有兴趣了解更多关于 python 和测井数据或岩石物理学的知识吗?跟我上

堪萨斯地质调查局,岩性符号。http://www . kgs . ku . edu/PRS/Ozark/PROFILE/HELP/DATA _ ENTRY/岩性/岩性-符号. html

“岩相数据由 FORCE Machine Learning competition 提供,测井和地震 2020 年”Bormann P .,Aursand P .,Dilib F .,Dischington P .,Manral S. 2020 年。2020 原力机器学习大赛。https://github . com/bolgebrygg/Force-2020-机器学习-竞赛

原文:https://towardsdatascience.com/displaying-logging-while-drilling-lwd-image-logs-in-python-4babb6e577ba?source=collection_archive---------28-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第109张

使用 Python 中的 matplotlib 显示随钻测井图像数据。作者创造的形象。

钻孔图像测井是从不同的测井测量/工具生成的钻孔壁的假彩色伪图像。电缆测井和随钻测井(LWD)获取井眼图像的方式不同。在电缆环境中,测量是通过压在井壁上的衬垫上的按钮进行的,覆盖范围有限,但分辨率很高。相比之下,在 LWD 环境中,测量是由构成钻柱/工具组件一部分的工具中内置的传感器进行的,并使用工具旋转,提供完整的 360 度覆盖范围。LWD 图像数据通常被分成扇区,扇区的数量根据工具技术的不同而不同。随着工具的旋转,数据被收集到相关的扇区中,由此我们可以建立井壁的伪图像。

生成的图像通常以二维形式显示在测井图上,如“展开的钻孔”和上图所示。圆柱形钻孔在垂直井中沿着北方位角切割,或者在斜井/水平井中沿着钻孔的高边切割。作为投影到 2D 表面的结果,任何与钻孔相交的平面要素在图上都表示为正弦曲线形状。通过分析这些正弦曲线的振幅和偏移,地质学家可以了解地下的地质结构。钻孔图像数据也可用于识别和分类不同的地质相/结构、识别薄层、断层和裂缝分析等。

在本文中,我将使用 Python 和 matplotlib 显示方位伽马射线和方位密度测量的随钻测井图像数据。

这篇文章是我的 Python &岩石物理学系列的一部分。详情可在这里找到。对于下面的例子,你可以在我的 GitHub 知识库中找到我的 Jupyter 笔记本和数据集,链接如下。

https://github.com/andymcdgeo/Petrophysics-Python-Series

接下来,本文的数据文件可以在 Python &岩石物理库的数据子文件夹中找到。

在我们开始处理数据之前,我们需要导入一些库来处理。对于本文,我们将使用熊猫、 matplotlib 、 numpy 和 lasio 库。这三个库允许我们加载 las 数据、使用它并创建数据的可视化。

显示 LWD 影像数据所需的 Python 库加载。

我们使用的数据集来自可公开访问的荷兰 NLOG 数据库。las 文件混合了 LWD 测量值和两幅图像。由于 las 文件是平面的,不支持阵列,LWD 影像数据通常以单个扇区的形式交付。我们将加载的第二个文件是调查,这使我们能够了解井眼的偏差和方位角,并有助于计算准确的地层倾角。在这篇文章中,我们将不讨论倾角调整。

我们将首先使用 lasio 加载 las 文件,并使用.df().将其转换为数据帧

加载图像 las 文件并将其转换为熊猫数据帧。

一旦数据被加载,我们可以通过使用.describe()来确认我们所拥有的数据。由于文件中有大量的曲线,我们可以调用df.columns()查看完整的曲线列表:

检索熊猫数据帧中的列。

它返回:

Index(['APRESM', 'GRAFM', 'RACELM', 'RPCELM', 'RACEHM', 'RPCEHM', 'RACESLM', 'RPCESLM', 'RACESHM', 'RPCESHM', 'RPTHM', 'NPCKLFM', 'DPEFM', 'BDCFM', 'DRHFM', 'TVD', 'BLOCKCOMP', 'INNM', 'ROP_AVG', 'WOB_AVG', 'TCDM', 'ABDCUM', 'ABDCLM', 'ABDCRM', 'ABDCDM', 'ABDC1M', 'ABDC2M', 'ABDC3M', 'ABDC4M', 'ABDC5M', 'ABDC6M', 'ABDC7M', 'ABDC8M', 'ABDC9M', 'ABDC10M', 'ABDC11M', 'ABDC12M', 'ABDC13M', 'ABDC14M', 'ABDC15M', 'ABDC16M','ABDCM', 'GRAS0M', 'GRAS1M', 'GRAS2M', 'GRAS3M', 'GRAS4M', 'GRAS5M', 'GRAS6M', 'GRAS7M', 'GRASM'], dtype='object')

如简介中所述,我们可以看到方位密度图像被分成 16 个单独的扇区,标记为 ABDC1M 至 ABDC16M。方位伽马射线图像被分成 8 个扇区,并标记为 gras 0 到 gras 7。

调查数据包含在 csv 文件中,可以按如下方式加载。

将油井测量数据加载到数据框架中。

当我们从数据帧中读取列时,我们发现有三条曲线:测量深度(深度)、井斜(DEVI)和井眼方位角(AZIM)。我们将使用这些曲线在我们的图上进行额外的可视化。

在我们绘制数据之前,我们将通过将主数据帧分割成两个较小的数据帧来简化数据的处理。我们可以通过调用 dataframe (df)并提供我们想要提取的曲线名称列表来实现这一点。

将主数据帧细分成方位伽马射线和方位密度图像。

绘制图像数据相当简单。我们首先必须使用plt.figure(figsize=(7,15))创建一个人物对象。figsize 参数允许我们以英寸为单位控制最终绘图的大小。

我们也可以选择为最小和最大深度创建两个新变量。这些用于定义绘图区域的范围。由于我们的数据帧的索引包含我们的深度值,我们可以创建两个新变量minymaxy,它们等于最小和最大索引值。

使用 matplotlib 中的 imshow()绘制方位密度数据,无需插值。

当我们执行代码时,我们生成了一个图像,向我们展示了我们的特征,但同时,我们可以看到它看起来有点块状。如果你看得足够近,你将能够分辨出图像的各个部分。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第110张

使用 matplotlib imshow()绘制的方位角密度图像,无插值。

我们可以对图像进行一些插值,使其平滑。在下面的示例中,插值已更改为双线性。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第111张

使用带有双线性插值的 matplotlib imshow()绘制的方位密度图像。

您可以在 matplotlib 文档中找到插值选项的完整列表。为了说明不同的方法,我使用了文档中的代码来生成显示不同选项的网格。

在方位密度图像数据上比较不同的 imshow()插值方法。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第112张

imshow()和方位密度图像数据的不同类型的插值。

你可以从上面的图像中看到,一些(lanczos 和 sinc)看起来比其他的稍微清晰一些。当处理图像数据时,选择将最终取决于用户偏好。

我们可以重复上述代码,通过将数据帧从 azidendf 更改为 azigamdf 来生成我们的方位伽马射线图像。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第113张

使用 matplotlib imshow()绘制的方位伽马射线图像。

当我们查看我们的图像时,我们注意到与密度图像相比,细节层次明显较少。这与测量类型和记录的较低扇区数有关。

现在,我们可以使用支线图将我们的图像记录和勘测数据绘制在一起。subplot2grid((1,3),(0,0))方法允许我们设置绘图的形状,在本例中,我们绘制 1 行 3 列。然后,我们将 ax1、ax2 和 ax3 分配给函数中第二组数字表示的三列。因为我们在与方位角相同的轨道上绘制偏差,我们需要使用ax.twiny()在现有轴的顶部添加一个新轴。

为了绘制我们的图像数据,我们可以为每个图像使用前面部分中的代码,而不是将其分配给绘图,我们可以将它们分配给子绘图轴。

用于绘制方位密度图像、方位伽马图像以及油井勘测数据的 Python 代码。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第114张

方位密度和方位伽马射线数据的 Matplotlib 图,与井斜和方位一起绘制。

现在,我们可以一起看到两幅图像,我们还可以考虑我们的钻孔偏差,这表明我们处于水平段。了解这一点很重要,尤其是在从图像测井计算任何倾角时。

你可能会注意到,2500 点处的河床似乎在两个地块之间发生了偏移,需要进一步调查。这将不在本文中讨论。

在本文中,我们介绍了如何加载和显示来自 LWD 方位伽马射线和密度测量的井眼成像测井。一旦数据被分成各自的数据帧,很容易将它们传递到 matplotlib 中的imshow()图。从这些图像数据中,地质学家和岩石物理学家可以更好地了解地下的地质构成。

“所有图片由作者生成”

感谢阅读!

如果您觉得这篇文章很有用,请随时查看我的其他文章,这些文章介绍了 Python 和测井数据的各个方面。你也可以在GitHub找到我在这篇文章和其他文章中使用的代码。

如果你想联系我,你可以在LinkedIn或者在我的 网站 找到我。

有兴趣了解更多关于 python 和测井数据或岩石物理学的知识吗?跟我上

原文:https://towardsdatascience.com/dissecting-ml-models-with-nopdb-6ff4651fb131?source=collection_archive---------19-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第115张

图片作者。

调试机器学习模型与调试“传统”代码非常不同。在深度神经网络中,我们必须处理大的特征图和权重矩阵,这些通常看起来没有意义。随着 ML 可解释性的日益重要,已经设计出了几种分析这些内部表示的方法,但是在实践中,获得它们并不总是简单明了的。像 Pdb 这样的经典调试器可能会有所帮助,但是用它来进行可视化和分析至少是不方便的。

虽然 PyTorch 等一些框架通过允许将挂钩附加到网络的层来解决这一问题,但这仅适用于我们感兴趣的功能作为特定层的输入输出的情况。如果我们想要访问在某个函数中只作为局部变量可用的信息——例如在现在无处不在的变形金刚的许多实现中的注意力权重——我们就不走运了。

还是我们?

NoPdb (声明:我是作者)是一个非交互式 Python 调试器。与标准 Python 调试器 Pdb 不同,NoPdb 没有交互式用户界面,但可以使用方便的上下文管理器对其进行编程*—*——以在给定的代码段运行时执行特定的操作。例如,我们可以使用它轻松地从其他人的代码深处获取一个局部变量,并保存它以供以后分析,甚至可以动态地修改它的值,看看会发生什么。

我们将在这里使用的基本功能由nopdb.capture_call()nopdb.capture_calls()提供(参见文档)。这些上下文管理器允许捕获关于给定函数调用的有用信息,包括参数、局部变量、返回值和堆栈跟踪。一个更强大的上下文管理器是[nopdb.breakpoint()](https://nopdb.readthedocs.io/en/stable/getting-started.html#setting-breakpoints),当到达给定的代码行时,它允许执行用户定义的动作(例如计算表达式)。

为了查看 NoPdb 的运行情况,我们将把它应用到一个 视觉转换器 ( ViT )。ViT 是最近提出的完全基于 Transformer 架构的图像分类模型。如下图所示,其主要思想相当简单:将输入图像分割成小块,让每个小块通过一个线性层,然后对这个“小块嵌入”序列应用一个标准的 Transformer 编码器。为了进行分类,使用一个常见的技巧:我们在输入序列的开头添加一个特殊的[class]标记,并在编码器输出的相应(第一个)位置附加一个分类头(单层 MLP)。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第116张

视觉转换器(ViT)。作者绘图。

虽然我们不太关心这篇文章中架构的细节,但我们确实需要知道模型的每一层都包含一个注意机制,它为的每一对输入位置(即图像块,加上[class]令牌)计算一个权重(一种相似性得分)。就像我们现在要做的,可视化这些权重可以给我们一个线索,告诉我们图像的哪些部分对模型最重要。

我们将使用来自 pytorch-image-models 库的timm包中预先训练好的 ViT,并且我们将跟踪这个 Colab 笔记本(笔记本最重要的部分都包含在这里)。

让我们首先安装timm计算机视觉包,以及 NoPdb :

pip install timm==0.4.5 nopdb==0.1

加载预训练模型很容易:

现在,我们将加载一个图像并将其提供给模型。让我们试试这张我在瑞士拍的照片:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第117张

瑞士阿姆登的奶牛。作者照片。

模型返回的是所有类的逻辑值(前 softmax 值)。在笔记本里,我写了一个小函数predict(),打印出最有可能的类及其概率。打电话给predict(input)给:

alp     0.7936609983444214
ox      0.1110275536775589
valley  0.029854662716388702
oxcart  0.008171545341610909
ibex    0.008044715970754623

现在让我们看看模型的内部!ViT 由 12 个blocks组成,每个包含一个attn层;这是计算注意力权重的地方:

VisionTransformer(
  (patch_embed): PatchEmbed(
    (proj): Conv2d(3, 768, kernel_size=(16, 16), stride=(16, 16))
  )
  (pos_drop): Dropout(p=0.0, inplace=False)
  (**blocks**): **ModuleList**(
    (0): Block(
      (norm1): LayerNorm((768,), eps=1e-06, elementwise_affine=True)
      (**attn**): **Attention**(
        (qkv): Linear(in_features=768, out_features=2304, bias=True)
        (attn_drop): Dropout(p=0.0, inplace=False)
        (proj): Linear(in_features=768, out_features=768, bias=True)
        (proj_drop): Dropout(p=0.0, inplace=False)
      )
      (drop_path): Identity()
      (norm2): LayerNorm((768,), eps=1e-06, elementwise_affine=True)
      (mlp): Mlp(
        (fc1): Linear(in_features=768, out_features=3072, bias=True)
        (act): GELU()
        (fc2): Linear(in_features=3072, out_features=768, bias=True)
        (drop): Dropout(p=0.0, inplace=False)
      )
    )
    ...
  (norm): LayerNorm((768,), eps=1e-06, elementwise_affine=True)
  (pre_logits): Identity()
  (head): Linear(in_features=768, out_features=1000, bias=True)
)

假设我们想将注意力可视化在第 5 个区块,即model.blocks[4]。查看 [Attention](https://github.com/rwightman/pytorch-image-models/blob/v0.4.5/timm/models/vision_transformer.py#L168-L180) 层的代码,我们可以发现一个名为attn的变量,它正是我们要寻找的注意力张量:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第118张

为了得到它的值,我们将使用nopdb.capture_call()上下文管理器来捕获对注意力层的forward方法的调用:

瞧——attn_call对象现在包含了一堆关于调用的有用信息,包括所有局部变量的值!让我们看看它们是什么:

检查attn_call.locals['attn'],我们可以看到它是一个形状为[1,12,197,197]的张量,其中 1 是批量大小,12 是注意头的数量,197 是图像块的数量+ 1 用于[class]令牌(记住,注意机制为每对位置计算一个权重)。

我们可以用不同的方法来分析这些注意力矩阵,但为了简单起见,我选择直观地显示每个补丁平均获得了多少注意力(针对每个注意力头):

(助手功能plot_weights,只是显示图像,并根据其权重调整每个面片的亮度,可以在笔记本中找到。)

调用plot_attention(input, attn_call.locals[‘attn’][0])为 12 个注意力头中的每一个产生一个图。以下是其中的一些:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第119张

第五个变形金刚模块中的平均注意力权重(对比度增加以便更好地观看)。每个补丁越亮,注意力权重越高。图片作者。

我们可以看到,一些头部倾向于主要关注图像中的特定对象,如奶牛(头部 8)或天空(头部 12),一些头部到处看(头部 2),一些头部主要关注一个看似随机的斑块,如背景中的一座山的一部分(头部 3)。

请记住,这只是一个有限的例子。我们可以通过使用 注意力卷展栏注意力流 更进一步,这是估计单个输入面片如何对输出做出贡献的更好方法,我们可以以几乎相同的方式利用 NoPdb。

NoPdb 可以做的另一件事是将代码插入到函数中。这意味着我们不仅可以捕获变量,还可以修改它们!我选了一个有点傻的例子来说明这一点:我们将在所有层中使用前 softmax 注意力权重,并将它们乘以 3。(这就像应用一个低的 softmax 温度,使分布更加“峰值化”。)我们当然可以通过编辑timm包的代码来做到这一点,但是我们需要重新加载包和模型,这可能会很繁琐,特别是如果我们需要重复做的话。另一方面,NoPdb 允许我们快速地进行更改,而不需要重新加载。

我们再来看看Attention.forward():

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第120张

我们希望将attn = attn * 3放在 softmax 之前,即第 174 行。我们将通过在这一行设置一个“断点”并让它执行这条语句来实现这一点。(注意,NoPdb 断点实际上并不停止执行;相反,它只是执行一些我们给它的代码。)我们也要像之前一样捕捉第 5 块的局部变量。

请注意,我们没有指定行号(174),而是指定了该行的实际代码:line='attn = attn.softmax(dim=-1)'—这只是一个方便的特性,并且line=174(如同在传统调试器中一样)也可以工作。另外,请注意,由于我们将函数指定为Attention.forward(而不是model.blocks[4].attn.forward),断点将在每个关注层的处触发。

让我们看看这是如何改变预测的:

balloon     0.2919192612171173
alp         0.12357209622859955
valley      0.049703165888786316
parachute   0.0346514955163002
airship     0.019190486520528793

我们捕捉到的注意力模式:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第121张

和上面一样的情节,但是调整了注意力的权重。图片作者。

虽然这篇文章关注的是 PyTorch,但是 NoPdb 不依赖于任何特定的框架,可以用于任何 Python 3 代码。

也就是说,一些框架,如 TensorFlow 或 JAX,将模型编译成计算图或直接编译成计算内核,然后在 Python 之外执行,NoPdb 无法访问。幸运的是,在大多数情况下,我们可以出于调试目的禁用该功能:

  • 在 TensorFlow 2.x 中,我们可以在执行模型之前调用[tf.config.run_functions_eagerly(True)](https://www.tensorflow.org/api_docs/python/tf/config/run_functions_eagerly)。(注意,这不适用于为 TensorFlow 1.x 编写的模型,这些模型被显式编译为图形。)
  • 在 JAX,我们可以使用[disable_jit()](https://jax.readthedocs.io/en/latest/jax.html#jax.disable_jit)上下文管理器。
  • Colab 本帖笔记本
  • GitHub 库
  • 单据

原文:https://towardsdatascience.com/dissecting-stockfish-part-1-in-depth-look-at-a-chess-engine-7fddd1d83579?source=collection_archive---------5-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第122张

*Stockfish 象棋引擎,*背景照片由 ᴊᴀᴄʜʏᴍ ᴍɪᴄʜᴀʟ 在 Unsplash 上拍摄

ost 国际象棋引擎有着相同的蓝图:抽象出一个国际象棋的位置,找到所有的候选棋步,遍历候选棋树直到一个给定的深度,并评估这些棋步的相关性以找到最好的一个。但是,它们的质量取决于以下标准:

  • 速度:研究候选移动和树的迭代,
  • 准确性:评估板。

这篇文章将仔细研究开源象棋引擎 Stockfish 12 的内部工作原理,并解释其成功的关键。本系列的第一部分将关注 Stockfish 如何提取头寸并生成候选人的移动。

国际象棋棋盘由 64 个方块组成,这意味着一个人可以在一个 64 位变量中存储一个给定棋子的位置。每个位对应一个方块,如果设置为 1 ,则该方块上有一个棋子。例如,下面的位棋盘代表游戏开始时白玩家的棋子。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第123张

在 Stockfish 中,bitboards 从 a1 方块开始,按等级进行,位置以小端编码方式存储,如上所述。通过这种方式,棋盘上的操作可以转化为位运算:

  • 将棋子向左移动一格:左移 1 位,
  • 将棋子向前移动一格:左移 8 位,
  • 检索一个玩家的所有棋子:他所有棋盘的逻辑或,
  • 验证一个方块是否被占据:棋盘和方块的位置掩码的逻辑与。

作为一个例子,下面是 Stockfish 代码,它可以让方块受到一个 bitboard of 卒 (bitboard.h)的攻击:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第124张

使用*Bitboard shift(Bitboard b)*一个模板化的函数,使用移位操作在给定方向 D 上移动 bitboard b

现在我们有了给定任何位置的棋盘的表示,国际象棋引擎必须为一个玩家找到所有的候选走法,以便建立所有可能走法的树。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第125张

作者图片

在模式中移动的棋子(棋子、骑士和国王)的候选移动是在一组固定的基数中。例如,D4 的白衣骑士总是有以下候选人:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第126张

在包含所有骑士的位板上的位移操作被用于计算那些候选移动:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第127张

可能的移动是所有这些移动的或连接。然而,如果该骑士在一个侧面的行列(Ax,Hx,x1,x8),它不允许移动到棋盘之外。因此,用边列或文件掩蔽位棋盘将确保如果骑士处于这样的位置,将不会生成候选者。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第128张

Stockfish 实际上是在生成候选项后执行检查,并使用一个Bitboard safe _ destination(Square s,int step) (bitboard.cpp)方法来确保棋步不会离开棋盘。最后,还有一些额外的验证,如阻塞块或发现的检查。为此,Stockfish 有一个*bool Position::legal(Move m)*方法(position.cpp)来测试一个伪合法的移动是否真的合法。

车、象和王后可以沿着一个方向移动无限数量的方格,直到它们到达棋盘的边缘,或者直到另一个棋子阻碍了它们的移动。使用预先计算的射线即时计算它们的候选移动是可行的。棋子的攻击射线与所有被占据的方格的位板进行“与”运算,使用一个名为bitscan的处理器级指令来寻找计算结果的第一个非平凡位。然而,该操作必须对每个片段的每个攻击射线重复,这导致了实时使用的计算密集型方法。

因此,Stockfish 使用了一种计算效率更高的方法,即在包含滑动棋子候选移动的数组中进行查找。为了生成在该数组中查找的索引,仍然需要找到滑动块的所有阻挡块:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第129张

然后,Stockfish 将使用阻挡板作为包含候选移动的预先计算的位板的数组中的索引:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第130张

这种方法提出了一个实际问题。由于阻挡器板是一个 64 位变量,包含候选移动的数组将具有 2⁶⁴元素,其大小约为 1 艾字节。由于不可能在内存中创建这么大的数组,Stockfish 将使用一个散列表来存储候选移动。由于存在大约 20,000 个不同的阻断板,hashmap 的大小只有几百千字节。关键的部分是找到一个散列函数,它将在我们的拦截器板空间中快速计算并且没有冲突。

为此,Stockfish 实现了一种叫做魔法位板的方法。目标是找到与特定棋子 p (车或象)和特定方块 s 相关的数字 λ(p,s) ,例如:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第131张

与原来的 blockers_board 相比,哈希键将具有更少的位(获得的位】):它可以用于索引我们的数组,使用合理的内存量。给定我们之前在 C7 方块上的车的阻挡器棋盘的例子,散列密钥生成将是:**

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第132张

这是在相同方块上相同棋子的另一个散列密钥生成,但用于不同的阻断板:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第133张

现在,如何通过一个简单的乘法运算找到那些将攻击方块串联成特定位置的幻数 λ(p,s) ?使用一种暴力方法(遍历随机幻数并检查所有阻断板的结果),只需要几秒钟就可以找到合适的幻数。因此,Stockfish 在启动时使用一个种子随机数生成器预先计算所有的魔术数字,以便在最短的时间内选择正确的魔术(bitboard.cpp)。

本文展示了 Stockfish 如何能够抽象出一个棋盘,以及它如何生成候选移动来创建新的位置。Stockfish 选择正确走法的方法还没有出现。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第134张

作者图片

本系列的下一部分将关注 Stockfish 评估头寸质量的方法和标准。这种评估方法将有助于选择我们所学的最佳候选动作。

https://antoinechampion.com

原文:https://towardsdatascience.com/dissecting-stockfish-part-2-in-depth-look-at-a-chess-engine-2643cdc35c9a?source=collection_archive---------5-----------------------

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第135张

Stockfish 象棋引擎,背景照片由 ᴊᴀᴄʜʏᴍ ᴍɪᴄʜᴀʟ 在 Unsplash 上拍摄

这个系列的第一部分展示了 Stockfish 如何抽象出一个国际象棋的位置,以及它如何快速找到每一个可能的走法。现在,引擎必须评估一步棋的质量,以便选择最好的一步。

过去,Stockfish 只依赖一套固定的规则,这些规则是国际象棋概念的算法翻译:速度,材料,空间 …但在 2018 年,神经网络进入了许多国际象棋引擎,Stockfish 的表现优于。为了填补这一空白,Stockfish 12 集成了一个神经网络,当已知经典评估的性能较差时,该网络优先于经典评估,通常处于平衡的闭合位置。

本文将首先关注神经部分的内部工作,然后再研究经典的评估方法。

神经评价函数基于俞那苏的 NNUE 架构(基于高效可更新神经网络的计算机 Shogi 评价函数,俞那苏,2018 )。这个微小的神经网络在不需要图形处理器的情况下评估 CPU 上的游戏位置:Stockfish 仍然可以很容易地集成到许多设备上,并由它的大量贡献者进行调整。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第136张

NNUE 的建筑,图片来自罗曼朱可夫,Stockfish NN Release (NNUE),Talkchess

NNUE 不理解位板,必须首先对位置进行编码。NNUE 的输入参数表示如下布尔值,对每一个 W,X,Y,Z 迭代:
是正方形 X 上的一个王与正方形 Z 上的一个 W[友|敌]棋子 Y?

总共有 40,960 个参数。用这种二进制编码代替简单的“*棋子 X 在正方形 Y 上吗?”*编码(768 个参数)有几个好处:

  • 在位置改变后更新输入和随后的神经元更快,因为这种编码允许增量计算,这是 NNUE 的优势;
  • 改变玩家的回合也更快,因为输入只需要翻转;
  • 在编码中提供比所需更多的信息被称为过度专门化,并且允许向网络输入更多的知识以降低其训练成本。

该网络的目标是建立一个评价函数,该函数是由非线性分离的不同层的神经元的组合。该评估函数将根据其神经元的权重进行优化(训练阶段),以便在已知国际象棋游戏的情况下输出最准确的评估。

NNUE 训练的基本思想是建立一个巨大的随机生成位置的输入数据集,这些位置用经典的 Stockfish 在较低的深度进行评估。该网络使用该数据集进行训练,然后可以使用特定的位置和评估进行微调。就其本身而言,网络很简单,因为它由 3 个完全连接的层加上一个输出层组成,输出层可以表示为材料分数。

然而,NNUE 的真正独特之处在于它的输入编码和针对 CPU 评估优化的增量计算。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第137张

NNUE:使用 SIMD 内部函数进行大量优化(nnue/layers/clipped_relu.h)

除了非常平衡的立场,Stockfish 仍然依赖于经典的评估。

这个想法是建立一个评估函数,作为国际象棋概念的组合,由几个加权和相加的标准组成。然后,该函数可以被缩放,以便用标准卒单位表示物质优势。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第138张

Stockfish 中的经典评价,图片来自作者

概念和相关标准如下:

  • 材料不平衡:每个玩家的棋子数
  • 位置优势:在特定的方格上有特定的棋子
  • 材料优势:每件的强度,有一双毕肖普
  • 兵的战略优势:双倍兵、孤立兵、连接兵、棋子支援兵、攻击兵
  • 其他棋子的战略优势:被阻挡的棋子、在好哨站上的棋子、主教 X 射线攻击、长对角线上的主教、被困住的棋子、暴露的女王、被渗透的女王、在打开的文件上的车、车和女王炮台、被攻击的敌方国王
  • 来袭威胁:攻击棋子、悬挂棋子、国王威胁、兵推威胁、发现/滑块攻击威胁、你的棋子可以移动但可以交换的方格、弱保护棋子
  • 走卒:被阻挡或未被阻挡的走卒
  • 空间:由你所有的棋子控制的方格
  • 王者安全:攻击王者,来袭检查,王者在‘棋子避难所’,守军位置

这个巨大的结果评估函数实际上被计算到 2 阶,以基于玩家的已知攻击/防御状态来计算奖励/恶意。

Stockfish GitHub 存储库中的许多 pull 请求包含上述标准权重的微小变化,这导致了 ELO 分数的微小提高。

不管我们是在开局、中局还是残局,不同标准的权重都是不同的。例如,一个被传递的棋子在游戏后期可能比中期更有价值。因此,Stockfish 对每个标准都有两个权重集:一个用于中期游戏,一个用于末期游戏。Stockfish 然后计算一个范围从 0(游戏结束)到 128(游戏未开始)的相位因子,这有助于在两个不同的权重之间进行插值。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第139张

中局和残局之间的锥形评估

然后,评估将再次缩放,以符合五十步规则:当接近达到该规则时,评估将更接近平局。

为了阐明经典的评估方法,我们将研究卡斯帕罗夫和托帕洛夫之间的一场比赛中的一个已知位置:

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第140张

卡斯帕罗夫-托帕洛夫,Wijk aan Zee,1999 年。27:白棋

这个例子将集中于位置优势标准:在特定的方格上有特定的棋子。对于棋盘上的每个方格,分数是根据占据该方格的棋子来分配的(例如,在中局中,a5 上暴露的黑王的价值低于 g8,G8 是更安全的方格)。该分数奖励来自两个硬编码的正方形分数表:一个用于棋子,一个用于棋子。拥有两个不同得分表的原因是棋子的得分奖励在垂直轴上是对称的,而棋子*(psqt . CPP)*则不是。

if (typeof(piece) == PAWN) {
   bonus += PBonus[rank][file];
}
else {
   file = file < 4 ? file : 8 - file;
   bonus += Bonus[piece][rank][file];
}

黑棋和白棋的分数表是一样的,因为只需翻转位板就可以计算黑棋的分数。例如,D4 上的白皇后在中局中值+8,在残局中值+24(如下所示),这与 D5 上的黑皇后是一样的。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第141张

棋子方桌奖金—中间游戏

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第142张

棋子方桌奖金—结束游戏

棋子平方得分是棋盘上所有棋子的总和,通过中间游戏和结束游戏的棋子平方得分表计算得出(见上文)。然后,基于棋盘上非棋子材料的数量来计算渐变评估的相位因子。这里,相位因子等于 83。最后,使用该阶段因子计算在中间游戏和结束游戏棋子平方分数之间插入的最终奖金。

# MG: middle-game score
# EG: end-game score
# P: phase factorFINAL_BONUS = (MG * P + (EG * (P_MAX - P)) / (P_MAX-P_MIN))

最终白棋得分为+247,黑棋得分为+46:从 Stockfish 的角度来看,这个棋盘导致了白棋明显的位置优势。

本系列的第一部分介绍了如何读取一个位置,以及如何根据这个位置生成候选移动。现在,第二部分解释了如何评估任何给定的位置,以便为每个玩家输出一个分数。

磁共振矩阵怎么计算TowardsDataScience 博客中文翻译 2021(二百四十六)_https://www.jmylbn.com_新闻资讯_第143张

本系列的前两部分解释了 Stockfish 概念

然而,生成候选移动的每一个可能的组合并立即评估它们在性能上是不可思议的:随着我们搜索深度的增加,候选移动的数量呈指数增长。Stockfish 需要明智地选择它们,这将是本系列下一部分的主题。

https://antoinechampion.com