TowardsDataScience 博客中文翻译 2020(七百二十七)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

通过免费服务提供和绘制数据非常简单

原文:https://towardsdatascience.com/providing-and-plotting-data-with-free-services-is-easy-c3176f4323f7?source=collection_archive---------58-----------------------

从开放数据提供商那里收集和提取数据,将它们放在一个新的数据集中,通过使用免费服务来发布和可视化数据?这比你想象的要容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由艾萨克·史密斯Unsplash 拍摄

由于科罗纳疫情提供了大量免费的可访问数据,我有了将我在德国居住的农村地区的 7 天发病率可视化的想法。罗伯特-科赫研究所 (RKI)提供了一个开放数据集,包含德国每个县的所有数字。对于可视化部分,我想尝试一些易于使用的服务。最近,我在德国新闻网站上偶然发现了一些很棒的可视化效果。他们(以及更多人)正在使用德国一家名为 Datawrapper 的初创公司提供的服务。他们还提供一些免费服务——太好了,让我们使用它们吧!最后,我想使用一个用于发布数据的开放平台 Qri 来发布我收集的数据。

让我们看看这些步骤,直到我可以创建和发布可视化。

  1. 定期收集和保存数据
  2. 将数据推送到存储库中
  3. 连接数据并创建可视化效果

定期收集和保存数据

不幸的是,RKI 没有公布我想要使用的数字的时间序列数据。只有实际日期的数字。我创建了一些 Python 脚本来收集实际数据,提取我想要使用的数字,添加并保存到我的 CSV 文件中。该脚本每天在我的家庭办公室的一个简单的 Raspberry Pi 上使用 cronjob 运行。我正在使用熊猫打开远程 CSV 的内置功能。这个脚本非常小,几乎不言自明。

import pandas as pd
import os.path

# Get Data
df = pd.read_csv("https://opendata.arcgis.com/datasets/917fc37a709542548cc3be077a786c17_0.csv")

# Get desired row (128 - Rheingau-Taunus)
rtk = df.loc[[128], ['last_update', 'cases','cases_per_100k', 'cases7_per_100k', 'deaths']]

# Update data type
rtk['last_update'] = pd.to_datetime(rtk['last_update'], format="%d.%m.%Y, %H:%M Uhr")

# Add row to CSV
use_header = False if os.path.isfile('rtk.csv')  else True
rtk.to_csv('rtk.csv', mode='a', header=use_header, index=False)

我算出我的县的 ID 是 128。现在很容易提取数据。由于数据集使用了奇怪的德国日期格式,我用熊猫to_datetime转换了它们。

最后,我将我的数据添加到 CSV 中。就是这样!下一步是使用 Qri 提供数据。

将数据推送到存储库中

Qri 是一个开源项目,旨在为数据集同步、版本控制、存储和协作构建软件。有点像数据集的 GitHub。它们提供了 GUI 客户端和 CLI 工具。我正在使用 CLI 工具来进行版本控制,并定期将我的数据集推送到他们的(免费)云空间,我可以将我的数据集作为开放的免费资源分享给其他对做酷的事情感兴趣的人。您可以提供一个自述文件,并为您的数据集添加一些元信息(字段描述等)。).关于设置说明,我参考了他们的 CLI 快速入门指南。使用 CLI 工具初始化和发布数据后,您的数据将可在其云空间中访问。我的数据就在这里

当我得到我的数据的更新版本时,我只需保存新版本并将它推到云中。

$ qri save --body ../inzidenz-rtk.csv
$ qri push

这个过程仍然是手动的,因为 CLI 工具不能在 Raspberry Pi 上工作。我的计划是将这些步骤添加到我的 cron 作业中,以实现完全自动化的发布。到目前为止,手动就足够了。

我不会深入 Qri 的细节,并参考他们的文档来获得更多的见解。上面的过程对我来说有效,但可能不是最好的。如果有什么我可以改进的,请评论!

Qri 最棒的是集成部分。您可以获得最新.csv的链接,以便在您最喜欢的数据分析工具中使用。此外,其他 Qri 用户可以派生您的数据集。

最后,我使用数据集通过 Datawrapper 创建一个图。

连接数据并创建可视化效果

Datawrapper 是一个非常棒的可视化工具。它不像 Tableau、Mode 或 Datorama 那样用于构建复杂的仪表板。Datawrappers 主要关注的是制作干净漂亮的可视化效果本身。您可以使用标准的图表,如条形图、折线图、饼图、圆环图等。他们专注于创建独特的图表。每个情节看起来都棒极了。Datawrapper 还提供了几个非常棒的地图绘图。有了免费帐户,你可以使用所有这些,但你在风格上受到限制。但是它们的默认样式和模板已经很棒了,随时可以使用。

最好的功能是,您可以链接一个外部数据集,为您的数据提供一个 URL。当然,我使用的是我的数据集在 Qri 的 URL。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Datawrapper 中使用 CSV 的 URL

下一步是检查和描述您的数据集,以便以后在图中使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

选择要在可视化中使用的字段

在我的例子中,我使用了两列:last_updatecases7_per_100k。现在我们可以创建可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Datawrapper 中设计和注释可视化

您可以细化、注释和设计可视化。使用免费版本,设计仅限于选择一个布局。您可以为某些部分选择颜色,如线条或注释,但您无法使用您公司的 CI 创建可视化效果。那是他们付费产品的一部分。对我来说,默认值已经足够了。

使用 Qri(或任何其他服务)连接数据的最大好处是:

如果您的数据已经更新,您只需重新发布您的图表,它就是最新的!

因为我使用了一些注释,比如日期和突出显示的范围,所以我需要做一些手工工作。其他一切都已经存在了。无需复制新数据、选择字段等。

我最终的可视化看起来是这样的(是的,Medium 可以嵌入 Datawrapper 可视化!)

嵌入媒体的最终可视化

结论

收集数据、为他人提供数据以及创建可视化效果比看起来容易。你不需要成为数据科学、数据工程或设计师方面的专家。即使不是开发人员,也可以使用许多很棒的工具。你专注于好的视觉化吗?关注数据包装器。它能很好地帮助你创建可嵌入的图表,将它们作为图片下载,甚至允许在他们的服务 River 中重用。有了 Qri ,你可以为大量受众提供数据集。使用他们的桌面客户端可以帮助那些不喜欢命令行界面的人。您关注的是结果,而不是创建结果的过程!

免责声明:我既没有参与 Datawrapper 也没有参与 Qri

[1]: 7 天发病率是每 100,000 名居民在 7 天内新感染的人数。
【2】:数据许可:数据许可德国—归属—版本 2.0/dl-de/by-2–0

证明伯努利幂和

原文:https://towardsdatascience.com/proving-bernoullis-sum-of-powers-22f50df188e9?source=collection_archive---------22-----------------------

如何计算 n 个第一整数的 p 次方之和

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片来自皮克斯巴伊加里克·巴尔塞吉安

在他的众多重要贡献中,著名的瑞士数学家雅各布·伯努利(1655–1705),他的家族(伯努利家族是总共八位世界著名数学家的起源)中的众多著名数学家之一,在 1713 年提供了一个关于第一个整数 np 次方之和的表达式(他称之为 Summae Potestatum )。他的解的形式是一个次数为( p + 1)的多项式函数,其中包含的系数涉及无处不在且现在著名的伯努利数(一个出现在数学和理论物理众多领域的分数序列)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:1713 年,杰出的瑞士数学家雅各布·伯努利(来源)发表了 Summae Potestatum,第一个整数的p次方之和的表达式(来源)。

这个和被称为福尔哈伯公式(以德国数学家约翰·福尔哈伯(1580–1635)的名字命名),他的结果伯努利以标题SummaePotestatum**,发表,是由下面的表达式给出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 1:第一个 n 个正整数的 p 次方之和,称为 Faulhaber 公式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:德国数学家约翰·福尔哈伯(1580-1635)。Faulhaber 是一个博学的人,他被训练成一个纺织工人,在几个城市的防御工事中工作,为军队建造水车和几何仪器,还有其他的事情(来源)。

正如这些关于数论的特殊讲座所指出的,如果把从索引 m =0 开始到索引 m = n -1 结束的总和写出来,计算会变得更加简洁。有了这种可供选择的指数,总和就变成了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 2:等式。1 写入的和从索引 m =0 零开始,到索引 m = n -1 结束。选择这组新的指数“整理”了计算。

现在考虑所谓的母函数 S ( nt ),一个幂级数,它具有方程中的和。1 和 2 作为系数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 3:生成函数具有等式 3 给出的和。1 和 2 作为系数。根据维基百科的说法,生成函数“是一种通过将数字视为幂级数的系数来编码无限序列的方式”。

代入等式。等式中的 2。3 我们得到双和:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 4:等式。3 在等式的替换之后。2.

其中 k 为整数。经过几个代数步骤用来重新排列总和,我们可以重新表达方程。4 由以下两个函数的乘积得出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 5:等式。4 重写为两个函数的乘积。这个表达式是在重新排列和并执行一些简单的(但不是很有启发性的)代数运算后得到的。

情商。5 是通过重新排列等式中的双和得到的。并执行一些简单的(但不是很有启发性的)代数操作。现在, S ( nt )的第一个因子可以用指数函数的泰勒展开式写成一个幂级数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 6:指数函数的幂级数展开。

(你只要从 Eq 的左边减去 1 就可以了。6 并将两边除以 x )。要写出 S ( nt )的第二项,就必须引入前面提到的伯努利数。等式中的函数 t /(e -1)。5 变成了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 7:为了写出等式中 S ( nt )的第二个因子。5 一个介绍伯努利数。

跳过几个步骤(为了避免混乱),生成函数 S ( nt )变成下面这个错综复杂的表达式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 8:等式 8 最初给出的生成函数。3 使用指数函数时间序列和 Eq。7(包含伯努利数)。

现在,下一步是定义所谓的伯努利多项式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 9:下面图 3 所示的伯努利多项式的定义。

下图显示了对应于不同伯努利数值的伯努利多项式的几个示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:伯努利数的几个值的伯努利多项式(来源)。

将母函数 S ( nt )的原始表达式与等式进行比较。8 和使用伯努利多项式的定义,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 10:我们所追求的第一个整数的 p 次幂之和的最终表达式。

请注意,生成函数可以优雅地写成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 11:生成函数的最终表达式,用伯努利多项式和伯努利数表示。

之前的一篇文章(见下文)中,我推导出了前五个伯努利数。它们由以下各项给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 12:在这篇文章中导出的前五个伯努利数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:左边,日本数学家小和田硕。右边是他的作品胜代山保(1712)中的一页,在那里他将二项式系数和伯努利数制成表格。

* [## 关于倒数级数的和

伟大的数学家欧拉和他的伟大发现

towardsdatascience.com](/on-the-sums-of-series-of-reciprocals-6711437ad893)

使用 Eq。9 我们得到一些伯努利多项式(见图 3):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 13:第一个伯努利多项式。

现在我们有了所有需要的工具!下面是两个简单的例子,我们的总和后,但所有其他情况下可以平凡地获得:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 14:第一个整数的 p 次方之和的两个简单例子。*

我的 Github 和个人网站 www.marcotavora.me 有一些关于数学和其他主题的有趣材料,如物理、数据科学和金融。看看他们!

如何证明不等式

原文:https://towardsdatascience.com/proving-inequalities-aab03b0588d5?source=collection_archive---------12-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Antoine DautryUnsplash 上拍摄

帮助证明一个< b

When you develop an interest in mathematics and start working with material that takes proof seriously, sooner or later you’ll be trying to find proofs of inequalities.

Proving that something is 等于另一个的技术通常更容易一些。你以同样的方式操纵两边,直到你得出有问题的等式。你可能需要做一些巧妙的替换,但是你能做的事情也就这么多了。

由于传递性,不等式可能有点棘手。如果你想让某些人ab看到那个 a < b,那看起来可能会非常困难。如果没有显而易见的解决方案,可能有必要想出一些c,为此你可以显示a < c < b,从而暗示a < b

让我们看看这两种情况的例子,我们将从一个“简单”的例子开始,我们不需要发明中间产品。

例中所有的数字都是实数。

简单的例子

给定实数rs,显示如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发展直觉

让我们先花点时间对它说的话发展一种直觉。让我们为rs挑选一些数字,看看会发生什么:

1/2 < 2/3 < 3/4 < 9/10 < 99/100

好吧,我明白了。我可以接受。

现在我们如何证明它总是正确的呢?

扩展到相同的分母

为了比较分数,它有助于扩展分数,使它们具有相同的分母。我们必须用(1+s)延长左边,用(1+r)延长右边

让我们这样做,看看我们的立场。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在分母相等了,原来我们可以把它们去掉。我们知道(1+r)(1+s)都是正数,所以我们知道它们的乘积(1+r)(1+s)是正数。逆1/((1+r)(1+s))也是如此。我们可以把两边都乘以倒数,有效地去掉分数。

我们不需要翻转不等式的方向,因为我们要乘的数是正数。

我认为这是进步。让我们开始吧。我们只剩下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

简化括号中的总和

将总和相乘,我们发现我们最终得到了两边的一个共同项:rs。我们两边都减去它,根据我们的给定得到一个真实的陈述。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

颠倒您的步骤,提供易于遵循的证据

为了给出一个正式的证明,我们只需颠倒我们的探索步骤,所以从上到下阅读时,推理是有意义的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的证明,吉文斯证明的每一步都是我们探索步骤的逆过程

从某种意义上说,这个证明很简单,因为它不需要我们在任何中间表达上有创造性。我们可以像处理等式证明一样处理这个证明。

让我们继续做一些更难的事情。

棘手的案子

给定任意两个实数xy,表明如下

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发展直觉

哦天啊。那个看起来要求更高一点。首先,让我们对它所说的有一个直觉。让我们挑选x = y = 2,我们得到:

4/5 <= 2/3 + 2/3

好吧,让我们试试另一双:x = 2, y = -3

-1/2 <= 2/3 + 3/4

好的,看起来我们会一直保持在 1 以下,甚至低于 0。右边可以增长到 1 以上,永远不会低于 0,因为单个项永远不会变成负数。

注意,当我们选择x = 0y = 0时,左右两边变得相等。

好的,我们对正在发生的事情有一点直觉。让我们看看是否能证明这一点。

扩展到相同的分母

右边是分数的和。我们可以尝试形成总和,看看它如何与左边的相比较。我们需要用1+|y|展开左边的项,用1+|x|展开右边的项

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好吧。所以这就是我们总结右手边时的样子。要证明的不等式变成了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

寻找已知的不平等

证明不等式时,你经常需要引入一个或多个额外的术语,这些术语介于你已经看到的两个术语之间。这通常意味着拿走或增加一些东西,这样第三个术语就滑了进来。

经常检查你的课本,寻找你应该知道的不等式,看看它们是否有用。练习也会经常建立在彼此的基础上。有时练习 a)的结果在练习 b)中很关键。所以不要“忘记”你之前的成绩。

在我们的例子中,我们看到两边看起来都类似于我们在第一个证明中处理过的熟悉的something/(1+something)模式。

让我们看看怎样才能让双方都符合我们已证明的不等式,这样我们就可以利用它了。

左边越来越长

让我们看看我们的左手边。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们取分子x+y的绝对值,我们可以用r=|x+y|代替,我们的左手边将是r/(1+r)的形式。这样做肯定会增加期限。x+y的绝对值在x+y<0的情况下更大,或者在x+y≥0的情况下相等。

所以我们有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看起来我们在左侧完成了。

收缩右手边

让我们看看我们的右手边。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了达到我们想要的s/(1+s)形式,我们必须做些什么?

如果我们用s=|x|+|y|+|x||y|代替,我们会得到(s+|x||y|)/(1+s)。我们的分子中多了一个|x||y|。如果我们放弃它,我们的项要么保持不变——如果xy0就会是这种情况——要么收缩。因为如果xy都不是0,那么|x||y|就是正的,所以我们要减少分子的值。

因此,我们有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们已经达到了我们想要的形式s/(1+s)

把我们的鸭子排成一排

我们已经将两边分别转化为r/(r+1)s/(s+1)形态。这些是我们想要在我们最初的左手边和右手边之间滑动的术语。

如果我们能证明0 ≤ r < s,我们可以用我们的第一个结果

r/(r+1) < s/(s+1)

我们替换了r=|x+y|s=|x|+|y|+|x||y|。我们立即看到0≤r,因为它是一个绝对值。通过三角形不等式我们知道|x+y|≤|x|+|y|是真的,所以我们可以证明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

太好了!我们知道0 ≤ r ≤ s,可以用r/(r+1) ≤ s/(s+1)。我们可以把所有的条款都整理好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们做到了!

我们最初的左侧和右侧术语很难直接比较。但是我们可以在它们之间加入一些我们知道如何比较的术语,从而形成一个证明我们最初陈述的链。

结论

当证明不等式时,寻找以可控方式收缩或增长项的方法是有用的,这样它们就符合已知的不等式并形成传递链。

如果你觉得你已经记下来了,为什么不测试一下自己,从头开始证明这两个不等式呢?你刚刚读了解答,所以…这能有多难?

他们又来了。

第一个不等式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二个不等式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你能行的!

用初等微积分证明素数的无穷性

原文:https://towardsdatascience.com/proving-the-infinity-of-primes-using-elementary-calculus-3386699801f4?source=collection_archive---------14-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由来自皮克斯拜皮特·林福思拍摄

如何用一个简单的积分证明有无穷多个素数

为了正式定义素数,我将使用 G. H. Hardy 和 E. M. Wright 的经典数论著作《数论导论》中的定义的“改编”版本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:英国数学家 G. H .哈代(来源)和 E.M .莱特(来源),著有名著*(*来源 )。

让我们只考虑正整数。其中,有一个特别重要的子类,即素数类。一个数 p 被称为质数,如果:

  • p > 1:数字 1 被认为既不是质数也不是合数。T4 不称 1 为质数的一个很好的理由是为了避免修改算术基本定理。这个著名的定理说“除了因子重排,一个整数只能用一种方式表示为质数的乘积*。”考虑到 1 是质数,这种因式分解的唯一性将会丢失(例如,我们可以将 3 写成 1×3,1×1×1×3,1⁴⁷⁴⁷⁵×3,等等)。*
  • p 除了 1p 之外,没有正约数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:与合数相反,质数不能排列成矩形(来源)。

素数的无穷大

素数的数目是无限的。第一组是:2,3,5,7,11,13,17,19,23,29,31,37 等等。这个重要定理的第一个证明是由古希腊数学家欧几里德提供的。他的证明被称为欧几里德定理

在这篇文章中,我将描述伟大的瑞士数学家莱昂哈德·欧拉只用基本微积分做的一个简单证明。我会看艾格纳和齐格勒的书。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:下面等式定义的 π ( x )的值。1 为前 60 个整数(来源)。

让我们首先考虑小于或等于某个 xR 的素数的个数,其中 R 表示实数的集合:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 1:小于或等于某 x ∈ R. 的素数个数

这个函数被称为素数计数函数。我们可以随意给质数编号,但让我们按升序编号:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 2:以递增顺序编号的素数。

现在考虑下面举例说明的函数 f( x )=1/ x

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:函数 f(x)= 1/x(来源 )。

这个函数在区间[1,∞)上的积分是 x 的对数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 3:1/x 从 1 到 x 的积分等于 x. 的对数

现在将 1/ x 下方的区域与图中所示阶跃函数下方的区域进行比较。我们稍后将更仔细地验证,对于整数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 4:x 的区间。下面的 5 是服从的。

遵循以下两个不等式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 5:证明所需的不等式。最后的和扩展到所有的mN只拥有小于或等于 x 的素数。

其中最后的总和延伸到所有的mN只拥有个质因数 p 使得:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了清楚起见,让我们考虑一个例子,比如说 n =6。在这种情况下,等式中的间隔。4 是x∈【6,7】,不等式变成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 6:等式的例子。5 代表 n=6。

第一个不等式可以从图 4 中读出。第二种呢?在这种情况下,上面不等式中的mN有哪些值?

  • 数字 2、3 和 5 只有一个素数。因为它们是素数,所以它们唯一的除数小于 6。
  • 合数 4 = 2 和 6 = 2 x 3 只有 2 和/或 3 作为质因数,并且都小于 6

加上项 1,刚刚列出的数(即 2、3、4、5 和 6)的倒数之和已经等于等式(1)中不等式之间的和。6 既然有无限多的 m s(即调和级数发散到∞),那么等式中的第二个不等式。6 是服从。更正式的演示见这个链接

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 7:调和级数→ ∞

现在,算术基本定理陈述“除了因子的重排,一个整数只能用的一种方式表示为质数的乘积所以情商里的每一个 m 。5 可以用以下形式的乘积来唯一地表示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 8:等式中的每一个 m 。5 可以唯一地表示为形式的乘积。

其中 k s 是每个素数因子在 m 的因式分解中出现的次数。因此,等式中的总和超过了 m。4 可以表示为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 9:等式中 m 的和。6.

(读者可以通过一个例子来验证这一点)。现在,括号内的和是一个简单的几何级数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 10:等式括号内的几何级数。9.

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 5:比值= 1/2,第一项= 1 的收敛几何级数(来源)。

等式中的乘积。9 是所有小于或等于 x 的质数。因此,比较等式。9 带情商。1,我们为 Eq 获得。5:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 11:等式。1 使用等式。9.

因为通常遵守下面的不等式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们获得:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于 log( x )是无界的,如下所示,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 log x 函数(来源)。

素数计数函数π( x )也是无界的。因此,我们得出结论,存在无穷多个素数。

感谢您的阅读,再见!一如既往,我们随时欢迎建设性的批评和反馈!

我的 Linkedin 、个人网站 www.marcotavora.me 、以及 Github 都有一些关于数学以及物理、机器学习、深度学习、金融等其他话题的其他有趣内容!看看他们!

证明π的不合理性

原文:https://towardsdatascience.com/proving-the-irrationality-of-π-10bc5d84ea11?source=collection_archive---------13-----------------------

一个显著结果的简单证明

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由来自 PixabayGerd Altmann 提供。

根据定义,无理数是不能由整数的分数(或比率)构成的实数。像 1/2、3/5 和 7/4 这样的数字被称为有理数。像所有其他数字一样,无理数可以用小数来表示。然而,与实数的其他子集(如图 1 所示)相比,无理数的十进制扩展永远不会终止,也不会像循环小数(例如 1/3 = 0.333……)那样,以重复自身的序列结束(参见此链接)。在这组无理数中有π,它是圆的周长与直径的比值(如图 2 所示)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:这个图展示的是实数 R 的集合,它包括有理数 Q、Q 内部的整数 Z、Z 中包含的自然数 N 和无理数 R\Q(无理数集合不像其他的那样有一个符号)(来源)。

π的值已经被几个古文明用数值估算过了(见此链接)。然而,在 17 世纪,艾萨克·牛顿和戈特弗里德·莱布尼茨 T20 发现微积分之后,无穷级数开始被用来获得更好的近似。一个例子是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它是由印度数学家桑加玛格拉玛的马达瓦首先发现的。对于 x =1,它变成了所谓的莱布尼茨π 公式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其缺点是收敛非常慢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2: π是无理数的一个例子。它是圆的周长与直径的比值。

无理数的另一个著名例子是 2 的平方根,它是由传奇哲学家萨摩斯的毕达哥拉斯的追随者发现的。据说最初,他们隐瞒了他们的发现,并根据传说,谋杀了梅塔蓬图姆的哲学家希帕索斯,因为他最终揭示了这个发现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:2 的平方根是无理数的一个例子(来源)。

我们在这里的目标是提供一个简单的证明π的无理数。为了做到这一点,我们将遵循尼文并从定义一个辅助函数 f ( x )开始。

引入辅助功能

让我们首先考虑以下(显然不相关的)函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 1:这个函数 f(x)将用于π的无理数的证明。

其中 n 为整数。这个函数可以写成幂展开式。例如,对于 n = 1、2 和 3,我们有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 2:等式 2 给出的 f(x)展开的例子。1 表示 n =1、2 和 3。

一般来说,人们有以下等式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 3:等式中的函数。1 写成幂展开。

这些系数很容易确定。例如对于 n =1,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

并且对于 n= 3:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**f(x)**的性质

对于 0< x1,我们有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 4:f(x)的第一性质。

这是 f ( x )的第一个重要性质。这是因为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们将需要 f ( x )的其他三个属性。其中两个是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 5:f(x)服从的另外两个性质。

其中( m )是 m 阶导数。

我们需要的最后一个属性是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个整数。因此请注意, f ( x )的所有导数都是整数。同样,因为如果我们互换 x 和 1- *x,*函数本身及其导数在 x =1 时也是整数,所以 f ( x )保持不变。

这些特性可以通过一个简单的例子来说明。设 n =4。然后我们有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从这里我们可以读出 c 系数的值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到所有的属性都被遵守(为了避免过度混乱,省略了情况 m =6 和 m =7):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

证明π的不合理性

这个证明是由加拿大裔美国数学家伊凡·尼文提出的。人们从假设与我们想要证明的相反的情况开始。更具体地说,我们假设π是有理的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 6:π有理的假设,和我们要论证的正好相反。

然后,我们构建以下函数:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其二阶导数(下面需要用到)是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 Eq。5 用于消除比 2 n. 高的 f ( x )的导数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 4:加拿大裔美国数学家伊万·m·尼文(来源)。

正如我们刚刚看到的, f ( x )及其所有导数在 x =0 和 x =1 时都是整数。这意味着 F (0)和 F (1),因此 F (1) + F (0),也是整数。我们现在使用以下标识:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 Eq。6 被用来消除 b 。综合双方,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Eq。4 我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是对于足够大的 n :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这与我们之前发现的 F (1) + F (0)是整数相矛盾。最初的假设 Eq。6 因此是假的,π一定是无理数。如果π是理性的,π也会是理性的。因此π也一定是无理数,这就结束了证明。

这个证明的优雅和简单是不可否认的。它们让我们意识到纯数学可以有多美好。

我的 Github 和个人网站 www.marcotavora.me 有一些关于数学和其他主题的有趣材料,如物理、数据科学和金融。看看他们!

证明 e 的超越性

原文:https://towardsdatascience.com/proving-the-transcendence-of-e-65aaa2de69c3?source=collection_archive---------23-----------------------

欧拉数超越性的初等证明

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由来自皮克斯拜皮特·林福思拍摄

欧拉数eT7 是一个数学常数~2.718,定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 1:欧拉数 e 的一个可能定义。

这个常数是瑞士数学家雅各布·伯努利发现的。初等函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 2:指数函数,唯一等于其导数的函数。

被称为指数函数,它等于它自己的导数(它是唯一具有这种性质的函数)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:方程 y = 1/ x 的绘图欧拉数 e 是唯一使阴影面积等于 1 的数(大于 1)(来源)。

超越数

实数可以是代数的,也可以是超越的。根据定义,n 次代数数 n 满足具有整系数的多项式方程,例如:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程 3:整系数多项式方程。它由代数数来满足。

一个代数数为 n 次的事实意味着 xⁿ的系数非零。超越数满足等式等方程的实数。3.

e 的超越

我们在这篇文章中的目标是证明 e 是一个超越数。这个证明的最初版本是由法国数学家查尔斯·埃尔米特提供的,但这里给出的版本是由德国数学家戴维·希尔伯特简化的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:法国数学家查尔斯·埃尔米特(来源)和德国数学家戴维·希尔伯特(来源)。

我们首先假设与我们试图证明的相反的情况,即 e 次数为 n: 的代数数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 4:如果 e 在 n 次代数数中,它满足这个等式,其中第一个和最后一个 a 系数非空。

我们开始证明用有理数逼近 e 的幂。我们定义了以下对象:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 5:用有理数逼近 e 的幂。

在哪里

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于等式中 e 的每个功率。5 我们有:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于非常小的ϵ来说,这个等式意味着所有的 eᵗ都非常接近于一个有理数。我们现在用等式代替。5 转换成等式 4 并抵消因子 M 。我们获得:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 6:代入等式的结果。情商 5。4.

注意等式中的 n 。4 和 Eq。6 是相同的数量。情商。6 有两个明显的特点:

  1. 第一个括号内的表达式是一个整数,并且选择了 M 个整数,使得表达式不为零
  2. 在第二个表达式中, ϵ’s 将被选择得足够小,使得表达式的绝对值为< 1

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 7:等式中第二项所服从的性质。6.

我们的证明将包括证明那个等式。6 不可能是真的,它构成了一个矛盾。这是因为一个非零整数和一个带绝对值的表达式的和< 1 cannot vanish.

Defining the M’s and ϵ’s

埃尔米特从定义 m 和ϵ开始。首先,他将 m 定义为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 8:定义 m 的积分。

其中 p 被选为素数,这将在后面确定。质数 p 可以取我们想要的那么大(但是 M 对于 p 的任意值都是整数)。其他 m 和 ϵ 定义如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 9:定义等式中引入的 Ms 和ϵs 的积分 6.

我们现在通过选择 p 来继续,以便满足上面的属性 1 和 2。

让我们首先计算积分 M. 乘以分子中的二项式并将结果提升到 p,我们得到

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 10:将等式分子中的二项式相乘。9

其具有整系数。将其代入 M 并使用

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 11:阶乘 m 的积分表达式。

我们得出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

等式 12:等式。8 限制 p 大于 n。

将我们自己限制为大于 n 的素数,我们立即看到这个等式的第一项是而不是可被p整除,然而,我们可以很快看到第二项 *。*展开阶乘:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

方程式 13:方程式中的第二项。12 能被 p 整除。

由于 M 不能被 p 整除,等式中的第一个括号。6 也不能被 p 整除。现在考虑等式中的顶部积分。9.引入变量 y:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

积分变成:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分子中括号内的多项式具有整系数,其项从

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

几步之后,我们到达:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对于整数 c s(其中等式使用了 11)。每个 M( k )是一个可被 p 整除的整数,因此等式中的第一个括号。6 不能被 p 整除,因此我们得出结论,等式第一个括号中的项。6 是非零整数。如果它是零,它会被 p 整除,我们只是得出结论,它不是。

剩下的最后一块就是展示那个情商。假设我们选择足够大的 p 值,则 7 为真。使用 Eq。9、经过几个步骤后我们发现:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果二项式乘积的绝对值对于 x ∈ [0, n )有一个上界 B,我们得到:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于 RHS → 0 as p →∞,证明结束。

我的 Github 和个人网站 www.marcotavora.me 有一些关于数学和其他主题的有趣材料,如物理、数据科学和金融。看看他们!

TensorFlow 2.x 的近似策略优化(PPO)

原文:https://towardsdatascience.com/proximal-policy-optimization-ppo-with-tensorflow-2-x-89c9430ecc26?source=collection_archive---------10-----------------------

理解 PPO 强化学习算法并用 TensorFlow 2.x 实现

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Neenu Vimalkumar 在 Unsplash 上拍摄的照片

在本文中,我们将尝试理解 Open-AI 用于强化学习的近似策略优化算法。在一些基础理论之后,我们将使用 TensorFlow 2.x 实现 PPO。在你进一步阅读之前,我建议你看一下来自的演员-评论家方法,因为我们将为 PPO 修改那篇文章的代码。

为什么选择 PPO?

  1. 不稳定的策略更新:在许多策略梯度方法中,由于较大的步长,策略更新是不稳定的,这导致坏的策略更新,并且当这个新的坏策略用于学习时,它导致甚至更坏的策略。如果步子迈得小,就会导致学习速度变慢。
  2. 数据低效:很多学习方法是从当前经验中学习,在梯度更新后丢弃经验。这使得学习过程缓慢,因为神经网络需要大量的数据来学习。

PPO 可以很方便地克服上述问题。

PPO 背后的核心理念

在早期的政策梯度方法中,目标函数类似于**LPG(θ)= Et[logπθ(At | ST)ˇAt]。**但是现在我们将采用当前策略和旧策略的比率,而不是当前策略的日志。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片经由https://arxiv.org/abs/1707.06347

我们还将削减比率,并将削减和不削减两者中的最小值,即 b/w。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片经由https://arxiv.org/abs/1707.06347

如下所示,这个缩减的目标将限制大型策略更新。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片经由https://arxiv.org/abs/1707.06347

因此,最终目标包含 3 个部分,第一个是 Lclip,第二个是我们的 critic net 的 MSE,即预测的和目标的状态值的平方损失。第三部分是鼓励探索的熵。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片经由https://arxiv.org/abs/1707.06347

算法步骤

  1. 玩游戏 n 步,存储状态,行动概率,奖励,完成变量。
  2. 将广义优势估计方法应用于上述经验。我们将在编码部分看到这一点。
  3. 通过计算它们各自的损失来训练一些时期的神经网络。
  4. 测试这个训练好的模型的“m”次发作。
  5. 如果测试集的平均奖励大于您设定的目标奖励,则停止,否则从第一步开始重复。

密码

神经网络:

  1. 在导入了所需的库并初始化了我们的环境之后,我们定义了我们的神经网络,类似于 Actor-Critic 文章中的神经网络。
  2. 行动者网络将当前状态作为输入,输出每个动作的概率。
  3. 批评家网络输出一个州的价值。

动作选择:

  1. 我们定义我们的代理类,并初始化优化器和学习率。
  2. 我们还定义了一个 clip_pram 变量,它将在演员损失函数中使用。
  3. 对于动作选择,我们将使用 TensorFlow 概率库,它将概率作为输入,并将其转换为分布。
  4. 然后,我们使用该分布进行动作选择。

测试模型知识:

  1. 这个函数将用于测试我们代理的知识,并返回一集的总奖励。

训练循环:

  1. 我们将循环“步骤”时间,即我们将收集“步骤”时间的经验。
  2. 下一个循环是代理与环境交互的次数,我们将体验存储在不同的列表中。
  3. 在上述循环之后,我们计算并添加最后一个状态旁边的状态的值,用于广义优势估计方法中的计算。
  4. 然后,我们处理广义优势估计方法中的所有列表,以获得回报,优势。
  5. 接下来,我们为 10 个纪元训练我们的网络。
  6. 培训结束后,我们将在测试环境中对我们的代理进行五集测试。
  7. 如果测试集的平均奖励大于您设定的目标奖励,则停止,否则从第一步开始重复。

广义优势估计:

  1. 我们定义了一个预处理函数,它实现了计算回报和收益的 GAE 方法。
  2. 将变量“g”初始化为零,将 lambda 初始化为 0.95。
  3. 我们通过颠倒奖励列表从后面循环奖励。
  4. 将 delta 计算为(当前动作的回报+ gamma 下一状态的值对于终端状态为零的 done 变量-当前状态的值)。
  5. 将变量“g”计算为(delta + gamma * lambda * done 变量* g)。
  6. 将返回计算为(当前状态的 g +值)。
  7. 反转返回列表,就像我们从后往前计算一样。
  8. 优势的计算方式为(returns-values)。**这里我们使用值[:-1]。毕竟,**我们的值列表比所有其他列表大一个,因为为了计算的目的,我们添加了紧挨着最后一个状态的状态的值。

学习功能:

  1. 学习函数将(在与环境交互期间存储或计算的状态、动作、优势、概率、回报的数组)作为输入。
  2. 我们计算当前的概率和损失。评论家的损失是 MSE。
  3. 该函数使用渐变抽头执行渐变更新。

演员流失:

  1. 行动者损失将当前概率、行动、优势、旧概率和批评家损失作为输入。
  2. 首先,我们计算熵并计算平均值。
  3. 然后,我们循环遍历概率、优势和旧概率,计算比率、裁剪比率,并将其添加到列表中。
  4. 然后,我们计算损失。注意这里的我们采取了负损失,因为我们想执行梯度上升,而不是梯度下降。

这就是关于编码的全部内容。现在让我们看看您的代理没有学习的原因和一些技巧。

实施时需要注意的事项:

在编写 RL 代码时,要记住以下几点。

  1. 神经元的数量、隐藏层数、学习速率对学习有巨大的影响。
  2. 张量和 NumPy 数组的形状应该是正确的。很多时候,实现是正确的,代码也是有效的,但是代理没有学到任何东西,仅仅是因为张量的形状不正确,并且当对这些张量进行运算时会给出错误的结果

你可以在这里找到这篇文章的完整代码。敬请关注即将发布的文章,我们将在 TensorFlow 2 中实现更多 RL 算法和深度学习算法。

所以,本文到此结束。谢谢你的阅读,希望你喜欢并且能够理解我想要解释的内容。希望你阅读我即将发表的文章。哈里奥姆…🙏

参考资料:

[## 近似策略优化算法

我们提出了一种新的强化学习策略梯度方法

arxiv.org](https://arxiv.org/abs/1707.06347)

修剪卷积神经网络

原文:https://towardsdatascience.com/pruning-convolutional-neural-networks-cae7986cbba8?source=collection_archive---------23-----------------------

机器学习是各行各业的新流行语,是 21 世纪的精灵。它承诺了一切,从在繁重的体力工作中代替人类劳动,到为决策提供高水平的见解和分析。当与物联网(IoT)结合时,这种魔力将进一步增强,并可能创造一个世界,在这个世界中,我们的环境是我们大脑的延伸,并对我们的突发奇想和愿望做出智能响应。

然而,精灵越强大,它所需要的神灯就越大。换句话说,机器学习软件通常计算量非常大,因此不适合轻量级物联网设备。在这里,我们探讨卷积神经网络的想法,这是图像识别和对象检测中机器学习的一个关键方面,以及它们为什么不需要像现在这样庞大。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 1:CNN 层如何将过滤通道应用于输入张量的图示

卷积神经网络(CNN) 通过将 N 个滤波器通道应用于输入图像(以下称为张量)来工作。假设一个输入张量在形状中(高度、宽度、先前通道的数量)。每个滤波器通道都可以看作是一个小权重盒,它围绕输入张量的高度和宽度,对该位置的值执行元素级乘法,并将它们相加,以在该位置输出单个值。根据过滤器通道盒的大小及其在输入张量周围移动的方式,单个盒将输出形状的张量(new_height,new_width,1)。通过应用 N 个过滤通道,输出张量将具有(新高度,新宽度,N)的形状。因此,这构成了单一的 CNN 层。

图像分类和对象检测模型通常具有大量 CNN 层(在 MobilenetV2 中超过 50 层),并且每个 CNN 层可以具有从 10 到 100 以上的滤波器通道数量。因此,模型中存储了大量参数(权重),使得模型使用起来复杂且计算量大。这促使我们想出在不影响模型功能的情况下减小模型大小的方法。

我们在这里讨论的方式是通过移除被认为对模型不必要的参数来修剪训练的模型。剪枝的方法是受郝力等人的论文“高效神经网络的剪枝过滤器”的启发。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 2:来源: GDJ ,via pixabay ( Pixabay 许可)

当我们查看一个完全训练好的神经网络时,我们可以看到它的许多权重非常接近于零。这表明这些权重在确定神经网络的输出中没有起重要作用。如果我们将神经网络视为大脑,这意味着只有一小部分大脑实际上用于解决给定的问题,而大部分大脑处于非活动状态。

应用这一思想,我们遍历模型中的 CNN 层,检查哪些滤波器通道具有非常接近于零的权重,并从该层中完全移除这些通道。此后,我们适当地重新连接各个 CNN 层(在需要的地方使用一个层来用零填充输入/输出张量以获得正确的形状),以确保信息仍然可以正确地通过模型流动。结果是一个更加精简的模型,仍然可以执行它被训练要做的图像分类/对象检测。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 3:对目标检测模型的精确度进行修剪的结果(mAP)

我们在 SSDnet 的一个版本上实现了修剪思想,以查看修剪如何影响模型的能力(由 mAP 表示,这是一种对检测对象的准确度的测量)。如图 3 所示,我们可以删除大约 76%的 CNN 频道,该模型仍然具有足够的弹性,可以对剩余的 24%的频道进行操作,并保持原来的精度水平。它还告诉我们,该模型基本上需要大约 24%的通道才能有效运行,任何进一步的减少都会严重影响其能力。代码可在网上获得

对于一个模型在停止工作之前可以承受的信道丢失百分比,似乎没有硬性规定,这个数量因模型而异。然而,这告诉我们的结论是,卷积神经网络中的大部分参数并没有真正发挥重要作用。这个概念可能扩展到其他形式的神经网络,如前馈神经网络和递归神经网络,肯定值得进一步探索。这个概念在设计用于轻量级物联网设备的机器学习模型方面可能有潜在的价值。

参考资料:

[1]马克等, MobileNetV2:反演残差和线性瓶颈,2018,CVPR 2018

[2]郝力等,高效神经网络的剪枝滤波器,2016,2017

[3]刘威等, SSD:单次多盒探测器,2016,ECCV 2016

修剪神经网络

原文:https://towardsdatascience.com/pruning-neural-networks-1bb3ab5791f9?source=collection_archive---------5-----------------------

通过移除连接或节点,神经网络可以变得更小更快

深度学习的大部分成功来自于建立越来越大的神经网络。这使得这些模型能够更好地执行各种任务,但也使它们的使用成本更高。较大的型号需要更多的存储空间,这使得它们更难分发。较大的模型也需要更多的时间运行,并可能需要更昂贵的硬件。如果您正在为真实世界的应用程序生产一个模型,这是一个特别值得关注的问题。

模型压缩旨在减少模型的大小,同时最大限度地降低准确性或性能的损失。神经网络修剪是一种压缩方法,包括从已训练的模型中移除权重。在农业中,修剪是剪掉植物不必要的枝或茎。在机器学习中,修剪是删除不必要的神经元或权重。我们将回顾神经网络修剪的一些基本概念和方法。

移除重量或神经元?

有不同的方法来修剪神经网络。(1)可以修剪权重。这是通过将单个参数设置为零并使网络稀疏来实现的。这将减少模型中的参数数量,同时保持架构不变。(2)您可以从网络中删除整个节点。这将使网络架构本身更小,同时旨在保持初始较大网络的准确性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修剪权重/突触与节点/神经元的可视化(来源

基于权重的修剪更受欢迎,因为它更容易做到而不会损害网络的性能。然而,它需要稀疏计算才能有效。这需要硬件支持和一定程度的稀疏性才能有效。

修剪节点将允许更优化的密集计算。这允许网络在没有稀疏计算的情况下正常运行。这种密集计算通常在硬件上得到更好的支持。然而,移除整个神经元更容易损害神经网络的准确性。

修剪什么?

修剪的一个主要挑战是决定修剪什么。如果要从模型中移除权重或节点,您希望移除的参数不那么有用。有不同的试探法和方法来确定哪些节点不太重要,可以在对准确性影响最小的情况下删除。您可以使用基于神经元的权重或激活的试探法来确定它对模型性能的重要性。目标是删除更多不太重要的参数。

最简单的修剪方法之一是基于权重的大小。移除重量实质上是将其设置为零。您可以通过移除已经接近于零的权重来最小化对网络的影响,这意味着量值较低。这可以通过移除低于某个阈值的所有权重来实现。要根据权重大小修剪神经元,可以使用神经元权重的 L2 范数。

不仅仅是权重,训练数据上的激活可以用作修剪的标准。当通过网络运行数据集时,可以观察到激活的某些统计数据。您可能会观察到一些神经元总是输出接近零值的值。这些神经元可能会被移除,而对模型几乎没有影响。直觉是,如果一个神经元很少以高值激活,那么它很少用在模型的任务中。

除了权重或激活的大小之外,参数的冗余也意味着神经元可以被移除。如果一层中的两个神经元具有非常相似的权重或激活,这可能意味着它们在做同样的事情。通过这种直觉,我们可以移除其中一个神经元,并保留相同的功能。

理想情况下,在神经网络中,所有神经元都有独特的参数和输出激活,这些参数和激活在数量上是显著的,并且不是冗余的。我们希望所有的神经元都在做一些独特的事情,并去除那些不独特的。

什么时候修剪?

修剪中的一个主要考虑是将其放在训练/测试机器学习时间线中的什么位置。如果您使用基于权重大小的修剪方法,如前一节所述,您可能希望在训练后进行修剪。但是,在修剪之后,您可能会发现模型性能受到了影响。这可以通过微调来解决,即在修剪后重新训练模型以恢复准确性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

迭代剪枝流程(来源

修剪的用法会根据应用程序和使用的方法而变化。有时微调或多次重复修剪是不必要的。这取决于网络被修剪了多少。

如何评价剪枝?

评估修剪方法时需要考虑多个指标:准确性、大小和计算时间。需要准确性来确定模型如何执行其任务。模型大小是模型占用多少字节的存储空间。要确定计算时间,您可以使用 FLOPs(浮点运算)作为度量。这比推理时间更容易衡量,并且不依赖于模型运行的系统。

通过修剪,在模型性能和效率之间有一个折衷。你可以大量修剪,得到一个更小更有效的网络,但也不太准确。或者,您可以稍微精简一下,拥有一个高性能的网络,但它也很大,运营成本也很高。对于神经网络的不同应用,需要考虑这种折衷。

结论

剪枝是提高神经网络效率的有效方法。在这个领域有很多选择和研究领域。我们希望继续在深度学习方面取得进展,同时保持我们的模型在能源、时间和空间方面的效率。

参考

[1] Blalock,Davis,等.神经网络剪枝是什么状态?。arXiv 预印本 arXiv:2003.03033 (2020)。

[2]韩,宋等.【学习权值和连接的高效神经网络】。神经信息处理系统的进展。2015.

[3] PyTorch 修剪教程https://py torch . org/tutorials/intermediate/Pruning _ Tutorial . html

[4] Keras / Tensorflow 剪枝教程https://www . tensor flow . org/model _ optimization/guide/Pruning/Pruning _ with _ Keras

[5] Molchanov,Pavlo,等.“修剪卷积神经网络以进行资源高效的推理。arXiv 预印本 arXiv:1611.06440 (2016)。

6 Babaeizadeh、Mohammad、Paris Smaragdis 和 Roy H. Campbell。 Noiseout:一种修剪神经网络的简单方法。arXiv 预印本 arXiv:1611.06211 (2016)。

PS4 vs XBone vs Switch——第八代主机谁赢了?

原文:https://towardsdatascience.com/ps4-vs-xbone-vs-switch-who-won-the-8th-console-generation-1e8520ba474?source=collection_archive---------32-----------------------

使用假设检验一劳永逸地决定…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

随着索尼准备推出 PS5,微软集思广益,想出更多的方法将字母“X”包含在下一款游戏机的名称中,任天堂做任天堂在周末做的任何事情,这是一个回顾第八代视频游戏机的好时机,并决定其中哪一款(如果有的话)可以被描述为“最好的”。

索尼当然可以为转移的设备加冕,自 2013 年推出以来,已售出超过 1.1 亿台 ps4(据估计,XBox One 在同一时间内售出了令人失望的 4700 万台,而 Switch 自 2017 年发布以来售出了 5500 万台)。当然,这些统计数据对消费者来说无关紧要,我们只能假设,消费者更关心的是游戏质量,而不是游戏机的商业性能。但是我们如何判断一款游戏的品质?正如一句谚语所说:一个人的垃圾是另一个人的 使命召唤

克服主观性是我以前在钻研专辑评论的黑暗世界时尝试过的,这是一个将在这里重复的技巧。特别是,我们将依靠游戏的’元批评 T13 分数’来衡量它的“内在质量”。提醒一下,MetaScore 是给定书名的所有可用评论家分数的加权平均值,并“根据[他们的]质量和整体地位”给予某些评论家额外的权重。因此,我们用于此分析的数据集是通过抓取 MetaCritic 网站生成的(这个过程在之前的博客中有深入介绍)。

对于收集到的数据,我们可以马上说一些事情:

  • 我们在三个控制台(PS4、XBox One 和 Switch)上有 13,334 个条目。
  • 许多游戏没有分配元分级。当没有足够的评论家评论来聚集一个时,就会发生这种情况。
  • 相同的标题在不同的平台上有不同的条目。此外,给定标题的 MetaScores 可能变化很大,这取决于评论是针对哪个控制台的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

kill all zombies——PS4 比 XBox One 高 10 分

让我们进一步研究这最后一点。有人可能会说,衡量两个游戏机中哪一个最好的最公平的方法是只检查在两个游戏机上都出现的游戏。事实上,如果我们看看每个平台上可用游戏数量的文氏图,我们会发现有很大的重叠——特别是在 PS4 和 XBox One 之间(它们在技术上更相似,并且大约在同一时间推出)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Matplotlib-Venn 创建的图表

让我们假设我们想要调查,对于 PS4 和 XBox One 上都可用的给定游戏,哪个版本更有可能拥有更好的 MetaScore。为了做到这一点,我们首先分离出至少在这两个平台上有 MetaScores 的游戏,然后在一个游戏接一个游戏的基础上,从另一个游戏中减去一个游戏的分数(在这种情况下,从 XBox One 中减去 PS4)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

XBox One MetaScore,每个游戏减去 PS4 MetaScore

让我们在 KDE 图上形象化这些分数差异…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到,与 PS4 相比,这两个平台上的游戏在 XBox One 上的平均 MetaScores 略高。话虽如此,但差别似乎很小(平均仅超过 1 分),均值两边的范围都相当宽。综合考虑所有因素,我们是否可以得出平台之间的平均差异显著的结论?这听起来很像假设检验的基础,所以让我们想想这样的检验会是什么样子。

如果我们试图证明一款游戏在不同主机上的 MetaScore 之间存在显著差异,那么我们需要拒绝它们之间没有差异的假设。

一个稍微微妙的点将有助于我们了解如何继续进行——尽管我们已经收集了整个 MetaCritic,但我们仍然在处理一个游戏的样本,而不是一个群体(如果没有其他情况,有一些没有 MetaScores 的游戏我们已经从我们的分析中排除了,因此根据定义,我们正在处理两个控制台上可用的所有游戏的子集)。

想象一下,在人口水平上,任何两台游戏机上游戏的 MetaScore 之间的平均差异实际上为零。那么人口分布的平均值当然是 0。为了证明两个控制台之间存在显著差异,我们需要证明我们的样本极不可能来自这个假设的零均值总体。

当然,这是几乎任何单样本假设检验的逻辑基础,但是当我们解释我们的结果时,从基本原则(而不是仅仅盲目地将数字插入公式)考虑这些事情会很有用,并将有助于确保我们得出正确的结论。回到手头的问题——我们现在可以陈述我们的无效假设和替代假设:

  • H₀: 控制台之间的平均差异= 0
  • Hₐ: 表示控制台之间的差异≠ 0

下一步是定义我们的 α (当我们不应该拒绝 H₀时,我们可以接受的概率)。0.05 对大多数人来说已经足够好了 α ,所以对我们来说已经足够好了。换句话说,如果我们真的拒绝 H₀,那么只有 5%的可能性我们这样做是错的。

为了确定我们是否可以拒绝 H₀,我们现在需要创建“t 统计量”,它由以下公式给出:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 x-bar 是样本均值,μ是总体均值,s 是样本标准差,n 是样本大小

我们可以将其与 T 分布(具有适当的自由度)进行比较,并绘制 T 统计量,这里显示为一条垂直红线。该 T 统计生成一个 p 值,该值等于红色 T 统计右侧的 T 分布下的面积。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

XBox One vs. PS4。蓝色曲线下总共有 5%的区域是粉红色阴影,反映了我们选择的 α=0.05

我们可以从可视化中看到,我们的 p 值将远低于阿尔法阈值 0.05。由此,我们可以拒绝零假设,并得出结论,对于同时出现在 PS4 和 XBox One 上的游戏,XBox One 版本更有可能拥有更高的元批评分数。

顺便提一下,我们可以按照完全相同的过程来说明:

  • 游戏在 XBox One 上比在 Switch 上更有可能获得更高的分数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

XBox One 与 Switch

  • 与 Switch 相比,游戏更有可能在 PS4 上获得更高的分数(尽管在这种情况下,对零假设的拒绝更加微不足道)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PS4 与开关

游戏机独占怎么样?

那么我们能得出 XBox One 是最好的第八代游戏主机的结论吗?你们当中的游戏爱好者(和集合论者)会正确地注意到,通过只考虑跨多个控制台可用的游戏,我们基本上忽略了数据集中一半的游戏。事实上,如果我们调查 PS4 的十大 MetaScores,我们会发现其中七个是平台专有的(因为它们在 XBox 或 Switch 上不可用)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

MetaCritic PS4 十大,截至 2020 年 5 月

与此同时,任天堂 Switch 十大游戏中有一半在 XBox 或 PlayStation 上找不到…

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截至 2020 年 5 月的十大

而且,为了完整起见,XBox One 的十大游戏中只有一款是主机独占的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们分析整个数据集时,PS4 和 Switch 具有最佳排他性的观察似乎得到了证实——Switch 的排他性具有最高的平均 MetaScore,XBox One 最差。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

怎样才能用更严谨的统计得出这个结论?同样,我们需要记住,我们处理的是样本,而不是总体。虽然我们的数据集包含许多现有的平台专有游戏,但有一些没有元得分,因此被排除在分析之外。

因此,我们应该再次采取假设检验的方法。如果我们想证明控制台 A 独占比控制台 B 独占有显著更高的元得分,我们需要以某种方式拒绝陈述相反情况的无效假设:

  • H₀: 表示控制台 a 独占≤控制台 b 独占的 MetaScore
  • Hₐ: 表示控制台 a 独占的 metascore>控制台 b 独占

请注意,尽管前面测试中的零假设检验了两个总体均值是否相同,但这里我们假设了一些稍微不同的东西—一个总体均值与另一个相同或小于另一个总体均值。这意味着我们将执行“单尾”测试。

当我们考虑我们的主机独占样本时,我们需要记住一些其他的事情:

  • 样品有个不同的尺寸(例如 PS4 有 1675 个独占,而 XBox 只有 854 个)
  • 样本的元得分具有不同的标准偏差
  • 样本是否来自正态分布并不明显——它们的 KDE 图似乎都有一个负偏斜

我们如何进行在某种程度上取决于这最后一点。韦尔奇的 T 检验是我们常规 T 检验的一种变体,它能更好地处理不同大小和差异的样本。但是,它仍然假设数据呈正态分布。如果我们得出结论,我们的样本是从正态分布的总体中抽取的,那么我们应该转向非参数方法,如排列测试(在之前的博客中详细讨论过)。

如果我们在专业环境中处理这个问题,我们可以运行一个Kolmogorov-Smirnov 测试来明确地决定我们样本的正态性。为了便于说明,我们暂时忽略这一点,尝试两种方法,看看会得到什么结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有点不寻常的是,我们看到参数和非参数检验在每种情况下都返回几乎相同的 p 值。这远非显而易见——事实证明,对我们的样本进行Kolmogorov-Smirnov 测试表明,它们确实极不可能来自正态分布的人群(这有可能使参数测试不可靠)。

从假设测试中我们可以得出的结论是,XBox One 绝对是三台游戏机中平台独占游戏最差的。虽然交换机的 exclusives 平均比 PS4 的 MetaScores 高,但这种差异在统计上似乎并不显著。

因此,决定“获胜”的第八代游戏机取决于你作为一个游戏玩家看重什么,尤其是你看重哪些游戏。作为一个在 2018 年花了很多时间在 Persona 5 上的人,我很难选择 PS4 以外的任何东西。

感谢一路看完博客!我很乐意听到任何关于以上的评论,或者这篇文章涉及的任何概念。如果你还有其他的 Matplotlib 小技巧和窍门,欢迎在下面留言,或者通过LinkedIn联系我。

PSA: EDA 很重要。

原文:https://towardsdatascience.com/psa-eda-is-important-7d3ce6e3fc3c?source=collection_archive---------70-----------------------

EDA 初学者指南

我的第一个数据科学项目的演练和 EDA 初学者指南。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这张照片的相关性很快就会变得清晰——继续读下去!(图片由作者提供)

这是我通过 Flatiron 的在线数据科学训练营完成我的第一个项目后学到的第一课。您可以获得许多有意义的见解,回答相关的业务问题,而无需构建单一的模型!当然,如果你正在建立一个模型,如果你花时间去了解你的数据,你将会建立一个更明智、更有效的模型。

这是我在 Flatiron 完成的第一个“项目”,但回想起来,这实际上只是整个生命周期中的“EDA”部分。啊,再次年轻。

没关系——我仍然从这个项目中学到了很多,并且在我继续更复杂的项目之前,它帮助我理解了一个重要的事实:

EDA 很重要。

项目概述

我们的任务是回答这样一个问题:“什么类型的电影票房最好?”

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我最后一次演讲的幻灯片

数据

数据由 Flatiron 提供,主要来自四个来源(如上所示):

  • 票房魔咒
  • IMDB
  • 烂番茄
  • TheMovieDB.org

特征包括:release_datepopularityproduction_budgetdomestic_grossworldwide_grossruntimegenre以及与每部电影所涉及的演员/导演相关的其他特征。

请记住,这是本课程的第一个专题,因此不会建立模型。这是一个纯粹简单的 EDA,然后被打包成一个简洁的、面向业务的演示。

清理数据

也许我是少数不介意清理数据的人之一。我也不介意打扫我的公寓,所以也许这之间有联系…

我必须清理数据:

1️⃣

  • strings转换为datetime对象,例如:

df['release_date] = pd.to_datetime(df['release_date'])

很简单。Pandas 有一个内置的方法来实现这一点,而datetime对象给了我们更多的选项来探索数据——这就引出了我的下一个观点…

2️⃣

  • 基于release_date列创建一个release_day特征:

df['release_day] = df['release_date].map(lambda x: x.weekday())

好玩!将release_date转换成一个datetime对象允许我们调用它的.weekday()方法来给出电影上映的日期。

我还创建了一个release_month列用于以后的分析。

3️⃣

  • 将所有数字转换成一个integer。令人惊讶的是,许多包含数字的列将它们存储为strings。不,谢谢你!

df['domestic_gross'] = df['domestic_gross].str.replace('$','').str.replace(',','').astype('int')

您可以看出这些数字实际上是以$45,986,233格式作为字符串存储的。在我将每个记录转换成一个int之前,我需要先移除$,

4️⃣

  • 添加几个计算列。例如:

df['worldwide_net'] = df['worldwide_gross'] — df['production_budget']

这不一定是“清理”过程的一部分,但我喜欢在清理时添加我能想到的任何计算列,以便它们已经存在。

对于这个数据集来说,这就差不多了——没什么太复杂的。我也删除了一些我知道不会有帮助的功能,只是为了保持紧凑。

探索数据

我从这个项目中学到的一件重要事情是,你不能‘搞砸’数据探索。这是不可能的。

至少,这是我学到的重要一课。出于某种原因,当我第一次开始表演 EDA 时,我以为我会以某种方式做一些“错误”的事情。这是你应该尝试任何事情的时候!

如果你认为有值得探索的关系,那么你就自动对了。可能发生的最糟糕的事情是你找不到相关性,或者找到一种与你期望相反的关系。

但即使如此!那还是在告诉你一些你的数据!!

所以我不知道谁需要听这个,但是再一次为后面的人:

你不能搞砸数据探索。

好吧,现在我已经一吐为快了,让我告诉你我探索了什么。

1.R untime

我想看看runtime是否会影响电影的popularityworldwide_gross

这是我为runtimepopularity找到的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

我发现runtimeworldwide_gross有些类似

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

虽然我们不一定会找到特别高的相关系数,但如果我们看看前 100 名和后 100 名电影的平均运行时间,我们可以看到电影在 120 分钟左右徘徊,而不是 90 分钟。

2.预算

我想看看更大的预算是否总是意味着更有利可图/更受欢迎的电影。让我们来看看。

budgetpopularity

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

再次为budgetworldwide_gross

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

当谈到预算与运行时间时,我们肯定会看到更强的相关性。然而,数字很清楚——预算很重要!

3.发布的日期/月份

还记得我们如何将我们的release_date列转换成一个datetime对象,然后用它来计算release_dayrelease_month吗,即使它们没有被显式地给出?

现在是使用它的时候了!

让我们来看看一周中的某一天或者一年中的某一个月对一部电影的表现有什么影响。

release_day & release_monthpopularity

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

release_day &同release_month``worldwide_gross

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

我肯定会期待周五和周六是电影发行的高峰期——不!

周五是popularityworldwide_gross最好的一天,但是根据这个数据,周六和周日实际上是上映电影最差的两天。

12 月在这两个类别中也有相当大的领先优势。

又名——在 12 月的一个星期五发行一部电影!

4.类型

最受欢迎的流派有哪些?让我们看看!

我们先根据popularity来看。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

而现在worldwide_gross

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Seaborn 创建的图表——这是我最后一次演示的幻灯片。

酷!我们可以看到,动作片、冒险片在这两项指标上都名列前茅,科幻片和奇幻片也榜上有名。

喜剧在票房最高的电影中排名前五,戏剧在最受欢迎的电影中排名前五。

结论

总而言之:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是我最后一次演讲的幻灯片。

这就是全部了!想出一些你想探索的想法,然后…探索它们。

有时你的假设会被证明是正确的,有时会被证明是错误的——没有一个比另一个更好。

两个都会告诉你一些关于你的数据的有用信息。

我希望这对某人有帮助!或者至少,让某人知道他们不是独自开始他们的数据科学之旅。

更多内容即将推出。

PSI 和 CSI:前 2 个模型监控指标

原文:https://towardsdatascience.com/psi-and-csi-top-2-model-monitoring-metrics-924a2540bed8?source=collection_archive---------2-----------------------

建模基础

种群稳定性指数和特征稳定性指数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

一旦一个模型被投入生产,需要定期的监控以确保这个模型仍然是相关的和可靠的。我写了一篇关于模型验证和模型监控以及这两个阶段的重要性的文章,你可以看看这篇文章的前传。

[## 为什么模型验证如此重要,它与模型监控有什么不同

模型开发过程的支柱

towardsdatascience.com](/why-is-model-validation-so-darn-important-and-how-is-it-different-from-model-monitoring-61dc7565b0c)

继续这篇文章的主题,我们将了解 PSI 和 CSI,即群体稳定性指数和特征稳定性指数,它们是在许多领域特别是信用风险领域使用的最重要的监控策略之一。

PSI 和 CSI,这两个指标都关注人口分布的变化。

这两个监控指标基于这样一个前提,即当开发和验证/OOT(超时)样本在经济条件、基本假设、活动风格和关注点等方面没有显著差异时,预测模型效果最佳。

例如:如果我们建立一个预测模型来预测正常经济环境下信用卡客户的流失率,然后根据经济衰退时期的样本进行测试,该模型可能无法准确预测,因为不同收入阶层的人口分布可能发生了显著变化,这可能会导致实际流失率非常高,但该模型可能无法捕捉到它,从而预测出错误的结果。但是,正如我们现在理解的,如果我们继续检查 DEV 时间和当前时间之间的人口分布变化,我们可以得到一个公平的想法,如果模型结果是可靠的或不可靠的。这是通过 PSI 和 CSI 作为重要的监控指标来实现的。

人口稳定指数

这是一种度量标准,用来衡量一个变量在两个样本之间的分布随着时间推移发生了多大的变化。它被广泛用于监控人口特征的变化,以及诊断模型性能中可能存在的问题-很多时候,如果模型由于人口分布的重大变化而停止准确预测,这是一个很好的指示。

在这篇研究论文中,上述定义已经得到了非常恰当的解释。我也在这篇文章的末尾给出了一个参考链接。

最初,开发群体稳定性指数(PSI)是为了监控 OOT 和信贷风险记分卡分析中开发时间段样本之间的分布变化。PSI 的使用现在在本质上已经变得有些灵活,可以检查模型相关属性以及总体样本总体的分布变化,包括因变量和自变量- CSI ,我们将在下一节讨论这一点。

PSI 倾向于总体人口转移,而 CSI 倾向于关注所使用的单个模型变量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:链接

人口分布的变化可能是由于:

  • 经济环境的变化,如经济衰退、新冠肺炎等
  • 数据来源的变化
  • 直接或间接影响人口分布的内部政策变化
  • 数据集成中可能导致错误数据的问题
  • 编程/编码时的问题,例如模型实现或缺少评分代码的一些关键步骤

由于分布变化不一定涉及因变量,PSI 也可用于检查任何样本之间的相似性/相异性,例如,在社会人口学研究中比较两个或多个人口的教育、收入和健康状况。

计算 PSI 的步骤(参考: 链接)

  1. 在评分样本中按降序对评分变量进行排序
  2. 将数据分成 10 或 20 组(决定)
  3. 根据评分样本计算每组中记录的百分比
  4. 根据开发样本计算每个组中记录的百分比
  5. 计算步骤 3 和步骤 4 之间的差异
  6. 取(步骤 3 /步骤 4)的自然对数
  7. 将步骤 5 和步骤 6 相乘

PSI 的 EXCEL 制表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

解释规则(参考: 链接)

  1. PSI < 0.1 :无变化。您可以继续使用现有模型。
  2. PSI > =0.1: 但小于 0.2——需要轻微改变。
  3. PSI > =0.2: 需要重大改变。理想情况下,我们不应该再使用这种模式。应该重新校准/重新开发。

我们也可以使用条件格式范围,红色-琥珀色-绿色区域,红色是 PSI 超过 20%的警报状态,琥珀色是 10–20 %,模型应处于观察状态,绿色是模型被视为 fir 使用的阶段,即< 10%。

现在,根据用例,这些阈值根据业务相关性进行调整,但保持观察人口变化的想法是相同的。

特征稳定性指数

它回答了哪个变量导致了人口分布的变化。它将评分数据集中的独立变量的分布与发展数据集中的分布进行比较。它检测随时间推移提交评分的输入变量分布的变化。

它有助于确定哪个变化的变量是导致模型得分变化的主要原因。

当模型性能下降时,检查模型变量的分布变化有助于确定可能的原因。这是一个通常在检查了 PSI 并且它不在绿色区域之后采取的步骤(<0.1 in general) to check that the overall population distribution can be attributed majorly to which variables.

At least one variable that has changed significantly or if several variables have moved to some extent, it might be time to recalibrate or to rebuild the model.

CSI invariably has the same steps as PSI while calculating it. Just that the deciding is done on the dev sample values of a particular variable by binning it and setting those limits as hard cutoffs. Then, while calculating the frequency values for any validation/OOT sample, apply those same cutoffs to the data and calculate the frequency values and apply the same formula as we did while calculating PSI.

CSI 的 EXCEL 表格:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

因此,PSI 可以帮助我们确定总体人口分布与 DEV 样本的比较,如果它显示出显著的变化,那么 CSI 可以帮助我们进一步将其缩小到导致波动的几个变量。

参考文献:

[## 人口稳定性指数及特征分析

本教程描述了人口稳定性指数和特征分析的含义和用途。简单来说…

www.listendata.com](https://www.listendata.com/2015/05/population-stability-index.html)

https://www.lexjansen.com/wuss/2017/47_Final_Paper_PDF.pdf

如果你想知道更多关于等级排序的信息,这是信用风险建模中的一个基本概念,请查看下面的帖子:

https://juhiramzai . medium . com/why-rank-ordering-is-so-important-BC 1 ff 8a 48764

观看此空间,了解更多关于数据科学、机器学习和统计学的信息!

快乐学习,快乐成长!

使用 GeoPandas 可视化菲律宾的人口密度

原文:https://towardsdatascience.com/psvisualizing-the-philippines-population-density-using-geopandas-ab8190f52ed1?source=collection_archive---------35-----------------------

地理可视化/菲律宾。

使用 GeoPandas 可视化 2015 年菲律宾人口密度

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

塞巴斯蒂安·赫尔曼在 Unsplash 上的照片

人口密度是城市规划中的一个重要概念。关于它如何影响经济增长的理论存在分歧。一些人,如 Rappaport 所说,认为经济是一种形式的**【空间均衡】** : 即居民和就业的净流动逐渐趋于彼此平衡。

密度与经济增长有某种关系的想法早已被多项研究所证实。但同样的理论是否适用于菲律宾以及先于什么的事物(密度跟随城市发展或城市发展跟随密度)是一个经典的数据科学问题。

然而,在我们测试任何模型之前,让我们做一个有趣的练习并可视化我们的数据集。

2015 年菲律宾人口数据集

菲律宾统计局每五年公布一次人口数据。在撰写本文时,仅发布了 2015 年的数据集,因此我们将使用该数据集。

导入包

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.colors as colors #to customize our colormap for legendimport numpy as np
import seaborn as sns; sns.set(style="ticks", color_codes=True)import geopandas as gpd
import descartes #important for integrating Shapely Geometry with the Matplotlib Library
import mapclassify #You will need this to implement a Choropleth
import geoplot #You will need this to implement a Choropleth%matplotlib inline

我们将使用的许多软件包都需要安装。对于那些安装 GeoPandas 有困难的人,请查看我关于这个的文章。请注意,geoplot 需要 cartopy 包,并且可以作为我文章中讨论的任何依赖项进行安装。

加载 shape file

需要 Shapefiles 来创建地理或政治边界的“形状”。

下载 shapefile 并使用 GeoPandas 加载它。

解压 zip 包时需要注意的一点是:所有内容都应该放在一个文件夹中,即使您只是简单地使用。shp”文件,否则它将无法工作。(这意味着”。cpg“,”。dbf“,”。prj”等应与您的“在同一位置”。shp "文件。

你可以在 gadm.org 下载菲律宾的 shape file(https://gadm.org/)。

注意:你同样可以从菲尔吉斯(http://philgis.org/)下载形状文件。菲律宾的数据可能会更好,虽然其中一些来自 GADM,但还是用 GADM 吧,因为我在这方面更有经验。

#The level of adminsitrative boundaries are given by 0 to 3; the details and boundaries get more detailed as the level increasecountry = gpd.GeoDataFrame.from_file("Shapefiles/gadm36_PHL_shp/gadm36_PHL_0.shp")
provinces = gpd.GeoDataFrame.from_file("Shapefiles/gadm36_PHL_shp/gadm36_PHL_1.shp")
cities = gpd.GeoDataFrame.from_file("Shapefiles/gadm36_PHL_shp/gadm36_PHL_2.shp")
barangay = gpd.GeoDataFrame.from_file("Shapefiles/gadm36_PHL_shp/gadm36_PHL_3.shp")

此时,您可以查看 shapefiles 并检查边界。您可以通过绘制形状文件来实现这一点。

#the GeoDataFrame of pandas has built-in plot which we can use to view the shapefilefig, axes = plt.subplots(2,2, figsize=(10,10));#Color here refers to the fill-color of the graph while 
#edgecolor refers to the line colors (you can use words, hex values but not rgb and rgba)country.plot(ax=axes[0][0], color='white', edgecolor = '#2e3131');
provinces.plot(ax=axes[0][1], color='white', edgecolor = '#2e3131');
cities.plot(ax=axes[1][0], color='white', edgecolor = '#2e3131');
barangay.plot(ax=axes[1][1], color='white', edgecolor = '#555555');#Adm means administrative boundaries level - others refer to this as "political boundaries"
adm_lvl = ["Country Level", "Provincial Level", "City Level", "Barangay Level"]
i = 0
for ax in axes:
    for axx in ax:        
        axx.set_title(adm_lvl[i])
        i = i+1
        axx.spines['top'].set_visible(False)
        axx.spines['right'].set_visible(False)
        axx.spines['bottom'].set_visible(False)
        axx.spines['left'].set_visible(False)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

较暗的填充意味着更多的边界

加载人口密度数据

每平方公里的人口数据和密度通常由菲律宾统计局(PSA)收集。

你可以通过其他人口统计或宏观经济数据来做到这一点,因为菲律宾一直在提供这些数据。(好样的菲律宾!)

因为我们想增加挑战,所以让我们从最详细的开始:城市和自治市级别。

我们首先加载数据并检查它:

df = pd.read_excel(r'data\2015 Population Density.xlsx',
                  header=1,
                  skipfooter=25,
                   usecols='A,B,D,E',
                  names=["City", 'Population', "landArea_sqkms", "Density_sqkms"])

清理数据

在我们继续之前,我们必须清理我们的数据。我们应该:

  • 删除值为空的行
  • 删除名称后的非字母字符(*表示脚注)
  • 删除每个城市名称后的“(首都)”和“不包括”字样
  • 删除前导和尾随空格
  • 还有更多…

在将数据与 shapefiles 合并时,清理确实会占用大量工作。

菲律宾就是如此,该国的一些城市以彼此相似的名字命名。(如圣依西多禄、圣胡安、圣佩德罗等)。

让我们跳过文章中的这一部分,但是对于那些想知道我是如何做到的人,请访问我的 Github 库。该代码将适用于自治市/城市级别的任何 PSA 数据。

探索性数据分析

我最喜欢的实现 EDA 的方法之一是通过散点图。我们这么做只是为了以图表形式看看哪些城市密度高。

Matplotlib 是可行的,但我喜欢 seaborn plots 的风格,所以我更喜欢经常使用它。

#First sort the dataframe according to Density from highest to lowest
sorted_df = df.sort_values("Density_sqkms", ascending=False,ignore_index=True )[:50]fig, ax = plt.subplots(figsize=(10,15));
scatter = sns.scatterplot(x=df.index, y=df.Density_sqkms)#Labeling the top 20 data (limiting so it won't get too cluttered)
#First sort the dataframe according to Density from highest to lowest
sorted_df = df.sort_values("Density_sqkms", ascending=False)[:20]#Since text annotations,overlap for something like this, let's import a library that adjusts this automatically 
from adjustText import adjust_texttexts = [ax.text(p[0], p[1],"{},{}".format(sorted_df.City.loc[p[0]], round(p[1])),
          size='large') for p in zip(sorted_df.index, sorted_df.Density_sqkms)];adjust_text(texts, arrowprops=dict(arrowstyle="->", color='r', lw=1), precision=0.01)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

菲律宾城市和自治市密度散点图。你可以直观地看到有些城市在密度上是异常值。注意,我使用了库 adjust_texts 来确保标签清晰易读。

从这张图表中,我们已经可以看出哪些城市高于“首都地区”的平均水平,即曼达卢永帕赛卡洛坎纳沃塔斯马卡蒂马拉邦马里基纳

同样在前 20 名中,我们可以看到这些城市大多位于“国家首都地区”和附近的省份,如拉古纳。还要注意马尼拉市对于这个数据集来说是一个异常值。

地质公园可视化

根据瓦尔多 T26 托布勒 T27 的说法,地理第一定律 T25 是“一切事物都与其他事物相关,但近的事物比远的事物更相关。”

这就是为什么在房地产中,检查和想象邻近性如何影响价值是很重要的。最终,地理可视化是我们可以做到这一点的方法之一。

我们已经可以使用 GeoPandas 的内置绘图方法来可视化我们的数据。

k = 1600 #I find that the more colors, the smoother the viz becomes as data points are spread across gradients
cmap = 'Blues'
figsize=(12,12)
scheme= 'Quantiles'ax = merged_df.plot(column='Density_sqkms', cmap=cmap, figsize=figsize,
                          scheme=scheme, k=k, legend=False)ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)#Adding Colorbar for legibility
# normalize color
vmin, vmax, vcenter = merged_df.Density_sqkms.min(), merged_df.Density_sqkms.max(), merged_df.Density_sqkms.mean()
divnorm = colors.TwoSlopeNorm (vmin=vmin, vcenter=vcenter, vmax=vmax)# create a normalized colorbar
cbar = plt.cm.ScalarMappable(norm=divnorm, cmap=cmap)
fig.colorbar(cbar, ax=ax)
# plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 GeoPandas 的内置绘图方法进行可视化

一些分析师更喜欢单调的颜色图,如蓝色或绿色,但当数据高度倾斜(有许多异常值)时,我发现使用发散的颜色图更好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发散的色彩映射表以可视化数据分散

使用发散色图,我们可以可视化密度值的分散。即使查看颜色条图例也可以看出菲律宾的密度值包含了偏高的异常值。

使用 Geoplot 绘图

除了 GeoPandas 的内置绘图功能之外,您还可以使用 geoplot 进行绘图。

k = 1600
cmap = 'Greens'
figsize=(12,12)
scheme= 'Quantiles'geoplot.choropleth(
    merged_df, hue=merged_df.Density_sqkms, scheme=scheme,
    cmap=cmap, figsize=figsize
)

在下一个系列中,让我们尝试更互动地绘制这一点,或者使用一些机器学习算法来提取更多见解。

完整代码,请查看我的 Github 库

对自治市和城市级别的数据进行预处理的代码也适用于其他 PSA 报告的统计数据。

让我知道你想让我们在未来尝试和可视化什么数据集。

公共交通服务范围:识别印度尼西亚雅加达的无服务市民

原文:https://towardsdatascience.com/public-transportation-range-of-service-identifying-the-unserved-citizens-in-jakarta-city-eaf8f3446fce?source=collection_archive---------36-----------------------

现实世界中的 DS

由于耐力有限,人们只能走一段时间或一段距离。为了促进公共交通的使用,公共交通服务的可及性应该在这个距离之内。使用地理信息系统,我们能够识别哪些区域不在步行距离内,并推断出未得到服务的市民。

概要:雅加达市是世界上最拥挤的城市之一。必须首先扩大对居民的服务覆盖面,以促进公共交通的使用。基于标准步行距离,该覆盖距离应该在 700 米以内,因为人类行走的耐力有限。所以,

雅加达 700 米的公共交通服务范围是否覆盖了所有居民?

答案是否定的。大约有(近似值) 827.594 (一千万人中的市民 **居住在现有公共交通步行距离之外。**64,752 公顷土地中的 9160.16 公顷(约 14%)不在服务范围内。为了减少数量,需要规划新的路线并产生一个空间规划,该空间规划或者包含该路线,或者被新路线包含。

介绍

如果我们谈论拥堵问题,雅加达是最糟糕的城市之一;它徘徊在世界十大拥堵城市中。由于拥堵而损失的时间可能在早上超过 19 分钟,在晚上超过 26 分钟。以至于每年每个雅加达市民有 7 天 6 个小时是花在交通拥堵上( Tomtom,2019 )。此外,拥堵导致空气污染激增,也就是说,不用说,慢慢地毒害着市民。尽管许多机构进行了各种衡量标准和排名,但这并没有减少问题的紧迫性,这个问题仍然需要解决。

当然,必须采取措施来减少这种使用:将私人汽车消费转向公共交通。这可以通过降低公共交通的成本来实现,我说的成本不是指货币价值。成本的组成部分可以由经验、舒适性、感觉、便利性、票价和许多影响人们使用公共交通决策的因素组成(尽管使用一些统计方法的计算可能会将这些变量转换为货币单位)。我认为,人们使用公共交通的最根本变量是交通服务的范围;一个人乘坐公共交通工具应该步行的距离。

(想象一下:即使有最好的火车或公共汽车,美丽的人行步道;你不会仅仅为了使用这项服务而步行 10 公里吧?)

嗯,10 公里只是夸张。重点是,步行距离要短。这种说法有许多理由,但它将深入一些学术论文,将涉及大量的统计数据,我不希望这篇文章变得沉重。所以,让我们保持轻松(如果你想寻找论据,见这个,和这个)。注意,我没有忽略其他导致变量。我的论点是,在我们实现其他变量之前,服务的范围应该是优先的。

在步行能力有限的情况下,服务范围必须在步行距离内:即 700 米。该数字由雅加达省法规设定,作为指定公交导向开发(TOD)区域的标准。超过这个数字,预计人们会使用其他交通工具因为走路太累了!因此,我们必须确保雅加达的每个公民都在这 7 亿人口的范围内。

该范围是二维的,并产生一个区域,该区域定义了服务的运输范围。 在我的另一篇文章中,我使用了其他命名法:行人汇水区(PCA),但本质上是一样的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

行人聚集区(PCA),一个人行走的最大距离。PCA 确定服务的经验范围(作者的分析,2020 年)

目标

本文旨在确定不在 700 米交通服务范围内的市民数量。为此,使用了一些地理数据:

  • 每个公共交通站的位置(交通设施)
  • 道路几何;
  • 人口分布

一些分析使用 700 米的距离作为圆形半径,但根据经验,人们不会飞。人走着转着;道路有交叉路口和弯道,所以这 700 m 的步行距离肯定在 700 m 半径内。

数据

本节解释输入数据:交通设施、道路几何和人口分布。

数据#1:交通设施

雅加达有许多运输供应商,包括私营和国有企业。虽然目前公布的交通服务清单可以在官方开放数据网站中找到,但 Trafi 已经收集并提供了全面的数据收集,我必须承认这一点。圆点是设施的停靠点;在那里,你可以登上汽车或公共汽车。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有雅加达的交通站有昂科特站、米克洛莱站、杰克林科站、雅加达站、火车站等等( Trafi,2020 )。从 OpenStreetMap 中收集道路几何图形

数据#2:道路几何形状

OpenStreetMap (OSM)中检索道路几何图形。注意地图上的点。**圆点是从 Trafi 中检索到的公共交通站点。**道路几何包括所有道路等级(高速公路、一级公路、二级公路、住宅区、人行道等)。).放大可以看到雅加达道路设计的复杂程度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

道路几何和公共交通站(来源:开放街道地图交通,2020)

数据#3:人口分布

我无意中发现了我的学长的文章,该文章讨论了印度尼西亚的城市化程度(就建筑区域和密度而言)和区域城市系统。其中一个论点是,为了定义和分析大都市区域,我们需要网格中的人口数据。我完全同意,幸运的是,这篇文章提到的全球人类居住层(T21)提供了这样的数据。

栅格数据的连续性为分析提供了灵活性。它忽略了聚集到行政边界的地理数据的离散性质(例如可以通过 choropleth 地图。作为数据分析师,这种连续不断的数据,迸发出喜悦的火花!本文的分析需要连续的数据,而不是离散的序数数据

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GHSL,通过双线性插值显示的人口密度(GHSL,2015 年)。实际数据是像元大小为 250x250m 的栅格。

分析

对于每个交通设施站点,我将行人集水区(PCA)确定为服务范围(PCA 和服务范围可以互换),并排除了已经被行人集水区覆盖的区域。这导致了行人聚集区没有覆盖的区域,但是一些区域是 PCA 没有覆盖的,例如机场、空地、湖泊。

因此,我通过将人口数据与没有交通设施的区域(超过 700 米的区域)叠加来提取。这就是为什么需要连续的人口数据,因为提取离散的地理数据(例如从行政边界进行空间提取)没有意义!

我想如果读者只看下面的图会更容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分析,未获得服务的市民的空间分布(作者的分析,2020 年)

结论

分析结果是一个栅格,其中包含当前公共交通服务范围之外的市民的值。正如目标所述,本文试图确定未得到服务的公民人数。

合计所有小区的值,**大约有 827,594 个市民没有得到服务。**请注意,我使用“大约”,这是因为人口数据的规模太小,需要根据当地情况进行重新评估。

此外,64,752 公顷土地中有 9,160.16 公顷(约 14%)没有这项服务。然而,这 14%中的一部分不应该被覆盖或者不需要被覆盖。这些部分是无人居住的区域:湖泊、机场、空地等。因此,总有一些地区没有交通服务。

一些评论和建议

本节阐述了建议以及整合交通规划和城市/空间规划的重要性。

交通城市规划与城市设计一体化

交通与城市规划/设计密不可分。土地利用影响交通,交通影响土地利用。由于这些相互作用,交通规划必须与城市空间规划相结合;交通规划不能孤立存在,因为交通是由周围的建筑环境定义和编制的。

与直觉相反,我们可以说,为了改善我们的交通,我们可以干预我们的城市环境,而不干预交通本身。举个例子,

  • 修建更好更宽的人行道减少了私人车辆的需求,导致公共交通需求增加;
  • 建设新的行人网络改善了行人聚集区,使车站服务于更多的居民,增加了车站的交通量;
  • 混合土地使用提供了附近的服务,减少了前往城市的另一部分的需求。
  • 减小城市街区的大小缩短了步行距离

建议

将它放入上下文中;对于目前居住在 700 米交通服务范围之外的雅加达市民,我们应该怎么做

显然,计划新的路线为没有得到服务的居民服务。但是!确保路线周围的步行网络包含新路线,提供直达服务或更短距离的线路。这可以通过为一些优先地区制定新的城市设计计划来实现。

另一个相当激进的想法是重组建筑体量,以产生更高的渗透性。整合土地和重新组织空间,将没有得到服务的市民转移到附近已经得到服务的社区。感觉这个可能性比较小,但是哎!日本人就是这么干的!

该机构

为了实现该建议,运输机构(规划路线)、规划机构(规划空间规划)或任何其他实体必须合作。

至少以我的经验来看,(我也希望并需要了解更多这方面的知识)我们印尼机构实体(政府或非政府)的现实是,这些实体有时是独立运行的。例如,开发商正在开发他们自己私人获得的土地,旅行社正在规划他们自己的路线;同时需要协同这些独立的活动。如果土地开发商也是运输服务商岂不是很厉害?嘿!日本人就是这么干的!(我从日本人身上学到了很多!)

我并不是说这种努力不存在(我的意思是,这就是我们政府的目的)。我的信息是作为一个城市规划专业的毕业生,我认为我们必须意识到这种现象;交通和空间规划是相互依赖的。

使用 Sphinx 在 Confluence/HTML 上发布 Python 项目文档

原文:https://towardsdatascience.com/publish-python-project-documentation-on-confluence-html-using-sphinx-fad3a98b8eeb?source=collection_archive---------18-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码文档在每个项目中都是必不可少的。代码文档可以分成多个部分。第一个是注释块,对程序员最有帮助;这些可以在每个解释类、方法、参数、可能的错误的文件中找到。然后是档案文件。这些通常是通过一个脚本生成的,该脚本将解析一个文件,并基于文档字符串中的描述,创建一个显式的 PDF。事后,应该有关于代码库的位置的信息;此外,应该有如何运行项目的详细说明。

在本文中,我们将研究由 Sphinx 生成的文件文档。这个文档生成器可以用来创建。pdf,。或者将技术文档页面发布到一个 Confluence 实例。

为什么选择技术文档的融合?

Confluence 是一个在一个地方创建、协作和组织所有工作的好地方。

  1. 可在公司范围内使用
  2. 允许你吸引同事和读者
  3. 基于网络,无需下载任何软件
  4. 敏捷环境的理想选择

创建一个 confluence 帐户,并创建一个存储文档的空间

Sphinx 入门

Sphinx 是一个工具,它使得为 Python 项目创建智能和漂亮的文档(或由多个 reStructuredText 源组成的其他文档)变得容易,由 Georg Brandl 编写。它最初是为新的 Python 文档而创建的,并为 Python 项目文档提供了出色的工具,但也支持 C/C++,并且计划开发更多的语言。

Sphinx 使用 reStructuredText 作为其标记语言,它的许多优势来自于 reStructuredText 及其解析和翻译套件 Docutils 的强大和直接。

创建文档所涉及的步骤;

GitHub 代码

  1. 转到 python 项目的根目录。在小项目的情况下,转到包含所有。py 文件
  2. 创建一个 Python 3 虚拟环境。在我的例子中, venv 是虚拟环境的名称

打开 cmdshift +右键,在此打开命令窗口

virtualenv -p python3 venv

3.激活虚拟环境。

cd venv/Scripts
activate.bat

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

确保您在整个项目过程中都处于虚拟环境中

4.安装所有项目需求

pip install -r requirements.txtORpip install Sphinx
pip install rinohtype# The recommended method of installation is using [pip](https://pip.pypa.io/) for confluencepip install sphinxcontrib-confluencebuilder

Sphinx 和 Rinohtype 已经在 requirements.txt 文件中。

5.创建一个 docs 目录并将 cd 放入该目录。这是所有文档文件将出现的地方。

mkdir docs
cd docs

6.设置 Sphinx

sphinx-quickstart

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

初始配置

用于 Sphinx 文档的 Docstring 格式;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文档字符串格式

7.开源/conf.py

  • 配置根目录的路径

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

取消第 15–17 行的注释,并粘贴以下代码

import os
import sys
sys.path.insert(0, os.path.abspath('../..'))

路径应该指向项目的根目录,查看项目结构,从 conf.py 我们应该通过向上两个父目录到达根目录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

主目录

  • 在 conf.py 中添加这些扩展名
extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.intersphinx',
    'sphinx.ext.ifconfig',
    'sphinx.ext.viewcode',
    'sphinx.ext.githubpages',
    'sphinxcontrib.confluencebuilder'
]# 'sphinxcontrib.confluencebuilder' is for confluence
  • 在 conf.py 中添加 latex 元素
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
    'papersize': 'letterpaper',# The font size ('10pt', '11pt' or '12pt').
    'pointsize': '10pt',# Additional stuff for the LaTeX preamble.
    'preamble': '',# Latex figure (float) alignment
    'figure_align': 'htbp',
}
  • 在配置文件中包含一系列与发布相关的设置:(*可选,仅当您希望在 confluence 中发布时)
confluence_publish = True
confluence_space_name = 'TEST'
*# (for confluence cloud)*
confluence_server_url = 'https://example.atlassian.net/wiki/'
confluence_server_user = 'myawesomeuser@example.com'
confluence_server_pass = '[myapikey](https://confluence.atlassian.com/cloud/api-tokens-938839638.html)'
*# (or for confluence server)*
confluence_server_url = 'https://intranet-wiki.example.com/'
confluence_server_user = 'myawesomeuser'
confluence_server_pass = 'mypassword'

例如:

confluence_publish = True
confluence_space_name = 'SPEC'
*# (for confluence cloud)* confluence_server_url = '[https://spectrra.atlassian.net/wiki/'](https://spectrra.atlassian.net/wiki/')
confluence_server_user = '[email@gmail.com](mailto:shravan@osiopt.com)'
confluence_server_pass = '[jhfgjsdfjhasdjfg](https://confluence.atlassian.com/cloud/api-tokens-938839638.html)'

如何为你的项目获取 confluence _ server _ pass:获取 API Key

详细安装: [斯芬克斯](http://Atlassian Confluence Builder for Sphinx) 的亚特兰蒂斯合流建造者

8.打开 index.rst,将内容更改为以下内容。(点击 index.rst 链接查看完整内容)

Documentation for the Code
**************************
.. **toctree::
   :maxdepth:** 2
   **:caption:** Contents:codename1
===================
.. **automodule::** codename1
   **:members:**codename2
=====================
.. **automodule::** codename2
   **:members:****# In case of many modules;**main
===================
.. **automodule::** app
   **:members:**controller
=====================
.. **automodule::** main.controller
   **:members:**models
=================
.. **automodule::** main.models
   **:members:**

9.创建文档文件。

在 docs 目录中键入命令

  • 创建 HTML
make html

如果您的 Python 版本≥3.7.0,构建 pdf 文件将会失败( Github 问题参考)

HTML 页面的快照;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文档的快照;index.html

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

文档的快照;index.html

这会在 docs/build/HTML/index . HTML中产生 HTML 文件

  • 在汇合处发布
make confluence

注意:如果合流失败,在合流前运行 make clean。

IMP:您可以将 confluence 页面导出为 PDF 格式

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从 Confluence 页面导出到 PDF

合流页面的快照;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

汇合页面的快照

一旦一切就绪;如果您对代码的文档进行了任何更改,请打开 cmd 并运行以下命令:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

命令

要了解更多信息,请参考以下链接;

谢谢你的时间。希望这篇文章对你有帮助。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用基于标准的 REST API 发布您的模型

原文:https://towardsdatascience.com/publish-your-models-with-a-standard-rest-api-94de1e1da682?source=collection_archive---------21-----------------------

使用 DEEPaaS API 公开您的模型的逐步指南

无论您是在开发一个成熟的应用程序,还是只想与您的同事共享模型,您都可能面临这样的情况:您需要与其他人共享您新开发的模型。在这个简短的分步教程中,我们将展示如何使用 REST API 轻松共享您的模型,而无需从头开始开发。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

构建机器学习模型的数据科学家没有一种简单而通用的方法来与他们的同事或任何有兴趣使用他们的人共享他们开发的应用程序。整个模型(即代码和任何需要的配置资产)可以共享,但是这要求模型的接收者需要有足够的知识来执行它。在大多数情况下,我们只是想分享模型以展示其功能(向其他同事或对我们的预测模型感兴趣的公司),因此没有必要分享整个实验。

在我们工作的互联世界中,最直接的方法是通过 HTTP 端点公开模型,以便潜在用户可以通过网络远程访问它。这听起来可能很简单,但是开发一个合适且正确的 REST API 并不是一件容易的事情。首先,正如在其他帖子中所展示的,数据科学家需要从头开始开发 API,这项任务需要 API 编程、网络、REST 语义、安全性等方面的知识。第二(可能是一个不太明显的问题),如果每个科学家都提出一个实现,我们最终会有无数不同的、不可互操作的 API 做或多或少相同的工作,导致一个支离破碎的生态系统,我们需要知道如何与所有这些端点交互。

DEEPaaS API:一个公开机器学习模型的 REST API

进入 DEEPaaS API :使用 aiohttp 搭建的机器学习、深度学习和人工智能 REST API 框架。DEEPaaS 是一个软件组件,它允许通过 HTTP 端点公开 Python 模型(使用您选择的框架实现)的功能。它不需要对原始代码进行修改,并有方法根据科学家的选择(输入参数、预期输出等)对其进行定制。)

DEEPaaS API 遵循 OpenAPI 规范(OAS) ,因此它允许人类和计算机发现并理解底层模型的功能、其输入参数和输出值,而无需检查模型的源代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 DEEPaaS API 公开的测试模型的 Swagger web 用户界面。

让我们通过一个走过的例子来看看它是如何工作的。

使用 DEEPaaS 逐步发布模型

将模型插入 API

为了更好地说明如何将模型与 DEEPaaS 集成,我们将使用来自 scikit-learn 的一个最著名的例子:一个针对 IRIS 数据集训练的支持向量机。在这个简单的例子中,我们定义了两个不同的函数,一个用于训练,一个用于执行预测,如下所示:

from joblib import dump, load                                                      
import numpy                                                                       
from sklearn import svm                                                            
from sklearn import datasets                                                       

def train():                                                                       
    clf = svm.SVC()                                                                
    X, y = datasets.load_iris(return_X_y=True)                                     
    clf.fit(X, y)                                                                  
    dump(clf, 'iris.joblib')                                                                                                                                          

def predict(data):                                                                 
    clf = load('iris.joblib')                                                      
    data = numpy.array(data).reshape(1, -1)                                        
    prediction = clf.predict(data)                                                 
    return {"labels": prediction.tolist()}

如您所见,按照 scikit-learn 的教程,训练函数将训练好的模型保存到磁盘中。下一步是为您的培训和预测呼叫定义输入参数。因为这个例子非常简单,所以我们只为预测调用定义输入参数。通常你需要把它放在一个不同的文件中,这样它就不会干扰你的代码,但是为了简单起见,我们在 IRIS SVM 旁边添加了这个特殊的函数:

from joblib import dump, load                                                      
import numpy                                                                       
from sklearn import svm                                                            
from sklearn import datasets                                                       
from webargs import fields, validate                                                                                                                                 

def train():                                                                       
    clf = svm.SVC()                                                                
    X, y = datasets.load_iris(return_X_y=True)                                     
    clf.fit(X, y)                                                                  
    dump(clf, 'iris.joblib')                                                                                                                                     

def predict(data):                                                              
    clf = load('iris.joblib')                                                   
    data = numpy.array(data).reshape(1, -1)                                     
    prediction = clf.predict(data)                                              
    return {"labels": prediction.tolist()}                                      

def get_predict_args():                                                         
    args = {                                                                    
        "data": fields.List(                                                    
            fields.Float(),                                                     
            required=True,                                                      
            description="Data to make a prediction. "
                        "The IRIS dataset expects "  
                        "four values containing the "
                        "Sepal Length, Sepal Width, " 
                        "Petal Length and Petal Width.",                        
            validate=validate.Length(equal=4),                                  
        ),                                                                      
    }                                                                           
    return args

最后一步,为了将它与 DEEPaaS API 集成,你需要使它可安装(你应该这样做),并使用 Python 的 setuptools 定义一个入口点。DEEPaaS 将使用这个入口点来了解如何加载以及如何将不同的函数插入到已定义的端点。我们目前使用的是deepaas.model.v2入口点名称空间,因此我们可以如下创建setup.py文件:

from distutils.core import setup                                                   

setup(                                                                             
    name='test-iris-with-deepaas',                                                 
    version='1.0',                                                                 
    description='This is an SVM trained with the IRIS dataset',                    
    author='Álvaro López',                                                         
    author_email='aloga@ifca.unican.es',                                           
    py_modules="iris-deepaas.py",                                                          
    dependencies=['joblib', 'scikit-learn'],                                       
    entry_points={                                                                 
        'deepaas.v2.model': ['iris=iris-deepaas'],                                 
    }                                                                              
)

安装、运行 DEEPaaS 并展示您的模型

一旦您准备好代码,您只需要安装您的模块和 DEEPaaS API,这样它就可以检测到它并通过 API 公开它的功能。为了以一种简单的方式做到这一点,让我们创建一个 virtualenv 并在其中安装所有内容:

$ virtualenv env --python=python3
    (...)
$ source env/bin/activate
(env) $ pip3 install .
    (...)
(env) $ pip3 install deepaas
    (...)
(env) $ deepaas-run

         ##         ###
         ##       ######  ##
     .#####   #####   #######.  .#####.
    ##   ## ## //   ##  //  ##  ##   ##
    ##. .##  ###  ###   // ###  ##   ##
      ## ##    ####     ####    #####.
              Hybrid-DataCloud  ##

Welcome to the DEEPaaS API API endpoint. You can directly browse to the
API documentation endpoint to check the API using the builtint Swagger UI
or you can use any of our endpoints.

    API documentation: http://127.0.0.1:5000/ui
    API specification: http://127.0.0.1:5000/swagger.json
          V2 endpoint: http://127.0.0.1:5000/v2

-------------------------------------------------------------------------

2020-02-04 13:10:50.027 21186 INFO deepaas [-] Starting DEEPaaS version 1.0.0
2020-02-04 13:10:50.231 21186 INFO deepaas.api [-] Serving loaded V2 models: ['iris-deepaas']

访问 API,触发训练和预测

如果一切正常,现在你应该能够将你的浏览器指向控制台中打印的 URL(http://127.0.0.1:5000/ui)并得到一个好看的 Swagger UI ,这将允许你与你的模型进行交互。

因为这是一个简单的例子,我们还没有提供一个经过训练的模型,所以首先要做的是进行一次训练。这将调用train()函数并保存训练好的 SVM 以备后用。您可以通过用户界面或命令行来完成:

curl -s -X POST "http://127.0.0.1:5000/v2/models/iris-deepaas/train/" -H  "accept: application/json" | python -mjson.tool
{
    "date": "2020-02-04 13:14:49.655061",
    "uuid": "16a3141af5674a45b61cba124443c18f",
    "status": "running"
}

训练将异步完成,这样 API 就不会阻塞。您可以从 UI 中检查其状态,或者使用以下调用:

curl -s -X GET "http://127.0.0.1:5000/v2/models/iris-deepaas/train/" | python -mjson.tool
[
    {
        "date": "2020-02-04 13:14:49.655061",
        "uuid": "16a3141af5674a45b61cba124443c18f",
        "status": "done"
    }
]

既然模型已经定型,我们就可以进行预测了。鸢尾数据集由 3 种不同类型的鸢尾(Setosa、Versicolour 和 Virginica)花瓣和萼片长度组成。样本有四列,分别对应于萼片长度、萼片宽度、花瓣长度和花瓣宽度。在我们的示例中,让我们尝试获取[5.1\. 3.5, 1.4, 0.2]观察的结果,并获取结果。同样,您可以从 UI 或命令行进行设置,如下所示:

curl -s -X POST "http://127.0.0.1:5000/v2/models/iris-deepaas/predict/?data=5.1&data=3.5&data=1.4&data=0.2" -H  "accept: application/json" | python -mjson.tool
{
    "predictions": {
        "labels": [
            0
        ]
    },
    "status": "OK"
}

如您所见,结果包含了我们的 SVM 执行的预测。在这种情况下,输入数据的标签是0,这确实是正确的。

整个代码示例可以在这个要点中找到。

结论

在这个简单的例子中,我们展示了机器学习实践者如何通过依赖于 DEEPaaS API 的 REST API 来公开任何基于 Python 的模型,而不是开发他们自己的自制 API。通过这样做,数据科学家可以专注于他们的工作,而不用担心编写和开发复杂的 REST 应用程序。此外,通过使用一个通用的 API,不同的模块将共享相同的接口,这使得它更容易在生产中部署和被不同的程序员使用。

承认

DEEPaaS API 已在DEEP-Hybrid-data cloudh 2020 项目(授权协议号 777435)中开发,该项目旨在为欧洲分布式电子基础设施上的机器学习和深度学习构建一个平台。

注:本帖原帖于KD nuggets

应用和数据接收流的发布者/订阅者模型

原文:https://towardsdatascience.com/publisher-subscriber-model-for-apps-and-data-ingestion-flows-b8ba7e85e992?source=collection_archive---------23-----------------------

探索实时数据流应用模型中的 Google Cloud 发布/订阅

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

约纳斯·勒普在 Unsplash 上拍摄的照片

在本文中,我将向数据工程师和应用程序开发人员展示发布者/订阅者模型的特征。我将首先解释概念的定义及其架构,什么是 Google Cloud 发布/订阅云服务,最后以一个简单的演示作为使用示例。

议程

  • 流式编程模型的概念和特征
  • 发布者/订阅者模型的一般架构
  • 谷歌云发布/订阅的概念和特征
  • 谷歌云发布/订阅架构
  • 演示

流式编程模型

编程模型是基于由一个名为主题的频道记录传输系统组织的工作流程编排。

在这个模型中有两个不同的角色,生产者消费者(稍后将被称为发布者和订阅者)。生产者负责发布关于主题的记录,其中通常由分布式集群组成的数据中心接收记录,存储记录,并使消费者可以通过访问主题的记录队列来获得记录。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Apache Kafka 集群的示例。出自阿帕奇卡夫卡

当代理同时扮演两种角色时,就会出现实时流,通常从消费者接收发送到主题的记录开始,对接收到的信息应用某种处理或任务,最后在不同的主题上再次发布。

传输系统具有以下基本特征:

  1. 允许发布和订阅记录流,类似于消息队列或企业消息传递系统。
  2. 它有一个数据中心,以容错的持久方式存储记录流。
  3. 进程在流发生时记录流。

然后,流编程模型封装数据管道和应用程序,这些数据管道和应用程序对它们接收的记录流进行转换或做出反应。

发布者/订阅者模型的体系结构

首先,让我们解决模型的主要抽象层次:主题

主题是记录发布到的类别或提要名称。它可以被理解为通过某种协议(FTP、TCP/IP、UDP、HTTP、SMTP 等)接收信息的通信信道,并且其信息按照到达的顺序被保留,并且可以被一个以上的咨询源(多订户)访问。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

阿帕奇卡夫卡主题剖析。来自阿帕奇卡夫卡

主题的结构可以根据我们实现的流系统而变化,如果您使用 Apache Kafka,您将有多个分区来确保复制并增加主题信息的可用性。

所有系统的共同点是,主题是由有序的、不可变的记录序列组成的,这些记录被不断追加到结构化提交日志中。主题中的每个记录都被分配了一个称为偏移量的顺序 id 号,它唯一地标识了主题中的每个记录。

另一方面,发布者和订阅者是流媒体系统的外部实体,它们可以通过上述相同的协议与之通信。该模型的一个优点是,发布者和订阅者可以是云系统,可以是用任何语言编写的作业,甚至可以是授权的第三方应用程序。如果需要,这种类型的大多数系统公开库和模板来构建定制客户机。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

发布/订阅通用架构。来自亚马逊网络服务

介绍谷歌云发布/订阅

Google 云平台提供 Pub/Sub 作为异步消息服务,将产生事件的服务与处理事件的服务分离开来。基本上,它允许我们创建主题和订阅渠道,而不必担心存储和分发所需的数据中心基础架构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自谷歌云平台 YouTube 频道

使用 Google Cloud SDK,我们可以为订阅的发布和消费构建我们的客户端,依靠与平台其余服务的原生集成,这显然增加了我们系统在流模型下的潜力。

在 Google Cloud Pub/Sub 中,发布者应用程序创建消息并将其发送给主题。订阅者应用程序创建一个对主题的订阅,以接收来自主题的消息。通信可以是一对多(扇出)、多对一(扇入)和多对多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用 Google Cloud 发布/订阅的发布者和订阅者关系。来自谷歌云平台

谷歌云发布/订阅架构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谷歌云发布/订阅架构流程示例。来自谷歌云平台

Google Cloud Pub/Sub 通过其 API 使用 HTTP 协议通过互联网发送流量,允许灵活地发送记录(批量或在线)和接收记录(异步或同步)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

谷歌云发布/订阅内部架构。来自谷歌云平台

使用此服务的任何解决方案的架构都必须通过 HTTP 将 base 64 格式的记录(称为消息)发送到主题(因此它可以是任何类型的数据),一旦接收到记录,它将在创建主题后的可配置时间内被存储和复制。然后,主题的订阅者接收消息,直到达到最大存储时间,或者直到订阅者用 ack 确认了消息,以先发生的为准。

演示

为了用一个应用程序的例子来解释应用程序和数据流的发布/订阅模型的功能,我将构建一个简单的架构,包含一个主题和一个 Google Cloud 发布/订阅。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

演示架构

演示将包括通过以下步骤构建解决方案:

  1. Google Cloud 发布/订阅主题和订阅创建。
  2. API 连接的设置。
  3. 使用 GCP API 定制 Python 发布者和订阅者编码。
  4. 通过云功能扩展连接可能性。
  5. 面向第三方出版商的 Salesforce Lightning 应用程序示例。

最后,我将展示如何使用 Google Cloud Dataflow 和 Tableau 扩展该架构,以包括数据接收流和实时分析。

Google Cloud 发布/订阅主题和订阅创建。

使用 GCP 控制台创建主题和订阅是一个非常简单的过程。首先,在菜单中查找 Pub/Sub。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

创建一个提供主题 ID 的主题(您可以使用自己的 AES 256 密钥加密主题)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

当主题准备好时,为它创建一个简单的订阅。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GCP 控制台的截图

仅此而已。记下主题和订阅名称,因为稍后会用到它们。

API 连接的设置

为了将我们的应用程序与我们的 Google Cloud 项目连接起来,需要进行身份验证。在这种情况下,为了简化过程并确保安全性,我们将创建两个服务帐户,以 JSON 格式获取它们的凭证,并将它们用作身份验证方法。

第一个服务帐户将用于发布者,它只允许发布到主题权限。转到 IAM >服务帐户。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

创建新的服务帐户,并提供名称和描述(服务帐户 ID 将自动创建)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GCP 控制台的截图

在角色部分中,搜索发布/订阅发布者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

最后创建一个密钥,并以 JSON 格式下载它。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

这就是发布者服务帐户,对于订阅者重复这些步骤,但是将选择的从发布/订阅发布者更改为发布/订阅订阅者。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GCP 控制台的截图

两个服务帐户现在都可以使用了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

使用 GCP API 定制 Python 发布者和订阅者编码。

为了构建这两个定制的客户端,需要一个安装了 google-cloud-pubsub 库的 python 环境。

此外,我们必须创建环境变量 GOOGLE_APPLICATION_CREDENTIALS,它的值将是带有我们之前下载的凭证的 JSON 文件的路径。

在我的例子中,我使用 Anaconda 创建了一个环境,并使用 pip 安装了库。官方安装文件可以在链接中找到。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

本地 Pyhton 环境设置。我将 JSON 文件重命名为一个有意义的名称。

现在环境已经准备好了,我们可以开始为我们的客户编码了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

出版者

使用库和文档编写了一个简单的发布脚本,它将从系统参数中发布一条消息,或者在没有提供参数的情况下发布一条默认值。最后,它将打印消息 ID 作为成功的确认。确保将 topic_name 替换为您的 Google Cloud 发布/订阅主题的名称。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

订户

订阅者获取其他 JSON 凭证,并简单地一个接一个地遍历主题的消息,打印其数据,并对收到的每条消息用预期的 ack 进行响应。

现在,我们已经准备好使用控制台运行我们的客户端进行测试。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Python 客户端演示

可以看出,在发布者客户端发送其消息时,订阅者客户端响应打印该消息。

通过云功能扩展连接可能性

目前,我们有本地客户,他们完成了发行商和订户的基本功能。然而,使用任何类型的客户机来扩展我们的选择将是有趣的,因为我们目前受限于存在连接 API 的编程语言。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大卫·维尔德霍媒体上拍摄的照片

为了解决这个问题,我们将使用 Google Cloud Functions,这是一个无服务器的解决方案,允许我们将发布客户端作为一个 web 服务公开,该服务通过 HTTP 协议接收消息,并使用 API 将它们发送到主题,就像我们刚刚构建的客户端一样。

首先,在 GCP 控制台中寻找云函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

创建一个新函数,键入名称,选择适当的内存分配,并选择 HTTP 作为触发器。此外,出于测试目的,您可以允许未经身份验证的调用,在生产环境中,您会期望每个 HTTP 触发器中都有一个身份验证头。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GCP 控制台的截图

对于源代码,您可以压缩一个完整的环境,并上传为直接文件、云存储中的文件或云源代码中的存储库。对于这个演示,内联编辑器就足够了,选择 Python 3。x 为运行时。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

截图来自 GCP 控制台

大体上。考虑到参数将在 JSON 请求中接收,我们将提供我们的函数代码。我们的本地 publisher 客户端的准确转换如下所示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

main.py

对于另一个选项卡,我们需要提供执行代码所需的库的名称。在这个演示中,我们只需要 google-cloud-pubsub 库。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GCP 控制台的截图

在高级选项中,不需要在 JSON 文件中提供凭证,因为我们可以直接在 GCP 控制台中设置将在每个触发器执行期间使用的服务帐户。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GCP 控制台的截图

另外,不要忘记在要执行的函数字段中提供正确的函数名。就这样,当函数准备就绪时,我们可以使用函数的 url 测试与任何 REST 消费者的连接,在这种情况下,我将使用 SOAP UI。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

SOAP UI 测试

如您所见,我们的客户端订户能够接收使用 Google Cloud Functions web 服务的 SOAP UI 发送的消息。确保媒体类型为应用程序/json。

面向第三方出版商的 Salesforce Lightning 应用程序示例

为了演示我们与任何系统集成的能力是如何扩展的,我决定使用 Salesforce CRM 并在其中构建一个 lightning 应用程序,该应用程序由一个简单的文本字段和一个按钮组成,当按下该按钮时,通过 HTTP 将文本发送到 web 服务。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Salesforce publisher Lightning 应用。截图来自通过 Trailhead 提供的免费 Saleforce 组织

为了避免深入研究这个工具的构造,我将简单地展示当您单击按钮时执行的源代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Apex 中的按钮 onClick 方法,Salesforce 编程语言

如你所见,这是创建一个对象,向 Google Cloud Function URL 发送一个 PUT 类型请求,其主体是一个 JSON,内容类型应用程序/json。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Salesforce 演示

如何包含数据摄取流

通过当前的架构,我们可以将我们的发布者和订阅者连接到任何应用程序,但我们没有考虑到需要对收到的记录进行一个或多个清理过程的情况,也没有及时存储记录。

使用谷歌云数据流,我们可以通过从模板创建一个清理流(或从头创建我们自己的)来扩展我们当前的架构,以将数据存储在数据仓库中,如 BigQuery,该数据仓库可由 Tableau 等分析客户端访问。

在 GCP 控制台的主题详细信息页面中,我们可以创建一个作业,使用 Google Dataflow 将主题的消息导出到 Google BigQuery。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为 Google Cloud 发布/订阅主题创建数据流。截图来自 GCP 控制台

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 GCP 控制台的截图

使用对 BigQuery 模板的云发布/订阅,我们可以创建一个管道,从发布/订阅获取 JSON 编码的消息的云发布/订阅流,通过用户定义的 JavaScript 函数执行转换,并写入预先存在的 BigQuery 表。

然后,在 BigQuery 中,我们可以使用 Google data studio 或 Tableau 等第三方客户端构建实时报告和仪表板。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

完整的架构:流发布/订阅应用+数据流

结论

本文解释了基于流的编程模型的架构和概念,解释了它的架构和与 Google Cloud 发布/订阅工具的使用,最后展示了一个演示,在这个演示中可以证实该模型提供的集成功能,无论是用于创建从流数据中心提供的应用程序,还是用于数据工程和实时报告的 ETL 流。

文献学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值