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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Python 中使用 Selenium 的分步 Web 抓取项目

原文:https://towardsdatascience.com/step-by-step-web-scraping-project-using-selenium-in-python-3be887e6e35c?source=collection_archive---------17-----------------------

选择网站,在 Python 中设置 Selenium,抓取数据并分析。

Selenium 是数据科学中的一个强大工具。它的用途之一是自动收集网站上公开的数据。使用 Python 中的 Selenium,您可以自动化 web 浏览器访问网站上的数据,收集并存储在 MySQL、CSV 文件等中。

这个项目是在华沙大学数据科学研究生学习期间与 T2 的 Jorge Bueno Perez 和 T4 的 Noam Shmuel 一起完成的。

在这个分步指南中,您将看到如何使用 Selenium Python 从网站www.openaq.org获取数据,并创建如下图所示的箱线图。

最终结果将是这样的:

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

显示 2020 年不同欧盟国家空气污染的箱线图

箱线图显示了欧盟国家 PM 2.5 空气污染水平的数据。 PM 2.5 是在空气中测量的颗粒物。简而言之,数字越大,空气质量越差。

我们将通过 Selenium 实现什么自动化:

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

从网站收集 PM 2.5 数据的手动过程

本文涵盖以下主题:

  1. 选择网站
  2. 在 Python 中设置 Selenium
  3. 从网站抓取数据并存储
  4. 使用 Python 中的 Seaborn boxplot 分析数据

1.选择网站

在你决定删除哪个网站之前,一个自然的问题来了——从网站上删除数据合法吗?

如果你想知道网站上是否允许抓取,首先你应该检查链接上的信息:在网站的末尾添加“robots.txt”。例如:www.examplewebsite.com**/robots . txt**

让我们看看我们是否能废弃 Facebook.com。当你打开链接www.Facebook.com**/robots . txt**你会看到以下信息:

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

上面明确写着你需要脸书的特别授权才能销毁这些数据。为了更好地理解 Robots.txt,请点击查看更多信息。

总是建议在知识共享协议下许可的、有开放数据源的或在 Robots.txt 中不禁止抓取的网站上使用抓取。

由于这个项目是非商业性的,并且网站【www.openaq.org】有开放的数据,可以通过多种方式访问,我们决定用它来进行抓取。他们甚至鼓励人们在他们令人敬畏的 FAQ 中使用数据做好事,值得一查!

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

www.openaq.org

收集什么数据?

在这个网站上,我们决定删除关于国家和 PM 2.5 信息的数据。为了做到这一点,我们希望过滤 PM 2.5,并为每个国家访问位置卡。然后复制 PM 2.5 数据(是一个数字)。基本上,我们想做的和下面的 gif 一样。

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

从网站收集 PM 2.5 数据的手动过程

看起来很累很无聊吧?访问大约 100 个国家的页面,每个国家有多达 15 个位置。喔喔喔!!!不会吧。但好消息是 Selenium 可以为我们实现自动化。但是!我们需要设置这个。

2.在 Python 中设置 Selenium

你应该在你的电脑里安装 Selenium。只需在命令提示符下键入pip install selenium(对于 Windows)并按回车键。有关安装的更多详细信息,请参见 Selenium 文档

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

从命令提示符安装 Selenium

然后你需要一个驱动程序,作为 Selenium 访问你的浏览器的桥梁。就我而言,我为 Mozilla Firefox 下载了一个 geckodriver 。取决于您的版本,您可以从这里下载:

火狐:https://github.com/mozilla/geckodriver/releases

考虑到你下载了 geckodriver ,将其解压,并复制粘贴geckodriver.exe到你的 python 所在的文件夹中。

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

将 geckodrive.exe 复制粘贴到 python app 所在的文件夹中(我的案例)

创建一个. py 文件并导入主库和包。

Selenium 的主要库和包

然后我们需要找到到我们的geckodriver.exe的路径,并用 python 代码设置 webdriver,如下所示。

Python 中的 WebDriver 设置

3.从网站抓取数据并存储

抓取工作流程如下所示:

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

刮擦 4 步工作流程

3.1 获取过滤器中的国家名称

我们需要与过滤器中的国家名称完全相同的拼写。从过滤器中获取值似乎有点困难。相反,我们可以从这个链接中获得所有国家的名称。它们将具有相同的拼写。

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

如果您右键单击国家名称并转到 Inspect 元素,您将看到国家名称保存在 class card__title 中。

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

废弃国名代码的主要部分如下所示:(全称)

结果是一个保存在 CSV 文件中的国家列表。

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

3.2 获取每个国家页面的链接

我们希望有网站时,每个国家都在过滤器中选择迭代。我们将使用刚刚生成的 CSV 文件中的国家名称。

我们要删除的链接:

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

以奥地利网站为例

代码:

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

Github Gist 上的代码

此步骤的结果是生成包含国家/地区& country_url(某个国家/地区的网站)的 CSV 文件。完整的代码是这里是。这些链接将在下一步中使用。

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

在步骤 3.2 中生成的 CSV 文件

3.3 从一个国家的页面,获取每个位置卡的链接

基本上,我们希望获得访问每个位置卡的链接:

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

访问每个位置卡的链接

我们可以通过类名删除位置卡的链接,并检索 href。

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

检查位置卡标题、类名和 href 的元素

刮位置卡链接功能及代码:(全代码)

3.4 打开位置卡,废弃 PM 2.5 数据

这是刮的最后一步。由于我们有每个位置卡的链接,我们可以访问每个卡上的 PM 2.5 数据并将其废弃。此外,我们将废弃同一页上的位置城市和国家。

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

AT2KA21 的位置卡

用 XPath 获取 PM 2.5 数据并分成不同的变量:(完整代码)

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

用 XPath 获取 PM 2.5 数据,Github Gist 上的代码

获取位置细节并分解成变量:

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

获取位置细节,Github Gist 上的代码

如果您看到完整的代码,我们会将在这一步收集的所有数据保存到 CSV 文件中。

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

步骤 3.4 的结果

4.使用 Python 中的 Seaborn boxplot 分析数据

在我们创建 Seaborn 箱线图之前,有几个数据操作步骤。过滤数据 PM 2.5 > 0;日期创建于 2020 年,仅限欧盟国家:

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

Github Gist 上的过滤代码

Seaborn Boxplot 的背景:

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

Github Gist 上的 Seaborn Boxplot 代码

结果是:

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

显示 2020 年不同欧盟国家空气污染的箱线图

逐步使用 Flask & Python 部署自定义对象检测

原文:https://towardsdatascience.com/step-by-step-yolo-model-deployment-in-localhost-using-python-8537e93a1784?source=collection_archive---------2-----------------------

自定义对象检测本地主机部署

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

照片由埃米尔·佩龙Unsplash 上拍摄

你只看一次(YOLO)是一个最先进的,实时对象检测系统。最新版本是 YOLOV5。这些 YOLO 型号以速度著称。他们可以在几秒钟内检测到视频帧中的多个对象。与 EfficientDet 和 RetinaNet 等模型相比,YOLO 模型的推理时间更短。YOLO 以其检测图像/视频中物体的速度而闻名。如果您的使用案例更关注多个对象的实时检测,那么 YOLO 是最合适的。现在,我们有 YOLO V5,它的小型版本大约有 476 FPS

在本文中,我将带您完成在 localhost 中部署您自己的定制 YOLO 模型的步骤。

那我们开始吧

在这里,我将简要介绍所有其他步骤,因为我们的议程是部署模型并在我们的网站上使用它。

  1. **抓取图像进行标注:**这是第一步。在这里,你可以去谷歌搜索你想要定制的图片。或者,您可以四处查看并单击对象的照片,然后为模型收集这些照片。这是你的选择,你希望你的模型有多好。
  2. **给你的图片贴标签。**为这一步提供大量数据,因为这对您的准确性至关重要。您可以使用任何工具来标注数据。没有自动标记自定义数据的方法。你必须手动操作。这是客体滞留中最令人沮丧也是最费时的部分,但是如果你把你的奉献给这一部分,你肯定会得到一个丰硕的成果。我使用了“LabelImg”工具进行标注。要了解更多关于“LabelImg”工具如何工作的信息,请阅读本文如何为对象检测标记图像
  3. 选择物体检测算法这里,我们将使用 YOLO-泰尼。并且,您可以在此处参考自定义对象检测代码。https://github.com/pranjalAI/Yolo-tiny-insurance还有许多其他方法用于对象检测,如 SSD、Yolo 等。
  4. 从第 3 步获得 Yolo 权重文件后,您需要转换 Yolo 生成的暗网模型。权重文件到 TensorFlow 服务,以便我们可以使用 TensorFlow 服务到我们的网页。

如果你已经到达这里。干杯!!你做得很好。您已经准备好将您的模型投入生产。

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

威尔·斯图尔特在 Unsplash 上拍摄的照片

皈依。重量文件是暗网格式到 TensorFlow 格式,你需要按照以下步骤。

暗网转张量流

克隆这个目录https://github.com/pranjalAI/tensorflow-yolov4-tflite

使用命令提示符进入目录。

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

照片由沙哈达特·拉赫曼Unsplash 上拍摄

现在,您需要安装一些依赖项/库。

安装库

如果您安装了 anaconda,那么您需要按照这个步骤在一个环境中安装所有需要的库。这将创造一个新的环境。环境名可以在。yml 文件。

# Tensorflow CPU
conda env create -f conda-cpu.yml
conda activate yolov4-cpu# Tensorflow GPU
conda env create -f conda-gpu.yml
conda activate yolov4-gpu

如果您没有安装 conda,那么请使用 pip 命令。我建议使用康达。

# TensorFlow CPU
pip install -r requirements.txt# TensorFlow GPU
pip install -r requirements-gpu.txt

因此,创建了具有各自依赖性的新环境。现在,要使用新创建的环境,您需要激活它。(这一步是为那些正在使用康达创造环境的人准备的。)

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

粘土堤Unsplash 上拍照

激活环境

康达激活 yolov4-gpu

这里“yolov4-gpu”是环境名。您可以在中更改它。yml 文件。(这一步是为那些正在使用康达创造环境的人准备的。)如果您正在使用 pip,则直接进行下一步。

现在,如果您进入了刚刚克隆的文件夹,并且已经激活了环境,最后,您需要在克隆的文件夹中进行两项更改。

首先,复制并粘贴您的自定义。重量文件,你用你的 Yolo 模型训练,到’数据’文件夹,并复制和粘贴您的自定义。“数据/类/”文件夹中。

其次,您需要对代码进行的唯一更改是在“core/config.py”文件的第 14 行。更新代码以指向您的自定义。名称文件如下所示。(我的习俗。names 文件称为 custom.names,但您的名称可能不同)

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

**注意:**如果你使用的是预先训练好的 yolov4,那么确保第 14 行仍然是 coco.names

开始了。!现在,我们需要一个命令行来使代码 TensorFlow 兼容

[## 程序员的 9 个方便的 Python 函数

根据我个人的脚本编写经验

medium.com](https://medium.com/better-programming/9-handy-python-functions-for-programmers-cc391a59acc7)

python save_model.py - weights。/data/your _ weight _ file . weights-output。/check points/yolo-tiny-416-input _ size 416-型号 yolov4

这里,416 是您在训练 yolo-tiny 时在配置文件中定义的图像大小。运行上述命令后,您将获得一个. pb 文件

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

现在,您需要在检测对象时给出这个文件夹的位置。现在,喝杯茶。搜索您可以使用的任何 HTML 模板。我们可以在这里讨论一些 HTML 的东西,但是,我们将在下次做。这里,我假设您已经准备好了一个演示网页。

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

照片由曼基·金Unsplash 上拍摄

使用 flask 服务 TensorFlow 模型

现在我们有了 TensorFlow 服务模型。现在,我们需要使用 flask 将它提供给我们的网页。

现在,将这个最终的对象检测和裁剪代码粘贴到您获得 TensorFlow 服务模型的同一个根文件夹中(检查上面的步骤)。

现在,您的 flask 应用程序将调用它来检测图像。

最终演示

工作演示

所以,恭喜你!您刚刚使用 Flask 在本地主机上部署了第一个自定义对象检测模型。尝试使用您的自定义对象,并对您部署的自定义对象检测模型进行注释。

在你走之前……

如果你喜欢这篇文章,并且想继续关注更多关于 Python &数据科学精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。

请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。

还有,可以随时订阅我的免费简讯: Pranjal 的简讯

用 Python 升级你的正则表达式游戏

原文:https://towardsdatascience.com/step-up-your-regex-game-in-python-1ec20c5d65f?source=collection_archive---------13-----------------------

Python 中使用正则表达式的高级文本操作

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

照片由本·怀特Unsplash 上拍摄

正则表达式(RegEx)是最好的工具之一。我可能有偏见,因为我的大部分工作都集中在自然语言处理(NLP)上,但是不管有没有 NLP,我发现自己一次又一次地求助于正则表达式。

我绝不是专家,有很多东西我不知道——但是我已经经常使用正则表达式好几年了,所以我对它们足够了解。

在这篇文章中,我想分享一些 regex 方法,我认为它们稍微高级一些,但是非常有用。我们还将包含实际的代码,以便我们能够正确地理解正在发生的事情。我们将涵盖:

**Look-ahead/behind Assertions** - (?>= ) | (?= ) | (?>! ) | (?! )
**Modifiers** - (?sm)
**Conditionals (If|Else)** - (...)?(?(1)True|False)

前瞻/后见断言

这些是我用过的最有用的正则表达式方法。

靠近页面顶部是我的名字,在 HTML 中是我的用户名。看起来是这样的:

<a href="/**@jamescalam**?source=post_page-----22e4e63463af----------------------" class="cg ch au av aw ax ay az ba bb it be ck cl" rel="noopener">James Briggs</a>

假设我们现在感兴趣的是从页面的 HTML 中提取用户名,我们已经提取了所有的<a>元素,并将使用 RegEx 来识别和提取用户名。

我们可以做一些乱七八糟的事情,像这样:

if '<a href"/@' in a:
    username = a.replace('<a href="/', '')
    username = username.split('?source')[0]

但是使用后视和前瞻断言,我们会得到更动态、更灵活的逻辑,如下所示:

if bool(re.search(r'**(?=<\/)'@.*(?=\?source)**', a)):
    username = re.search(r'**(?=>\/)'@.*(?=\?source)**', a).group()

这里将从这个(或任何文章)页面上的<a>元素中提取任何用户名。但是它看起来很复杂——所以让我们把问题简化一点。

向后看

后视断言告诉我们的 regex to assert 任何潜在的匹配都是在之前给出给断言的模式。让我们比较有和没有这个断言的正则表达式:

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

这里,我们没有使用回顾断言——因为我们只搜索 hello world ,我们返回两个匹配。截图来自 Regex101

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

通过为’ 1: ‘添加一个回顾断言(突出显示),我们只匹配前面有’ 1: '的 hello world 。截图来自 Regex101

在这里,我们告诉我们的断言,断言1: 先于hello world

当然,我们也可以仅将第一个 hello world 与"1: hello world"匹配,但是这将在我们的匹配中包括"1: "——无论什么包含在我们的断言中,在匹配的输出中都不包括**。**

  • 回顾过去——我们在回顾我们的模式。
  • 断言 —我们断言这个其他模式的存在,但是我们并不匹配它(例如包含在我们输出的文本中)。

向前看

我确信,在理解了“看- 后面的断言之后,一个“看- 前面的断言的行为是可以预见的。让我们确保我们的 hello world 后面跟着一个**,**:

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

通过为’'添加一个前瞻断言(突出显示),我们只匹配后面跟有逗号的 hello world 。截图来自 Regex101

底片

我们刚刚讨论的两个断言都是肯定的断言——我们断言我们的匹配模式在我们的断言模式之前/之后。

然而,我们经常需要断言我们的模式是而不是紧挨着另一个。为此,我们分别使用回顾和前瞻断言的否定形式— **(?<! )****(?! )**

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

负的后视断言(左)和负的前视断言(右)。截图来自 Regex101

在实践中

为此,我们将使用安然电子邮件数据集。我们有两列,filemessage——我们想要的一切都在message中。如果我们看一下第一个message列,我们会发现:

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

我们希望从这些数据中提取出Message-IDDate

我们可以这样写:

def boring_extract(msg):
    msg = msg.splitlines()
    **msg_id** = ''.join(
                 msg[0].replace(
                     'Message-ID: <', ''
                 ).split('.')[:2]
             )
    **time** = msg[1].replace('Date: ', '')[-5:]

现在,这看起来很糟糕,并且将需要很长时间来运行——它也根本不是动态的,如果由于某种原因,数据或DateFrom开关位置中的某个字段丢失了,该怎么办?—代码会被破解。

这就是我们使用正则表达式的地方,严重依赖于前瞻和后视断言。让我们比较使用和不使用正则表达式的代码:

**Message-ID**

**No RegEx**
msg = msg.splitlines()
msg_id = msg[0].replace('Message-ID <', '')
msg_id = msg_id[0].split('.')[:2]
msg_id = ''.join(msg_id)**With RegEx**
msg_id = re.search(r'**(?<=Message-ID: <)**\d+.\d+**(?=.)**', msg).group()

**Date**

**No Regex**
msg = msg.splitlines()
time = msg[1].replace('Date: ', '')[-5:]**With RegEx**
time = re.search(r'**(?<=Date: )**.***(?= \(\w\w\w\))**', msg).group()

Message-IDDate正则表达式中,我们都以**(?<= )**开始,以**(?= )**结束——分别是积极的后视和前瞻断言。对于上面的例子,我们为msg_idtime输出如下:

**[Out]:** 18782981.1075855378110

**[Out]:** Mon, 14 May 2001 16:39:00 -0700

修饰语

同样,RegEx 的一个非常有用的特性。修饰符允许我们修改正则表达式的行为。

例如,以单行修饰符**s**为例——这将把.*的行为从包括新行改为包括新行:

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

不带单行全局修改器(左)和带单行全局修改器(右)—右上角的标志 s 表示我们已经应用了该修改器。截图来自 Regex101

只需添加这个标志就可以改变正则表达式的行为。有一大堆不同的修改器,我们甚至可以合并它们来创建更具体和独特的行为。这些改性剂中最常见的包括:

**Single line [s]** - Allows the **.** metacharacter (which matches everything **except** newlines) to match newlines too**Multi-line [m]** - **^** and **$** now match the **beginning/end of lines**, rather than default behavior of matching beggining/end of entire string**Insensitive [i]** - Upper **and** lower-case characters are matched, e.g. **A = a****Extended [x]** - **Ignores whitespace**. To include spaces, they must be escaped using **\**. Also allows comments inside the regex with **#****ASCII [a]** - Match to **ASCII-only** characters, rather than the full Unicode character set

在 Python 中,我们可以用两种方式实现这些修饰符。

(1)修饰符标志在表达式之外实现,作为函数的附加参数,它们应用于整个正则表达式。添加单行修饰符和不敏感修饰符将如下所示:

re.match('[a-z]+01.*', text, **re.S|re.I**)

注意,我们使用按位 OR (|)将多个修饰符串在一起。

(2)行内修饰符在表达式中使用(? )语法——其中修饰符标记跟在?后面。实现单行和不敏感修饰符只需要(?**si**),就像这样:

re.match('**(?si)**[a-z]+01.*', text)

根据语言的不同,RegEx 实际上可以支持模式子部分中的修改行为——使用内联修饰符(? )来启动行为,使用(?- )来关闭修饰符:

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

使用内联修饰符修改正则表达式的一个子部分——注意这在 Python 中不会起作用。

然而,这个负的内联修饰符在 Python 中不受支持,一个内联修饰符(放在任何地方)将影响整个模式——而不仅仅是它的一部分。

我从未遇到过这样有用的问题——所以我不认为我们在这方面错过了什么。

条件句(If | Else)

RegEx 中的条件语句真的很酷——尽管可能有点特殊。

就像 Python 中的if else语句一样,我们可以在正则表达式中集成相同的逻辑。它的工作原理是说:

好吧,我们的模式匹配吗?(hello)?(?(1)

如果是这样——现在我们匹配模式 A,(?(1) world|

否则—我们匹配模式 b。bye)

合在一起,这给了我们(hello)?(?(1) world| bye)

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

使用条件语句的正则表达式示例。截图来自 Regex101

第一部分是我们的捕获组**(hello)**——分配给(1),因为它是我们的正则表达式中的第一个捕获组。通过添加?,我们使这个匹配成为可选的(否则,它将只在 true 时匹配)。

然后我们问一个问题?(1)——意思是捕获组(1)匹配吗?

如果匹配,我们的正则表达式将尝试匹配逻辑语句中的第一个参数world

或者,如果捕获组(1)不匹配—我们的正则表达式将尝试匹配语句中的第二个参数bye

如果我们在 Python 中测试,我们会看到相同的结果:

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

本文到此为止,在处理文本时,在 RegEx 中使用这三个特性可以给代码带来巨大的变化。它们都是我生活中不可或缺的特征。

我希望您从这篇文章中学到了一些东西,并且会像我一样发现这些特性很有用。如果您有任何建议或问题,请随时通过 Twitter 或在下面的评论中联系我们。

感谢阅读!

有兴趣学习更多的正则表达式吗?我写了这篇关于使用正则表达式解析 Python 代码来构建自动文档工具的文章,请随意尝试一下!

[## Python 的自动文档

编写代码很无聊,为什么要浪费时间呢?

towardsdatascience.com](/auto-docs-for-python-b545ce372e2d)

Jupyter 用户的生产力提示

原文:https://towardsdatascience.com/stepping-into-intermediate-with-jupyter-f6647aeb1184?source=collection_archive---------21-----------------------

数据科学

使用 Jupyter 笔记本和 JupyterLab 让您的工作流程更加高效

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

里卡多·戈麦斯·安吉尔在 Unsplash 上的照片

**Table of Contents**[**Introduction**](#6439)1\. [Startup files](#9431)
2\. [Auto reload](#809c)
3\. [Multi-cursor](#fe1b)
4\. [Exit confirmation](#e064)
5\. [Update you python packages](#4b45)
6\. [Copying cells from another file](#83e1)

介绍

要成为一个高效的 Jupyter 用户,有几件事你需要知道。在这篇文章中,我将通过六个技巧来提高你的工作效率。这些提示在 Jupyter 笔记本和 Jupyter 实验室都有效。

有关 Jupyter hacks 和版本控制的更多信息,请阅读这些文章。

启动文件

如果你一次又一次地输入同样的东西,启动文件就是你的解决方案。Jupyter 笔记本将自动访问启动文件夹中的文件。一般 Mac 中默认位置是/Users/<your_profile>/.ipython/profile_default/startup

您可以通过在 Jypyter 笔记本单元中运行这个命令来找到您的启动目录。

get_ipython().profile_dir.startup_dir

输出可以是这样的。

'/Users/<your_profile>/.ipython/profile_default/startup'

当您启动 Jupyter Notebook 时,可以在此目录下创建一个或多个要运行的文件。

例如,创建一个名为 00-startup.py 的文件,并添加以下代码。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
get_ipython().magic('matplotlib inline')

当你使用魔法%时,你需要使用如上图所示的get_ipython().magic()

重启你的 Jupyter 笔记本。可以不用进口熊猫或者 Numpy。

您可以根据需要添加更多库。示例

[## 如何在 Docker 上运行 Jupyter 笔记本

不再有 Python 环境和包更新

towardsdatascience.com](/how-to-run-jupyter-notebook-on-docker-7c9748ed209f)

自动重新加载

当你修改一个导入的文件时,你必须重启内核。但是autoreload在进入执行单元之前会自动重新加载模块。

您可以将它添加到其中一个单元格中并执行它。

%load_ext autoreload
%autoreload 2

通过保存修改后的文件,它可以在另一个文件中自动重新加载。

如果您想一直启用此设置,您可以将其添加到~/.ipython/profile_default/ipython_config.py

如果没有文件,可以先打ipython profile create

ipython profile create
[ProfileCreate] Generating default config file: '/Users/yourname/.ipython/profile_default/ipython_config.py'
[ProfileCreate] Generating default config file: '/Users/yourname/.ipython/profile_default/ipython_kernel_config.py'

第 31 行左右:

# ~/.ipython/profile_default/ipython_config.py

c.InteractiveShellApp.exec_lines = ['%autoreload 2']

c.InteractiveShellApp.extensions = ['autoreload']

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

自动重新加载正在运行。

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

多光标

您可以用光标选择多个位置。点按您想要开始的位置,按下 Option 键,拖移光标,开始键入。您可以使用 Cmd+右箭头键跳到每一行的最右边。

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

退出确认

有多少次你在按 Ctrl+C 键关机后输入 y 并按下 return 键?您可以通过按 Ctrl+C 两次来跳过它。

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

更新您的 python 包

你是否定期更新 python 包?

检查您需要更新的软件包。这将列出过时的软件包。

pip list -o
# or
pip list --outdated

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

你可以运行install -U来更新一个包。

pip install -U package

如果你想一次更新所有的包,在你的终端上运行这个。

pip list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1  | xargs -n1 pip install -U

pip check验证哪些已安装的软件包具有兼容的依赖关系。如果发现问题,需要使用pip install 'packagename==0.14.1'安装正确的版本。

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

其他有用的命令有:

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

pip 参考

从另一个文件复制单元格

在 Jupyter Notebook 中,您可以通过按 cmd+v 两次从另一个文件复制粘贴。如果你只按一次,你会得到下面的警告。在 JupyterLab 中,您需要使用c来复制一个或多个单元格,并使用v将其粘贴到另一个文件中。

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

我希望这些建议能帮助你提高工作效率。你最喜欢的小费是什么?

通过 成为 会员,获得媒体上所有故事的访问权限。

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

https://blog.codewithshin.com/subscribe

关于 Jupyter 的更多文章

[## 使用 Jupyter 笔记本进行版本控制

Jupytext 分步指南

towardsdatascience.com](/version-control-with-jupyter-notebook-b9630bc5996e) [## Jupyter 的技巧和窍门

Jupyter 技巧和提示的集合

medium.com](https://medium.com/series/jupyter-hacks-and-tips-1b1a3a10bc79) [## 如何在 Jupyter 中创建一个有吸引力的气泡图

从 Github repo 抓取数据的分步指南

towardsdatascience.com](/how-to-create-an-attractive-bubble-map-5cf452c244e9) [## 手把手的 Jupyter 笔记本黑客

您应该使用的技巧、提示和快捷方式

towardsdatascience.com](/hands-on-jupyter-notebook-hacks-f59f313df12b) [## 用 Jupyter 笔记本写作的 7 个基本技巧

第一篇数据科学文章指南

towardsdatascience.com](/7-essential-tips-for-writing-with-jupyter-notebook-60972a1a8901)

赢得系统设计面试的步骤

原文:https://towardsdatascience.com/steps-to-ace-the-system-design-interview-1908ffb77b9b?source=collection_archive---------33-----------------------

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

约翰娜·布格特在 Unsplash 上的照片

(这个帖子也在我的博客里)

澄清

系统设计面试和编码面试一样,不仅测试候选人的技术技能,还验证候选人是否能解决一个没有很好定义的问题。问题问得模糊笼统。候选人的工作是找出需求并提出合适的设计。应聘者在得到问题后马上投入设计是一个常见的错误。对于 Twitter 上的 design 这样的问题,你可能需要弄清楚需要考虑哪些核心功能,注册?简介?文字推文?视频/图片推文?时间线?其他技术要求可能是每秒读写?请求的峰值/平均值?用户基本位置?

工作解决方案的关键组件

一旦你有了需求,你就可以开始考虑系统或者子系统的结构,如果它是针对一个以上的特性的话。首先找出一个可行的解决方案总是好的,而不是试图提出一个完美的最优解决方案。试着想出一个包含所有必要组件的简单系统。在白板上展示系统。组件包括应用服务器、数据存储(SQL 或 NoSQL)、代理、CDN、消息队列、事件总线等。选择基本解决方案所需的组件。解释为什么需要这些组件,它们应该如何连接在一起,以及用户如何与系统交互。

列出 API

API 是组件间通信的表达。能够设计一套逻辑 API 是候选人的优势。对于 RESTful API,最好遵循 REST 惯例,使用适合 CRUD 等资源操作的 HTTP 动词。路径应该是代表资源的名词。这也有助于展示您可以在设计中正确地使用查询参数和请求体。

最佳化

然后,你需要优化系统。当考虑优化时,你需要优化正确的东西。最好是针对常见用例进行优化。例如,如果从数据库中读取数据比向数据库中写入数据更常见,那么在数据请求者和持久数据存储之间引入缓存是有意义的。它有助于更快地提供热数据,并且缓存失效的频率会降低,因为写操作并不多。但是,为写入密集型系统引入缓存会对性能产生负面影响,因为这将经常导致缓存失效。其他优化可以是根据用户的位置将请求分配到不同的数据中心。将数据库划分为碎片来处理请求。正确设计表中的键,使请求流量均匀分布到分区。

可量测性

随着用户群的增长会怎么样?毫无疑问,您将需要设计一个水平可伸缩的系统。水平可伸缩性意味着系统可以通过增加越来越多的商用计算能力来处理更多的请求。这比增加一台服务器的马力更具成本效益。

交易

毫无疑问,你听说过很多流行的软件来构建一个分布式系统。比如 MongoDB,ElasticSearch,Memcached,Kafka 等等。然而,随意向面试官抛出这些流行语并不足以打动他们。对你来说,解释选择和为什么不选择另一个是很重要的。比如 MongoDB 给你的好处有哪些是 MySQL 不会的?也许你的应用程序并不关心数据模型之间的关系,比起强一致性,它更喜欢更好的性能。再比如,为什么你会更喜欢用 Kafka 构建事件驱动的系统。也许您的业务逻辑是一个长流程,需要异步完成。也许你有一些子系统需要知道这个事件。

错误处理

软件从来都不是完美的,所以作为候选人,你应该解释你的系统是如何处理错误的。一个关键点是,您能够识别单点故障,并提供解决方案来降低整个系统的故障率。另一个常见的错误场景是流量太大,系统无法处理。一种常见解决方案是节流。节流是限制系统请求数量的过程。通过限制每个客户端的请求数量,系统可以具有相对可预测的工作负载。因此,它也有助于计划社交。

临终遗言

这些是您在系统设计面试中需要考虑的一些要点。如果您想了解更多关于系统设计的技术细节,我推荐使用设计数据密集型应用研究系统设计作为准备的参考。祝你好运。

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

以前的帖子:

我关于 FAANG 访谈的帖子

我关于金融和科技的帖子

神经网络、计算机视觉和自动驾驶汽车之间的关系

原文:https://towardsdatascience.com/stereo-vision-neural-nets-and-demand-in-autonomous-vehicles-6a9b6e6de41c?source=collection_archive---------41-----------------------

自动驾驶汽车(AV)正在大力发展,许多公司在这方面投资了数百万美元。2017 年,福特投资 Argo AI 生产自动驾驶技术。Argo AI 随后与卡耐基梅隆大学合作,在 T2 投资了 1500 万美元用于 AV 研究。

其他公司也纷纷效仿,包括韩国汽车制造商现代和日本巨头丰田分别投入17 亿6 . 67 亿

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

来源:Self,特斯拉网络卡车大会 via Carscoops |有些公司确实比其他公司更挣扎

管理咨询公司麦肯锡公司(Mckinsey & Company)估计,2015 年至 2030 年将是以研发为重点的 AVs 商业化应用的第一个时代。据预测,从 2030 年及以后,消费者将更频繁地购买 AVs。目前,随着买家的疲惫,公司正努力与目标市场建立联系,需求增加可能还需要一段时间。

研究兴趣和资金随时可用,因此现在是试验各种 AV 技术的最佳时机,如视觉系统。当前的视觉系统通过用景深数据辅助其运动估计算法来充当车辆的眼睛。最大的两个竞争对手是激光雷达(光探测和测距)和立体视觉

什么是激光雷达为什么要用?

激光雷达是一种激光扫描仪,它产生点云,提供周围环境的 3D 重建,允许深度和海拔估计。

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

来源:丹尼尔 l 卢 via 维基媒体旧金山十字路口的点云

激光雷达的工作原理是将一束光射到一面旋转的镜子上,光线被反射到多个方向。一旦射线返回,它被反射回扫描仪,扫描仪测量物体有多远。

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

来源: Steven Waslander via ME597 在滑铁卢大学用于激光雷达的旋转镜和扫描仪

由于光的波粒二象性,光线可以表示为正弦函数。发出的光线和返回的光线会产生相移。给定相移和已知射线波长,计算距离;这个过程重复得非常快,并产生一个详细的地图。

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

来源: Steven Waslander via ME597 在滑铁卢大学激光雷达扫描仪应用的相移&距离推导演示

由于扫描仪和反射镜所需的精度,激光雷达系统可能会很贵,根据所需的自主性和应用水平,市场价格从 1 000 美元到 75 000 美元不等。

立体视觉呢?

立体视觉是一种有趣的替代方式,它使用多相机设置来估计深度,令人惊讶的是,它是基于人类如何做到这一点的!

实验时间到了

现在试试这个:闭上你的右眼,把你的手指放在你的面前,集中注意力。现在闭上另一只眼睛,重复这个动作。

如果你很难做到这一点,不要担心,有一个 Wikihow 可用

好了,现在你做完了,你的手指动了一下,对吗?

别担心,你的眼睛工作正常,这是它们的几何学的结果。你所经历的现象被称为视差,当从两条不同的视线看到一幅图像时,这种现象就会发生,因此,图像看起来会移动。在这种情况下,两条视线就是你的眼睛。

将几何学用于视差的动机

用双眼正面盯着一个物体会产生深度,因为我们自己的视觉似乎是会聚的。这类似于一张透视照片,所有平行线相交于某个遥远的地平线点。

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

来源:Diego Delso via Wikimedia|透视信息丢失,相机需要额外处理才能重现

然而,相机拍摄的图像不能像我们的眼睛那样创造深度。

图像将世界的 3D 视图转换成 2D 投影。更正式地说,这导致一条线转变成一个点。在欧几里得空间,即包含在 2D 平面中的几何空间中,平行线不能像在透视图像中那样与相交(透视图像属于射影空间)。这由左边所示的线表示,尽管它对应于不同距离处的独特点,但相机无法分辨。从摄像机的角度来看,它看到的是一个点 x 而不是线 OX

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

来源: OpenCV 文档 |立体设置涉及极线几何关联两个相机投影;注意尾线如何穿过可能解决方案处的l’

相机不能像我们的大脑一样相互通信,以帮助我们的眼睛产生图像。这导致在不同角度拍摄的同一图像的两个平面投影。所有深度信息都已丢失。然而,通过对两个投影进行三角测量,应用一些几何图形,并使用视差,相机可以相互关联以解析地求解距离。

上面显示的双摄像头设置是深度估计的基础,它被称为立体视觉。

有关坐标转换和相机的更多信息,请阅读这篇关于相机校准的文章

数学估算深度

推导和量化深度的视差效果是数学密集型的。如果你只对主公式感兴趣,请跳到这一小节的末尾。

有关推导,请参考上一小节中的图表。

假设两个摄像机都位于中心 O 和*O’*处,它们在 X 处会聚。

线 OX 在左投影平面上显示为一个点 x 。然而,当从右投影平面观察时,有一组对应的点,x’,它们在称为极线l’的平面中形成一条线。这表示深度并证明点 x 实际上是一条线OX;现在的任务是确定 x T21 在哪里。

沿着 OX 可以画出称为延长线的特殊线条,在*O’*处汇合。通过检查每条核线可以找到点 x ,直到找到一条与 x 相交的核线,这个解就是**核线约束。**多个 X 的指示,每一个都与一个特定的外延线相匹配,暗示该点的可能解决方案 x.

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

来源: OpenCV 文档 | 通过外极线 O’X 解决外极线约束;注意在 xOf、x’o’f 和 OO’x处形成的三个相似三角形

现在,这个问题可以从自上而下的角度重新审视。

给定对极线约束的特定解, x ,其在相对平面中的对应点,x’,视线 OX 和相对相机的对极线,*O’x,*深度可以被求解。

点 *x 和 x’*在不同的深度。

两条线, OXO’x处于不同的角度,但是可以通过等价的三角形来关联,这就是为什么差(x-x’)等于参数: B,f,Z(下面等式中的)。(x—x’)的差值就是视差 : 视差误差的数值度量。

更正式地,视差指的是两个相似区域的坐标距离(从任一图像投影来看)。视差与 深度 *、Z、*成反比关系,通过求解等价三角关系得到证明。

对于更近的物体,视差更明显,这表明当同一点出现在两个投影的不同位置时,视差很大。由于反比关系,它必须对应于一个短的深度。

用前面一节中展示的实验来验证上述假设。你的观察应该与定义的数学关系相匹配。

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

来源: OpenCV Docs | 视差计算用于隔离,求解深度:Z

x 的值通过极线约束求解,并且*x’*通过检查对面摄像机的图像投影得知。给定相机、 B焦距f 之间的一些距离,然后可以计算出 Z

将此应用于场景的所有像素产生一个视差图,它通过颜色指示深度。

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

来源: OpenCV 文档 |浅灰色物体更近,深灰色物体更远视差图

有关立体视觉和 3D 重建的更多信息,请访问 OpenCV 的文档Rich Radke 博士的 ECE6969 课程

立体视觉的缺陷与改进

虽然立体视觉不贵,但它的主要问题是处理时间。理想情况下,在 AVs 中,大多数系统将接近实时工作。然而由于解决极线约束需要很长时间,立体视觉系统本身无法足够快地工作。为了减少计算时间,正在研究使用机器学习来改进立体声系统并加速它们。

通过机器学习的立体视觉

在深入神经网络的细节之前,理解什么是图像是关键:一个图像是一个 2D 数字数组,每个数组元素是一个像素值。

由于这种结构,卷积神经网络(CNN)是理想的,因为它们在图像上应用滑动过滤器,将图像下采样为代表其可能值的单个向量。向量被传递到一个完全连接的网络,该网络为每个值分配概率,并输出最可能的匹配作为预测。

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

来源: Aphex34 via Wikimedia |典型的**神经网络架构:**对图像进行子采样,馈入全连通层并输出预测

为了了解更多关于 CNN 和神经网络的知识,迈克·庞德博士提供了简短的解释,正式的概念可以在斯坦福大学的视频讲座中找到。

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

罗,G. Swing,Urtasun Via 多伦多大学计算机科学系暹罗 CNN 架构学习分发

至于立体系统,图像被分割成左右两个投影,一次分析一个小区域。两个投影都被馈送到一个 连体 CNN ,其同时为左右投影中的对应区域上的视差创建一组可能的概率分布。然后,该组可能性被传递到一个全连接层*,该层输出原始图像的单个片上最可能的视差分布。*

这意味着网络以被称为概率分布连续函数的形式输出差异的可能值的范围*。*

概率分布代表结果发生的可能性,其中组结果显示在 x 轴上。随机变量包含这些结果作为可能的值。每个结果都有相应的可能性显示在 y 轴上。

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

来源: Atakbi1 via Wikimedia |一种叫做高斯分布的概率分布,最大值在中心(平均值)。以上 CNN 产生独特的概率分布

按照上面的 CNN,x 轴将填充视差值,y 轴填充这些差异是正确的可能性。CNN 学习并预测分布的*形状。*通过找到分布的最大值点,使用单独的算法来找到最可能的视差。

暹罗 CNN 设计允许对应于不同图像区域的差异被关联,这可能表明那些区域是同一表面的一部分。

暹罗 CNN 架构的扩展

先前的网络比较了左右投影并优化了匹配成本。这意味着在两个投影中搜索指向同一部分的补片。一旦找到,每个补片将被用于计算视差,给出该补片相对于平面的位置。由于已经找到了精确的点,这些网络围绕着解决极线约束的过程工作。

上面讨论的连体 CNN 是对过去网络的改进。通过改变优化参数来学习可能差异的分布,消除了计算差异的*需要。*取而代之的是,选择最有可能的视差,这使得连体 CNN 架构比其前身运行得更快。

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

Martin thoma via Wikimedia|扩展深度估计,共同解决语义分割等其他视觉任务

在过去,网络已经实现了组合解决方案,其中统一解决了对象识别和深度估计。因此,找到相关的差异可以扩展连体 CNN 设计,以允许其他视觉任务

自主视觉的未来

行业领导者 Waymo 使用激光雷达系统,特斯拉创始人埃隆·马斯克发表评论

"…任何依赖激光雷达的人都注定要失败…”

双方显然存在激烈的竞争和相互矛盾的观点。康奈尔大学的研究人员支持立体视觉,尽管公众担心它在无人驾驶汽车中的功效和安全性。

特斯拉不仅仅使用立体视觉;它的车辆实现了立体摄像机、雷达和地图绘制,以提供具有竞争力的精确度。尽管需要更多的技术,立体声系统的运行成本仍然低于激光雷达。

虽然安全至关重要,但企业必须盈利才能继续运营。对消费者来说,最大的障碍之一是市场价值,它直接与用于汽车设计的技术联系起来。正如开头提到的,AVs 还处于起步阶段,随着更多的研究和开发,很多东西都会改变。只有时间能证明哪种视觉系统更胜一筹。

解开 Stigmergic 独立强化学习

原文:https://towardsdatascience.com/stigmergic-reinforcement-learning-why-it-tells-us-1-1-3-4d50dfa9cb19?source=collection_archive---------50-----------------------

因为 1+1=3

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

JESHOOTS.COMUnsplash 上拍照

群优化是“多智能体学习”保护伞下的众多子领域之一。它信奉“人多力量大”的理念我们的代理人越多,我们能完成的就越多。这个领域试图使用极其大量的简单智能体来解决问题,每个智能体都为一个比自身更大的目标做出贡献。换句话说,群体优化利用了一个概念:

多主体系统比其单个组成部分的总和具有更大的灵活性、健壮性和潜力。

群体优化最流行的分支之一是 stigmergy。Stigmergic 算法允许代理通过环境使用本地信息间接协调。一个主体的行为会在环境中留下“痕迹”,并刺激其他主体的后续行为。然后,我们重复。

我们可以把斯蒂格利茨看作一种使用简单规则的方法论。每个代理都有一个很小的、全面的规则手册可以遵循,指导他们如何修补周围环境或与他人互动。如果每个规则书都设计正确,那么它们动作的组合最终会完成一些任务。

这种“级联动作”的想法在自然界中经常可以找到。蚂蚁和白蚁利用信息素间接相互交流,让它们能够搭建桥梁或建造复杂的巢穴。甚至在细菌中也观察到了群体行为,特别是粘细菌,其中群体行为由复杂的控制系统指导。

在这篇文章中,我们探索了 Stigmergic 独立强化学习,一种新的大规模多智能体学习方法。

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

萨阿德·萨利姆Unsplash 上拍摄的照片

动机

可扩展性是多智能体强化学习(MARL)的最大障碍之一,因为状态和动作空间随着智能体数量的增加呈指数增长。虽然已经提出了独立的学习算法来应对这一挑战,但是这些方法往往会遇到非平稳性问题。要了解更多关于 MARL 及其障碍的背景,请随意查看这篇文章:

[## 多主体强化学习:要点

好像一个机器人学习一切还不够

medium.com](https://medium.com/swlh/the-gist-multi-agent-reinforcement-learning-767b367b395f)

斯蒂格利茨独立强化学习(SIRL)提出了一种算法,它在显式联合学习和其独立对应学习之间提供了一种平衡。换句话说,该算法在大范围内协调不同的独立学习代理。

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

照片由埃里克·沃德Unsplash 拍摄

系统结构

斯蒂格利茨由四个主要部分组成:

  • **媒介:**代理间接相互通信的方法或环境的一部分
  • **动作:**原语,允许代理与环境或其他代理交互,通常改变其状态
  • **痕迹:**一个特工留下的信号,用来和其他人间接交流
  • **条件:**触发或允许执行某些动作的事件

使用这些公式,我们可以比经典的强化学习更容易地表示代理之间的间接协调。

在给定的条件下,代理在执行动作之后在介质中留下痕迹。

当这些痕迹由于许多起作用的因素而在介质中积累和混合时,它们各自根据应用相应地响应这些信号。在一个位置累积的轨迹越大,代理对特定信号的响应越剧烈。

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

照片由陈乐德Unsplash 上拍摄

在 SIRL 的表述中,环境媒介是分离的实体。我们可以把环境想象成一个物理状态的集合,在这个集合中代理可以表现、描述和定位他们自己。另一方面,媒介可以被认为是环境的一个特定部分,通过它传播信息。这种分离用于区分 SIRL 和经典的 RL 算法。SIRL 框架的其他部分将在随后的章节中概述。

避免冲突

冲突避免用于隐式协调代理,即使每个代理只有本地信息。这里有一个想法:让代理竞争动作机会,只允许一部分代理在给定的时间内执行动作。为此,每个代理都有一个评估模块和一个行为模块,每个模块都有自己的一套神经网络。

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

李灿明Unsplash 上拍照

评估模块测量代理的动作优先级给定其当前本地状态。换句话说,从评估模块获得更高回报的代理人更有可能执行他们的行动。

行为模块在给定本地状态和评估模块许可的情况下选择要执行的适当动作。因此,在确定行动时,总有两个步骤:

  1. 将本地状态传递给相应的评估模块,并使用协调信道与附近的代理进行比较
  2. 仅当代理在第一步中拥有足够高的动作优先级时,将相同的本地状态传递给相应的行为模块以选择适当的动作

这些数学公式将在本文后面讨论。

介质及其属性

在 SIRL,数字信息素(trace)用于代理之间的间接通信。这些信号存储在包含信息素分布的地图(介质)中,并向代理提供相关的状态空间信息。我们可以把这种表示想象成一个热图,由虚拟代理集中存储或者在指定代理之间分开。

数字信息素只是数字。数字越大,信号越强。如前所述,它们可以组合、混合和累积。SIRL 通过引入三个属性对此进行建模。当不同的信息素结合时,它使用线性叠加。此外,这些信息素不局限于单一空间,而是扩散到周围区域。最后,信息素的量级随着时间的推移而衰减。扩散率和衰减率是可调的超参数。

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

Katarzyna UrbanekUnsplash 拍摄的照片

数学

吸引子选择

我们假设每一个智能体都能在有限的范围内感知数字信息素。让我们将吸引子定义为信息素图中包含非零数量数字信息素的任何块。该块将对附近的代理有效地探索本地状态空间具有吸引人的效果。然而,对于代理选择一个动作,他们首先需要选择一个吸引子来进行它的动作(即。向吸引子移动)。代理选择特定吸引子的概率由下式给出:

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

概率代理 I 选择吸引子 j

其中 d_ij 是从代理 I 到吸引子 j 的距离。ε是位置 j 处的信息素的大小,xi 是范围内所有吸引子的集合,D 是某个单调函数。例如,在论文的实验中,函数 D 看起来像这样:

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

[1]中使用的 d 函数示例

这个概率值直观上是有意义的。我们可以看到,随着距离的增加,选择吸引子的概率降低。类似地,随着信息素数量的减少,概率也减少。所选吸引子的位置被连接到代理的本地状态,并被传递到评估和行为模块。

然而,有些人可能会问,为什么我们不简单地选择信息素强度和距离的最佳组合的吸引子呢?我们不希望我们的代理人聚集在一起,因为这违背了避免冲突的目的。实际上,最理想的是随机地选择吸引者。

信息素放置

在将本地状态传递给评估和行为模块之后,我们决定是否执行一个动作。如果有,我们就在环境中放置信息素:

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

信息素更新方程

其中 a 代表由一个代理投放的数字信息素的固定数量,b 是衰减率,如果一开始没有代理的话就应用。衰变有助于去除无用的吸引子久而久之。

奖励

我们假设传统的 RL 框架,试图最大化预期的累积回报。因此,我们将状态转换的奖励定义如下:

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

过渡奖励

其中 p 是比例因子。给定代理 I 和选择的吸引子 j,我们奖励使代理更接近吸引子的行为。

动作优先级

请记住,每个代理都有一个评估网络,它输出与它所拥有的操作优先级成比例的值。该值越高,越有可能允许执行某个操作。

由于我们希望最大化我们的总体预期回报,我们直觉地**希望给予给定其本地状态下具有较高预期回报的代理行动优先权。**因此,我们将我们的行动优先级定义为价值函数(V):

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

价值函数与政策

代理的状态值越高,它获得的操作优先级越高。随后,行为模块根据其策略选择一个概率最高的动作。我们还将 R_tilde 定义为:

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

其中该价值函数(V)表示目标价值网络的输出。目标价值网络定期复制价值网络的参数,并用于在训练时增加稳定性。同样,行为模块除了其政策网络之外,也同时拥有价值网络和目标价值网络。

定义所有的损失

我们快到了!接下来,我们定义每个代理中评估和行为模块的损失函数。评估模块的价值损失定义为:

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

评估网络损耗函数

代表代理 I 的 TD 误差平方。行为模块的值损失与上面类似。此外,它的政策损失类似于优势行动者批评家的损失,我们用计算出的优势函数来衡量负概率:

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

行为模块更新

注意变量 R 不再有波浪号。这些奖励由行为模块的目标值函数而不是评估模块的目标值函数定义,使其成为不同于以前的变量。

现在我们有了所有这些损失,我们可能会试图单独优化*每个代理的模块。*然而,这将有效地将算法简化为代理之间的独立学习。换句话说,每个代理人只优化自己的政策,而不考虑其他人,失去了我们最初开始优化的协调概念。

联邦培训

但是等等!我们的建筑还有最后一部分!在这里,我们解释联邦培训模块。虽然这是一个虚拟代理,但它包含与其他代理相同的体系结构和部件。它负责通过**平均优化来优化每个智能体的神经网络模块。**更正式地说:

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

“*v”*上标表示属于联邦培训模块的参数。此外,“*p”*表示动量项,“l”表示学习率。更新仅对在该时间步中执行动作的代理求和结果,θ表示那些代理的每个相应模块的参数。在这里,我们通过对这些代理的梯度进行平均来更新联邦教练的参数。然后,因为联邦训练器具有相同的模块结构,我们能够将这些新参数发送回代理。**实际上,我们已经做了几件事:

  • 更新了执行动作的每个代理的参数
  • 允许单个代理不仅根据他们的表现,还根据其他代理的表现来更新他们的策略
  • 在通常具有指数增长的状态和动作空间的上下文中,将更新缩小到线性 梯度组合

结果

论文中进行的实验涉及到像素组,每个像素组都是一个代理,它们按照数字的形状排列。例如,像素在 150 次迭代后学会了如何形成数字“4 ”,如下所示:

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

实验结果如[1]所示

SIRL 与其他四种方法进行了比较。

  • JL:仅使用行为模块共同学习最佳行为
  • IRL:类似于 JL,但输入向量只包含自相关本地状态
  • JL-O:类似于 JL,但是用代理的精确坐标代替吸引子
  • IRL-O:类似于 IRL,但是用代理的精确坐标代替了吸引子

SIRL 与它的竞争对手相比表现良好,在较少的训练周期内教会它的特工形成精确的队形。

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

数字 4 的相似性度量,如[1]所示

结束语

SIRL 提出了一种新的方法来解决多智能体系统的可扩展性问题。它为超大型系统中的强化学习提供了一种有前途的分散方法,并可以被视为从多机器人运动到交通信号控制等更复杂领域中基于群体的强化学习的起点。不管怎样,很明显,代理人通过合作所能完成的要比他们个人潜力的总和更大。它可能只是告诉我们,有时候,1 + 1 = 3。

参考

[1] X. Xu,R. Li,Z. Zhao,和 H. Zhang,用于多智能体协作的 Stigmergic 独立强化学习 (2019)。

[2] F. Heylighen,stigmargy 作为一种普遍的协调机制:组成、种类和应用 (2015)。

从经典到最新,这里有讨论多代理和单代理强化学习的相关文章:

[## 纳什均衡介绍:朋友还是敌人 Q 学习

让机器人打破平衡

towardsdatascience.com](/multi-agent-rl-nash-equilibria-and-friend-or-foe-q-learning-4a0b9aae3a1e) [## 分层强化学习:封建网络

让电脑看到更大的画面

towardsdatascience.com](/hierarchical-reinforcement-learning-feudal-networks-44e2657526d7)

还在为你的机器学习模型解析用户代理字符串吗?

原文:https://towardsdatascience.com/still-parsing-user-agent-strings-for-your-machine-learning-models-use-this-instead-8928c0e7e74f?source=collection_archive---------31-----------------------

用这个代替

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

Emile Perron 在 Unsplash 上的照片

包含在用户代理字符串中的信息可以使用低维嵌入来有效地表示,然后在下游的机器学习任务中使用。

究竟什么是用户代理字符串?

当用户与网站交互时,浏览器向服务器发送 HTTP 请求,以获取所需的内容、提交数据或执行其他操作。这种请求通常包含几个,即指定给定请求参数的字符键值对。一个用户代理字符串(下面称为“UAS”)是一个 HTTP 请求头,它描述了代表用户的软件(图 1)。

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

图一。当向服务器发送请求时,浏览器充当用户的代理。用户代理字符串描述浏览器的属性。

UAS 的最初目的是 内容协商 ,即根据各自 UAS 中包含的信息(例如,图像格式、文档语言、文本编码等)确定提供给用户的最佳内容的机制。).这些信息通常包括浏览器运行环境的详细信息(设备、操作系统及其版本、地区)、浏览器引擎和版本、布局引擎和版本等等(图 2)。

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

图二。典型 UAS 及其元素的示例。

虽然为不同的浏览器提供不同的网页被 T2 认为是一个坏主意,但是现在,UAS 仍然有许多实际的应用。最常见的是网络分析,即报告流量构成以优化网站的有效性。另一个用例是 web 流量管理,包括阻止讨厌的爬虫,减少网站上不需要的访问者的负载,防止点击欺诈,以及其他类似的任务。由于它们包含丰富的信息,UAS 也可以作为机器学习应用的数据源。然而,后一种用例至今没有得到太多的关注。在这里,我解决了这个问题,并讨论了一种从机器学习模型的 UAS 创建信息特征的有效方法。这篇文章是我最近在两个会议上演讲的摘要— 为什么是 R?R 语言的企业应用 。下述示例中使用的数据和代码可从 GitHub 获得。

作为机器学习模型特征的 UAS 元素

UAS 元素通常可以作为用户特征的有用代理,例如生活方式、技术成熟度,甚至富裕程度。例如,通常从高端移动设备访问网站的用户可能不同于从运行 Windows XP 的台式计算机上的 Internet Explorer 访问同一网站的用户。当没有其他人口统计信息可用于用户时(例如,当一个新的、未被识别的人访问一个网站时),具有针对这些特征的基于 UAS 的代理可能特别有价值。

在某些应用中,区分人类和非人类 web 流量也是有用的。在某些情况下,这很容易做到,因为自动化网络爬虫使用包括单词“bot”(例如,Googlebot/2.1 (+http://www.google.com/bot.html))的简化 UAS 格式。然而,一些爬虫不遵循这个惯例(例如,脸书机器人在其 UAS 中包含facebookexternalhit两个字),识别它们需要一个查找字典。

从 UAS 创建机器学习功能的一个看似简单的方法是应用一个解析器,提取单个 UAS 元素,然后一次性编码这些元素。这种方法在简单的情况下可以很好地工作,当只有高级的和容易识别的 UAS 元素需要转换成特征时。例如,确定用户代理的硬件类型相对容易(移动对桌面对服务器,等等)。).几个高质量的、基于正则表达式的解析器可以用于这种特性工程(例如,参见“ua-parser”项目及其语言选择的实现)。

然而,当想要使用组成 UAS 的所有 元素并从中提取最大信息时,上述方法很快变得不切实际。这有两个主要原因:

  • 现有的关于用户代理头格式的建议没有以任何方式实施,在现实世界中,人们可能会遇到各种各样的 UAS 规范。因此,众所周知,对 UAS 的一致解析非常困难。此外,每天都有新的设备、新版本的操作系统和浏览器出现,这使得维护高质量的解析器成为一项艰巨的任务。
  • 可能的 UAS 元素及其组合的数量是天文数字。即使有可能对它们进行一次性编码,得到的数据矩阵也会非常稀疏,而且太大,不适合目前数据科学家通常使用的计算机的内存。

为了克服这些挑战,可以应用降维技术,将 UAS 表示为固定大小的向量,同时最小化原始信息的损失。当然,这个想法并不新颖,因为 UAS 只是简单的文本串,这可以通过使用各种自然语言处理方法来实现。在我的项目中,我经常发现脸书研究人员开发的 fastText 算法( Bojanowski 等人,2016 )产生了特别有用的解决方案。

描述 fastText 算法超出了本文的范围。然而,在我们继续举例之前,有必要提一下这种方法的一些实际好处:

  • 它不需要数据,也就是说,一个运行良好的模型只需要几千个例子就可以训练出来;
  • 它适用于短的结构化文档,如 UAS;
  • 顾名思义,训练快;
  • 它可以很好地处理“词汇之外的单词”,也就是说,它可以生成有意义的向量表示(嵌入),即使是在训练期间没有看到的字符串。

fastText 实现:选择您的武器

fastText 的官方实现可以作为独立的 C++库和 Python 包装器获得。这两个库都有很好的文档记录,并且易于安装和使用。广泛使用的 Python 库gensim有自己的算法实现。下面我将演示如何在 r 中训练快速文本模型。

围绕 fastText C++库有几个 R 包装器(参见[fastText](https://github.com/mlampros/fastText)[fastrtext](https://github.com/pommedeterresautee/fastrtext)[fastTextR](https://cran.r-project.org/web/packages/fastTextR/index.html))。然而,可以说在 R 中训练和使用 fastText 模型的最简单的方法是通过[reticulate](https://rstudio.github.io/reticulate/)包调用官方的 Python 绑定。将fasttext Python 模块导入到 R 环境中可以按如下方式完成:

# Install `fasttext` first 
# (see [https://fasttext.cc/docs/en/support.html)](https://fasttext.cc/docs/en/support.html))# Load the `reticulate` package 
# (install first, if needed):
require(reticulate)# Make sure `fasttext` is available to R:
py_module_available("fasttext")
## [1] TRUE# Import `fasttext`:
ft <- import("fasttext")# Then call the required methods using 
# the standard `$` notation, 
# e.g.: `ft$train_supervised()`

用快速文本学习 R 中的 UAS 嵌入

下面描述的例子基于来自whatismybrowser.com数据库的 200,000 个独特的 UAS 样本(图 3)。

图 3。本文示例中使用的 UAS 示例。数据存储在纯文本文件中,其中每行包含一个 UAS。注意,所有 UAS 都被标准化为小写,且没有应用其他预处理。

在 R 中训练一个无监督的 fastText 模型就像调用类似下面的命令一样简单:

m_unsup <- ft$train_unsupervised(
   input = "./data/train_data_unsup.txt",
   model = "skipgram",
   lr = 0.05, 
   dim = 32L, *# vector dimension*
   ws = 3L, 
   minCount = 1L,
   minn = 2L, 
   maxn = 6L, 
   neg = 3L, 
   wordNgrams = 2L, 
   loss = "ns",
   epoch = 100L, 
   thread = 10L
)

上述命令中的dim参数指定了嵌入空间的维数。在这个例子中,我们希望将每个 UAS 转换成大小为 32 的向量。其他参数控制模型训练的过程(lr —学习速率、loss —损失函数、epoch —历元数等)。).要理解所有参数的含义,请参考官方的 fastText 文档

一旦模型被训练,就很容易计算新案例的嵌入(例如,从测试集中)。下面的例子展示了如何做到这一点(这里的关键命令是m_unsup$get_sentence_vector(),它返回一个向量,该向量是由构成给定 UAS 的单个元素的嵌入的平均值):

test_data <- readLines("./data/test_data_unsup.txt")

emb_unsup <- test_data %>% 
  lapply(., function(x) {
    m_unsup$get_sentence_vector(text = x) %>%
      t(.) %>% as.data.frame(.)
  }) %>% 
  bind_rows(.) %>% 
  setNames(., paste0("f", 1:32)) # Printing out the first 5 values
# of the vectors (of size 32)
# that represent the first 3 UAS
# from the test set:emb_unsup[1:3, 1:5]
##      f1       f2    f3    f4      f5
## 1 0.197 -0.03726 0.147 0.153  0.0423
## 2 0.182  0.00307 0.147 0.101  0.0326
## 3 0.101 -0.28220 0.189 0.202 -0.1623

但是,我们如何知道经过训练的无监督模型有没有用呢?当然,测试它的一种方法是将通过该模型获得的 UAS 的矢量表示插入到下游的机器学习任务中,并评估最终解决方案的质量。然而,在跳到下游建模任务之前,人们还可以直观地评估 fastText 嵌入有多好。众所周知的 tSNE 地块(Maaten&hint on 2008;参见这个 YouTube 视频可能特别有用。

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

图 4。通过无监督快速文本模型获得的嵌入的 3D tSNE 可视化。该图中的每个点对应于测试集中的一个 UAS。根据用户代理的硬件类型对点进行颜色编码。

图 4 显示了使用上面指定的 fastText 模型从测试集中为 UAS 计算的嵌入的 3D tSNE 图。尽管该模型是以无监督的方式训练的,但它能够产生反映原始用户代理字符串的重要属性的嵌入。例如,人们可以看到关于硬件类型的点的良好分离。

根据定义,训练受监督的快速文本模型需要标记的数据。这就是现有的 UAS 解析器通常可以提供很大帮助的地方,因为人们可以使用它们来快速标记数以千计的训练样本。fastText 算法支持多类和多标签分类器。标签的预期(默认)格式是__label__<value>。以这种方式格式化的标签(在多标签模型的情况下,可能由空格分隔)将被预先添加到训练数据集中的每个文档。

假设我们对强调 UAS 硬件类型差异的嵌入感兴趣。图 5 示出了适于训练相应模型的标记数据的例子。

图 5。适用于训练监督快速文本模型的标记数据示例。

在这种标记数据上训练监督快速文本模型所需的 R 命令类似于我们之前看到的:

m_sup <- ft$train_supervised(
    input = "./data/train_data_sup.txt",
    lr = 0.05, 
    dim = 32L, *# vector dimension*
    ws = 3L, 
    minCount = 1L,
    minCountLabel = 10L, *# min label occurence*
    minn = 2L, 
    maxn = 6L, 
    neg = 3L, 
    wordNgrams = 2L, 
    loss = "softmax", *# loss function*
    epoch = 100L, 
    thread = 10L
)

我们可以通过在标记的测试集上计算精度、召回率和 f1 分数来评估所得到的监督模型。这些指标可以跨所有标签计算,也可以针对单个标签计算。例如,以下是与标签“移动”相对应的 UAS 的质量指标:

metrics <- m_sup$test_label("./data/test_data_sup.txt")
metrics["__label__mobile"]## $`__label__mobile`
## $`__label__mobile`$precision
## [1] 0.998351
##
## $`__label__mobile`$recall
## [1] 0.9981159
##
## $`__label__mobile`$f1score
## [1] 0.9982334

对这个监督模型的 tSNE 图的视觉检查也证实了它的高质量:我们可以看到关于硬件类型的测试用例的清晰分离(图 6)。这并不奇怪,因为通过训练监督模型,我们提供了支持信息,帮助算法创建特定于任务的嵌入。

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

图 6。使用监督模式下训练的 fastText 模型获得的嵌入的 3D tSNE 可视化,标签对应于硬件类型。

结论

本文证明了 UAS 中包含的丰富信息可以使用低维嵌入来有效地表示。生成这种嵌入的模型可以在无监督和有监督模式下训练。无监督嵌入是通用的,因此可以用于任何下游机器学习任务。然而,只要有可能,我会建议训练一个特定任务的监督模型。将 UAS 表示为固定大小的向量的一个特别有用的算法是 fastText。它的实现可以在当今数据科学家使用的所有主要语言中获得。

在你走之前

寻找类似的数据分析或建模?我提供数据科学咨询服务,所以联系

随机、批量和小批量梯度下降

原文:https://towardsdatascience.com/stochastic-batch-and-mini-batch-gradient-descent-demystified-8b28978f7f5?source=collection_archive---------14-----------------------

为什么我们在实现深度神经网络时需要随机、批量和迷你批量梯度下降?

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

资料来源:www.unsplash.com

这是一个详细的指南,它应该回答我们在实现深度神经网络时为什么以及何时需要随机、批量和小批量梯度下降的问题。

简而言之 : 我们需要这些不同的实现梯度下降的方法来解决我们在训练神经网络时肯定会遇到的几个问题,这些问题是损失函数和噪声梯度的局部最小值和鞍点。

关于这一点的更多内容将在下面的文章中解释——nice;)

目录

  1. 1.简介:让我们回顾一下梯度下降
  2. 2.训练神经网络时的常见问题(局部最小值、鞍点、噪声梯度)
  3. 3.分批梯度下降
  4. 4.随机梯度下降
  5. 5.小批量梯度下降
  6. 6.带回家的信息

1.简介:让我们回顾一下梯度下降

在我们讨论实现梯度下降的不同方法之前,我认为最好先回忆一下梯度下降到底是什么。

当我们训练神经网络时,我们希望它学习执行特定的任务。这项任务可以简单到预测某一特定市场对某一产品的预期需求,或者对皮肤癌进行分类。

不管这个任务,我们在训练期间的唯一目标是最小化目标/损失函数。对于预期需求的预测,这是一项回归任务,该损失函数将是均方误差(MSE)损失函数:

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

等式 1 均方误差损失函数

对于分类任务,我们希望最小化交叉熵损失函数:

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

等式 2 交叉熵损失函数

然而,在我们能够最小化损失函数之前,神经网络必须计算输出。这是在前向传播步骤中完成的,此时网络接收输入特征向量,在隐藏层中执行若干点积和非线性运算,并输出预测*。(关于正向传播步骤* 的更详细解释,请参考本文 *)。*该步骤如下图所示:

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

图一。深度神经网络。图片来源:自己的作品

计算隐藏值以及最终预测向量 y 的方程式如下:

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

情商。3 正向传播

预测 y 和基本事实标签(我们实际想要预测的值)都包含在损失函数中,以计算指示网络预测准确度的定量度量。

损失函数的较低值导致预测和标签之间的较低误差,反之亦然。

为了获得损失函数的最低可能值,我们必须调整神经网络的参数,即权重和偏差。

这就是梯度下降发挥作用的地方。

我们必须计算损失函数相对于这些权重和偏差的负导数(梯度)。在下一步中,这些参数朝着该梯度的方向更新。以下等式表示任意权重矩阵的更新步骤。

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

情商。4 更新步骤

每次执行更新时,权重和偏差越来越接近损失函数将具有全局最小值的最优值集。这种预测将尽可能接近我们想要预测的真实标签。

梯度下降是神经网络训练和整个深度学习领域的支柱。这种方法使我们能够教会神经网络执行任意任务,而无需为其显式编程。

只要神经网络能够最小化损失函数,网络最终将能够做我们想要它做的事情。

梯度下降训练时会遇到问题

当然,和往常一样,说起来容易做起来难。当沿着损失函数的负梯度下降到最佳权重时,我们肯定会面临多个问题,例如局部最小值鞍点、噪声梯度,这些问题会使我们的训练过程更加困难。

常规梯度下降的不同方法,即**随机梯度下降、**批量梯度下降和小批量梯度下降,可以正确处理这些问题,尽管不是每种方法都能解决所有问题。由您决定哪种方法最适合您当前的问题。

正因为如此,我们将在下面更详细地讨论实现梯度下降算法的不同方法以及它们独特的优点和缺点。

但是首先我想简要地解决局部最小值、鞍点和噪声梯度的问题,让你们更好地理解为什么我们首先需要这些不同种类的梯度下降。

2.训练神经网络时的常见问题

局部最小值和鞍点

不幸的是,损失函数并不总是有好的形状。事实上,它们可以呈现非常复杂的形状,例如:

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

图 2 三维损失函数。资料来源:www.mathworks.com

因此,损失函数通常具有局部最小值和鞍点。

这些 2D 图形示意性地显示了局部最小值和鞍点在二维空间中的样子:

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

图三。局部最小值和鞍点。来源:自己的作品。

x 轴是任意权重值,而 y 轴是损失函数值。假设我们在神经网络的训练期间获得权重,该权重产生鞍点或局部最小值所在的损失函数值。

在这种情况下,你可以清楚地看到,斜率,或者说损失函数的梯度,变得无限小,因为损失函数在这一点上是平坦的。这种情况的直接后果是梯度陷入局部最小值或鞍点,并且由于权重保持不变,学习无法进一步进行。

在实践中,鞍点是一个比局部最小值大得多的问题,尤其是在处理成千上万个权重参数时。

为什么会这样?

损失函数所在的对应维度空间具有与权重参数数量相同的维度数量。鞍点意味着在高维空间中的当前点,损耗在一个方向下降,而在另一个方向上升。如果你在十万维空间,你可以想象这种情况会经常发生。

相反,一个局部最小值意味着损失函数在我当前点的所有方向上增加。

可以想象,这在高维空间是不太可能的。不管你是否有一个鞍点或局部最小值,梯度下降的常规实施将在训练中遇到困难。

即将推出 : 面向软件开发人员、数据分析师、学者和行业专家的高级深度学习教育,旨在加速向人工智能职业的过渡。

更多详情请看:www.deeplearning-academy.com

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

www.deeplearning-academy.com

嘈杂的梯度

训练神经网络时的另一个问题和限制因素是,我们计算的梯度可能变得非常嘈杂。当进行梯度下降时,我们(通常)计算训练集中每个单个特征标签实例对的损失,并通过推导关于权重参数的损失函数来获得梯度。

这样做的结果是,单个数据样本上的每个计算梯度只是指向损失函数的最高增长率的真实梯度的粗略估计。

这导致数据集中每个要素-标注实例对的计算梯度的方向和值略有不同。我们说这些梯度是有噪声的或者具有很高的方差。

结果,在训练期间,我们不直接走向损失函数的全局最小值,而是梯度做一些之字形运动。梯度的噪声会导致网络的训练时间更长。

为了更好地理解这一点,让我们来看一个嘈杂的梯度视觉例子。下面的视频展示了带噪声梯度的梯度下降过程。

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

噪声梯度向损失函数的局部最小值移动。来源:自己的作品。

梯度朝着位于三维空间中的损失函数的全局最小值移动。您可以注意到,在训练集中的每个单个数据实例上计算的负梯度并不直接指向损失函数的全局最小值。

相反,梯度在方向和值上略有不同。正因为如此,我们正在做这些曲折的运动,而不是直接走向全球最小值。

在下一节中,我们将看看如何使用梯度下降来更新神经网络的权重的不同变化。虽然我们仍然要使用我们以前学过的梯度下降法,但是有几种方法可以使用计算出的梯度来更新网络权重。

在下文中,我将向您介绍三种技术,即*、小批量梯度下降 。每种权重更新技术都有其优点和缺点。*

根据问题的不同,您可能更喜欢一种方法。先说批量梯度下降。

3.批量梯度下降

请考虑一个数据集,其中我们有 N=6 个标记的数据实例。每个实例都有 4 个特征(学历武学*** )和一个标签 y 。***

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

在训练过程中,神经网络为每个实例计算一个预测,该预测与地面真实标签进行比较。给定预测和标签,我们可以将两者都放入损失函数,并计算给定样本的损失函数的梯度。

到目前为止,一切顺利。在这一点上,我们可以使用计算出的梯度来更新我们的网络权重,使之接近最优权重,从而最小化损失函数。

然而,在批量梯度下降过程中,我们不会马上进行。

相反,在处理完数据集的所有数据实例后,权重只更新一次。具体来说,在批量梯度下降期间,计算并求和数据集中每个实例的梯度。

最后,累积的梯度除以数据实例的数量,即 6。这样,我们得到了数据集中所有数据实例的平均梯度。权重现在在该平均梯度的负方向上更新。****

对于我们的数据集,我们必须计算并求和该数据集中六个样本的梯度。然后,我们将梯度的总和除以 6,并用这个平均梯度执行单梯度下降,以更新神经网络的权重。

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

情商。5 用批量梯度下降更新步骤。

在这个等式中, θ 代表任意的权重值。

批量梯度下降的优势

  • 计算效率高:正如你可能已经猜到的,这种技术的计算要求较低,因为每次采样后都不需要更新。
  • 稳定收敛:另一个优点是权重收敛到最优权重是非常稳定的。通过计算和平均数据集中每个样本的所有单独梯度,我们得到了真实梯度的非常好的估计,指示损失函数的最高增加。

Barch 梯度下降的缺点

  • 较慢的学习:批量梯度下降的缺点是学习过程要慢得多,因为我们在处理完 N 个样本后只执行一次更新。
  • 局部极小值和鞍点:另一个缺点是,在学习过程中,我们可能会陷入损失函数的局部极小值,永远不会达到神经网络获得最佳结果的全局最优值。这是因为我们计算的梯度或多或少是一样的。我们实际上需要的是一些噪声梯度。方向值的这种小偏差将允许梯度跳出损失函数的局部最小值,并继续向全局最小值更新。另一方面,干净的梯度更容易陷入局部最小值。

4.随机梯度下降

与批量梯度下降相反,我们可以执行随机梯度下降。这种方法可以被认为是批次梯度的对立面。

请考虑我之前介绍的数据集。对于每个实例,在数据中,我们再次进行预测,将预测与标签进行比较,并计算损失函数的梯度。

然而,在这种情况下,我们在每个数据实例已经被神经网络处理之后更新权重。这种方法也经常被称为在线学习。****

对于我们的小数据集,我们计算每个数据实例的梯度,并更新神经网络的权重六次:

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

情商。5 用随机梯度下降更新步长。

换句话说:这个等式执行六次——每个数据实例一次。

随机梯度下降的优势

  • 即时性能洞察:随机梯度下降让我们立即洞察神经网络的性能,因为在这种情况下,我们不必等到数据集结束。
  • 更快的学习:相应地,随机梯度下降可以导致更快的学习,因为在处理每个数据实例之后执行更新。

随机梯度下降的缺点

  • 噪声梯度:与我们平均梯度以获得最终梯度的批量梯度下降相反,在随机梯度下降中,我们使用每个单独的梯度来更新权重。这些梯度可能非常嘈杂,并且在方向和值方面有很大的差异。这意味着我们对每个样本计算的梯度仅仅是指向损失函数增加的真实梯度的粗略估计。换句话说,在这种情况下,我们有很多噪声。然而,这一事实可以避免训练期间的局部最小值,因为高方差会导致梯度跳出局部最小值。
  • 计算密集:随机梯度下降比批量梯度下降计算密集得多,因为在这种情况下,我们更频繁地执行权重更新。
  • ****无法确定全局最小值:另一个缺点可能是梯度下降法无法确定损失函数的全局最小值。由于这种噪音,要找到并保持一个全局最小值会更加困难。

5.小批量梯度下降

第三种也是最后一种重量更新技术称为小批量梯度下降。想象一下,这种方法结合了其他两种方法的优点。对于小批量梯度下降,我们必须将我们的训练集分成大小为 n 的批量

例如,如果我们的数据集包含 10,000 个样本,那么合适的大小 n 应该是 8,16,32,64,128。

类似于批量梯度下降,我们计算并平均小批量数据实例中的梯度。梯度下降步骤在每个小批量样品处理后进行。

请再次考虑我们的小数据集。在小批量梯度下降的情况下,我们可以将这六个数据实例分成大小为 n=2t 的批量,总共留给我们三个小批量:

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

我们为每个小批量中的两个数据实例计算两个梯度,将它们相加,然后除以 2,得到该小批量的梯度平均值:

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

情商。7 用小批量梯度下降更新步骤。

我们将使用这个平均梯度来执行梯度下降步骤。在这种情况下,我们将做梯度步骤总共三次。

小批量方法是实现深度学习中梯度下降算法的默认方法

小批量梯度下降的优势

  • 计算效率:就计算效率而言,该技术介于之前介绍的两种技术之间。
  • ****稳定收敛:另一个优点是更稳定地收敛到全局最小值,因为我们计算 n 个样本的平均梯度,这导致更少的噪声。
  • 更快的学习:由于我们比随机梯度下降更频繁地执行权重更新,在这种情况下,我们实现了更快的学习过程。

小批量梯度下降的缺点

  • 新的超参数:该技术的一个缺点是,在小批量梯度下降中,引入了一个新的超参数 n ,称为小批量。已经表明,学习率之后的小批量大小是 神经网络整体性能的第二个最重要的超参数 。出于这个原因,有必要花时间尝试许多不同的批量大小,直到找到一个最终的批量大小,它与其他参数(如学习速率)一起工作得最好。

带回家的信息

  • 在训练神经网络时,局部最小值、鞍点和噪声梯度是常见的问题
  • 批量梯度下降可以防止梯度的噪声,但我们会陷入局部最小值和鞍点
  • 对于随机梯度下降,我们很难确定全局最小值,但通常情况下,不要陷入局部最小值
  • 小批量方法是实现深度学习中梯度下降算法的默认方法。它结合了其他方法的所有优点,而没有它们的缺点

原载于 https://www.deeplearning-academy.com。****

机器学习的随机梯度下降解释清楚

原文:https://towardsdatascience.com/stochastic-gradient-descent-for-machine-learning-clearly-explained-cadcc17d3d11?source=collection_archive---------49-----------------------

随机梯度下降是当今大规模机器学习问题的标准优化方法。它用于从逻辑回归到人工神经网络的各种模型的训练。在本文中,我们将用线性回归来说明梯度下降和随机梯度下降的基本原理。

形式化我们的机器学习问题

正如你可能知道的,监督机器学习在于找到一个函数,称为决策函数,它最好地模拟数据的输入/输出对之间的关系。为了找到这个函数,我们必须将这个学习问题公式化为一个最优化问题。

让我们考虑以下任务:找到将输入空间、变量 X 映射到输出空间、变量 Y 的最佳线性函数。

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

Y 变量对 X 变量的绘图(图片作者: GitHub 链接)

当我们试图通过线性函数来模拟 XY 之间的关系时,允许学习算法选择的函数集合如下:

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

术语 b 就是截距,在机器学习中也叫偏差
这组函数就是我们的假设空间。但是我们如何选择参数 a,b 的值,以及我们如何判断这是否是一个好的猜测?

我们定义了一个叫做损失函数的函数,它在结果 Y. 的上下文中评估我们的选择

我们将损失定义为平方损失(我们可以选择另一个损失函数,如绝对损失) :

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

平方损失惩罚实际 y 结果和通过选择参数组 a、b 的值估计的结果之间的差异。这个损失函数在单个点上评估我们的选择,但是我们需要在所有的训练点上评估我们的决策函数。

因此,我们计算误差平方的平均值:均方误差

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

其中 n 是数据点的数量。
该函数取决于定义我们假设空间的参数,称为经验风险

Rn(a,b) 是参数的二次函数,因此其最小值总是存在,但可能不是唯一的。

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

(图片作者: GitHub 链接)

最终,我们达到了最初的目标:将学习问题公式化为优化问题!

事实上,我们所要做的就是找到决策函数,即 a,b 系数,使这种经验风险最小化。

这将是我们可能产生的最好的决策函数:我们的目标函数

在简单线性回归的情况下,我们可以简单地对经验风险进行微分,并计算 a,b 系数来抵消衍生产品。用矩阵符号来计算这个解更容易。方便的是将常量变量 1 包含在 X 中,并将参数 ab 写成单个向量 *β。*因此,我们的线性模型可以写成:

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

我们的损失函数变成了:

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

最小化我们的等式的向量β可以通过求解下面的等式来找到:

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

我们的线性回归只有两个预测器( ab ,这样 X 就是一个nX2***矩阵(其中 n 是观测值的个数,2 是预测值的个数)。如你所见,要解这个方程,我们需要计算矩阵**(*x^t**x)**然后求逆。

在机器学习中,观察值的数量通常非常多,预测值的数量也非常多。因此,该操作在计算和存储方面非常昂贵。

梯度下降算法是一种迭代优化算法,它允许我们在保持低计算复杂度的同时找到解决方案。我们将在本文的下一部分描述它是如何工作的。

潜入梯度下降原理

梯度下降算法可以用下面的类比来说明。想象一下,你半夜在山里迷路了。你什么也看不见,因为一片漆黑,你想回到位于谷底的村庄(你试图找到均方误差函数的局部/全局最小值)。为了生存,你制定了以下策略:

  1. 在你当前的位置,你感觉到了山的陡度,找到了坡度最陡的方向。最陡的斜率对应于均方误差的梯度。
  2. 你沿着这个方向下山,走一段固定的距离,然后停下来检查你是否还在正确的方向上。这个固定距离就是梯度下降算法的学习速率。如果你走得太久,你可能会错过这个村庄,最终会在山谷另一边的斜坡上。如果你走得不够,到达村庄将需要很长时间,并且有陷入小洞的风险(当地的最小值)。
  3. 你重复这些步骤,直到满足你设定的标准:例如,两个步骤之间的高度差非常低。

最终,你会到达谷底,或者你会陷入局部最小值…

既然你已经用这个寓言理解了原理,那就让我们深入到梯度下降算法的数学中去吧!
为了找到使均方误差最小的 ab 参数,该算法可以实现如下:

  1. 初始化 ab 的值,例如 a =200,b=-200
  2. 计算相对于 ab 的均方误差的梯度。坡度是当前位置最陡坡度的方向。

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

然后通过减去梯度乘以步长来更新 ab 的值:

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

η ,我们的固定步长。

ab 的更新值计算均方损失。

重复这些步骤,直到满足停止标准。例如,均方损失的减少低于阈值 ϵ.

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

梯度下降算法图解(图片作者: GitHub Link )

在下面的动画中,您可以看到由梯度下降算法执行的参数 a 的更新,以及我们的线性回归模型的拟合:

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

梯度下降算法的动画(图片作者: GitHub 链接)

由于我们正在拟合具有两个预测值的模型,我们可以在 3D 空间中可视化梯度下降算法过程!

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

渐变下降 3D 动画(图片作者: GitHub 链接)

梯度下降:这会扩展到大数据吗?

在梯度下降算法的每次迭代中,我们必须查看所有的训练点来计算梯度。

因此,该算法的时间复杂度为 O(n)。计算一个非常大的数据集需要很长时间。也许我们可以计算梯度的估计值,而不是查看所有的数据点:这种算法被称为迷你批次梯度下降

小批量梯度下降包括使用大小为 N 的随机子集来确定每次迭代的步进方向。

  • 对于一个大的数据子集,我们得到一个更好的梯度估计,但算法较慢。
  • 对于一个小的数据子集,我们得到一个更差的梯度估计,但算法计算解决方案更快。

如果我们使用一个大小为 N=1 的随机子集,称之为随机梯度下降。这意味着我们将使用一个随机选择的点来确定步进方向。

在下面的动画中,蓝线对应随机梯度下降,红线是基本梯度下降算法。

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

随机梯度下降 3D 动画(图片作者: GitHub 链接)

我希望这篇文章能帮助你理解这个基本的优化算法,如果你喜欢它,或者如果你有任何问题,请不要犹豫发表评论!

你可以在我的 GitHub 上找到我做的实现随机梯度下降和创建动画的代码:https://GitHub . com/baptiste-monpezat/random _ gradient _ descent

你也可以在我的博客上找到原帖:https://baptiste-monpezat . github . io/blog/random-gradient-descent-for-machine-learning-clearly-explained

随机梯度下降&动量解释

原文:https://towardsdatascience.com/stochastic-gradient-descent-momentum-explanation-8548a1cd264e?source=collection_archive---------19-----------------------

实施随机梯度下降

先说随机梯度下降法(SGD),这可能是我们听过最多的第二著名的梯度下降法。正如我们所知,传统的梯度下降法通过将每个参数推向其梯度的相反方向来最小化目标函数(如果您对普通梯度下降法有困惑,可以查看此处的以获得更好的解释)。

尽管批量梯度下降保证了凸函数的全局最优,但是考虑到您正在训练具有数百万样本的数据集,计算成本可能会非常高。随机梯度下降通过给数据集增加一些随机性来拯救。在每次迭代中,SGD 随机洗牌并更新每个随机样本上的参数,而不是完全批量更新。

SGD 实施

让我们来看一个具体例子的实现。我们的优化任务被定义为:

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

这里,我们试图用两个参数a, b最小化y — f(x)的损失,上面计算了它们的梯度。

样本生成将是:

我们生成了 100 个xy的样本,我们将使用它们来找到参数的实际值。

SGD 的实现很简单:

只有一行加法np.random.shuffle(ind),它在每次迭代中打乱数据。我们还设置a_list, b_list来跟踪每个参数的更新轨迹,优化曲线将是:

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

签名于

SGD 降低了计算成本,并可能避免停留在局部最小值,因为它可以通过每次随机选择新样本跳到另一个区域。但这样做的缺点是,如果不适当降低学习速率,它会持续超调。所以在实际用例中,SGD 总是和一个衰减的学习率函数耦合在一起(更多解释此处)。

为了使更新跟踪更加平滑,我们可以将 SGD 与小批量更新结合起来。

小批量 SGD

这里所说的小批量是基于一小批渐变而不是每一项来更新参数。这有助于减少差异,并使更新过程更加顺畅:

每次我们再次混洗数据,但是这次按照以下公式对每批的梯度进行平均更新:

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

通过将批量大小设置为 50,我们得到了更平滑的更新,如下所示:

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

小批量 SGD

动力

最后,还有一个概念,动量,与 SGD 相结合。它通过引入一个额外的术语γ来帮助加速收敛:

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

在上面的等式中,θ的更新受上次更新的影响,这有助于在相关方向上加速 SGD。

实现是不言自明的。通过设置学习率为 0.2,γ为 0.9,我们得到:

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

动量-新加坡元

结论

最后,这绝对不是探索的终点。动量可以与小批量相结合。而且你还测试了更灵活的学习率函数,它随着迭代而变化,甚至在不同的维度上变化的学习率(完全实现这里)。

到目前为止,我们在所有维度上使用统一的学习率,但是对于不同维度上的参数以不同频率出现的情况,这将是困难的。接下来,我将介绍自适应梯度下降,它有助于克服这个问题。

参考:

  1. https://ml-cheat sheet . readthedocs . io/en/latest/gradient _ descent . html
  2. http://d2l.ai/chapter_optimization/sgd.html
  3. https://ruder . io/optimization-gradient-descent-descent/index . html # gradient descent optimizationalgorithms
  4. http://d2l.ai/chapter_optimization/momentum.html

随机模拟帮助你掌握统计学的概念

原文:https://towardsdatascience.com/stochastic-simulation-helps-you-grasp-concepts-of-statistics-befdba517404?source=collection_archive---------27-----------------------

统计学的概念可能很难理解。不要绝望。简单的基于 Python 的模拟可以帮助提炼概念。

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

图片来源: Pixabay (免费用于商业用途)

模拟有助于提炼概念

掌握与统计相关的概念可能很难

你是否觉得掌握统计分析的概念——大数定律期望值置信区间p 值——有些困难和麻烦?

你并不孤单。

我们人类的大脑和精神还没有进化到能够处理严格的统计方法。事实上,一项关于人们为什么努力解决统计问题的研究揭示了人们对复杂而非简单、更直观的解决方案的偏好——这常常导致问题完全无法解决。

你可能从诺奖得主丹尼尔·卡内曼的名著《思考,快与慢》中知道,我们的直觉并不存在于我们的理性所在的同一个系统中(见下面的视频)。

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

图片来源:作者用 Pixabay 制作的拼贴画

我们擅长处理少量的数字。人脑的短期工作记忆大约在7–8 项/数左右。

因此,每当一个过程以数千或数百万的规模出现时,我们 往往会对那个过程的‘固有性质’失去把握。那些只表现在大数极限的规律和模式,在我们看来是随机的,毫无意义的。

统计学处理的是大数,统计建模和分析中几乎所有的理论和结果都只在大数极限下有效。

** [## 巨大的数字会产生一个心理黑洞

一万亿。一个古戈尔。一个亿。树(3)。在零和无限之间的某个地方有许多有限的东西,但是…

www.livescience.com](https://www.livescience.com/26870-ginormous-numbers-boggle-the-mind.html)

数据科学/机器学习植根于统计学——怎么办?

在这个数据科学和机器学习的时代,核心统计概念的知识被认为是在这些领域取得成功的关键,这可能会让数据科学从业者和正在学习该行业的人感到担忧。

但是不要绝望。有一个非常简单的方法可以解决这个问题。而且它叫‘模拟’。特别是离散的、随机的、基于事件的模拟。

因此,每当一个过程以数千或数百万的规模出现时,我们往往会失去对那个过程的“内在本质”的把握

让我给你看一个最简单的例子

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

图片来源: Pixabay

掷骰子的期望值

假设我们掷出一个(公平的)骰子,有 6 个可能的面——1 到 6。骰子面从集合{1,2,3,4,5,6}中取值的事件由随机变量表示。在正式的设定中,任意随机变量的所谓‘期望值’(用 E[ X ] 表示)由下式给出:

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

其中 f(x)概率分布函数 (PDF)或概率质量函数 (PMF),即描述可能取值分布的数学函数。**

对于掷骰子的情况,随机变量 X 是离散的,即它只能假定离散值,因此它有一个 PMF(而不是一个 PDF)。这是一个非常简单的 PMF,

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

这是因为随机变量在样本空间{1,2,3,4,5,6}上具有“均匀概率分布”,即任何骰子投掷都可以产生这些值中的任何一个,完全随机,并且不会偏向任何特定值。因此,期望值为,

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

因此,根据理论,3.5 是掷骰子过程的期望值。

****是最可能的值吗?不会。因为一个骰子连 3.5 的面都没有!那么,这个量是什么意思呢?

****是某种概率吗?否。因为该值明显大于 1,并且概率值始终介于 0 和 1 之间。

****这是否意味着我们可以预期这张脸最多出现 3 次或 4 次(3.5 次是 3 次和 4 次的平均值)?不。因为 PMF 告诉我们,所有的面孔出现的可能性都是一样的。

幸运的是,统计学的一个基本原则提供了答案,即大数定律,该定律认为,从长远来看,期望值就是随机变量将取的所有值的平均值

注意短语“从长远来看”。我们如何证实这一点?我们能模拟这样的场景吗?**

我们当然可以。简单的 Python 代码可以帮助我们模拟场景,验证大数定律

拯救巨蟒

定义一个有骰子面的数组和一个模拟单掷的函数。

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

扔几次骰子,

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

您可能已经注意到,对于每次调用dice_throw(),我都使用np.random.choice()函数从数组dice中随机选取一个项目。如果您运行这段代码,您将在您的机器上得到一个完全不同的序列。

我们留下了统计数据,我们在一个模拟区

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

图片来源: Pixabay (免费用于商业用途)

停下来,意识到正在发生什么。

我们不再处理形式概率和定义。我们正在模拟一个随机事件——掷骰子——就像在现实生活中一样。这就是模拟的诱惑。它在你的计算硬件上构建了一个真实生活的复制品:-)

我们可以把所有的编码留在身后,就这么做——掷骰子,记下面部,冲洗并重复——真的。但要验证遵循这条路线的大数定律,将需要大量的时间。

这就是为什么我们有了计算机和 Python 编程语言,不是吗?

所以,我们只是模拟它足够长的时间,保持一个运行平均值,并绘制它。这是我得到的。

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

我们不再处理形式概率和定义。我们正在模拟一个随机事件——掷骰子——就像在现实生活中一样。

最初,移动平均线相当疯狂,四处移动。随着模拟次数的增加,平均值收敛到 3.5,正如理论所预期的那样。

这样,我们再回来统计,借助模拟。大数定律可以通过重复刺激随机事件来验证——只需很少的编程。

用模拟处理置信区间

一些基本定义

人口 :我们要测量某个属性的全部集合。我们(几乎)永远无法获得足够的总体数据。因此,我们永远无法知道人口属性的真实值。

样本 :我们可以收集的总体数据的一部分(子集),它有助于我们估计总体的特性。因为我们不能测量总体属性的真实值,所以我们只能估计它们。这是统计学家的中心工作。

统计量 :统计量是样本的函数。这是一个随机变量,因为每次你取一个新的样本(来自同一人群)你将得到一个新的统计值**。例如样本均值或样本方差。这些是对人口的良好(无偏)估计。**

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

置信区间 :统计量的一个范围/界限(由我们选择)。我们需要这个最小/最大界限来量化我们抽样的随机性质的不确定性。让我们以平均值的置信区间为例进一步阐明这一点。

根据我们抽取样本的地点和方式,我们可能会得到很好的总体代表性,也可能得不到。所以,如果我们 多次重复抽取样本的过程 ,在某些情况下样本会包含总体的真实均值,而在另一些情况下,它会漏掉它。

我们能说一下我们成功抽取包含真实均值的样本的比例吗?

这个问题的答案在置信区间里。如果满足一些假设,那么我们就可以计算出包含某个分数的真实均值(当我们大量采样时)的置信区间。

下面给出了必要的公式。我们不会讨论这个公式的细节,也不会讨论为什么在这个公式中使用特殊的 t 分布。读者可以参考任何本科水平的统计文本或优秀的在线资源来理解基本原理。

** [## z 和 t 分布的置信区间

1)理解置信区间的概念,并能够为均值构建一个置信区间 2)理解何时(为了什么…

pages.wustl.edu](https://pages.wustl.edu/montgomery/articles/2757#:~:text=The%20t%2Ddistribution%20incorporates%20the,less%20than%20the%20sample%20size.) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

置信区间图解:图片来源(公立大学课程资料)

我们能说一下在抽取包含真实均值的样本时成功的比例吗?这个问题的答案在置信区间里。

实际效用如何?

请注意定义和过程,以了解置信区间的真正实际用途。

当你计算均值的 95%置信区间时,你不是在计算任何概率(0.95 或其他)。您正在计算两个特定的数字(样本均值的最小和最大界限),如果我们重复这个过程,它将创建一个包含真实总体均值(未知)的值范围。

这就是实用之处。我们不会重复这个过程。我们只是抽取一次样本,构建这个范围。

如果我们可以重复这个过程一百万次,我们将能够验证声称在 95%的情况下,真实平均值位于这个范围内。

但是在现实生活中,采样一百万次是非常昂贵的,而且是完全不可能的。因此,置信区间的理论计算为我们提供了最小/最大范围,仅来自样本的一次抽取。这太神奇了,不是吗?

但是在模拟中,我们可以实验一百万次!

是的,模拟是神奇的。我们可以重复抽样过程一百万次,并验证我们的理论置信区间真正包含总体均值(大约 95%的时间)的说法。

让我们用一个工厂生产的真实例子来验证一下。假设在一个工厂中,某台机器平均生产 20 吨产品,标准差为 5 吨。这些是真实的总体均值和标准差。因此,我们可以编写简单的 Python 代码来生成一年(52 周)的典型生产运行,并绘制它。

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

然后,我们可以编写以下函数对**过程进行任意次模拟,以计算置信区间真正包含总体均值的次数。**记住,我们知道这种情况下的总体均值——是 20。

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

如果我们运行这个函数 10,000 次,每次都计算 C.I .是否包含真实平均值,然后检查频率/比率,我们得到以下结果。

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

这些比率惊人地接近理论计算值 0.9 (90%)和 0.99 (99%),不是吗?

我们可以重复抽样过程一百万次,并验证我们的理论置信区间确实包含总体均值的说法。

模拟是大规模数据科学的有力工具

在上面的例子中,我们讨论了均值的置信区间。但我们可以围绕任何其他统计数据构建 C.I .比如方差或 T2 分位数。我们甚至可以构建两个实验之间的平均差异的的置信区间。在每种情况下,确切的公式和计算可能略有不同,但想法是相同的。

随着流程复杂性的增加,我们处理的不是一个而是多个相互关联的流程,在实践中计算简单的汇总统计数据可能并不总是可行的。对于大型数据科学和分析任务,我们必须掌握随机模拟的艺术来处理这种情况。

仿真综述与思考

在本文中,我们展示了模拟理解统计估计概念的能力,如期望值置信区间。事实上,我们没有机会重复统计实验数千次,但我们可以在计算机上模拟这个过程,这有助于我们以清晰直观的方式提取这些概念。

一旦你掌握了模拟随机事件的艺术,你就可以用一种新的分析武器来研究随机变量的性质和它们背后深奥的统计理论。

例如,你可以用随机模拟来研究,

  • 许多随机事件的均值收敛于正态分布(用数值实验验证中心极限定理)
  • 看看当你以这种或那种方式将许多统计分布混合或转换在一起时会发生什么?你会得到什么样的分布呢?
  • 如果一个随机事件不遵循理论假设,结果会是什么样的异常行为?在这种情况下,模拟可能是你唯一的朋友,因为如果假设不成立,标准理论就会失效。
  • 深度学习网络的运行会出现什么样的统计特性?

对于学习数据科学和机器学习的基本原理来说,这些练习的重要性怎么强调都不为过。

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

如果你喜欢这篇文章,你可能也会喜欢我关于随机模拟和使用 Python 的统计概念的其他文章。

** [## Python 中的蒙特卡罗集成

一个著名的赌场启发的数据科学,统计和所有科学的把戏。用 Python 怎么做?

towardsdatascience.com](/monte-carlo-integration-in-python-a71a209d277e) [## 用 Python 实现布朗运动

我们展示了如何模拟布朗运动,在广泛的应用中使用的最著名的随机过程,使用…

towardsdatascience.com](/brownian-motion-with-python-9083ebc46ff0) [## 如何从头开始生成随机变量(不使用库)

我们通过一个简单的伪随机生成器算法,并显示如何使用它来生成重要的随机…

towardsdatascience.com](/how-to-generate-random-variables-from-scratch-no-library-used-4b71eb3c8dc7) [## 用简单的 Python 例子揭开假设检验的神秘面纱

假设检验是数据科学的基础。我们使用简单的真实例子来演示这个概念,使用…

towardsdatascience.com](/demystifying-hypothesis-testing-with-simple-python-examples-4997ad3c5294)

喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我将收取您的一部分会员费,而不会对您产生额外费用

[## 通过我的推荐链接加入媒体

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@tirthajyoti/membership)****

使用生成对抗网络的随机天气生成器

原文:https://towardsdatascience.com/stochastic-weather-generator-using-generative-adversarial-networks-a9856b0f83ef?source=collection_archive---------33-----------------------

使用 GANs 对多元分布建模

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

作者图片

被困在付费墙后面?点击这里使用我的朋友链接阅读这个故事!

G 世代模型已经被用于不同领域的无数应用中——从定量金融到水文气候研究的建模和最小化尾部风险,再到研究极端天气的联合影响。生成模型的强大之处在于它能够封装整个依赖结构和数据集的潜在概率分布。这非常有用,因为使用生成模型,我们不仅可以创建数据集的未来表示,还可以对新的真实数据点进行采样,从而保持原始训练数据集之间的交叉相关性。

生成对抗网络(GANs)是由good fellow et al .(2014)首先提出的一类新的生成模型。从那时起,GANs 在机器学习社区中被广泛采用,以解决无监督的机器学习问题,包括图像/文本生成和翻译。在本文中,让我们探索如何使用 GANs 来模拟离散时间随机过程,并按需创建可信的样本来构建天气数据的合成时间序列。

甘小说简评:

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

生成性对抗网络的架构示意图(图片由作者提供)

GANs 架构由两个子模式组成,称为 生成器(G)鉴别器(D) ,它们相互竞争,目标是通过训练过程达到纳什均衡。生成器学习将潜在空间(例如,Noise ~ N(0,1) )映射到给定数据样本分布的数据空间,并且鉴别器评估生成器完成的映射。生成器的主要作用是生成模拟训练数据集的合成数据,达到鉴别器不能区分合成数据和真实数据的程度。

发生器的输入是一个随机噪声向量x’(通常是均匀或正态分布)。噪声向量通过生成器映射到一个新的数据空间,得到一个伪样本G(x’),它是一个多维向量。鉴别器是一个二元分类器,它接受合成的*G(x’)*和训练( x )数据集,并学习将它们分类为假的和真的。当鉴别器不能确定数据是来自真实数据集还是来自发生器时,达到 GAN 模型的最佳状态。

随着时间的推移,GANs 的几种变体被开发出来,以解决手头问题的特定需求,但是所有这些变体都采用分两个阶段进行的对抗性训练:

**第一阶段:**训练鉴频器,冻结发电机。这是通过将真实和虚假数据的样本传递给模型并评估鉴别器是否能够正确预测它们来实现的。在训练过程的第一阶段,网络将只进行正向传递,不进行误差的反向传播。

**第二阶段:**在此阶段,我们训练发电机,并冻结鉴别器。这可以通过优化发生器来实现,以创建逼真的样本来欺骗第一阶段中经过训练的鉴频器。

一旦训练完成,GANs 模型将被优化以生成足够真实的合成时间序列,从而模拟真实的时间序列数据。训练后,生成模型可用于按需创建新的可信样本。

什么是随机天气发生器?

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

作者图片

随机天气生成器是一种统计模型,旨在通过分析某个地区的天气统计特征,生成该地区无限长的天气数据合成时间序列。大多数随机天气生成器使用马尔可夫过程和不同天气变量的频率分布的组合。

在气候建模中,传统上使用连接函数对多元分布进行建模。copula 函数是具有标准一致边缘的多元分布。任何多元分布都可以写成它的边际分布和它的 copula 的组合。例如,在二元情况下,给定两个连续的随机变量***【x】【y】,具有边际分布【F】【G】,以及联合分布【Q】*,存在一个系词【C】**使得

GANs 提供了一个完全不同的框架来模拟多元分布。结合使用生成性和鉴别性模型,以及对抗性训练,我们将能够将噪音转化为现实的天气数据。

数据:

在这项研究中,我们将使用位于加州湾区的五个气象站的月总降水量。为了训练 GAN 模型,我们将使用从 NOAA 的 USHCN 数据库获得的 1893 年至 2012 年的月降水量数据。降水量的单位是百分之一英寸。我们将重点关注 GANs 通过模拟月总降水量来获取五个气象站之间的空间相关性的能力。

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

湾区气象站(图片由作者提供)

型号:

对于 GAN 的发生器和鉴别器组件,我们将采用三层顺序模型。潜在向量将包括从正态分布中采样的 20 个值。我们将在隐藏层中使用流行的 ReLU 激活函数,并使用平均绝对百分比误差(MAPE)损失和随机梯度下降的 Adam 版本来训练模型。为了防止模型过拟合,我们将采用剔除正则化技术。本研究中使用的 GANs 架构示意图如下所示

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

甘建筑(图片作者提供)

我们的模型输出将有 10,000 个合成数据样本,其中 5 个输出特征对应于利弗莫尔、伯克利、纳帕、佩塔卢马和圣克鲁斯地区的月总降水量。该模型是使用 Python 中的 Keras 库实现的,下面提供了代码片段。

结果:

正如本文介绍部分所提到的,GANs 最大的优势之一是它能够按需生成数据。使用经过训练的 GANs 模型,为五个气象站中的每一个生成了 10,000 个新的合成数据点。下图和下表比较了用于训练模型的实际数据和 GANs 模型生成的合成数据的描述性统计数据。

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

不同气象站降水数据的箱线图(实际)

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

不同气象站降水数据的箱线图(合成)

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

实际(训练)和合成数据的描述性统计和相关性比较

对模型结果的快速回顾表明,GAN 模型能够相对较好地了解每个气象站的数据分布,同时保持站之间的交叉相关性。对于圣克鲁斯站,模型估计值略高于观测值。但一般来说,合成数据的样本最小值、下四分位数(25%)、中值(50%)、上四分位数(75%)和样本最大值与实际数据的相应统计数据匹配良好。通过优化潜在向量的大小、层数、代价函数、训练算法和激活函数,可以进一步提高 GAN 模型的性能。

基于 GANs 的数据增强;

对于大多数现实世界的应用程序来说,数据稀缺是需要解决的最大瓶颈之一。在保险和风险分析领域尤其如此,数据质量进一步加剧了数据稀缺的问题。GANs 提供了一个强大的预训练建模框架,可以人工合成新的标记数据,用于开发更好的模型和风险分析。这项研究只是触及了 GANs 在风险建模中的潜在应用的表面。敬请关注更多内容。

感谢阅读这篇文章!感谢所有反馈。如有任何问题,请随时联系我。

如果你喜欢这篇文章,这里还有一些你可能喜欢的文章:

** [## 使用深度学习的飓风路径预测

每年 6 月 1 日到 11 月 30 日之间的时间窗标志着北大西洋飓风季节。在此期间…

medium.com](https://medium.com/@kap923/hurricane-path-prediction-using-deep-learning-2f9fbb390f18) [## 通过数据科学解读气候变化

用 FB Prophet 预测未来 CO₂水平

towardsdatascience.com](/interpreting-climate-change-through-data-science-321de6161baf) [## 飓风佛罗伦萨——建立一个简单的风暴路径预测模型

飓风佛罗伦萨是 2018 年大西洋飓风季节的第一场主要飓风。从它在海角附近的起源…

towardsdatascience.com](/hurricane-florence-building-a-simple-storm-track-prediction-model-1e1c404eb045)**

股票基本面分析:SEC 季度数据汇总的 EDA

原文:https://towardsdatascience.com/stock-fundamental-analysis-eda-of-secs-quarterly-data-summary-455e62ff4817?source=collection_archive---------34-----------------------

大熊猫 2020 SEC 申报的探索性数据分析

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

马库斯·斯皮斯克在 Unsplash 上的照片

许多投资者认为基本面分析是他们战胜股市的秘密武器。您可以使用许多方法来执行它,但是它们有一个共同点。他们都需要关于公司财务报表的数据

幸运的是,所有在美国股票市场交易的股票都必须向证券交易委员会提交季度报告。每季度 SEC 都会准备一份舒适的 CSV 文件,帮助所有投资者寻找投资机会。让我们来探讨如何从这些中获得有价值的见解。csv 文件。

在本教程中,我们将使用 python 的 pandas 库来解析 CSV 文件,我们将学习如何:

我们将处理数据并:

  • 浏览秒转储中的文件
  • 查看这些文件的每一栏,并讨论与最相关的
  • 移除按关键列或多列分组的重复的数据
  • 使用交互式 Plotly 图表可视化数据以支持我们的探索
  • 还有更多

和往常一样,你可以按照 GitHub 上分享的笔记本里的代码。

[## vaclavdekanovsky/数据分析示例

permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…

github.com](https://github.com/vaclavdekanovsky/data-analysis-in-examples/blob/master/SEC%20Quarterly%20Data%20Dump/EDA_of_SEC_2020Q1_Filling_sub.ipynb)

SEC 季度数据

好像没什么问题。你只需从 SEC 数据集页面下载季度包,按降序排列财务报表中的数值,并挑选顶部的股票。现实并没有那么简单。让我们来看一看 2020 年第一季度所有 SEC 备案的 45.55MB 大 zip 文件。

每个季度的包包含 5 个文件。这里有一个 2020 Q1 的例子:

  • readme.htm—描述文件的结构
  • sub.txt —关于提交文件的主要信息,包括公司标识符和文件类型
  • num.txt —每份财务报表和其他文件的数字数据
  • tag.txt —标准分类标签
  • pre.txt —关于 num.txt 中的数据如何显示在在线演示文稿中的信息

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

SEC 季度数据转储中的解压缩文件

本文将只讨论 submission master,因为它包含的信息对于一篇文章来说已经足够了。后续报道将更详细地研究这些数据。我们开始吧。

2020Q1 提交文件

2020 年第一季度,这些公司已经提交了13560文件,sub.txt 收集了关于它们的 36 个专栏。

# load the .csv file into pandas
sub = pd.read_csv(os.path.join(folder,"sub.txt"), sep="\t", dtype={"cik":str})# explore number of rows and columns
sub.shape[Out]: (13560, 36)

我总是从一个简单的函数开始,该函数检查数据框的每一列,检查空值的百分比,以及有多少唯一值出现在列中。

浏览 sub.txt 文件,查看每列包含的数据

让我强调一下 SEC submission master 中的几个重要栏目。

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

pandas 中的快速文件概览示例

  • adsh — EDGAR 登录号唯一标识每份报告。该值在 sub.txt 中从不重复,例如 0001353283–20–000008 是 Splunk 的 10-K(年度备案)代码。
  • cik —中央索引键,识别每个 SEC 注册人的唯一键。例如,Splunk 的 0001353283。如您所见,adsh 的第一部分是 cik。
  • 名称 —提交季度财务数据的公司名称
  • 表格 —提交报告的类型

表格 s—提交给 SEC 的提交类型

根据分析,我们看到 2020 年第一季度提交的报告包含 23 种独特的财务报告。投资者的主要兴趣在于涵盖上市公司年度业绩的 10-K 报告。因为这份报告预计每年只提交一次,所以显示公司财务季度变化的报告也很重要。

  • 10-K美国公司年报
  • 10-Q季度报告和也许
  • 20-F外国公司的年度报告
  • 40-F外国公司的年度报告(加拿大)

让我们看看哪些表单在数据集中最常见。2020Q1 中表格类型的绘制将显示此图片:

使用 Plotly 的低级 API 生成条形和饼形支线剧情

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

各公司在 2020 年第 1 季度使用 Plotly 中的可视化功能报告了不同的提交类型

该数据集包含超过 7000 份 8-K 报告,通知重要事件,如协议、裁员、材料使用、股东权利修改、高级职位变更等(参见 SEC 的指导方针)。因为它们是最常见的,我们应该花些时间来探索它们。

8k 唱片公司

仅过滤8-K表单,我们看到数据集包含这种类型的7502记录。

[In]:
# let's filter adsh, unique report identifier of the `8-K`s
eight_k_filter = sub[sub["form"]=="8-K"][["name","adsh"]]
eight_k_filter.shape[Out]: (7502, 2)

如果我们将包含详细财务数据的num.txt合并,我们只能得到2894行。有些记录似乎没有细节。

[In]:
# load the num.txt file containing detailed data
num = pd.read_csv(os.path.join(folder,"num.txt"),sep="\t")# merge the file headers with the detailed data 
eight_k_nums = num.merge(eight_k_filter)
eight_k_nums.shape[Out]: (2894, 10)

除此之外,这些记录仅涵盖20份独特的报告(每份报告由adsh号标识)。

[In]: len(eight_k_nums["adsh"].unique())
[Out]: 20

这是因为num.txt只包含财务细节,而大多数8-K用文字描述事件。只有像0001262976–20–000015这样的罕见事件,这种特殊情况会声明额外的财务报表作为8-K报告的一部分。

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

num.txt 中的每一行正好包含财务报表中的一行

8-K以纯文本描述事件,这不是转储的一部分。只有在包括财务报表的情况下才会出现详细信息,这种情况很少见

8-K 没有财务明细,其他表格有吗?

我们很少在num.txt中看到任何与8-K表单相关的数据。让我们用图表显示所有的表格类型,看看其他归档是否有所不同。我们将把num.txt左连接到sub.txt,并使用indicator参数来查看哪个adsh键出现在两者中。

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

只有 8-K 和 8-K/A 与财务详细信息无关

当我们连接这两个文件时,我们可以看到只有8-K8-K/A缺少财务细节,这很好,因为现在我们将研究年度10-K和季度10-Q报表

10K 和 10 Q

在 8-K 文件中,只有 20 份包含 SEC 季度数据转储中的额外信息,这并没有带来多少好处。让我们将注意力转移到更有趣的提交类型——年度报告和季度报告,然后我们将简要地看一下其他的形式。

SEC 在 2020 年 4 月初发布了数据集,因此我们很有可能在记录中看到一些日期为 2019-12-31 的年度报告。如果我们只过滤10-K10-Q,我们会发现 2020Q1 转储中的大部分数据都是年度报告。

# filter only 10-K and 10-Q forms
tens = sub[sub["form"].isin(["10-Q","10-K"])]# count how many forms of each type are in the dataset
tens_counts = tens["form"].value_counts().reset_index().rename(columns={"index":"form type", "form": "count"})# using Plotly.Express create a bar chart
fig = px.bar(tens_counts,
            x="form type",
            y="count",
            barmode='group', 
            text="count", 
            title="Number of Annual and Quarterly forms in 2020Q1"
           )
fig.show()

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

Q1 的 SEC 数据转储主要包含年度报告

但是所有的公司都在一年的最后一天报告年度报表吗?

财政年度

数据集包含列fyfp,它们表示财务报表所代表的财政年度和季度。我们绘制了最典型的图表。(有关代码,请参见完整的笔记本“财政年度”部分)

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

2019 年的年度报表是最典型的,但我们看到一些 Q1、Q2 甚至 2020 年第三季度的报表

它揭示了一个有趣的事实,即 2020 年第一季度的数据包含 2020 财年的第二季度和第三季度。我们怎么可能在第一季度就已经知道夏季和秋季的财务结果呢?

让我们来看一下雷克斯诺德公司的财务报表。

本报告中 2020 财年之前(含)的财年是指相应日历年的 4 月 1 日至 3 月 31 日。例如,我们的 2020 财年,即 2020 财年,是指 2019 年 4 月 1 日至 2020 年 3 月 31 日这段时间。— Rexnord 公司

财政年度不必与日历年度完全相同。有些公司在 1 月份结束了 2020 财年,大部分数据都进入了 2019 年。意味着一个公司的财政收入和其他公司没有可比性。

2020 财年将从 2 月 19 日持续到 2020 年 1 月

2019 年营收如何确定?

为了使价格与基本面特征一致,我们必须确定收入何时获得,现金何时流入。我们用什么变量来找出财务数据的真实时间框架?它是数据集中另一个名为period的变量。再来看剧情。

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

period 变量表示表单财务周期的结束日期。

我使用了 Plotly 的高级 API,所谓的 Plotly.express 。它在数据集方面非常强大,然而,它却在不同类型的支线剧情中挣扎,比如本例中的条形图旭日 char t。

fig=**px.bar**(tens_period_stats_1, # preproces statistics in a DataFrame
           **x="period"**, # on x-axis display the period
           **y="records"**, # on y-axis count of the records
           **color="form"**, # split the bar chart by form (10-K, 10-Q)
           # created groupped bar-chart (not stacked)
          ** barmode="group"**, 
           **text="records"**, # label the bars with counts
           # show only period from Sept-2019 to March-2020
           # you can zoom-out the chart by double click
           **range_x=['2019-09-30','2020-03-31']** 

          )# plotly also struggles a bit with date-time variables,
# to make sure I see end of the months a specify that I really want ticks at these values
fig.update_xaxes(
    ticktext=tens_period_stats_1["period"].astype('str'),
    tickvals=tens_period_stats_1["period"].astype('str')
)fig.show()

如果您想要显示类别的详细信息,旭日图是饼图的有用替代物。

fig=**px.sunburst**(tens_period_stats_1,
                path=["label","form"],
                values="records")
fig.show()

我们可以看到,大部分报表都落入了 2019 年底 2020 年初的预期期。还有一些来自 2019 年 9 月、10 月和 11 月的申请。为什么它们不属于 2019 年第四季度的前一次转储?

注意:周期似乎在一个月的最后一天结束,但这是由 SEC 引入的舍入引起的。有些公司,如 John Deere 使用 52/53 周财年,其会计年度于 2019 年 11 月 3 日结束(参见 SEC 文件)。然而,大多数公司都会在月底前提交报表。

处理这些报表需要多长时间?平均处理时间。

SEC 规定季度报表的最后期限为 40-45 天,年度报表的最后期限为 60-90 天(参见 SEC 指南)。小公司 60 天,大公司 3 个月。这意味着在 1 月初发布 2019 年第四季度数据时,一些公司还没有上传 10 月、11 月甚至 9 月的数据。这就是为什么它们会出现在 2020 年的第一批垃圾中。

让我们看看是否每个人都设法满足这些期限。我们将accepted(SEC 接受数据时)的值与财政期结束时的period进行比较。

# we subtract `period` from `accepted` and turn into days
tens_latest_period["delivery_time"] = (tens_latest_period["accepted"] - tens_latest_period["period"]).dt.days

我们关注基本的统计参数:

[In]: df["delivery_time"].agg(["mean","median","min","max"])
[Out]: 
mean        78.115119
median      58.000000
min         11.000000
max       2929.000000

最快的会计师在 11 天内提交报表,但平均值和中间值都接近 60 天。使用 Plotly 创建直方图的能力,我们可以检查通常的交付时间。

**px.histogram**(df, 
             x="delivery_time", 
             color="form", 
             # maximum is 2929 days, but most of the values appear in the first fifth of the chart
             range_x=[0,200])

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

我们看到季度报告的交付时间大多长达 50 天,而年度报表的交付时间则长达 90 天

你注意到 90 天后提交的表格数量突然下降了吗?它承认,大多数公司都能在截止日期前提交,只有少数公司提交晚了。还可以有一些修正,我们将在下一节中探讨。

典型的年度报告超过 50 页。见亚马逊的 10k

大家都只报一个 10-K 还是 10-Q?

我们希望每家公司每个季度只报告一份报告,但是一个勤奋的分析师会仔细检查。我们根据公司的唯一cik号分组,并标出有多少公司提交了一份申请,以及是否有一些公司提交了更多的申请。

# Is 10-K/Q reported once by each company or more times? 
tens = sub[sub["form"].isin(["10-Q","10-K"])]# using `.value_counts().value_counts()` combo will tell us
# how many companies have 1, 2 or more records
tens_counts_by_company = tens["cik"].value_counts().value_counts().sort_index().to_frame()

然后我们可以直接从熊猫创建一个情节,如果你设置了

pd.options.plotting.backend = "plotly"

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

你可以使用不同的“后端”选项直接从熊猫绘图。查看 Matplotlib 如何仅显示输入的 xticks,同时 Plotly 填充 x 轴上缺失的值

我们预计所有的cik都只提交了一份报告,对于大多数公司来说,这是事实。然而,有一些张贴了更多的记录。

[In]: tens["cik"].value_counts()[Out]: 
1191334    33
1165639    14
1624985     8
1481504     4
...
1517681     1

公司为什么要这么做?这些错误是对以前提交的错误还是更正?他们是否将信息分成多个文件?我们不会知道,除非我们看看多次提交的例子。

我们过滤重复的行:

# we filter the "cik"'s which appear more than once
companies_reporting_more_tens = tens["cik"].value_counts()[tens["cik"].value_counts()>1]# we look on few columns with relevant data
columns_to_see = ["adsh","cik","name","period","fy","fp","filed", "form"]
tens[tens["cik"].isin(companies_reporting_more_tens.index)].sort_values(by=["cik","period"])[columns_to_see]

上面的代码显示了 321 行,按cikperiod排序,简单看一下就会告诉我们,实际上,大多数公司都提交了一些历史更正。拥有cik=1191334的公司似乎报告了包含 24 份季度报告和 9 份年度报告的全部历史,但大多数只发送了一两份额外的文件。

# preprocess the data
df = tens[["form","cik"]].groupby(["cik","form"]).size().to_frame("submitted 10-K/Q")\
.reset_index().groupby(["form","submitted 10-K/Q"]).size().to_frame("company count").reset_index()# Create a bar chart with two series, one for 10-K and one for 10-Q
fig = px.bar(df[df["submitted 10-K/Q"]>1], 
            x="submitted 10-K/Q", 
            y="company count",
            barmode="group", 
            color="form", 
            title="Number of companies having more than 1 submission in 2020Q1")# update the tickers to each each one starting from 1 with step of 1
fig.update_layout(
    xaxis_type='category'
)
fig.show()

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

设置 xaxis_type='category '将强制 Plotly 以发送的方式显示值,并且不使用从 1 到 len(df)的线性值。不幸的是,一个范围接一个范围,所以所有的 10-K 在左边,剩下的 10-Q 在右边。

现场检查没有发现任何公司会在同一时期发送两种填充物。我们能证明他们真的不存在吗?

[In]: tens.groupby(["cik","period"]).size().max()
[Out]: 2

对分组cik&period组合的检查发现,有一些公司将同一时期的数据上传给 SEC 两次。

让我们通过使用groupby作为过滤器来观察它们:

[In]: tens.groupby(["cik","period"]).size()[tens.groupby(["cik","period"]).size()>1][Out]:
cik      period    
1191334  2013-09-30    2
1635748  2019-06-30    2

详细的观察表明,它们在filedaccepted或两者上有所不同。

删除重复项

重复的线是每个数据集的祸根。它们导致许多问题,因为它们扭曲了度量标准,污染了机器学习模型,并且随着每个连接而成倍增加。一旦我们发现它们,我们应该立即决定如何去除它们。

在我们的情况下,我们将只接受后来填写的表格(更高的filed),如果所有记录都相同,我们将采用较新的accepted。熊猫的.cumcount()功能将帮助我们完成任务。这相当于 SQL 的ROW_COUNT(),我们将只选取每条记录的第一次出现。详细步骤如下:

  • 按决定性字段filedaccepted对数据进行排序
  • 按分区列分组— cikperiod
  • 使用.cumcount()对行 0,1,2 进行排序…
  • 仅过滤具有该值的行==0
# for all the `10-K` and `10-Q` we reduce the number of rows from 5212 to 5210
tens = tens.loc[tens.sort_values(by=["filed","accepted"],ascending=False).groupby(["cik","period"]).cumcount()==0]

Github 上查看完整的代码和详细的分解。

类似的算法将帮助我们仅获得 2020 年第一季度提供的最新提交:

tens_latest_period = tens.loc[tens.sort_values(by="period", ascending=False).groupby("cik").cumcount()==0]

外国公司

10-KQ对所有在股票市场交易的美国公司都是强制性的。但 SEC 收集从美国市场受益的外国企业的信息。他们必须按照20-F40-F表格提交财务报表。它们有什么不同?

让我们使用列countrybacityba来保存注册人的业务地址信息。我们把这些信息转换成地址。

[## Python 的地理编码-将地址列表转换为地图

如何使用地理定位 API 接收绘制客户、工厂、车队地图所需的数据…

towardsdatascience.com](/pythons-geocoding-convert-a-list-of-addresses-into-a-map-f522ef513fd6)

有了这些地方的纬度和经度,我们就可以在世界地图上显示出来。Plotly 的.scatter_geo()是我们需要的图表类型:

# set up the chart from the df dataFrame
fig = px.scatter_geo(twenties, 
                     # longitude is taken from the df["lon"] columns and latitude from df["lat"]
                     lon="lon", 
                     lat="lat", 
                     # choose the map chart's projection
                     projection="natural earth",
                     # columns which is in bold in the pop up
                     hover_name = "name",
                     # format of the popup not to display these columns' data
                     hover_data = {"name":False,
                                   "lon": False,
                                   "lat": False,
                                   "countryba": True
                                     },
                     color="form",
                     size_max=20
                     )
# fit the map to surround the points
fig.update_geos(fitbounds="locations", showcountries = True)fig.show()

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

40-F 专用于在加拿大注册的公司,而 20-F 则用于其他外国公司

自己试试

你想自己试试吗?没有比这更简单的了。SEC 最近公布了 2020Q2 数据。下载它们,解压缩并运行笔记本中的脚本,看看表单的结构在第二季度是否发生了变化。

[## vaclavdekanovsky/数据分析示例

permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…

github.com](https://github.com/vaclavdekanovsky/data-analysis-in-examples/blob/master/SEC%20Quarterly%20Data%20Dump/EDA_of_SEC_2020Q1_Filling_sub.ipynb)

结论

在本文中,我们回顾了 SEC 季度数据转储中提供的提交类型。我们已经看到,最常见的8-K在转储中没有附加信息。因此,我们重点关注年度和季度报表,并探索这些报表在提交后的 180 天内出现在数据集中。大多数公司在一个季度报告一份报表,但我们已经看到一些历史文件和一些副本。

通过删除重复项,我们为分析的下一步——探索财务状况——准备了数据集。但是对于本文来说,这些信息已经足够了,我们将在下次讨论。

如果您喜欢这篇介绍,请随意查看我的其他文章:

[## 阅读熊猫 CSV 时处理多余的空格

为什么我们关心空白?内置熊猫功能,自定义处理。创建 1M 测试数据和…

towardsdatascience.com](/dealing-with-extra-white-spaces-while-reading-csv-in-pandas-67b0c2b71e6a) [## 在一个文件夹中解压缩、更新和再压缩 XML

使用 python 自动化办公程序

towardsdatascience.com](/unzip-update-and-zip-again-xmls-in-a-folder-7d57f9710ddb)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值