TowardsDataScience 博客中文翻译 2019(七十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

贝叶斯网络基础

原文:https://towardsdatascience.com/basics-of-bayesian-network-79435e11ae7b?source=collection_archive---------13-----------------------

介绍

贝叶斯网络上的文本数不胜数,但其中大部分都有沉重的数学公式和概念,因此很难理解。在这里,我试图用最少的等式和一个真实世界的例子来尽可能简单地解释这个主题。

基本概念

贝叶斯网络是一个非常重要的工具,用于理解事件之间的相关性,并为它们分配概率,从而确定一个事件发生的可能性有多大,或者给定另一个事件发生的变化是什么。例如,假设你在学校因为迟到被老师责骂,迟到的原因可能有很多,比如起床晚了,交通堵塞等等。所以在这里,责骂取决于像晚起或交通堵塞这样的事件,也就是说,这些原因对你被责骂有直接影响。这可以有效地用贝叶斯网络来表示,我们很快就会看到。

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

Fig. 1

{X1,X2,……。有些事情就像被骂,晚起等等。在贝叶斯网络中,它们可以表示为节点。现在,如果一个节点依赖于另一个节点,那么从一个节点到另一个节点画一个箭头/弧线,如图 1 所示。它被解释为子节点的出现受其父节点的出现的影响。所以贝叶斯网络代表一个有向无环图。不允许在节点内形成循环模式,所以它是非循环的

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

Fig. 2: The Formula for Joint Probability Distribution

现在使用条件概率链式法则,我们可以很容易地得到完整的联合分布,即给定所有其他相关事件的最终事件的概率。(注:如果不确定条件概率和链式法则,就按照这些 讲座 *。它们是学习概率和贝叶斯统计的广泛资源。)*从等式中,我们可以看到子节点的概率取决于它的直接父节点。注: π 表示产品标志。

使用上述公式,我们可以推导出以下模型的联合概率分布公式。

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

Fig. 3

因此,使用图 2 中给出的公式,可以很容易地得到上述给定网络的联合概率估计结果。

贝叶斯网络模型的真实例子

现在让我们用一个真实世界的例子来结束本教程,以便更好地理解。

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

Fig. 4

让, P(A)表示你早上醒来晚的事件。

P(B)表示你上学迟到的事件。

P©表示你被老师责骂的事件。

P(D)表示路上堵车的事件

P(E)表示你父亲每天早上登上公共汽车的事件。

P(F)表示你父亲就职的事件。

那么你在学校被骂的概率有多大呢?现在,你可以很容易地用公式找到答案。所以最后的结果变成了 P(C|B)。P(B|A,D)。P(D)。P(A)

嘿,但是等等!!!P(E)和 P(F)呢???它们也存在于模型中。请记住,两个事件,如果没有用弧线直接或间接连接到任何其他节点,则称为独立事件,一个事件的发生不会影响另一个事件的发生。我们可以从模型中有把握地预测出 P(C|F) 的值,即你因为你父亲要上任的事件而被骂的概率是 0

给定父节点,每个节点的概率值以称为条件概率表(CPT) 的表格形式表示。下面的例子是 CPT 的代表。

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

Fig. 5: Conditional Probability Table (Creator: Muhammad Nazim Razali)

贝叶斯网络在现实世界中有着巨大的应用。给定症状,贝叶斯网络可以预测特定疾病导致症状的概率。此外,通过从两个犯罪现场收集证据,贝叶斯网络可以为调查小组提供关于两个地方的罪犯是否相关的有价值的见解。

一些 MOOCs 探索贝叶斯网络的更多内容:

1.概率图形模型斯坦福大学

2.机器学习的贝叶斯方法国立研究型大学高等经济学院

3.贝叶斯统计:从概念到数据分析作者加州大学圣克鲁斯分校

图形绘制基础

原文:https://towardsdatascience.com/basics-of-graph-plotting-7eaadd11a8d?source=collection_archive---------21-----------------------

我们大多数数据科学家进入这个行业是因为我们热爱数据(不管这意味着什么?不,我也不知道!).创造易于阅读的情节的能力通常是事后才想到的。大多数职位描述都会提到可视化数据的能力很重要,但我从未在面试或工作中与任何人就可视化的最佳实践进行过合理的对话。鉴于有这么多坏的阴谋,这肯定不是因为我们都是这方面的专家!

花两个月的时间做一些分析,然后让你所有的利益相关者都茫然地看着你的演示,这是没有意义的。虽然创建一个非常复杂的交互式 3d 可视化 make 看起来令人印象深刻,但如果底层图形执行得不好,那么试图用一些 java 代码来改进是相当浪费时间的。有一个著名的表达涉及闪光和一只狗,我不会在这里重复。

对我来说,一个图表应该是极简的,并且在可能的情况下,不言自明。因此,我决定在博客中分享我的观点。我已经包括了我在绘制图表时考虑的一些方法。

总则

你的目标是把注意力吸引到重要的部分,而不是用不必要的杂乱分散观察者的注意力。一条太细的线可能不会引起足够的注意,而一个不必要的图例会弄乱情节,没有任何有意义的贡献。不太重要的特征可以变得更淡,这样第一眼就看不出来。颜色应该是直观的:红色代表不好,绿色代表好。一个需要反复问自己的重要问题是*这个像素起了什么作用?*如果你没有一个好的答案,那么删除它。

典型的图表

我的起点是 matplotlib 的标准输出,并添加了一些我经常看到的内容。数据是 1981-1990 十年间墨尔本的最低温度,单位为摄氏度,每天有一个数据点。

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

我们想展示什么?

在我们开始做出任何改变之前,我们需要问自己*我们试图描绘的是什么?*我想提请大家注意两个特点。一是强烈的季节性行为,二是每天都有很大的波动。

线条样式

先说最根本的,实际数据。不要因为是时间序列数据就假设需要用线。使用线条的主要原因是为了跟踪数据点的顺序,但我们对精确的顺序并不感兴趣,我们只是想表明有很大的波动。线的另一个问题是,大量的注意力被吸引到离群值上,因为离群值与线的长度相关联。这是我的解决方案:

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

我们现在有两种不同的风格,一种用于原始数据,一种用于趋势。在这种情况下,这真的很有效,因为在我们的图中还有两个我们想要引起注意的特征。粗蓝线非常清楚地显示了温度的周期性和季节性,是该图的主要焦点。每日波动由散点图显示,淡灰点不太明显。

对于趋势线,我计算了每个月的平均温度,然后将其二次插值回每日时间序列。这产生了一个更加美观的流畅的情节。

轴文本

轴标签有一些明显的问题,我认为还有一些风格上的问题可以改进:

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

我将所有的文本放大,并选择将颜色改为灰色,因为我希望数据成为焦点,而不是轴标签。我还认为在 python 中使用衬线字体看起来更专业。

x 轴:x 刻度标签太长,最后重叠了。一个解决方案是旋转日期,但是因为我每年只有一个刻度,所以我不需要日期或月份。给定上下文,我们还可以推断 x 轴指的是日期,而不必明确标记它。

y 轴:我还微妙地改变了界限,使顶部刻度上方和底部刻度下方的空间相等。

称赞那些发现我也把轴的宽度设为 2 而不是标准的 1 的人。非常学究气,但它会有意义的页面。

神话;传奇

您的图例有一些可用的格式选项。最重要的和第一个你应该考虑的是*你需要一个吗?*在一个理想的世界里,你的阴谋没有一个是显而易见的,但它并不总是可以避免的,然而它应该是你要考虑的事情列表的顶部。在这种情况下,我认为这是非常明显的,所以我认为添加图片标题是最干净的选择。

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

Daily temperature measurements are shown by the grey dots with the 30 day mean shown in blue.

可能的话,把图例放在图中,因为它就在附近,你不必去找它。这也使得将数字转换成幻灯片的工作变得容易多了;浮动图例会使图像尺寸变得非常大,不会给幻灯片上的文本留下太多空间。然而,也不要把图例放在图表中真正重要的部分(是的,我已经看过很多次了!!)

包围盒

我说的是包围该图并包括 x 轴和 y 轴的黑色矩形。对我来说,它切断了文本的视觉化,因此,切断了叙事,这就是它对你的观众的影响。我是一个相当新的采用者,但你可以让他们看不见!

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

Daily temperature measurements are shown by the grey dots with the 30 day mean shown in blue.

我还添加了水平线来标记 y 轴上的主要刻度,这样您可以更容易地读取实际值。同样,这些是非常苍白的,首先绘制出来,这样它们就不会压倒眼睛,但是当你需要它们的时候它们就在那里。

还记得我之前改变了小轴刻度的宽度吗??它们现在没有了主要的 x 轴和 y 轴,所以让它们更占主导地位比被误认为屏幕上的灰尘更有意义。

结论

花 5 分钟时间想出如何完善一个情节,抵得上花 5 个小时讨论它的意义。

密码

github repo中给出了绘制上述完善图的代码。

独立成分分析基础

原文:https://towardsdatascience.com/basics-of-independent-component-analysis-ad14f683b49b?source=collection_archive---------14-----------------------

动机

我们一直在寻找模式,并对数据进行更深入的理解。关于这个数据集,你首先想到的是什么?

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

如果你的第一个想法是——“那些点看起来太好了”——那么你抓住我了。这不是一个真正的数据集,我花了比我应该产生这些点更多的时间。然而,这不是重点。

你看到了什么?从视觉角度来看,很明显有两个群体有两种线性趋势。这两个组混合在一起成为一个不可区分的点集合。

再来一个:你能把这幅杰作中的两个组件分开,并辨认出画中的人吗?

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

I’m not religious but this has me thinking…

同样,这对我们来说不应该是个问题。我们可以在精神上分离这两个图像,但是如果有人要求这两个分离的图像,你实际上会怎么做呢?

我们需要一个分离混合数据集的数学框架和算法。

定义

在考虑这个数学框架之前,我们先用简单的思路写出来。

  1. 我们有不同部分组合的数据。
  2. 我们想把它分离成一个更简单的表示。
  3. 我们希望尽可能少的混乱。

假设我们有 m 个初始点:

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

我们想分成 n 个部分:

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

我们想找到一个分离初始点的变换。这种变换最简单的形式是一个 nm 矩阵 W

为了确保 n 输出被分离,我们可以搜索使分量尽可能不同于正态分布的变换。

如果你上过统计学课,那么你可能听说过正态分布(钟形曲线)。所有统计学中最重要的结果之一是中心极限定理,它表明将一组独立的样本(即使来自非正态分布)相加会得到正态分布。

所有组合的不同组或图像形成通常正态分布的混合点的集合。我们希望提取尽可能个别地呈非正态分布的成分。

峭度

描述概率分布的两个常用指标是平均值和**标准偏差。**它们代表分布的一阶和二阶矩,通常包含了关于平均值和分布的大部分信息。它们被定义为:

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

我们还可以讨论分布的三阶矩,称为峰度。峰度衡量分布的偏斜程度。我们将其定义为:

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

正态分布的峰度为 0。如果我们将峰度最大化,我们将得到一个尽可能非正态的分布。

摘要

在本文中,我们激发了我们分离由多个来源组成的数据的自然能力。从分散的数据集到过滤的图像,这些对于我们的大脑来说很容易分离,但从算法的角度来考虑更有趣。

本着让每个组件尽可能不同的想法,我们可以开始构建一个算法。找出导致具有最大峰态分布的变换。我们可以通过使用梯度下降来更新我们当前的候选,并继续下去,直到我们将原始数据分成不同的部分。

感谢阅读!独立成分分析是一个很好的工具,也是解决一些有趣问题的切入点。我很想听听你的反馈,看看是否有人对这个话题感兴趣——我只是触及了皮毛。

经典 CNN 的基础知识

原文:https://towardsdatascience.com/basics-of-the-classic-cnn-a3dce1225add?source=collection_archive---------3-----------------------

一个经典的 CNN(卷积神经网络)是如何工作的?

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

Classic CNN architecture.

卷积神经网络。听起来像是生物学和数学的怪异结合,还有点 CS 的成分,但这些网络是计算机视觉和图像处理领域最有影响力的创新之一。

卷积神经网络是多层感知器(MLP)的正则化版本。它们是基于动物视觉皮层神经元的工作而开发的。

计算机对图像的可视化

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

Binary image visualization.

假设我们有一个 JPG 形式的彩色图像,其大小为 480 x 480。代表性的阵列将是 480×480×3。这些数字中的每一个都被赋予一个从 0 到 255 的值,该值描述了该点的像素强度。图像的 RGB 强度值由计算机可视化以进行处理。

使用 CNN 的目的:

这个想法是,你给计算机这个数字数组,它将输出描述图像属于某一类的概率的数字(猫 0.80,狗 0.15,鸟 0.05,等等)。).它的工作原理类似于我们的大脑。当我们看一张狗的图片时,如果图片有可识别的特征,如爪子或 4 条腿,我们就可以把它归类为狗。以类似的方式,计算机能够通过寻找边缘和曲线等低级特征来执行图像分类,然后通过一系列卷积层建立更抽象的概念。计算机使用在初始级别获得的低级特征来生成高级特征,如爪子或眼睛,以识别对象。

一个经典的 CNN:

经典卷积神经网络的内容:-

1.卷积层。

2.每个卷积层之后的激活操作。

3.池层,尤其是最大池层,以及基于需求的其他层。

4.最后完全连接层。

卷积运算

第一层:

1。卷积层的输入

将图像调整到最佳大小,并作为输入馈送到卷积层。

让我们把输入看作是像素值的 32×32×3 阵列

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

2。存在滤波器或神经元或内核,其取决于内核大小的维度覆盖输入图像的一些像素。

设滤波器的核的维数为 5x5x3。

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

3.内核实际上滑过输入图像,因此它将滤波器中的值与图像的原始像素值相乘(也称为计算元素级乘法)。

对乘法求和,为特定感受野生成单个数字,因此为了滑动内核,总共 784 个数字被映射到 28×28 阵列,称为特征图

  • *现在,如果我们考虑相同维度的两个内核,那么获得的第一层特征图将是(28×28×2)。

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

高层视角

为了便于理解,让我们取一个大小为(7x7x3)的内核。每个核都被认为是一个特征标识符,因此可以说我们的滤波器是一个曲线检测器。

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

  • 原始图像和图像上内核的可视化。

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

生成的乘积值之和= 4*(5030)+(2030) = 6600(大数字)

  • 现在当内核移动到图像的其他部分时。

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

生成的乘积值之和= 0(小数字)。

小值和大值的使用。

1.价值低很多!这是因为在图像部分没有任何东西响应曲线检测器滤镜。记住,这个卷积层的输出是一个激活图。因此,在一个滤波器卷积的简单情况下(如果该滤波器是曲线检测器),激活图将显示图像中最有可能弯曲的区域。

2.在前面的示例中,我们的 26 x 26 x 1 激活图的左上角值(26 是因为 7x7 过滤器而不是 5x5)将是 6600。这个高值意味着输入音量中可能有某种曲线导致过滤器激活。在我们的激活图中,右上角的值将是 0,因为输入体积中没有任何东西导致过滤器激活。这只是一个过滤器。

3.这只是一个过滤器,用来检测向外向右弯曲的线条。我们可以为向左弯曲的线条或直边设置其他过滤器。过滤器越多,激活图的深度就越大,我们拥有的关于输入量的信息就越多。

在图片中,我们可以看到第一个 conv 的过滤器实际可视化的一些例子。训练网络的层。尽管如此,主要论点还是一样的。第一层上的滤波器在输入图像周围进行卷积,并且当它所寻找的特定特征在输入体积中时“激活”(或计算高值)。

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

顺序 conv。第一层之后的层。

1.当我们穿过另一个 conv。层,第一个 conv 的输出。层成为第二个 conv 的输入。层。

2.然而,当我们谈到第二个 conv 时。层,输入是从第一层产生的激活图。因此,输入的每一层基本上都描述了原始图像中某些低级特征出现的位置。

3.现在,当你在上面应用一组滤镜时(通过第二个 conv)。层),输出将是表示更高级特征的激活。这些特征的类型可以是半圆(曲线和直边的组合)或正方形(几条直边的组合)。当你通过网络,通过更多的 conv。层,您将获得表示越来越复杂功能的激活图。

4.在网络的末端,你可能会有一些过滤器,当图像中有笔迹时会激活,当看到粉红色物体时会激活,等等。

联营业务。

最大池示例。

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

2x2 filters with stride = 2 (maximum value) is considered

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

3x3 filters with stride = 1 (maximum value) is considered

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

3x3 filters with stride = 2 (maximum value) is considered

全连接层。

1.这个完全连接的层的工作方式是,它查看前一层的输出(我们记得它应该代表高级功能的激活图)和类别数量 N (数字分类为 10)。

2.例如,如果程序预测某个图像是一只狗,它将在激活图中具有高值,这些激活图表示像爪子或 4 条腿等高级特征。基本上,FC 层会查看哪些高级别要素与某个特定类最相关,并具有特定的权重,这样当您计算权重与前一层之间的乘积时,就可以获得不同类的正确概率。

3.完全连接的层的输出如下[0 .1 .1 .75 0 0 0 0 0 .05],那么这表示对于数字分类,图像是 1 的概率为 10%,图像是 2 的概率为 10%,图像是 3 的概率为 75%,图像是 9 的概率为 5 %( soft max 方法)。

培训。

我们知道内核也称为特征标识符,用于识别特定的特征。而是如何用特定的权重初始化内核,或者过滤器如何知道应该有什么值。

训练的重要一步由此而来。训练过程也被称为反向传播,它被进一步分成 4 个不同的部分或过程。

向前传球

损失函数

向后传球

重量更新

向前传球:

对于训练的第一个时期或迭代,第一 conv 的初始核。层用随机值初始化。因此,在第一次迭代之后,输出将是类似于[. 1 . 1 . 1 . 1 . 1 . 1 . 1 . 1]的内容,它不会优先考虑任何类,因为内核没有特定的权重。

损失函数:

训练涉及图像以及标签,因此数字 3 的标签将是[0 0 0 1 0 0 0 0 0 0 0 0 0 0],而第一个历元之后的输出非常不同,因此我们将计算损失( MSE —均方误差

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

目标是最小化损失,这是微积分中的一个优化问题。它包括尝试调整重量以减少损失。

向后传球:

它包括确定哪些重量对损失影响最大,并找到调整它们的方法,以减少损失。使用 dL/dW 计算,其中 L 是损失,W 是相应内核的权重。

权重更新:

这是使用以下等式更新内核权重的地方。

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

这里的学习速率由程序员选择。学习率的值越大,表示优化步长的步长越大,卷积到优化权重的时间越长。

测试。

最后,看看我们的 CNN 是否工作,我们有一套不同的图像和标签(不能在训练和测试之间双浸!)并通过 CNN 传递图像。我们将输出与地面实况进行比较,看看我们的网络是否有效!

基础知识:使用 Tensorflow 在 Anaconda 中创建虚拟环境

原文:https://towardsdatascience.com/basics-virtual-environment-in-anaconda-with-tensorflow-aecb60fb56ab?source=collection_archive---------18-----------------------

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

为您的机器和深度学习模型创建一个虚拟环境是保护它们的一个重要的主动步骤。这个隔离的内存空间将允许使用同一个包的不同版本。发生的更新将被严格管理和手动更新。让我们创建一个机器和深度学习虚拟 python 环境设置。

蟒蛇

如果您没有 Anaconda,请下载并安装最新版本。否则,继续更新 conda 和目前它里面的所有包。

安装 Anaconda

前往https://anaconda.com/distribution。页面中间是基于 Python 版本的安装程序选项。挑选你的毒药,安装在你喜欢的地方。

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

我会推荐安装 Python 3.7。Python 2.7 不再维护。已经“退休”了。

更新 Conda

康达是巨蟒之首。它是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包…“就像您应该更新 pip 一样,conda 也经常需要更新。当我们这样做的时候,并且对你的其他项目来说是安全的,我们将在此刻更新 Anaconda 中的所有包。

为此,打开 Anaconda Powershell 提示符。键入以下内容:conda update conda。

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

在某些时候,系统会提示您说是或否,以越过不可返回的点。如果你准备好了,按“y”键,让它继续。一旦完成,让我们更新所有当前安装的软件包。使用以下命令:conda update -all。

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

这将有相同的“是”或“否”提示。

第二步:GPU 利用率

这一步绝对是可选的。如果你有一个可以被 NVIDIA 的 cuDNN 和 CUDA 使用的 GPU,那就去用吧。这里是支持 CUDA 的 GPU 列表。

库达

CUDA 是一种简化 GPU 利用的计算和编程模型。要下载,请单击此处并为您的电脑选择合适的选项。

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

一旦您选择了适当的选项,正确的安装程序将会出现。

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

在本文中,10.2.89 版不需要任何补丁。如果您要安装的版本有修补程序,请确保在基本安装程序之后安装这些修补程序。

点击下载按钮并安装 CUDA。这将需要几分钟的时间,但是您可以使用安装程序中的默认选项。

cuDNN

cuDNN 是 CUDA 深度神经网络库的简称。它类似于最初的 CUDA,但正如其名称所示,它是用于深度神经网络的。

要下载,你需要创建一个 NVIDIA 的开发者账户。做起来很简单。一旦你创建了一个帐户,继续下载最新版本。下载文件将是一个 zip 文件夹。将它解压缩到计算机的 C:驱动器,然后将其添加到环境路径中。

环境路径

通过按 Win + R 打开“运行”窗口。要访问系统属性,您需要打开“sysdm.cpl”。

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

点击“确定”,然后系统属性窗口将会打开。点击“高级”标签,然后点击底部附近的环境标签按钮。在系统变量框下,有一个“新建”按钮,按一下。你可以给这个变量起任何你喜欢的名字,它的值将会是 cudnn 文件夹中 bin 文件夹的路径。

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

步骤 3:创建虚拟环境

要创建虚拟环境,您将使用以下命令结构:conda create-n env _ name pip python = version。因此,env_name 是您将赋予环境的名称,python=version 是您将使用的 python 版本。我们将继续创建一个名为 virtEnv 的环境,版本为 3.7。

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

在某个时候,系统会提示您按 y 或 n 继续创建。准备好了就按“y”键。

一旦创建了虚拟环境,我们就可以激活它了!为此,请使用命令 conda activate env_name。在我们的情况下,这将是康达激活 virtEnv。

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

提示符应该从(base)变为(virtEnv)或您为环境命名的任何名称。

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

步骤 4:安装必要的库

既然虚拟环境已经激活,我们就可以安装库了。这些库可以是项目所需的任何版本。对于这种环境,我们将安装 Tensorflow。因为我们在利用自己的 GPU 优势,所以会安装 Tensorflow 的 GPU 版本。如果您不想要那个版本,就放弃调用的’-gpu '部分。

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

这将安装 Tensorflow 2.0 及其所有依赖项。这可能需要一段时间。

步骤 5:检查 Tensorflow 是否已安装

我们快完成了!只差一步了。我们需要检查 Tensorflow 是否安装正确。通过在 Powershell 中键入“python”来打开解释器。当解释器打开时,它将显示您正在使用的 python 版本以及下面的> > >。那是我们将要打字的地方。

第一行我们将使用“导入张量流为 tf”来导入张量流。

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

接下来,我们将打印带有’ print(tf。__ 版本 _ _)。如果成功,版本号将出现在下面。

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

如果一切正常,按 ctrl+z 退出解释器。至此,您已经准备好在新创建的虚拟环境中创建项目了!

虚拟

好吧,我们可以解决房间里的大象。还有一个不涉及 Anaconda 的选项。Python 有一个名为 virtualenv 的库,用于为 python 项目创建虚拟环境。根据您使用的 python 版本,您可能需要也可能不需要安装 virtualenv 库。如果您正在使用 Python 2,那么您将需要使用 pip 来安装 virtualenv,然后创建一个新目录。在 Python 3 中,venv 模块是一个标准库,您只需要创建并激活环境。

虚拟环境管理

现在我们有了一个虚拟环境,您可能想要创建更多。在这一点上,它可以成为一个集群…乱七八糟。以下是一些有助于管理虚拟环境和保持头脑清醒的有用命令:

虚拟环境命令

查看您电脑上的环境:(两者做同样的事情)

  • 康达信息-envs
  • 康达环境列表

查看某环境下安装的软件包列表:

  • 当前未激活的环境 : conda list -n env_name
  • 当前激活的环境 : conda 列表

查看是否安装了某个包 : (env_name 是您的环境名,package_name 是您查询的包。)

  • conda list -n 环境名称包名称

启动环境:

  • conda 激活环境名称

停止环境:

  • 康达停用

移除环境:

  • conda 环境移除-n 环境名称

既然您的工具箱中已经有了虚拟环境技能,现在您可以创建许多不同的项目。都是相互独立的包版本!甚至是那些可以利用神经网络的,你可以在基础:神经网络帖子中了解到。

在我们重新学习之前,

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

篮球分析:预测获胜份额

原文:https://towardsdatascience.com/basketball-analytics-predicting-win-shares-7c155651e7cc?source=collection_archive---------4-----------------------

利用机器学习预测 NBA 顶级球员的个人胜率

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

最近,达里尔·莫雷声称勒布朗詹姆斯是有史以来最伟大的篮球运动员。很明显,差得远了。莫雷是 NBA 休斯顿火箭队的现任总经理。对于所有的棒球迷来说,莫雷是篮球界的比利·比恩。对于所有电影爱好者来说,莫雷就像是布拉德·皮特在《摇钱树》中扮演的篮球运动员。如果你没有理解前面两句话,那么你可能需要做一些研究。简而言之,莫雷是一个巨大的分析家伙。所以,当他谈论勒布朗·詹姆斯的成就时,这意味着在篮球分析学,或莫雷球,术语,勒布朗是有史以来最伟大的(试着告诉跳过贝勒斯)。

我从莫雷的言论中得出的最大问题是:他如何衡量哪个球员比下一个更好?是成功吗?影响?效率?(莫雷爱效率胜过比利·比恩爱上垒百分比)。

今天,有很多新的篮球指标被世界各地的球迷和分析师用来比较和衡量球员。例如,有球员效率评级(PER) ,它考虑了成绩,如投篮命中率、罚球、三分球、助攻、篮板、盖帽和抢断,以及负面结果,如投篮不中、失误和个人犯规。

一些先进的篮球指标,如 PER,可以很好地衡量球员在篮球比赛中的效率。但这是否告诉我们,这名球员将为他们的球队带来成功?也许吧。但是,一个玩家被视为成功的唯一方式就是获胜。

赢得股份是一个很好的开始,可以展示一个玩家给他们的团队带来了多大的成功。根据 Basketball-Reference 的说法,win shares 是一个衡量一名球员在整个赛季中为他的球队赢得比赛次数的指标。从这个角度来看,卡里姆·阿布杜尔·贾巴尔不仅是 win 份额的单赛季领导者,拥有 25.4 个 win 份额,而且是 win 份额的职业生涯领导者,拥有 273.4 个 win 份额。所以,我相信你明白这个衡量标准可能是一个很好的指标,来衡量一个球员对球队的贡献有多大。

:这篇文章使用的所有代码都可以在 GitHub 上找到,整理在这个笔记本上

分析

目的:我们能使用其他篮球指标预测 NBA 球员的个人胜率吗?

本次分析使用的数据来自 2016–17 和 2017–2018 NBA 赛季,使用篮球参考。本质上,我使用 2016-2017 NBA 赛季的数据来创建我们的模型,并从最近一个赛季的统计数据来预测获胜份额。我执行了一个监督回归机器学习分析:

  • 受监督的:该数据包含 win 份额和所有其他篮球指标,用于训练和测试模型
  • 回归:赢股是一个连续变量

今天,有很多新的篮球指标被世界各地的球迷和分析家用来比较和衡量球员。为了预测获胜份额,我混合使用了基本和高级 NBA 统计数据:

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

探索性数据分析

  • win 股份的分配最初是什么样子的?

在继续分析之前,我使用了基本的 EDA 来看看我们的数据能告诉我们什么。首先,我快速浏览了一下 win 份额的分布情况:

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

马上,我们看到 win 份额的分布向右倾斜。2016-2017 赛季期间,大多数 NBA 球员的胜率不到 5%。这是有意义的,因为只有少数几个被选中的人,大部分是 NBA 全明星,会有很高的胜率。例如,2016-2017 NBA 赛季的 win shares 领先者是詹姆斯·哈登,MVP 亚军,拥有 15 份 win shares。所以,拥有高份额是一种精英身份。

从分布中提取的奇怪数据是 0 win 份额的玩家数量。经过进一步的分析,我发现有很多玩家几乎不玩游戏。虽然这些球员都在 NBA 的名单上,但这并不意味着他们不会对球队和他们自己的个人数据产生重大影响。因此,我更新了数据,只包括那些至少打了 30 场比赛,平均每场比赛至少打 25 分钟的球员。清除数据后,win 份额的分布如下:

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

现在 0 赢份额的玩家少了很多!win 份额的分布仍然是右偏的,但看起来更接近正态分布。

  • 我选择的所有特征都是赢得份额的良好预测因素吗?

我使用皮尔森相关系数分析了这个问题,皮尔森相关系数衡量特征和目标(赢得份额)之间的线性相关性。它的值介于-1 和+1 之间,其中接近-1 的值表示负强关系,接近+1 的值表示正强关系:

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

这一发现令人惊讶!在我最初选择用来预测胜率的 13 个篮球指标中,有 4 个没有足够强的相关性(强=大于 0.5 &小于-0.5)。因此,我从我的模型中排除了这些指标。

我吃惊地看到 3 个百分点(3P%)不仅有微弱的相关性,而且还有负相关性。在今天的 NBA,几乎每个球队和球员都非常依赖 3P,所以我认为 3P%在分析中会起到重要作用。另一个有趣的发现是玩的游戏(G)和赢的份额之间的弱关系。有人会认为,玩家参与的游戏越多,他们赢得的份额就越高。然而,仅仅因为一个玩家参与了一个游戏,并不意味着他们会成功。助攻数(AST)是另一个我认为与 win 份额有密切关系的指标。

  • 其余的特征是否高度相关?

对于分析的下一部分,我想看看要素之间是否有很强的相关性,或者多重共线性。多重共线性通常发生在两个或更多预测变量之间高度相关的时候。请记住,与 win shares 密切相关的功能是好的,但与其他功能密切相关的功能可能没有那么大帮助。这甚至会使我们更难解释我们将要创建的模型。

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

根据上面的配对图,我发现了这些特性之间的一些问题:

  • VORP vs BPM: 有很强的正相关关系(相关系数 0.98)。Box Plus Minus (BPM) 是球员在球场上每 100 次持球对联盟平均水平的贡献。替代球员(VORP)的价值采用 BPM,并将其转化为对团队的贡献。为了计算 VORP,你需要使用 BPM。因此,它们高度相关。
  • **投篮命中率指标:**我们在分析中还剩下三个投篮命中率指标。现场目标百分比(FG%)是完成的现场目标与尝试的现场目标的比率。有效现场目标百分比(eFG%)调整现场目标百分比,以说明三分现场目标算三分,而现场目标只算两分。真实投篮命中率(TS%)通过计算 2 分和 3 分的投篮命中率和罚球来衡量球员的投篮效率。我觉得这些指标密切相关(TS%和 eFG%的相关性为 0.90)。因此,我决定只使用 TS%,因为它与 win 份额的相关性最高。

在研究了这些数据之后,我留下了以下篮球指标作为创建模型的特征:

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

模型选择和测试

由于这是一个监督回归机器学习分析,我创建了三个回归模型:

  • 线性回归
  • 支持向量回归
  • k 近邻回归

让测试集包含 25%的数据(其余的数据用于训练模型),下面是模型的结果:

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

这些模型的明显赢家是:线性回归。线性回归模型具有较低的均方误差(越低越好)、均方误差(越低越好)和较高的方差得分(越高越好)。这并不是说其他两个模型,支持向量和 k 近邻回归,不应该被忽略!他们仍然有非常令人印象深刻的结果,只是没有线性回归模型那么强。

预言

如上所述,我使用了 2017-2018 NBA 赛季的所有特征,通过我们的模型来预测获胜份额:

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

Win Share Predictions Using Linear Regression Model

根据线性回归模型的预测,勒布朗詹姆斯名列榜首!该模型预测他以 14.81 的胜利份额领先 NBA。然而,在现实中,勒布朗(14 胜)排在 2017-2018 赛季 NBA MVP 詹姆斯·哈登(15.4 胜)之后,后者在预测中排名第二。不错的预测!卡尔安东尼唐斯和安东尼·戴维斯在线性回归预测和最近的 NBA 赛季中分别排名第三和第四。

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

Win Share Predictions Using Support Vector Regression Model

支持向量回归模型有一些不寻常的结果。根据这个模型的预测,勒布朗(15.5 胜)再次名列榜首,哈登紧随其后(15.4 胜)。最令人兴奋的结果是,该模型准确地预测了哈登的获胜份额!他以 15.4 胜份额领跑 2017–2018 NBA 赛季,与预测值相同。安德烈·德拉蒙德在使用线性回归模型预测的 win 份额中未进入前 10 名,但在使用支持向量回归模型预测的 win 份额中排名第 3。唐斯和戴维斯都跌出了预测名单,斯蒂芬·库里和凯文·杜兰特甚至都没有进入前十名。

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

Win Share Predictions Using k-Nearest Neighbors Regression Model

使用 k-最近邻的 win 份额预测比以前模型的预测少得多。对于这个模型,哈登预测的 win 份额最高,仅为 12.3 win 份额。预测值的另一个奇怪的结果是,勒布朗,拉塞尔·维斯特布鲁克,扬尼斯·阿德托昆博和戴维斯并列 12.24 胜份额!

结论

以下是我从这个分析中学到的一些东西:

  • 使用平均绝对误差作为衡量标准,我们创建的一个模型能够预测 NBA 球员的个人胜率,误差在 0.761 分以内。
  • 替代球员(VORP)的价值是预测获胜份额的最重要因素。3.0%(3P)、比赛场次(G)和助攻(AST)与赢球份额没有太大关系。
  • 勒布朗詹姆斯仍然是国王!不完全是,但是他已经 33 岁了,还在生产!

尽管最佳模型在预测 NBA 球员的获胜份额方面做得很好,但我在这个过程中了解到的一些问题可能会在未来的项目中帮助我:

  • 更多的数据可能会有所帮助。为了训练模型,我只使用了 2016-17 赛季的数据。我可以使用过去几个赛季的数据,但我希望这些预测是真实的。NBA 已经不是几年前的样子了。就像我在分析中所说的,三分球已经占据了上风。更多的球队是靠投长传。事实上,上个赛季的半决赛球队——金州勇士队、克利夫兰骑士队、休斯顿火箭队和波士顿凯尔特人队——在大多数三分球尝试中都处于领先地位。最初,我害怕包括以前赛季的数据,因为它不会准确预测今天的 NBA。然而,这实际上是有帮助的,因为三分球并没有我想象的那么重要。
  • Stat padding 不一定代表成功。拉塞尔·维斯特布鲁克是三双、的王者,当一名球员在三个不同的指标中取得两位数的总成绩时。事实上,他前两个赛季场均三双!在我使用模型做出的所有 win shares 预测中,威斯布鲁克都是前 10 名,但在过去的赛季中,他甚至都不是前 10 名。由于他的统计数据如此之好,他的获胜份额预测比他们应该的要高得多。
  • 赢得份额可能不是衡量个人成功的最佳指标。篮球是一项团队运动,衡量个人表现并不容易。詹姆斯·哈登因为他惊人的进攻表现而获得 MVP,但是他的防守呢?不存在的。他的队友帮助他弥补了许多防守上的不足。但是如果他们没有呢?或者如果防御策略不合适呢?哈登仍然会产生很大的进攻数据,但如果他的球队缺乏防守,他的胜率就会下降。

总的来说,我了解到,是的,人们可以使用篮球指标来预测胜率。然而,赢球份额可能不是衡量个人成功的一个很好的标准,因为在篮球比赛中,赢球需要整个团队,而不仅仅是一个球员。除非你的勒布朗。加油湖人队!!!

请随时给予反馈或建设性的批评!:)还有,关注我的个人 博客 或者推特@ datao sanch*。*这篇文章使用的所有代码都可以在 GitHub 上找到,整理在这个笔记本上。

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

原文:https://towardsdatascience.com/batch-mini-batch-stochastic-gradient-descent-7a62ecba642a?source=collection_archive---------0-----------------------

在这个深度学习的时代,机器已经超过了人类的智力,通过看例子来了解这些机器是如何学习的是很有趣的。当我们说我们正在训练模型时,是幕后的梯度下降在训练它。

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

Machine Learning behind the scenes (Source: https://me.me/i/machine-learning-gradient-descent-machine-learning-machine-learning-behind-the-ea8fe9fc64054eda89232d7ffc9ba60e)

因此,让我们更深入地研究深度学习模型,看看梯度下降及其兄弟姐妹。

梯度下降

这是维基百科对梯度下降的说法

梯度下降是一种一阶 迭代 优化 算法求函数的最小值

这似乎有点复杂,所以让我们分解一下。

梯度下降的目标是最小化给定的函数,在我们的情况下,是神经网络的损失函数。为了实现这个目标,它迭代地执行两个步骤。

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

Source: https://hackernoon.com/the-reason-behind-moving-in-the-direction-opposite-to-the-gradient-f9566b95370b

  1. 计算斜率(梯度),即函数在当前点的一阶导数
  2. 从当前点向坡度增加的相反方向移动计算出的量

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

Gradient descent (Source: https://medium.com/@divakar_239/stochastic-vs-batch-gradient-descent-8820568eada1)

因此,想法是通过神经网络的隐藏层传递训练集,然后通过使用来自训练数据集的训练样本计算梯度来更新层的参数。

这样想吧。假设一个人在山谷的顶端,他想到达谷底。所以他走下斜坡。他根据当前位置决定下一个位置,当他到达他的目标山谷底部时停下来。

有不同的方法可以让那个人(重物)走下斜坡。让我们一个一个的来看看。

批量梯度下降

在批量梯度下降中,所有的训练数据都被考虑在内以采取一个单独的步骤。我们取所有训练样本梯度的平均值,然后使用该平均梯度来更新我们的参数。这只是一个时代中梯度下降的一步。

批量梯度下降对于凸的或相对平滑的误差流形是很好的。在这种情况下,我们有点直接走向最优解。

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

Cost vs Epochs (Source: https://www.bogotobogo.com/python/scikit-learn/scikit-learn_batch-gradient-descent-versus-stochastic-gradient-descent.php)

成本与时期的关系图也非常平滑,因为我们对单个步骤的训练数据的所有梯度进行了平均。随着时间的推移,成本不断降低。

随机梯度下降

在批量梯度下降中,我们考虑梯度下降的每一步的所有例子。但是如果我们的数据集非常庞大呢?深度学习模型渴望数据。数据越多,模型越有可能是好的。假设我们的数据集有 500 万个示例,那么仅仅一步,模型就必须计算所有 500 万个示例的梯度。这似乎不是一个有效的方法。为了解决这个问题,我们有随机梯度下降。在随机梯度下降(SGD)中,我们一次只考虑一个例子来进行单步。我们在 SGD 的一个时期中执行以下步骤:

  1. 举个例子
  2. 把它输入神经网络
  3. 计算它的梯度
  4. 使用我们在步骤 3 中计算的梯度来更新权重
  5. 对训练数据集中的所有示例重复步骤 1-4

因为我们一次只考虑一个例子,成本会随着训练例子的变化而波动,而且一定会降低。但是长期来看,你会看到成本随着波动而降低。

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

Cost vs Epochs in SGD (Source: https://adventuresinmachinelearning.com/stochastic-gradient-descent/)

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

Source: https://towardsdatascience.com/optimizers-be-deeps-appetizers-511f3706aa67

还因为成本波动很大,它永远不会达到最小值,但会一直围绕着它波动。

SGD 可以用于更大的数据集。当数据集很大时,它收敛得更快,因为它会更频繁地更新参数。

小批量梯度下降

我们已经看到批次梯度下降。我们也看到了随机梯度下降。批量梯度下降可用于更平滑的曲线。当数据集很大时,可以使用 SGD。批量梯度下降直接收敛到最小值。对于较大的数据集,SGD 收敛更快。但是,因为在 SGD 中我们一次只使用一个例子,所以我们不能在它上面实现矢量化实现。这可能会降低计算速度。为了解决这个问题,使用了批量梯度下降和 SGD 的混合。

我们既不一次使用所有的数据集,也不一次使用一个例子。我们使用少于实际数据集的一批固定数量的训练样本,称之为小批。这样做有助于我们实现我们看到的前两种变体的优点。因此,在创建了固定大小的小批量后,我们在一个时期内执行以下步骤:

  1. 挑选一个小批量
  2. 把它输入神经网络
  3. 计算小批量的平均梯度
  4. 使用我们在步骤 3 中计算的平均梯度来更新权重
  5. 对我们创建的小批量重复步骤 1-4

就像 SGD 一样,小批量梯度下降中各时期的平均成本会波动,因为我们一次对少量样本进行平均。

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

Cost vs no of mini-batch (Source: https://stats.stackexchange.com/questions/310734/why-is-the-mini-batch-gradient-descents-cost-function-graph-noisy)

因此,当我们使用小批量梯度下降时,我们会频繁更新我们的参数,并且我们可以使用矢量化实现来加快计算速度。

结论

就像这个世界上的其他事物一样,我们看到的所有三种变体都有其优点和缺点。这并不是说一个变体经常被使用。根据情况和问题的背景,每个变体都被统一使用。

有问题吗?需要帮助吗?联系我!

Github

个人网站

领英

电子邮件:sushantpatrikarml@gmail.com

用 Pytorch 实现神经网络的批量归一化和丢失

原文:https://towardsdatascience.com/batch-normalization-and-dropout-in-neural-networks-explained-with-pytorch-47d7a8459bcd?source=collection_archive---------1-----------------------

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

Photo by Wesley Caribe on Unsplash

在本文中,我们将讨论为什么我们需要深度神经网络中的批处理规范化和剔除,然后在标准数据集上使用 Pytorch 进行实验,以查看批处理规范化和剔除的效果。本文基于我对 PadhAI 深度学习讲座的理解。

引用注:本文内容和结构基于四分之一实验室深度学习讲座——帕德海

为什么要标准化输入?

在讨论批处理规范化之前,我们将了解为什么规范化输入会加快神经网络的训练。

考虑这样一种情况,我们将具有特征 x_1 和 x_2 的 2D 数据输入神经网络。这些特征之一 x_1 具有从-200 到 200 的较宽范围,而另一个特征 x_2 具有从-10 到 10 的较窄范围。

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

Before Normalization

一旦我们将数据标准化,两个特征的数据分布集中在一个区域,即从-2 到 2。传播看起来像这样,

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

After Normalization

让我们讨论一下为什么规范化输入会有帮助?

在对输入进行归一化之前,与这些输入相关联的权重会有很大变化,因为输入要素存在于从-200 到 200 以及从-2 到 2 的不同范围内。为了适应特征之间的这种范围差异,一些权重必须较大,而一些权重必须较小。如果我们具有更大的权重,那么与反向传播相关联的更新也将很大,反之亦然。由于输入权重的这种不均匀分布,学习算法在找到全局最小值之前一直在平台区域振荡。

为了避免学习算法花费大量时间在平台上振荡,我们对输入特征进行归一化,使得所有特征都在相同的尺度上。因为我们的输入是在相同的尺度上,所以与它们相关联的权重也将是在相同的尺度上。从而帮助网络更快地训练。

批量标准化

我们已经对输入进行了规范化,但是隐藏的代表呢?

通过对输入进行归一化,我们能够将所有的输入特征置于相同的尺度上。在神经网络中,我们需要计算第一层 a₁₁.的第一个神经元的预激活我们知道预激活只不过是输入加上偏差的加权和。换句话说,它是权重矩阵 W₁的第一行和输入矩阵 X 加上偏差 b₁₁.的点积

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

在每一层“I”上预激活的数学方程由下式给出:

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

每一层的激活等于将激活函数应用于该层的预激活的输出。在每一层“I”上激活的数学方程由下式给出,

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

类似地,需要计算网络中存在的“n”个隐藏层的激活值。激活值将作为网络中下一个隐藏层的输入。因此,不管我们对输入做了什么,不管我们是否对它们进行了归一化,激活值都会随着我们基于与相应神经元相关联的权重对网络越来越深入而发生很大变化。

为了使所有的激活值达到相同的尺度,我们对激活值进行了归一化,这样隐藏的表示就不会发生剧烈的变化,同时也有助于我们提高训练速度。

W 为什么叫批量规范化?

因为我们计算的是单个批次的平均值和标准差,而不是整个数据。批量标准化在网络中的每个隐藏神经元上单独完成。

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

学习γγ和ββ

由于我们正在规范网络中的所有激活,我们是否正在实施一些可能会降低网络性能的约束?

为了保持隐藏神经网络的代表性,批处理规范化引入了两个额外的参数 Gamma 和 Beta。一旦我们规范化了激活,我们需要再执行一个步骤来获得最终的激活值,它可以作为另一个层的输入。

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

参数γ和β与网络的其他参数一起被学习。如果γ(γ)等于平均值(μ),β(β)等于标准偏差(σ),则激活 h_final 等于 h_norm,从而保持网络的代表能力。

在 Colab 中运行此笔记本

文章中讨论的所有代码都在我的 GitHub 上。你可以通过谷歌虚拟机上运行的 Colab 在 Github 上直接打开我的 Jupyter 笔记本,用任何设置打开 code 笔记本。如果您只想快速打开笔记本并按照本教程进行操作,请单击此处的。

[## niranjankumar-c/deep learning-PadhAI

来自 pad hai-Niranjankumar-c/deep learning-pad hai 的深度学习课程相关的所有代码文件

github.com](https://github.com/Niranjankumar-c/DeepLearning-PadhAI/tree/master/DeepLearning_Materials/7_BatchNormalization)

使用 Pytorch 进行批量标准化

为了了解批量标准化是如何工作的,我们将使用 Pytorch 构建一个神经网络,并在 MNIST 数据集上进行测试。

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

批量标准化— 1D

在本节中,我们将建立一个完全连接的神经网络(DNN)来分类 MNIST 数据,而不是使用 CNN。使用 DNN 的主要目的是解释在 1D 输入(如数组)的情况下批处理规范化是如何工作的。在将大小为 28x28 的 MNIST 图像提供给网络之前,我们将它们展平成大小为 784 的一维输入数组。

我们将创建两个深度神经网络,具有三个完全连接的线性层,并在它们之间交替重新激活。在具有批处理规范化的网络的情况下,我们将在 ReLU 之前应用批处理规范化,如原始论文中所提供的。由于我们的输入是一个 1D 数组,我们将使用 Pytorch nn 模块中的BatchNorm1d类。

import torch.nn as nn
nn.BatchNorm1d(48) #48 corresponds to the number of input features it is getting from the previous layer.

为了更好地了解批处理规范化如何帮助网络更快地收敛,我们将在训练阶段查看网络中多个隐藏层的值分布。

为了保持一致,我们将绘制两个网络中第二个线性图层的输出,并比较该图层的输出在网络中的分布。结果看起来像这样:

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

The first row indicates first epoch and second row for second epoch

从图表中,我们可以得出结论,在每个时段内,没有批量归一化的值的分布在输入的迭代之间发生了显著变化,这意味着没有批量归一化的网络中的后续层看到了输入数据的变化分布。但是批量标准化模型的值分布的变化似乎可以忽略不计。

此外,我们可以看到,由于协方差移动,即每批输入的隐藏值移动,批量标准化网络的损耗比正常网络降低得更快。这有助于网络更快地收敛并减少训练时间。

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

批量标准化— 2D

在上一节中,我们已经看到了如何为以 1D 数组作为输入的前馈神经网络编写线性层之间的批量规范化。在本节中,我们将从语法的角度讨论如何实现卷积神经网络的批量规范化。

我们将采用相同的 MNIST 数据图像,并编写一个实现批量标准化的网络。该批 RGB 图像有四个维度——batch _ sizex通道 x 高度 x 宽度。在图像的情况下,我们对每个通道的批次进行标准化。类别BatchNorm2d对 4D 输入(带有额外通道维度的小型 2D 输入)应用批量标准化。

BatchNorm2d将它从前一层的输出中接收的通道数作为参数。

拒绝传统社会的人

在文章的这一部分,我们将讨论神经网络中的丢失概念,特别是它如何帮助减少过拟合和泛化错误。之后,我们将使用 Pytorch 实现一个有和没有丢失的神经网络,看看丢失如何影响网络的性能。

放弃是一种正则化技术,它随机“放弃”或“停用”神经网络中的少数神经元,以避免过拟合问题。

辍学的想法

用数据上的大参数训练一个深度神经网络可能导致过度拟合。能否在同一个数据集上训练多个不同配置的神经网络,取这些预测的平均值?。

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

但创建一个具有不同架构的神经网络集合并训练它们在实践中是不可行的。辍学去救援。

丢弃在每个训练步骤中随机地去激活神经元,而不是在原始网络上训练数据,我们在具有丢弃节点的网络上训练数据。在训练步骤的下一次迭代中,由于其概率性行为,被丢弃去激活的隐藏神经元发生变化。以这种方式,通过应用 dropout,即…在训练期间随机停用某些单个节点,我们可以模拟具有不同架构的神经网络的整体。

培训时辍学

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

在每次训练迭代中,网络中的每个节点都与概率 p 相关联,是保留在网络中还是以概率 1-p 将其停用(退出)网络。这意味着与节点相关联的权重仅更新了 p 次,因为节点在训练期间仅活动 p 次。

测试时掉线

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

在测试期间,我们考虑所有激活都存在的原始神经网络,并通过值 p 缩放每个节点的输出。

使用 Pytorch 辍学

为了直观地显示 dropout 如何减少神经网络的过度拟合,我们将使用 Pytorch torch.unsqueeze生成一个简单的随机数据点。遗漏的效用在可能过度拟合的自定义数据上表现得最为明显。

一旦我们生成了数据,我们可以使用如下所示的matplotlib散点图来可视化张量。

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

为了显示过度拟合,我们将训练两个网络——一个没有辍学,另一个有辍学。没有丢失的网络具有 3 个完全连接的隐藏层,ReLU 作为隐藏层的激活函数,而有丢失的网络也具有类似的架构,但是在第一和第二线性层之后应用了丢失。

在 Pytorch 中,我们可以使用torch.nn模块申请退学。

import torch.nn as nn
nn.Dropout(0.5) #apply dropout in a neural network

在本例中,我在第一个线性图层后使用了 0.5 的漏失分数,在第二个线性图层后使用了 0.2 的漏失分数。一旦我们训练了两个不同的模型,即…一个没有辍学,另一个有辍学,并绘制测试结果,它看起来像这样:

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

从上面的图表中,我们可以得出结论,随着我们增加历元的数量,没有丢失的模型正在过度拟合数据。无漏失模型是学习与数据相关的噪声,而不是对数据进行归纳。我们可以看到,与没有丢弃的模型相关联的损耗随着时段数量的增加而增加,这与具有丢弃的模型相关联的损耗不同。

[## niranjankumar-c/deep learning-PadhAI

来自 pad hai-Niranjankumar-c/deep learning-pad hai 的深度学习课程相关的所有代码文件

github.com](https://github.com/Niranjankumar-c/DeepLearning-PadhAI/tree/master/DeepLearning_Materials/7_BatchNormalization)

继续学习

如果你想用 Keras & Tensorflow 2.0(Python 或者 R)学习更多关于人工神经网络的知识。查看来自 Starttechacademy 的 Abhishek 和 Pukhraj 的人工神经网络。他们以一种简单化的方式解释了深度学习的基础。

结论

在本文中,我们已经讨论了为什么我们需要批量归一化,然后我们继续使用 MNIST 数据集来可视化批量归一化对隐藏层输出的影响。在此之后,我们讨论了辍学的工作,它防止数据过拟合的问题。最后,我们可视化了两个网络在有丢包和无丢包情况下的性能,以观察丢包的影响。

推荐阅读

[## 利用 Pytorch 神经网络模块构建前馈神经网络

前馈神经网络也称为多层神经元网络(MLN)。这些模型网络是…

www.marktechpost.com](https://www.marktechpost.com/2019/06/30/building-a-feedforward-neural-network-using-pytorch-nn-module/) [## 用 Pytorch 可视化卷积神经网络

可视化 CNN 过滤器并对输入进行遮挡实验

towardsdatascience.com](/visualizing-convolution-neural-networks-using-pytorch-3dfa8443e74e)

如果你在实现我的 GitHub 库中的代码时遇到任何问题,请随时通过 LinkedIn 或 twitter 联系我。

直到下次和平:)

NK。

免责声明 —这篇文章中可能有一些相关资源的附属链接。你可以以尽可能低的价格购买捆绑包。如果你购买这门课程,我会收到一小笔佣金。

BatchNormalization 不是一个规范!

原文:https://towardsdatascience.com/batchnormalization-is-not-a-norm-cebfd921dadd?source=collection_archive---------13-----------------------

质疑深层神经网络中的基本元素

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

最近几年,深度神经网络在多个领域,特别是视觉和文本领域,广泛地改善了艺术状态。随着支持深度神经网络的基础设施的进步,研究转向通过使网络更宽更深并提高准确性来最大限度地利用可用硬件。深度神经网络的一个关键方面是批量标准化,它使得在不影响训练速度的情况下更深入变得可行。这使得 BatchNorm 成为 CNN 的重要组成部分。在用于对象识别的大多数当前技术状态的模型中,在网络架构内的卷积层之后有批处理层。但是批量规范化有多重要呢?我们需要对执行的每个卷积进行批量归一化吗?在本文中,我们将尝试回答其中的一些问题。

正常化

归一化是一种数据准备技术,用于确保数据一致且具有统一的尺度。在图像中,常用的数据准备技术包括像素归一化和图像归一化。

  1. 像素标准化:这是通过将每个像素除以 255 来实现的,因此它们在[0,1]的范围内
  2. 图像标准化:这将改变像素强度的范围,以便数据集中的每个图像都利用整个范围的像素值。这通常被称为直方图拉伸或对比度拉伸。从下图可以很容易理解——

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

Source: Nuruzzaman Faruqui

上述技术有助于在训练开始前使图像正常化。一旦我们对图像进行卷积,就没有驱动力来限制尺度变化并保持一致。这就需要在每次卷积运算后使用另一种归一化技术。这时,批处理规范化就介入了。它有助于减少内部协变量的变化。

通俗地说,协变量偏移指的是数据集不同部分的不同特征分布。当在网络层内观察到由于激活的分布而导致的相同差异被称为内部协方差偏移。使用 BatchNorm,我们添加了一个归一化步骤,该步骤固定了层输入的均值和方差,通过降低梯度对参数或其初始值比例的依赖性,有助于加快收敛并改善通过网络的梯度流。

在其发明之后,批处理规范化已经在 CNN 中被广泛接受。不过,最近有人声称 BN 在两种情况下表现不佳——批量非常小和 RNN 中的重复连接。除此之外,BN 仍然比其他技术更受青睐,因为它易于管理,并且可以跨所有流行的框架使用。

这在很大程度上证明了在网络架构中使用 BN 的合理性,但是没有研究讨论应该多频繁地添加一个 BN。如果我们看看现有的网络,一个 BN 是在一个 3x3 卷积后添加的。让我们通过一个实验来检验这个理论。

在我的上一篇文章— Is ReLU ReLUvant 中,我通过进行一个在网络内随机丢弃 ReLU 层并测试准确性的小实验来检查 ReLU 的用法。结果是混杂的——当网络中 10%到 20%的总 ReLUs 被丢弃时,达到了最好的准确性。尽管从那个实验中得出任何结论仍有待商榷,但它确实激励我进行了一个类似的批量标准化实验。

实验

让我们从具有完全预激活的 ResNet 块的 ResNet1⁸模型开始。在这个实验中,我们将随机从 100%开始丢弃一些 BN 层,在每个后续实验中丢弃 10%,保持所有其他参数一致。

在这个实验中,我们将使用 CIFAR10 数据集

超参数

BATCH_SIZE = 512
MOMENTUM = 0.9
WEIGHT_DECAY = 5e-4
LEARNING_RATE = 0.4
EPOCHS = 24
ReLUPercent =100

图像增强

Height and Width shift range = 0.15625,
Rotation range = 12
Random LR Flip

【计算机】优化程序

使用动量为 0.9、重量衰减为 5e-4 的 SGD。一个周期的学习率策略,在第 5 个时期具有 0.4 的最大 LR,并向后面的时期逐渐下降。

体系结构

该模型有 4 个 ResNet 块。与传统的 ResNet1⁸不同,在 ResNet 块的末尾,我们连接输入和残差路径,然后进行逐点卷积,以过滤前面获取的信息。
这个模型有 190 亿层。

基准

在 CIFAR10 数据集上,该模型在 Google Colab 上的 24 个历元中给出了约 88%的验证准确率。该模型有大约 27M 个参数。

培养

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

Plot 1: a)Training Accuracy Curve, b) Validation Accuracy Curve

结果

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

Table1: Accuracy Comparision

令人惊讶的是,当 50%的 BN 层被随机丢弃时,获得了最佳的验证准确度。此外,在这种情况下,训练精度稍低,因此,模型更加正则化。对于一个卷积,我们有一个 BN 时的精度比只有一半 BN 层时的精度低 1.03%。令人惊讶的是,当我们仅使用总 BN 的 20%时,最佳精度仍然比使用所有 BN 层时更好。

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

Plot 2: Max Validation Accuracy

有了这些结果,我们可以部分回答我们的问题

在一个网络中,我们需要一个 BN 层吗?
是的。如果没有 BN,模型精度会大幅下降。所以我们确实需要一些标准化技术。
在每个卷积之后盲目地添加一个 BN 是构建 CNN 架构的正确方式吗?
大概不会!
还有更好的办法吗?
肯定是的!
如何决定是否需要添加 BN?
网格搜索可以是一种方式,但我想不出任何其他最优方式来决定是否在卷积后添加 BN。虽然从直觉上来说,我们可能需要避免在模型末尾添加 BN 层,以便预测层可以看到更大范围的值。

虽然我们仍然不知道卷积层是否具有 BN 的适当方法,但希望这确实有助于我们理解,在设计深度神经网络时,仍然需要质疑非常基本的元素的使用。

实验可以在这个 Colab 笔记本里找到。

感谢您的阅读!请在评论中告诉我你的想法。再次感谢,继续学习!

[1]:何、、张、向宇、任、、孙、简。(2016).用于图像识别的深度残差学习。770–778.10.1109/cvpr . 2016.90 .
【2】:克日涅夫斯基,亚历克斯。(2012).从微小图像中学习多层特征。多伦多大学。

云计算之战

原文:https://towardsdatascience.com/battle-of-cloud-computing-f52c2840986f?source=collection_archive---------30-----------------------

简介:

云计算、混合云平台、数据货币化和深度学习只是当今 2.0 技术变革中的几个花哨的热门词汇。一方面,企业正在应对数据货币化、自动化和降低成本的挑战。另一方面,他们努力定义一个清晰的战略,并确定合适的云平台,将现有的数 Pb 数据和组织模式转移到其中,而不必担心最机密和最重要文件的安全性,同时始终坚持适当的合规性。较小的组织和高速增长的初创公司正面临着可扩展性和不断增加的房地产费用的挑战,以管理他们的内部数据中心。

优化智能数据、计算密集型业务分析、自动化、安全性和监控、业务流程、通信、数据整理、可扩展性和合规性是每个企业最迫切的需求和关注点。为了确保这些需求得到满足,公司必须部署所需的系统和程序来满足上述所有领域的需求。为了实现完美的实施,他们必须雇佣专家资源,购买设备和软件,确保适当的维护,并满足容纳所述设备的房地产要求。所有这些需求都会给企业带来巨大的成本,因此越来越多的公司选择将某些任务指定给云来减轻这一负担,因为这在财务上是有利的。必须根据每个企业的愿望和要求选择一个云平台,并且必须与特定实体的愿景和目标保持一致。在许多情况下,企业选择多个云提供商和混合云平台来确保满足所有需求。

以美国电话电报公司和微软为例。这两家公司价值 20 亿美元的交易,旨在将技术和最新的应用程序转移到云上,这受到了美国电话电报公司数字愿景的影响。由于微软是美国电话电报公司的长期合作伙伴,Azure 产品最符合美国电话电报公司的通信、业务流程和安全要求。这些,再加上微软在数字化之旅中创建和再造企业的能力,是美国电话电报公司选择微软的主要原因。尽管如此,Azure 作为产品和基础设施的美丽在其中扮演了重要角色。这一点非常明显,因为微软在云行业的市场份额不断增长(截至 6 月 30 日的 2019 财年收入为 380 亿美元),并增加了沃尔玛和 Gap 等客户。最近的 2019 年第三季度报告显示,Azure 在云计算之战中给了竞争对手 AWS 一个机会。

美国电话电报公司表示,它正在成为一家“公共云优先”的公司,将应用程序从其数据中心转移到 Azure,并将通信业务的员工转移到微软 365,其中包括 Windows 10、Office 365 以及移动和安全服务。

再举一个微软绝地契约的案例研究。微软赢得了一份关键合同,为该公司提供从云到人工智能和应用于关键军事工作的机器学习的服务。这份合同建立在微软在政府技术领域数十年成功的基础上,但将合同授予微软而不是 AWS 仍然是一个令人惊讶的决定。微软能够满足政府的要求,并且出价高于他们的主要竞争对手。这是因为他们的云产品 Azure 非常漂亮,它提供了身临其境的多样化功能、现代安全合规驱动的架构、可扩展性和持续创新。微软在他们的云计算上投入了大量资源,该系统对于现代化战争来说是健壮的。这是一个赢得的关键合同,因为据估计它在 10 年内价值高达 100 亿美元。这份合同对于展示微软在云技术市场的领先地位至关重要。

Azure 发展势头背后的原因&行业如何认识到它的价值。

虽然有许多因素影响微软云业务的崛起,但有三个要点最能推动这一运动:安全性、合规性和 AI/ML 计划

微软产品的遗产:作为习惯动物,当我们听到熟悉的东西时,会自动感到更安全。Windows、MS Office、SQL server、SharePoint 是可识别的名称,自现代计算机诞生以来就一直存在。这些是在谷歌和亚马逊出现之前的过去二十多年里,消费者和企业已经习惯使用的一些微软产品。微软的遗产和在业界的存在是 Azure 接受的主要原因,因为迁移和实现是第二天性。

**一站式服务:**微软云是一个完整的包,其产品包括云基础设施服务(IaaS)、应用程序和软件即服务(SaaS)等服务。这些产品包括服务器、存储、数据库、网络和软件(SQL Server、Windows Server、Visual Studio、System Center、GitHub……)—也称为智能云细分市场、Office 365 (Office、Exchange、SharePoint、Skype for Business 和微软团队)、LinkedIn 和 Dynamics 365(云 CRM 和 ERP)。

**Azure 专用主机:**这种新的专用主机为在单租户物理服务器上运行虚拟机提供了更大的灵活性。这为您提供了对机器上运行的一切的完全控制。该主机将支持 Windows、Linux 和 SQL Server 虚拟机。虚拟机有两种不同的处理器。当一家公司使用 Azure 专用主机时,他们可以确保他们做出的决定有助于他们公司的物理安全、数据完整性和监控。底层基础设施与任何其他 Azure 数据中心主机完全相同。

**现有许可折扣:**为了在技术生态系统中保持竞争力,微软决定对其产品提供折扣。特别是,微软正在提供升级到微软 Azure 的激励措施,包括免费更新。这些激励措施为公司创造了 0 美元的利润。

**合规驱动:**一般数据保护法规旨在保护用户隐私。微软充分利用了新的要求,使新的功能符合要求,如 Azure GDPR 数据主题请求门户。这使得 Azure 尽可能地为用户请求提供数据。

对于 Microsoft Azure,GDPR 功能突出显示了可用作模板的策略,以便在您的组织内创建您自己的策略和流程。这些策略也可以在系统的试点测试或审计期间使用。

为什么 Azure 被认为是安全的云平台?

握手:在计算机世界中,握手本质上是在两个组件之间创建一个网络连接。数字握手可以在任何两个通过相同协议通信的系统之间完成。这两个系统可以是客户端和服务器,或者只是 P2P 网络上的两台计算机。握手确认连接系统的身份,并允许无缝地进行额外的通信。大多数情况下,握手等同于验证连接、速度或试图连接到它的计算机的授权的步骤。握手在云计算世界中起着重要的作用,主要是当一台计算机试图与另一台计算机或服务器连接时。当两台计算机遵循相同的协议时,这种握手变得简单而安全。例如,一家企业使用 Windows 系统十年,然后过渡到 AWS 进行云计算。这个过程变得异常困难,因为 Windows 和 AWS 遵循不同的协议。因此,为了匹配和结合两个不同的协议和两台计算机,需要定义一个新的端口或算法,以允许授权不间断地进行。此外,打开一个端口或创建一个新的端口被认为是一个易受攻击的点,因为黑客利用这些点作为漏洞来进入系统和环境。因此,Azure 被认为比 AWS 更安全,因为 Azure 是基于 windows 的,如果我们参考世界的统计数据,我们会发现迄今为止大多数计算机都是基于 Windows 的,并使用 Linux 操作系统。

大约 50%的微软 Azure 虚拟机已经采用了 Linux。Azure 上超过六个受支持的 Linux 发行版进一步将 Linux 集成到微软生态系统中。其中包括 CentOS、CoreOS、Debian、Oracle Linux、Red Hat Enterprise Linux (RHEL)、SUSE Linux Enterprise Server (SLES)、openSUSE 和 Ubuntu。这些工具表明 Azure 是建立在 Linux 平台上的。Linux 被认为是世界上最安全的计算平台。补充这些工具的是 Azure Cloud Switch、SONiC、Azure Sphere 和 Azure Sphere Security Service。这些工具为网络设备提供操作系统,为软件定义的网络提供软件网络组件,并为边缘设备提供软件和硬件堆栈。

尽管如此,对于计划过渡到云计算世界的企业来说,Azure 成为他们的首选和偏好,因为集成是平滑和轻松的,不需要通过创建现有平台和操作系统之间握手的端口和算法来重新发明轮子。这种强有力的握手使授权变得容易并提供增强的安全性,因为对于计算机和服务器来说,当现有的基于 windows 的系统和基于 Linux 的操作系统与基于 Windows 的云平台和 Linux 操作系统连接时,协议是相同的。握手变得几乎不可渗透,因为连接不需要新的端口。此外,Linux 内核是微软自己的产品,基于 C 语言构建,集成到 Windows 8 和 10 操作系统中,由于其扩展的 DAC、名称空间、POSSIX 功能和加密功能,增强了最大程度的安全性。通过 Azure Sphere 自己的定制 Linux 内核,微软使握手更加流畅和安全。

**数据中心的全球布局:**微软 Azure 拥有 54 个数据中心区域,覆盖南北美洲、欧洲、中东、亚洲和太平洋地区,比任何其他云提供商都多。数据中心的大量存在和数量成倍增加了 Azure 数据中心的规模,并提供了优于 AWS 和 Google 的速度和弹性优势。此外,他们的地理数据中心确保了增强的安全性。由于这一事实,该特定区域的客户端数据不必传播很远。比如说;来自东海岸的 Azure 客户端数据保持在同一地区,而来自西海岸的数据则没有。这提高了访问数据的速度并增强了性能。如果数据必须传输到位于西海岸的数据中心,就需要更长的网关,网关越长,安全威胁就越大。Azure 在北美有 16 个数据中心区域,在欧洲有十几个,首先进入的是中东的两个区域,大约十几个在亚洲,4 个在太平洋,不像 AWS 在全球总共只有 22 个区域,其中一个在太平洋,8 个在北美,这使它更容易受到攻击。谷歌的数据中心区域更少,全球只有 16 个。使用 AWS 的美国中部以外的客户将不得不使用东海岸或西海岸以外的数据中心,这导致创建长网关,而长网关简化了渗透系统的能力。

Azure Security Center:Azure Security Center 的特性非常密集,它根据使用案例和环境来执行产品、服务和流程的角色。一个完整的威胁检测、建议和保护包,帮助企业应对现代网络威胁。Azure 安全系统的魅力在于它提供安全智能和建议,并且旨在跨混合云工作负载使用,无论这些工作负载是否在 Azure 上,也可以在本地使用。这是一个明显的证据,表明企业正在接受微软作为一个安全的云平台,不管他们是否使用 Azure。微软声称现代安全威胁非常复杂,Azure Security Center 解决了三个紧迫的安全问题 a)动态工作负载 b)日益复杂的攻击 c)安全技能和人才的短缺。Azure Security Center 通过管理合规性、评估、建议、预防、速度和自动化来满足这三个方面的需求。

**合规管理:**系统可以跨机器、数据服务和应用集成和实施,确保服务器、机器和应用默认合规。这是因为它带有预定义的 Azure 策略控制,并且只有在制定策略和合规性时才能部署实现。它还提供了选择、设置和定制策略的灵活性。该过程确保企业默认定义并遵循策略和配置标准。该系统在一致的基础上扫描应用和机器,并在控制面板中提供单一窗口视图,以识别是否有任何订阅缺少策略,并使用正确的策略保护所述订阅。

保护负载: Azure 安全中心持续监控工作负载,并确保工作负载是否根据定义的安全策略和实践进行配置。Azure Security Center 提供的最强大的评估功能是网络地图。该图提供了工作负载以及节点如何配置和相互连接的单一窗口视图,这有助于识别节点之间可能成为网络中潜在攻击威胁的不必要连接。

安全背后的美丽: Azure Security center 最美丽的特性是其名为 Secure Score 的推荐引擎。它有助于识别漏洞,确定威胁的优先级,并提供定制的指令来修复它们。Azure Security Center 的推荐引擎可以部署在组织中的每个资源上,每个资源都被监控、评估、推荐并定义自己的标准集。这包括 Azure 虚拟机、非 Azure 服务器和 Azure PaaS 服务,如 SQL 和存储帐户等。

**威胁防护:**安全中心的威胁防护保护数据、IOT 和混合云工作负载。它检测并防止基础设施即服务(IaaS)层、Azure 中的平台即服务(PaaS)中的威胁,包括 Azure 应用服务、Azure SQL、Azure 存储帐户以及非 Azure 服务器。除此之外,融合杀伤链分析和网络杀伤链分析功能有助于识别环境中的警报、攻击点的来源、攻击活动及其可能对环境资源造成的影响。此外,安全中心提供内置的 Windows Defender 高级威胁防护,确保 Windows 虚拟机和服务器在安全中心的建议和评估范围内。高级威胁检测也可以集成到 Linux 虚拟机和服务器中。环境中的威胁可能包括多种类型,但是让系统做好足够的准备来防范和抗击暴力攻击在很大程度上受到系统策略的影响。Azure Security Center 帮助设置安全访问策略,并通过定义授权用户的访问权限、访问时间和允许的源 IP 地址范围或 IP 地址来限制对虚拟机的访问。

**速度和自动化:**安全中心提供与 Azure 和 Azure 资源的无缝本地集成。这意味着,你可以整合一个完整的安全故事,涉及 Azure 策略和所有 Azure 资源的内置安全中心策略,并确保每个方面都自动应用于你在 Azure 中创建的新发现的资源。

**广泛的日志收集:**来自 Windows 和 Linux 的日志都在信息安全智能分析引擎中得到利用,并用于创建建议和警报。

Azure 的人工智能计划

无限的数据资产:在数字时代,公司的价值不再与有形资产、基础设施或其他有形材料挂钩。相反,公司的价值可以通过他们的数据来衡量和定义。数据为公司提供了以前看不到的启示。与此同时,收集和使用数据也带来了挑战。公司需要考虑数据的可扩展性、效率、备份和恢复。微软 Azure 提供了传统数据库中没有的解决方案。这是通过独立的计算机节点完成的。有一个主节点和二级热备用节点。备用节点提供紧急备份。

计算机节点能够通过缓存 SSD 来提取一页数据,从而减少通过网络的次数。缓存功能将存储的可扩展性从 1–4tb 提高到 100 TB。存储容量的增加有几个原因。Azure 超大规模架构允许快速读取扩展能力,并为主要计算机节点提供时间来生成更多请求。该架构还被设置为共享存储,并且备份是即时的。数据备份能够从主计算机节点移动到存储层,这意味着服务器性能不受影响。

以非常相似的方式,通过拷贝文件快照来完成任何所需的恢复。这意味着数据的大小不是问题,也不会减慢处理速度。这意味着当恢复在同一存储帐户中时,主计算机节点的性能不会受到负面影响。如果地理位置不同,那么这就是 Azure 超大规模数据库有用的时候。它允许 Azure SQL 数据库超大规模数据库的恢复,而不管它当前托管在哪里。

理解认知

**Azure 认知服务:**通过 Azure 认知服务支持企业应用构建、网站开发和自动化机器人。这些服务包括以下功能:视觉、语音、语言、搜索和决策 API。独立和胜任的数字员工的发展受到 Azure 认知服务的影响,并提高了效率、速度和自动化。

**Azure 认知搜索:**数据点和信息有很多潜在的意义。对于多媒体或数据源来说尤其如此。Azure Cognitive Search 通过提高可搜索性来使用和分析这些数据。Azure 添加的认知技能至关重要,因为它们丰富了原始文档和资源。这种方法的优点是易于分类、搜索和提取关键信息。微软 Azure 特别适合投资于机器学习的人,他们没有编程或编码技能,在没有软件帮助的情况下在这一领域工作。

当存在原本无法搜索的文本时,应该使用认知搜索。它还具有语言翻译的优势,因此如果文档是另一种语言,它可以处理和翻译该语言。还有一些高级版本和型号可以满足大量的需求和要求。Azure 为他们选择共享的数据提供了灵活性。

Microsoft Azure 在某种程度上受限于正在使用的数据的位置。为了能够使用 Azure,必须有可由索引器访问的数据。没有这一点,数据是不可用的。这些索引器非常关键,因为它们与技能相关,然后在所有后续搜索中定义。技能集用于数据内操作的处理和顺序。如果开始时没有可靠的数据,产出和数据就会缺乏。

**SQL Server 机器学习:**预测分析和机器学习的重要性只会增加。当企业需要处理数据时,他们可以采用 SQL Server 机器学习来与 Python、R 和关系数据结合使用。可以直接在数据库中执行所需的脚本。这意味着数据不需要通过网络传输来进行数据分析。机器学习和预测分析有大量的应用。它们可以用于数据清理、特征工程、培训和部署机器学习模型等。有了这个工具,企业组织和公司可以将深度学习添加到他们的 SQL server 中。

AWS 有多安全?

云 SaaS 应用程序越来越受欢迎,并在快速创新。这意味着,围绕安全性、数据管理和隐私的问题和顾虑往往会越来越多。AWS 安全性分为四个不同的类别。这些是系统、通信、数据和隐私。了解 AWS 的安全性非常重要,因为使用该解决方案会带来隐私和安全方面的期望。

根据 Rath、Spasic、Boucart 和 Thiran (2019)的说法,在评估 AWS 的安全特性时,需要调查一些特定的领域。AWS 必须为系统组件提供保护、防止对系统的未授权访问、监控网络请求、审计和违规恢复、持续的数据保护(无论网络连接如何)、隐私保护、法规遵从性、安全通信以及对云资源的全面保护。当一个系统满足所有上述安全要求时,这意味着它们能够挫败和防止任何类型的攻击。在上述每个类别中都有几个考虑因素。

为了保证 AWS 的安全性,它必须在通信、数据和隐私安全方面提供保护。要知道如果 AWS 有这些解决方案,它会有潜在的安全问题,这个问题可能发生的实例,然后是这个问题的所有解决方案。一个系统必须是全面的才能被认为是安全的,我们现在将探讨 AWS 是否以及如何满足这些安全要求。

合规和监管标准: AWS 使用多种工具来满足必要的监管和合规标准。AWS 的数据公民合规性意味着云用户必须满足从整个国家到局部地区的地理定位要求。AWS 通过 CloudFront 和地理定位软件实现加密擦除。AWS 使用 KMS 服务来控制许多 AWS 服务和应用程序的加密和密钥。用户还必须通过分担责任模式来表明他们对数据安全的承诺。AWS 提供了云平台的基本安全功能,并不是所有的应用程序都可用。当数据需要在国家或其他地理区域之间传输时,AWS 使用兼容的数据传输地理位置来实现这一点。当用户考虑数据保留时,他们知道 AWS 通过多种不同的工具和系统来备份数据。对于数据生命周期,AWS 有一个允许管理资源和数据的系统。最后,用户可以放心,使用 DynamoDB 不会意外或故意删除数据,以实现有意的数据保留。

**识别、认证和授权:**当认证和授权问题成为关注点时,AWS 会满足安全需求。AWS Cognito 支持多种登录选项,满足了多因素身份认证的要求。AWS 允许多个应用程序和设备的单点登录。当用户只需要短期访问系统时,他们可以使用 AWS 访问令牌来验证 API。为了实现客户端和服务器之间的身份验证,AWS 会为相互身份验证生成证书。为了确保只有正确的用户才能访问系统,AWS 使用了安全打包程序和密钥编码器。这种数字权限管理满足了用户登录的安全要求。有时,系统管理员希望在高级别管理用户和组。身份和访问管理器是设置各种用户权限的 AWS 工具。与 access manager 相关,AWS 还允许基于请求它们的个人的身份和权限的某些活动。这发生在基于请求的身份验证模型中。最后,AWS 利用 IAM、Cognito 和 AWS CloudWatch 等工具来安全访问数据和资源。这满足了访问控制许可的安全要求。

**安全开发、运营和管理:**除了遵守法规和管理用户访问,AWS 还需要确保当他们的系统实际部署在一个平台上时,安全性仍然是重中之重。以下所有工具都用于防范攻击企图。AWS 通过定制的 bastion 服务器完成从专用网络到外部网络的访问。总有一些怀有恶意的人试图访问数据并破坏它,AWS 采用 GuardDuty 作为自动威胁检测。用户希望他们的应用程序始终可用。为了实现持久可用性,AWS 使用 CloudWatch 和 WAF 等各种工具来保护和监控设备。企业需要知道他们的计算资源受到保护,并且 AWS 具有经济持久性。AWS 使用 CloudWatch 来确保资源得到明智的管理和使用。亚马逊并没有创建 AWS 平台中使用的所有应用程序,因此这些应用程序中可能存在漏洞,AWS 在漏洞管理工作中使用了 AlienVault USM。

**隐私和保密:**就满足所有既定要求而言,这是 AWS 的一个不足之处。每当 AWS 不符合要求时,IT 团队必须承担起保护隐私和机密性的责任。

当 SSL/TLS 证书用于 AWS 服务和资源时,AWS 使用 AWS 证书管理器来部署它们。这意味着存在端到端的安全性。隐私和机密性的所有其他方面,包括加密数据计算、数据匿名化和处理目的控制,都不是 AWS 提供的安全功能。

**安全架构:**AWS 中的用户可以访问他们自己的虚拟网络,这为 AWS 创建了一个独特的部分,可以启动应用程序和其他资源。用户可以完全控制这个网络。每当在 AWS 中使用 web 应用程序时,它都会受到 web 应用程序防火墙的保护,防止恶意行为在 web 应用程序上发生。由于大量设备没有连接到互联网,因此有必要确保所有物联网设备的安全。AWS 为安全元素部署物联网设备管理。访问数据的速度对每个人都很重要,AWS 意识到了这一点。当需要访问大量不常用的数据时,可以通过 Glacier 服务使用安全的冷存储进行访问。当访问数据时,需要处理 TLS/SSL 的加密密钥和证书。AWS 使用密钥管理器和证书管理器来管理 TLS/SSL 证书。当用户需要创建自己的加密或密码密钥时,有一个云硬件安全模块允许创建这些密钥。

AWS 通过公开其所有安全特性和更新的列表,使其安全选项尽可能易于访问。这使得所有用户和感兴趣的利益相关者可以更多地了解 AWS 如何满足他们的安全需求。这让用户可以评估 AWS 是否能为他们工作并满足他们的需求。

Azure 安全中心 vs AWS 检查员:

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

Azure vs 亚马逊 vs 谷歌云机器学习服务:

蔚蓝机器学习

微软的 Azure machine learning 作为软件即服务有几个优秀的特性。它具有全面的自动和半自动机器学习功能。Azure 有两个主要的不同分支:机器人服务和机器学习。Azure 有非常灵活和众多的算法,适合新手和高级数据科学家。有一个被称为 Cortana Intelligence Gallery 的广泛社区支持 Microsoft Azure。

Azure 机器学习的具体功能包括拖放界面、数据准备、机器学习模型的培训、部署和管理、对开源技术 PyTorch、TensorFlow 和 scikit-learn 的支持。使用开源 Python,有可能在 Azure workspace 上构建模型。不需要高级数据科学专业知识,就可以使用 API 和认知服务等概念和工具。

亚马逊云机器学习和预测分析

亚马逊的机器学习被称为自动化机器学习服务的亚马逊 ML 和定制机器学习建模的亚马逊 SageMaker。

Amazon ML 的特点是分类、回归和聚类。如果使用 Amazon SageMaker 需要一个定制平台,该平台有内置算法,支持以下框架:TensorFlow、MXNet、Keras、Gluon、Pytorch、Caffe2、Chainer 和 torch。现在让我们来看看亚马逊的这两个机器学习解决方案的一些优势。

Amazon ML 是一个自动化的、随时可以部署的机器学习模型。你可以把它想象成一个样板房,它可以很快完工,不需要太多的定制。Amazon ML 的一个优势是它是一个自动化的解决方案,可以处理严格的截止日期,并且产品可以快速工作。该平台还能够从多个数据源加载数据,并自动对这些数据进行所有必要的处理。Amazon ML 几乎不需要用户输入任何信息,这对于那些不需要或不想做这些决定的人来说是一个优势。一个机器学习科学家新手会发现 Amazon ML 的自动性是一个优势,因为系统会为你做出大多数必要的决定。Amazon ML 预测分析的优势在于有两种不同的 API,一种用于实时数据,另一种用于按需数据。

亚马逊 ML 在预测分析方面有局限性,因为只有三种可能的选择。这些是二元分类、多类分类和回归。亚马逊 ML 的所有学习都需要被监督。亚马逊 ML 的一个巨大弱点是,自 2016 年以来,指南和文档一直没有更新。随着技术日新月异的发展,当时写下的信息对今天来说可能已经过时了。Amazon ML 缺少的方面是异常检测、推荐和排名。

Amazon SageMaker 是一款面向数据科学家的工具,这些科学家拥有一些机器学习经验,并希望能够轻松地建模解决方案,并在适当的时间和地点部署它。SageMaker 负责外部系统,以确保数据科学家不会专注于服务器和访问问题。SageMaker 的算法可以处理系统中的大量数据。SageMaker 的算法包括但不限于:线性学习器,因子分解机,图像分类,神经主题模型。亚马逊机器学习服务对所有参与机器学习的人都有用,从新手到专家。

谷歌云机器学习和预测分析

谷歌的一个优势是,机器学习模型基于两个不同的层次——一个面向机器学习应用的新手用户,一个面向机器学习应用的超级用户。Google 不满足自动 ML 系统的聚类、异常检测和排序功能。对于定制建模,Google ML 引擎内置了算法。它支持以下框架:TensorFlow、scikit-learn、XCBoost 和 Keras。

对于新手用户来说,AutoML 的优势在于 Google 存储和训练数据集以及所有需要的模型。由于谷歌是一个如此强大的生态系统,谷歌 ML 的一个天然优势是它连接到所有其他谷歌系统,数据自动存储在云中。Google ML 使用 API 来访问可用于处理和训练模型的不同产品。由于 AutoML 意味着自动化和快速数据处理,它的弱点在于灵活性和有限的定制可能性。

这就是 Google ML 引擎的闪光点。对于不具备处理数据和语言所需知识的人来说,这个系统有很多缺点,但是对于高级科学家来说,这个系统有很多优点。由于 Google 也有 TensorFlow,所以其他框架的使用实际上是有限制的,因为用 TensorFlow 作为机器学习的框架是一种天然的联系。TensorFlow 是一个非常难学的系统,期望 ML 引擎与 TensorFlow 一起使用可能会有问题。谷歌 ML 引擎的另一个弱点是,它不像亚马逊那样在他们的机器学习和预测分析模型中建立起来。

结论

归根结底,在决定使用什么样的云计算资源时,每个企业都有责任决定哪些因素对他们最重要。对他们来说什么最重要?安全性是他们的重中之重,而 ML 在列表中的位置较低,还是快速启动并运行的能力比 100%定制更重要?这些决策可以基于存储的信息类型、企业的规模或企业的位置等。随着技术领域的快速发展和不断变化,看看谁会在云计算之战中胜出将是一件有趣的事情。

免责声明

本文是作者在深入研究和分析的基础上提出的观点和想法。没有人声称这在任何情况下都是准确的。您自己的观点、想法和发现可能会因本地用例、理论、经验和发现而有所不同。如果您发现了与您的体验不同的内容,请通过电子邮件或短信直接联系我,就此主题进行进一步的对话,因为我总是希望拓宽我的视野。谢谢你。

伯特 vs 乌尔菲特对决

原文:https://towardsdatascience.com/battle-of-the-heavyweights-bert-vs-ulmfit-faceoff-91a582a7c42b?source=collection_archive---------17-----------------------

重量级人物之战

一个简单的 web 应用程序,用于实时比较两种架构。包括在谷歌应用引擎上部署的完整代码和说明

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

Photo by Johann Walter Bantz on Unsplash

这篇文章是早先文章的延续,在那篇文章中我谈到了在自定义数据集上运行拥抱脸的 pytorch-transformers 库。

在本主题中,我们将讨论:

  1. 使用 py torch-transformers & ul fit 进行推理
  2. 使用 HTML 前端和 flask 后端将其转换为 web 应用程序
  3. 使用 SQLAlchemy & Cloud SQL 存储数据
  4. 谷歌应用引擎上的生产部署
  5. 几个有趣的观察结果

背景

py torch-transformers发布时,我想试用一下,看看它的性能有多好,使用起来有多方便。因此,我开始着手建立一个 BERT(基础)模型,并在 IMDB 电影评论数据集上进行了微调。我把它包在一个网络应用程序上,任何人都可以玩。然后,我觉得与其他模型进行比较会很有趣,所以我在我的应用程序中加入了 ULMFiT。之所以选择 ULMFiT,是因为我作为 FastAI 的学生已经很长时间了,并且随身带着一个微调过的模型。最后,我决定通过对每个单词进行预测来实现实时性,这提供了一种很酷的方式来查看模型的内部工作方式。

app 部署在这里:https://deployment-247905.appspot.com/

这是当前版本的外观:

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

密码

所有的代码都存在于这里的回购中。[注意:自述文件将会随着代码的清理/小的重构而更新更多的细节]

下面快速浏览一下目录结构。

├──docker file
├──readme . MD
├──app . YAML
├──main . py
├──model
├──model-fastai
├──requirements . txt
├──static
┤──templates
└──utils _ inference . py

  1. Dockerfile:将应用程序作为 docker 容器运行。此外,我们在谷歌应用引擎(GAE)部署中使用了“灵活”的环境,这需要一个 dockerfile 文件。
  2. app . YAML:GAE 所需的应用程序设置文件
  3. main.py:主 flask 后端代码。文件名应该是 main.py,以便与 GAE 一起使用
  4. 模型:包含微调的 BERT(基本)模型文件。想要下载文件,但是库需要增强来处理。我会看看我能不能做到。
  5. model-fastai:只包含 ULMFiT 的 imdb.vocab 文件。其他文件从一个公共的谷歌云存储桶中下载。
  6. requirements . txt:docker file 需要安装的所有包
  7. 静态:Web 用户界面所需的 CSS 和 javascript 文件
  8. 模板:包含拥有我们的 Web 用户界面的 index.html 文件。
  9. utils_inference.py:为 BERT 模型进行推理所需的实用函数。这些是从 pytorch-transformers 的 utils_ 中复制的。py 文件,并定制为 IMDB 电影评论数据集运行。

推理

虽然 pytorch-transformers 使运行预训练模型甚至微调它们变得容易,但我发现在它上面运行推理很困难。因此,我复制了相关的功能,并修改它们以适应我的需要。

在 IMDB 电影评论数据集上微调 BERT 的所有细节可以在我早先的帖子中找到。

另一方面,从代码中可以看出,在 ULMFiT 上运行推理非常简单。

推理是通过后端的“/analyze”API 端点公开的,然后调用相关的函数来获得预测并在响应中返回它。

前端

前端使用 HTML、CSS 和 Javascript 开发。它使用额外的 jQuery 包来整合标尺、加载按钮和向上/向下滚动功能。为了提供实时交互,使用 AJAX 调用在每个单词后自动触发预测(稍有延迟,以防止在键入句子时触发不必要的事件),从而只更新标尺,而无需重新加载整个页面。

UI 还有一个选项,可以对任何评论的模型性能进行投票。这些信息被保存在一个 SQL 数据库中,这样我们以后就可以分析哪个模型对哪个评论更有效。

我的 UI 技能相当有限,所以代码肯定不是最优雅的,但它完成了工作。

后端

后端使用 FLASK WSGI web 应用框架。它公开了 3 个 API 端点:

/':对于主用户界面

“/analyze”:用于运行预测

/model-feedback ':用于提交对模型性能的反馈。

可以调用后端在调试或生产模式下运行。这是由一个。主应用程序文件夹中的“调试”文件。(即在调试模式下运行创建一个*。调试 apps 文件夹中的*文件)。

女服务员 用于服务制作版。请注意,按照 Google App Engine 的指示,生产版本需要在端口 8080 上运行。

后端使用aiohttp&asyncio模块异步下载模型文件。

我们还保存了客户端 IP 地址,以区分有多少不同的 IP 地址访问了该应用程序。因为在 GAE,应用程序位于 nginx 代理之后,所以我们必须使用 request.access_route[0] 来检索它。

数据存储

后端使用 SQLAlchemy 与谷歌的云 SQL 实例交互,将模型性能数据保存在 MySQL 数据库中。必须单独提供云 SQL 实例。Google App Engine 实例可以直接访问云 SQL 实例(通过云 SQL 连接名称字段)。请参考官方文档,了解实例的配置。

部署到生产

因为我从谷歌获得了免费积分,所以我决定把这个应用程序放在它的基础设施上。起初我想部署一个虚拟机实例,但后来我遇到了 GAE,听起来非常完美。

让我们来看一下 app.yaml 文件,该文件控制应用程序如何在 GAE 上托管

运行时:自定义
env: flex
资源:
CPU:2
memory _ GB:4.0
disk _ size _ GB:20
readiness _ check:
app _ start _ time out _ sec:900
env _ variables:
CLOUD _ SQL _ CONNECTION _ NAME:deployment-XXXXXX:xxxxxxxx:xxxxxxxx xx
DB _ USER:xxxxxxxx
DB _ PASS:XXXXXX

运行时:自定义
环境:flex

如果您正在部署 docker 容器,那么您需要使用灵活的环境(与标准环境相对)。自从我开始使用 docker 以来,我已经部署了相同的环境,但是我想转移到标准的环境,因为如果没有使用,这些实例可以缩减到 0。

资源:
cpu: 2
内存 _gb: 4.0
磁盘 _ 大小 _gb: 20

我增加了默认实例的配置,选择了一个双 CPU 实例,内存为 4 GB,磁盘大小为 20 GB。在’ google cloud deploy '命令失败并且日志抛出“设备上没有剩余空间”错误后,我不得不增加磁盘大小。

准备就绪 _ 检查:
app_start_timeout_sec: 900

在我收到“ google cloud deploy ”命令失败后,我将应用程序启动超时从默认的 300 秒增加到 900 秒。

env _ variables:
CLOUD _ SQL _ CONNECTION _ NAME:deployment-XXXXXX:xxxxxxx:xxxxxxxx
DB _ USER:xxxxxxx
DB _ PASS:XXXXXX
DB _ NAME:xxxxxxx

将数据库凭证传递给后端 python 脚本需要这些设置。理想情况下,我们应该使用“云密钥管理”解决方案(或等效方案)

beta _ settings:
cloud _ SQL _ instances:deployment-XXXXXX:xxxxxxx:xxxxxxxx

需要此设置来提供 GAE 和云 SQL 实例之间的连接。

有趣的观察

在这一部分,我们将看看我发现的一些有趣的观察结果:

总的来说,ULMFiT 似乎很难处理短句(3-4 个单词)。

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

添加“.”最后改变置信度%。

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

仅仅增加一个额外的单词“It”就改变了对 ULMFiT 的预测。

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

我想这两种情况都有可能。

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

这个也一样。

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

伯特在这里做得更好,因为我认为“高于平均水平”是积极的。

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

在这种情况下,两者都是正确的,但我们知道 ULMFiT 对于较短的句子偏向于否定。

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

很高兴看到这里的信心越来越强。

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

很高兴看到伯特能把这件事做好。但是我们知道“高于平均水平”是负面的。

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

但它得到的却是负面的。也许是因为刑期较短。

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

这里都很好。

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

但这是什么?伯特仅仅通过去掉单词“was”就改变了它的预测。发生什么事了?

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

现在这个你会认为是负的,伯特错了,乌尔姆菲特对了。

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

但是如果你去掉“黑暗”这个词,伯特就会改变它的预测。同样,不知道这是如何工作的。

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

最后,我在 IMDB 上测试了 50 多条真实评论,我可以说这两个模型彼此非常一致,除了这一次 ULMFiT 似乎做出了更好的判断。

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

结论

虽然上面的例子确实表明 BERT 更擅长理解语言的语义,但是在现实世界中,当有多个句子时,两者之间没有太多选择。

如果更多的用户可以尝试这个应用程序,并提供他们对一种模式比另一种模式更好的情况的反馈,也许我们就可以选出一个赢家。

快速链接:【https://deployment-247905.appspot.com/】

用 Google Colab 战胜 GPU 的挫败感

原文:https://towardsdatascience.com/battling-out-the-gpu-frustration-with-google-colab-2fb62ecf276d?source=collection_archive---------9-----------------------

轻松开发复杂机器学习模型的平台。

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

image from NVIDIA

随着机器学习和深度学习模型的数据集规模大幅增加,对 GPU 更快训练模型的需求也在升级。作为数据科学的学生,我们都知道我们受到挑战的笔记本电脑需要多长时间来运行包含数百万条记录的数据集的机器学习或深度学习模型。

一般来说,基本的笔记本电脑和个人电脑需要用户花费大量的时间来将数据拟合到构建的模型中。因此,超调模型的过程会受到这种约束的影响。

这种情况的另一种选择是购买外部 GPU,基本型号的平均价格为 250-300 美元。对于一个学生来说,对于他/她正在努力的大学项目来说,这是一个很大的代价。

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

GIF from Giphy

我知道这很令人沮丧!!!

多亏了谷歌,学生们可以不再担心这样的情况,因为谷歌在云上提供了一个免费的 GPU 来运行大规模的机器学习项目。

本文将带您开始使用 Google Colab,这是一个免费的 GPU 云服务,带有一个基于 Jupyter Notebook 的编辑器。

用户可以运行他们的机器学习和深度学习模型,这些模型建立在当前最受欢迎的库上——Keras、Pytorch、Tensorflow 和 OpenCV。

首先,你需要一些 Python 和 Jupyter notebook 的知识,以及基本的机器学习概念。

Google Colab 是 Python 流行库的完美工具,如 KerasTensorflowPytorch 。您可以创建一个新的 Python 3Python 2 笔记本,打开存储在各自用于创建笔记本的 google 帐户中的笔记本,并可以从本地计算机上传笔记本。在将我们的数据集上传到平台的情况下,有一个缺点,即当会话重新启动时,数据集会被删除。我们可以将 Google Drive 安装到笔记本上,这是一个很酷的功能,而不是每次打开笔记本时都要上传文件。

Google Colab 入门

我们可以通过点击下面的链接启动该平台

[## 谷歌联合实验室

编辑描述

colab.research.google.com](https://colab.research.google.com/notebooks/welcome.ipynb?pli=1)

一旦你点击链接,你将被要求使用你的谷歌账户登录,你创建的所有笔记本将被自动存储以备将来使用。

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

  • 示例选项卡提供了一些代码,为了使用 Google Colab 的大部分功能,必须对这些代码进行适当的检查。
  • 最近的选项卡提供了您最近创建或处理的几个笔记本。
  • Google Drive 选项卡提供所有链接到您的 Google 帐户的笔记本。
  • Github 标签让你将你的 Github 账户链接到 google colab。
  • 上传选项卡提供了从本地计算机上传文件的链接。通过广泛使用该平台,可以了解大多数隐藏的功能。

基本布局和功能

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

image from Google Colab

这是创建新笔记本时生成的基本布局。大部分功能与 Jupyter 笔记本相似。双击 Untitled.ipynb 可以更改笔记本的名称 +Code 和+ Text 分别用于添加新的 Code 单元格或 markdown 单元格。其他用户可以通过添加他们的 Gmail 地址来共享笔记本,这样每个人都可以在一个地方进行适当的更改。您可以通过点击屏幕右上角的连接按钮开始新的会话。

在开始会话之前,最好将运行时类型更改为 GPU(因为这是使用 Google Colab 的主要目的),可以在运行时选项卡中访问它。

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

Google Colab 是一个非常简单但功能强大的平台,可以运行您的机器学习和深度学习模型,而不必担心 GPU 的能力。如果你习惯在 Jupyter 笔记本上工作,那么这将是小菜一碟。

降价

我想强调一下降价,因为它们在开发 Jupyter 笔记本时增加了很多重量。它帮助你通过你的代码讲述一个故事,如果你想成为一名数据科学家,这是必须的。管理主要需要输出,而不是相关的代码,这简化了这个过程。Google Colab 提供了对所写的降价的实时预览,这样你就不必每次都运行单元格来进行微小的修改。

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

上传数据

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

该窗口出现在屏幕左侧,并带有一个与之相关的箭头。在这里,你可以从本地计算机上传一个文件或者挂载你的 Google Drive(我会在文章的后半部分解释)。

基本命令

1.安装你的谷歌硬盘

from google.drive import drive 
drive.mount(/content/gdrive)

2.安装库

!pip install keras

3.克隆 Github 存储库

!git clone [https://github.com/pytorch/pytorch](https://github.com/pytorch/pytorch)

4.运行 Python 脚本

!python setup.py

TPU 电力公司

TPU(张量处理单元)是由谷歌开发的,旨在提供高计算能力来训练机器学习和深度学习模型。尽管你可以随意使用 NVIDIA Tesla K80,但 TPU 提供的动力要大得多。根据 Google 的 Colab 文档提供的信息, A GPU 提供 1.8TFlops 并拥有 12GB RAM ,而 TPU 提供 180TFlops 并提供 64GB RAM。

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

GIF from Giphy

结论

Google Colab 是 Jupyter Notebook 运行高计算深度学习和机器学习模型的绝佳替代品。您可以随时与其他开发人员共享您的代码,以便他们可以帮助您优化代码。大多数 python 库都预装了 Google Colab,因此它减轻了安装每个库的负担。和主要功能将是免费的 GPU!!!。

像往常一样,免费产品有一些限制。(无关紧要的限制,但在某些情况下会有所不同)。只能使用Python 2.7(2020 年 1 月起弃用)或 3.6 作为编程语言,不支持 R 。每个用户的 GPU 分配限制为一次 12 小时。使用的 GPU 是 NVIDIA Tesla K80 ,一旦会话完成,用户可以通过连接到不同的虚拟机来继续使用资源。

我建议你参考你的 Google Colab 一站式指南,它提供了更多的技巧和窍门,让你对 Google Colab 有更深的了解。

谢谢你。

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

GIF from Giphy

使用贝叶斯法则来发现(并澄清)你日常生活中隐藏的信念

原文:https://towardsdatascience.com/bayes-rule-for-job-hunt-b2eca4d3b98?source=collection_archive---------8-----------------------

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

Photo by Mikhail Vasilyev on Unsplash

如何应用统计概念来改善决策

贝叶斯法则的核心是,每当我们得到新的证据时,我们就更新我们的信念。当有人说她比以前更(或更少)自信时,她应用了贝叶斯法则,因为她在学习新信息后改变了信念。大多数人凭直觉用这个想法工作。然而,很少有人在自己的生活中有意识地使用它。

这篇文章不是关于贝氏法则的技术细节和公式。相反,我想向你们展示这个想法的强大之处。通过举例向你展示如何将这个框架应用于求职,我想达到两个目标:

  1. 我想让你相信贝叶斯法则在日常生活中的作用。
  2. 我想向你介绍一个如何改进决策过程的总体框架。

让我们开始吧。

求职的例子

汤姆最近搬到了一个新的城市,正在找工作。然而,他不想随机申请工作。相反,汤姆想把他的精力和时间放在最有前途的招聘上。他如何找到能让他在个人和职业两方面都茁壮成长的职位?

由于 Tom 对 Bayes 法则了如指掌,他拿着一张纸坐下来,开始问三个问题来告知他的决定。

问题 1:汤姆对多少招聘信息感兴趣?

这个估计是他第一次先于先验是我们在没有考虑进一步证据的情况下认为是真实的数字。这是一个粗略的估计,汤姆会逐步改进的。这就是贝叶斯法则的意义所在!汤姆认为 10%的职位空缺是他想要的。

换句话说,这意味着汤姆必须写十份求职申请才能换到一份有前途的工作。这是一个非常模糊和繁琐的策略。第二个问题将帮助他在这方面有所改进。

问题 2:哪个信息最有助于汤姆区分好与丑?

汤姆正在寻找看起来尽可能不同的好的和坏的工作机会的信息。Tom 认为公司评级页面是可靠的来源,因为他认为好工作很可能与高评级有关。因为他正在使用贝叶斯法则,所以他必须估计这种可能性。汤姆认为,在 90%的情况下,好工作都是在评级高的公司。

汤姆还必须考虑另一种情况:这份工作很糟糕,但评分仍然很高的可能性有多大?他提出了两种可能发生的方式。首先,这家公司可能是一个很好的工作场所,但具体的工作却很一般。第二,一些公司可能会伪造评级。然而,他并不认为这两种情况发生的可能性很大。所以他假设 5% 的小概率。

如你所见,汤姆很自然地开始思考他的信念和假设。他没有直觉地认为“好的评级是一个好的指示”,而是有两个不同的假设需要评估。

现在他可以更新他的求职策略了。在没有任何进一步信息的情况下,他认为所有招聘信息中有 10%是有吸引力的。然而,鉴于一家公司的评级很高,他现在希望 67% 的这些招聘信息与他相关。这是一个巨大的差异,反映了他对公司分数的信任。

也凸显了两面思考的重要性!把 90%作为估计值是很诱人的,但这只是考虑了少数好工作。

计算:

汤姆对好工作的偏好是 10%。鉴于这是一份好工作,获得良好评级的概率为 90%。两项相乘得到 9%。他有 90%的前科。鉴于这是一项糟糕的工作,获得良好评级的概率为 5%。两项相乘得到 4.5%。所以我们的后验概率是 9% / (9% + 4.5%),大概是 67%。

问题 3:随着时间的推移,你还收集了哪些信号?

因为找工作是一个过程,汤姆可以再次运用同样的原则。举个例子,让我们假设汤姆参加了第一次求职面试。这是一次愉快的经历,离开后他有了很好的感觉。这如何改变他认为自己找到了一份好工作的信念?

在这个阶段,Tom 更加怀疑,因为招聘人员告诉他的和日常工作之间可能会有差距。他用 80%的概率估计好公司有好的第一次面试。然而,即使是糟糕的公司也会在 70%的情况下给人留下好的第一印象。

鉴于这些数字,他的信任度从 67% 略微上升到 70% 。如你所见,变化不大。这是贝叶斯的另一个强大的方面:你可以很好地理解新信息是多么重要!尽管看起来一切都变得更加透明,但事实可能并非如此。

计算:

我们对好工作的偏好(给予高评级)为 67%。鉴于这是一份好工作,第一次面试成功的概率是 80%。将这两项相乘得到大约 54%。我们以前的坏工作是 33%。鉴于这是一份糟糕的工作,第一次面试成功的概率是 70%。将这两项相乘得到大约 23%。因此我们的后验概率是 54% / (54% + 23%),大约是 70%。

后续步骤

汤姆很快就取得了很大进步,但和往常一样,还有进一步提高的空间。贝叶斯法则给了他两条前进的道路:

  1. 他可以整合额外的信号,并相应地更新他的信念。例如,他可以考虑员工的波动或公司随时间的发展。
  2. 他可以重新评估先前的估计。这些评论抓住了对他来说重要的东西吗?他分配的数字是可信的,还是需要调整?为什么?

无论他决定从现在开始做什么,他都会意识到每一条信息是如何影响他的信念的。

摘要

正如汤姆的例子所示,当你开始将贝叶斯法则应用于现实生活时,有三个好处:

  1. 你通过明确陈述和量化你的信念来获得清晰。
  2. 你识别最强有力的信息来源,即概率差异最大的信号。
  3. 您量化剩余的不确定性,这允许您决定是否值得收集额外的信息。

如果这篇文章对你有所帮助,或者你想补充什么,请在评论或 Twitter 上告诉我。我也很乐意在 LinkedIn 上联系。感谢阅读!

资源

一段时间以来,我一直想写下这个例子,但 3Blue1Brown 的这个精彩视频给了我最后一点动力:

如果你对普通人如何应用贝叶斯法则成为高度成功的预测者的广泛描述感兴趣,我强烈推荐菲利普·e·泰特洛克和丹·加德纳的书《超级预测——预测的艺术和科学》。**

基于 Kotlin 的 Android 无张量流贝叶斯文本分类

原文:https://towardsdatascience.com/bayes-text-classification-in-kotlin-for-android-without-tensorflow-d10f1247c23d?source=collection_archive---------20-----------------------

📱移动机器学习

探索没有 TensorFlow APIs 的纯 Kotlin 中的贝叶斯文本分类。

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

Photo by Luca Bravo on Unsplash

T ext 分类由于其能力和广泛的用途,已经成为自然语言处理中的一项重要任务。我们将学习以非深度学习的方式使用这项技术,而不使用 TensorFlow 和神经网络。这个分类器将在 Android 应用程序中工作,所以需要用 Kotlin 或 Java 编写。

但是为什么是科特林,为什么不是我们的 TensorFlow 或者 Python?

We aren’t using TensorFlow? Because it’s written in C++, models are constructed in Python and we need to run it in Kotlin!

TensorFlow 和 TensorFlow Lite 可以在 Android 上高效地工作(或者有时是在头脑中吹的方式)。类似的算法可以在任何编程语言中创建,如 C、C++甚至Swift(iOS 原生),如果它可以在 kot Lin(Android 原生)中创建的话。

有时,在平台中本地编码的分类器可以比 TensorFlow 或其 API 执行得更好。此外,我们可以对它的工作和推理有更多的控制流。

我们要用哪种机器学习算法?我们到底在创造什么?

我们将使用朴素贝叶斯文本分类器对 Kotlin 中的文本进行分类,该分类器最终将在 Android 设备上运行。

Math is coming! Be ready!

谈论朴素贝叶斯文本分类

朴素贝叶斯文本分类使用贝叶斯定理的力量将文档(文本)分类到某一类。

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

Bayes Theorem

如果我们根据我们对文本分类的需要来建立等式,那么它将变成这样,

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

Eq.1

在这里,我们将文档表示为 x₂x₁令牌…xₙ和 c 是我们将计算概率的类。分母被省略,在这里可以看到它的解释(因为在这两种情况下(C₁和 C₂),P( x₁,x₂…xₙ)将保持不变并将作为归一化常数)

我们将计算两个类别的概率,即垃圾邮件 ( C₁)和火腿 ( C₂)。概率较高的将是我们的输出。

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

对于每个类,我们都有一个词汇或一组出现在垃圾邮件或垃圾邮件中的单词,它们将代表我们的类语料库。

先说科特林。

If you loved Python earlier!

首先,我们将定义我们的语料库positiveBagOfWordsnegativeBagOfWords,它们分别包含垃圾邮件和火腿词。

现在,我们创建一个名为Classifier的新类来处理分类任务。我们需要定义两个常量和一个从给定文本中提取标记的方法(通过删除不必要的单词、标点符号等)。).

getTokens( document ) =令牌。因此,我们可以将文档 d 转换为一组令牌,如 x₁ ,x₂ … xₙ.

寻找概率

首先,我们需要找到 P( C ) 或者类概率。这无非是两个语料库中有多少单词属于类别 C 的概率。

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

Class probabilities. Eq.2

Calculates Eq.1

接下来,我们需要找到 P( X | C ) 这是 X 的概率,假设它属于一个类别 C

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

在此之前,我们需要一个方法来找到给定文档中的令牌 xᵢP( xᵢ | C ) 。我们可以用这个方法。

Calculates P( xᵢ | c )

其中class_vocab是其中一个语料库。它代表 P( xᵢ | C)中的 c。想知道 1 是从哪里来的?这就是拉普拉斯平滑。如果 P( xᵢ | C)是 0,而 xᵢ在我们的语料库中不存在,那么我们所有的 P( X | C)都可能变成 0。加 1 可以解决这个问题。

现在,我们需要将所有的 P( xᵢ | C ) 相乘,最后乘以 P( C),这是我们在下面方法中的类概率。

Calculates Eq.1

仅此而已。现在我们需要检查哪个类的可能性更大。

在这个要诀里可以一目了然的看到完整的代码。

还有呢!

太长了,有点数学化。结束了!

希望你喜欢科特林的朴素贝叶斯的想法。请在下面的评论区分享您的反馈。

这是我的第一篇数学含量很高的文章,所以请原谅我在精度标注上的错误。😃

快乐的机器学习。

贝叶斯定理与电影评论分析

原文:https://towardsdatascience.com/bayes-theorem-and-movie-review-analysis-fffae437a56?source=collection_archive---------27-----------------------

贝叶斯定理是概率论中的一个基本公式。如果你想知道某个事件发生的概率,我们可以使用一些先验知识和贝叶斯定理来进行计算。

贝叶斯定理

让我们来看看贝叶斯定理:

P(A|B) = (P(B|A) * P(A)) / (P(B))

后验,* P(A|B) :假设事件 B 发生,事件 A 发生的概率*

可能性 P(B|A) :给定事件 A 发生,事件 B 发生的概率。**

先验 P(A) :是我们发生的概率。**

P(B) :事件 b 的概率,也改写为 P(B|A) + P(B| Aᶜ)

关于可能性与概率的一个注记:

可能性类似于概率,但不是概率。可能性被认为是给定固定数据的假设。然而,我们常常不知道我们所知道的数据是什么样的样本。因此,可能性 P(B|A)度量了一个样本支持这个特定事件的程度。

简单贝叶斯例子

假设,1%的人口患有疾病,并且有针对该疾病的医学测试。如果一个人患有这种疾病,该测试预测他们患有这种疾病的准确率为 87%。如果一个人没有患病,该测试正确地测量出 72%的人没有患病。假设一个人接受了测试,并且测试结果呈阳性,那么他患这种疾病的概率是多少?

**# posterior = P(has disease | positive test) 
# likelihood = P(positive test | has disease)
# prior = P(has disease)
# P(positive test) = P(positive test | has disease) * P(has disease) + P(positive test | does not have disease) * P(does not have disease)posterior = (0.87 * 0.01) / (0.87 * 0.01 + (1 - 0.72) * (1 - 0.01))posterior = 0.03**

院长

让我们再多谈谈先验知识。先验是基于我们已经掌握的信息。如果我们对事件的认识改变了呢?假设一项新的研究发现,这种疾病实际上在 3%的人口中流行,而不是 1%。这大大改变了我们的答案,使这种疾病呈阳性结果的概率增加到 8.8%。因此,当我们考虑样本如何反映总体时,当我们有数据集样本时,考虑先验概率是很重要的。

打破朴素贝叶斯

前面的例子只考虑了一个特征和目标,现在我们来想想,如果这个疾病有四个不相关的疾病检测结果呢?如果一个人每次测试都得到阳性结果,那么这说明了患这种疾病的可能性有多大。这就是朴素贝叶斯派上用场的地方。

之所以称之为朴素贝叶斯,是因为它做出了一个在现实中几乎不可能满足的主要假设,这就是所有特征都是独立的且互不影响的假设。假设独立性的一个例子是球的大小不影响球的颜色。然而,这不是一个伟大的假设,因为大多数篮球(相当大)是橙色的,而大多数高尔夫球(相当小)是白色的。同样,朴素贝叶斯作出这种假设是为了使数学更简单,并使计算机程序在初始分类测试中运行得更快。它可能不会是您使用的最终模型,但它是一个很好的起点。

让我们通过一个例子来展示朴素贝叶斯的工作原理。

假设我们想计算在给定评论文本的情况下,在腐烂的西红柿上获得“新鲜”分数的概率(在评论文本中,我们计算每个单词出现的次数)。

  1. 开始配方。给定评论包含 X 个单词,一部电影是 C=fresh 的概率是多少?这等于新得分包含这些单词的可能性乘以新得分的概率除以单词的概率。

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

2.使用链式法则,我们可以将似然性 P(X|Ci) 扩展到每个单词在给定条件下依次减少的似然性:

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

3.由于我们天真地认为单词是相互独立的,因此我们可以简化数学。贝叶斯的独立性法则表明,如果 A 和 B 是独立的,那么 P(A|B) = P(A) 。我们只需要看|和类前的单词。然后我们将这些可能性相乘。这将等式简化为:

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

4.最后,由于我们的分母是不变的,我们来看看比例性:

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

“给定该评论文本的电影是新的概率与给定新评论的每个词的可能性乘以新评论的概率的乘积成比例。”

在 Python 中应用朴素贝叶斯

这种数学可能有点复杂和冗长,尤其是对于文本分类。幸运的是 Scikit-learn 有一个内置的库为我们做数学运算。有几种不同类型的朴素贝叶斯分类器,但我们希望使用多项式贝叶斯分类器,因为它测量离散计数(即电影评论中的字数)。我使用了来自这个 Kaggle 数据集的评论。

  1. 导入必要的库并将数据存储在数据帧中
**import csv
import pandas as pd
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformerdata = []
with open('reviews.tsv', encoding="utf8", errors='ignore') as tsvfile:
    reader = csv.reader(tsvfile, delimiter='\t')
    for row in reader:
        data.append(row)reviews = pd.DataFrame(data[1:], columns=data[0])**

2.清理数据帧。要做的一些改变是将新鲜和腐烂转换为二进制,并将评论和评分存储在自己的系列中。

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

An initial look at the data

**score_dict = {'fresh': 1, 'rotten': 0}
reviews['fresh'] = reviews['fresh'].map(score_dict)X = reviews['review']
y = reviews['fresh']**

3.在 X 轴和 y 轴上执行训练、测试和分割

**X_train, X_test, y_train, y_test = train_test_split(X, y)**

4.创建一个 CountVectorizer 对象,并将其安装在 X_train 上。不要使用 X,因为我们希望将 X_train 视为我们拥有的唯一数据。使用 stop_words='english '删除不太重要的单词,如“the”、“and”和“that”然后转换 X_train 和 X_test。

**count_vectorizer = CountVectorizer(stop_words='english')
count_vectorizer.fit(X_train)X_train_counts = count_vectorizer.transform(X_train)
X_test_counts = count_vectorizer.transform(X_test)**

5.创建并调整 TfidfTransformer 对象。这将根据每个单词在文档中出现的频率以及在多少个文档中出现来对其进行加权。如果一个单词在文档中出现很多,那么这个值就会增加,因为它可能是一个重要的单词。但是,如果它出现在很多文档中,则价值会降低,因为这个词可能对整体分类影响不大。变换 X_train 和 X_test。

**tfidf_transformer = TfidfTransformer()
tfidf_transformer.fit(X_train_counts)x_train_tfidf = tfidf_transformer.transform(X_train_counts)
x_test_tfidf = tfidf_transformer.transform(X_test_counts)**

6.在 tfidf 训练数据上创建和训练多项式朴素贝叶斯分类器。

**classifier = MultinomialNB()
classifier.fit(x_train_tfidf, y_train)**

7.执行朴素贝叶斯。这一步为你做了所有的计算!我们可以做两件事:第一是严格计算后验概率,第二是得到最可能的结果。我们可以在我们的测试数据上做到这一点,但为了简单起见,让我们看看我写的一篇评论,应该是 fresh

**classifier.predict_proba(count_vectorizer.transform(['This is an awesome movie']))# Output: [0.36188785, 0.63811215]classifier.predict(count_vectorizer.transform(['This is an awesome movie']))# Output: [1]**

这个输出意味着这部电影有 0.362 的几率有分,有 0.638 的几率有。它还预测评论是新鲜的

还有一种使用流水线的替代方法,它压缩了计数矢量化、tfidf 转换和分类器步骤。

**from sklearn.pipeline import Pipelinetext_classifier = Pipeline([('count_vectorizer', 
                             CountVectorizer(stop_words='english')),
                            ('tfidf_vectorizer',   
                             TfidfVectorizer()),
                            ('clf', MultinomialNB())])text_classifier.fit(X_train, y_train)text_classifier.predict_proba(['This is an awesome movie'])
text_classifier.predict(['This is an awesome movie'])**

摘要

贝叶斯定理利用先验知识和事件发生的可能性来预测在其他事情发生的情况下特定结果发生的概率。朴素贝叶斯是一种快速而强大的工具,我们可以用它来对信息进行分类,但它主要是一个起点,因为它做出了一些假设,所以要谨慎使用。它主要用于文本分类,因为数据集很大,非常符合独立性原则。关于代码的更多信息,请查看我在 GitHub 上的库。

我如何学习数学:哑吧的贝叶斯定理?

原文:https://towardsdatascience.com/bayes-theorem-for-dummy-how-do-i-learn-mathematics-e9bff5538cd8?source=collection_archive---------27-----------------------

我是从[1]开始学习 SVM 的,作者提到:“如果你没有读过《朴素贝叶斯》,我会建议你通过 这里 ”来阅读。这让我很好奇,我想我应该浏览一下,因为两年前上完数学课后,我仍然不明白贝叶斯定理,哈哈…

如果你只是想知道贝叶斯定理,跳过这一步

因为我打算攻读计算机科学博士学位,所以我开始阅读大量的研究论文,试图理解数学(尽管一开始很难),并开始在谷歌上搜索大量的数学解释。当我不理解的时候,我坚持去理解。我试着把数学写出来,我试着阅读 10~20 个解释它的资料。

当我开始思考我在高中期间学到了什么但不明白的东西(例如奇怪的 e 常数)时,我搜索了它并试图理解它,结果发现它并没有那么难,只是我的高中和大学讲师没有解释它的起源,如果你对它感兴趣,你可以去这里自己阅读。

我在第一年有机会进入深度学习,然而,我对此一无所知,但现在我可以说,在 Youtube 上观看了斯坦福 CS231n 系列之后,我至少熟悉了深度学习的基础知识。我之前不明白 DL 里的交叉熵,信息论里的熵到底是什么,多亏了[3],终于,我明白了。当你不懂的时候,就试着反复阅读,强迫自己经常谷歌,试着从基础开始学习耐心点,总有一天你会明白的。

TLDR;如何理解数学

  1. 耐心(你的决心)
  2. 从基础开始学习(如果你基础真的很差,请不要急于学习)
  3. 问问你的讲师、导师或你认识的数学得了 A++++的人(在中国我们称他们为学霸)。
  4. 谷歌的发明是有原因的,孩子。

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

贝叶斯定理

一些基础知识

永远记住概率背景下的乘法,等于
每当他们说给定某事的概率时,你可以把它们转换成数字。例如,你可以认为你有 100 个球在一个盒子里,其中 50 个是红色的,30 个是绿色的,20 个是蓝色的,因此你得到一个红色球的概率是 50/100 = 0.5(除非你把这个球拿出来,然后放回盒子里,这样盒子里总是有 100 个球,这叫做替换样本)。

你有 3 种不同颜色的球(例如红色、绿色、蓝色)。给定每个球的概率(r=0.5,g=0.3,b=0.2),我们想知道得到 3 个不同颜色的球的概率(意味着一个红色,一个绿色和一个蓝色)。

P(1R & 1G & 1B) = 0.5 * 0.3 * 0.2 = 0.03 =你有 3%的机会得到 3 个不同颜色的球。用话说,我有 50%的机会得到红球,得到一个红球后,我不想再得到另一个红球,我想得到绿色或蓝色。因此,得到一个绿色球的几率是 0.5 * 0.3 = 0.15,或者得到一个蓝色球的几率是 0.5 * 0.2 = 0.1,这意味着我有 10%和 15%的机会得到一个绿色球或蓝色球,或者合计 25%的机会得到非红色球,同样计算最后一个球,得到 3 个不同颜色的 3 个球是极其困难的。 (如果我说错了请指正。)

贝叶斯定理

我实际上是从[2]中理解的,我以他们为例。

P(A|B) = P(B|A) * P(A) / P(B)

P(A) =事件 A 的概率
P(B) =事件 B 的概率
P(A|B) =给定 B 发生的事件 A 的概率
P(B|A) =给定 A 发生的事件 B 的概率

比如我们想知道,当我们看到烟的时候,火灾发生的概率是多少。(我们可能不想知道,但如果你是政府,你希望是否应该在工业区附近建立一个消防站,这可能会有用。)

P(火)=发生火灾的概率
P(烟)=看到烟的概率
P(火|烟)=当我们看到烟时发生火灾的概率
P(烟|火)=发生火灾时看到烟的概率

p(火灾)= 0.01 表示有 1%的火灾。P(烟雾)= 0.1,表示我们看到 10%的烟雾。
P(Smoke|Fire) = 0.9 意思是当火灾发生时,90%的时间我们都能看到烟。

给定贝叶斯叔叔的方程和上面的情况,我们想求 P(火|烟)。

P(火|烟)= P(烟|火)* P(火)/ P(烟)= 0.9 * 0.01 / 0.1 = 0.09 意味着如果我们看到一个工厂冒出烟,就会发生 9%的火灾。

先说 P(烟|火)* P(火)= 0.9 * 0.01=0.009 (0.9%),这意味着有烟发生火灾的概率是 0.9%。我们也可以说,没有烟的火是 0.1%。(0.09 + 0.01 = 0.1 = 1%有烟或无烟火灾)

我们知道看到烟并不意味着有火灾,只能说有机会有火灾。从方程中我们知道,当我们除以 P(烟)时,几率是 9%,P(有烟的火)/P(烟)= 0.009/0.1 = 0.09。超过这 10%的看到烟的机会,我们可以说,我们观察工业区 10000 次,我们看到烟 1000 次(0.1),有 90 次发生火灾(0.009),因此,90/1000 = 9%的机会发生火灾。

换句话说,10000 次我们观察工业区,1000 次我们看到烟,100 次有火灾发生,90 次火灾有烟,10 次火灾没有烟。因此,当我们看到烟时,实际上有 9%的可能性发生火灾。

+-----------+----------------+-------+
|           | Fire | No Fire |       |
+-----------+----------------+-------+
| Smoke     | 90   | 910     | 1000  |
| No Smoke  | 10   | 8990    | 9000  |
+-----------+------------------------+
|           | 100  | 9900    | 10000 |
+-----------+------+-----------------+Based on this table, total smoke = 1000, fire with smoke = 90, given number of smoke, smoke with fire = 90/1000 = 0.09 = 9%

这就是我对贝叶斯定理的理解。贝叶斯定理有一些修改,

P(A | B)= P(B | A)* P(A)/(P(B | A)* P(A)+P(B | A ')* P(A ')

这个方程基本上和我刚才解释的一样。试着把数字放进去数数,这会帮助你更好地理解问题。

1000 次冒烟相当于 90 次有烟着火+ 910 次无烟着火。

结论

请注意,我们总是可以用一个数字来表示概率,因为这实际上是统计学。

这是我如何理解一个数学公式和贝叶斯定理。希望这篇文章能帮助你理解更多关于贝叶斯定理的知识,并帮助你在统计考试中给这类问题打分。

参考

[1]https://medium . com/machine-learning-101/chapter-2-SVM-support-vector-machine-theory-f 0812 effc 72

[2]https://medium . com/machine-learning-101/chapter-1-supervised-learning-and-naive-Bayes-class ification-part-1-theory-8b9e 361897 D5

[3]https://towards data science . com/demystifying-entropy-f2c 3221 e 2550

贝叶斯定理——一些观点

原文:https://towardsdatascience.com/bayes-theorem-some-perspectives-eeb4421b186e?source=collection_archive---------9-----------------------

“我听到了,我忘记了。我看见了,我记得。我知道,我理解。”――荀子

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

最近我在读数学史相关的书籍,这让我想起了一个事实,所有看起来复杂的方程都是从一个小的现实世界的问题开始的。研究小问题的好处是,它可以帮助我们忽略树叶,专注于树干,更重要的是,它允许我们在复杂的理论和现实世界的例子之间来回转换。

在这种信念的激励下,我开始将这种策略应用于一个我很久以前就已经学会但我并不十分直观地熟悉并能够快速应用于我在现实世界中遇到的任何情况的定理——贝叶斯定理。正如您所知,贝叶斯定理在数据分析和统计中非常有名,是许多机器学习模型和算法的基础。

我将调查一些小例子,并在下面的部分中尝试给你一些定理的直观解释。虽然下面的讨论对于有统计学背景的人来说可能很熟悉,但我觉得如果你从来没有花时间真正思考和工作,要有一个深刻和直观的理解是很不容易的。为了最大限度地利用这一点,建议您随身携带一支笔和纸,并按照计算结果进行操作。计算非常简单,但是自己写下来可以利用你的肌肉记忆,保证给你留下深刻的印象。

这个问题

首先,我们需要有我们感兴趣的问题,并收集一些数据进行分析。这里会用到一个简单的例子,但是数学是如此的通用,当然你可以把它应用到任何你想要的问题上!

这里我要考察的问题是学历和一个人的财富之间的关系。我感兴趣的一个问题是,如果一个人获得了学士学位,他/她变得富有的可能性有多大?当然,这并不意味着两者之间的因果关系,而只是一个给另一个的可能性。

设置

显然,为了应用这个定理,我们需要定义随机变量和符号。设一个人的财富是随机变量 Y 学历是随机变量 X 。Y 取 Y 的赋值的概率写成 P(Y=y)或 P(Y),Y 取 Y 以外的赋值的概率是 P(Y=~y)或 P(~y)。对于 x 也是一样。

贝叶斯定理被定义为

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

数据收集和处理

让我们开始收集数据吧!我脑子里马上就能想出一些人。下表显示了它们的相关数据。

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

Data of the friends I know. Numbers are made up. Ohh…yeah, Elon is my friend, he always talk to me (in youtube) but I am not sure if he also treats me as friend 😦

为了简化,我根据以下规则将数据分类。

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

你可能会注意到我收集数据方式的一些问题。请参见部分对数据的讨论。我们将暂时忽略这些问题,因为我们主要想对贝叶斯定理有一些直观的理解。

应用贝叶斯定理

我感兴趣的问题是:鉴于我获得了学士学位,成为超级富豪的概率有多大?形式上我是问 P(Y=3|X=2)。根据贝叶斯定理,等于联合概率 P(X=2,Y=3)除以边际概率 P(X = 2)……(1)。我们可以进一步把分子分为 P(X=2|Y=3)P(Y=3),分母分为 P(X = 2 | Y = 3) P(Y = 3)+P(X = 2 | Y = 2)* P(Y = 2)+P(X = 2 | Y = 1)* P(Y = 1)……(2)

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

现在,我们可以**直接查找数据来确定每个组件的值。**例如,为了找出 P(X=2|Y=1),我们首先统计 Y=1 的记录数,在本例中为 5。我们还需要记录 X=2 和 Y=1 的行数,在本例中是 1。所以 P(X=2|Y=1)是 1/5。要计算 P(Y=1),我们只需要统计所有记录中 Y=1 的记录数,也就是 5/10。我们重复这些步骤来确定所有元素的值,从而得到 …(3) 的结果。

一些观察和解释

  • 划分条件:观察到分母 P(X=2)被划分为 P(X = 2 |Y = 3) P(Y = 3)+P(X = 2 |Y = 2) P(Y = 2)+P(X = 2 |Y = 1) P(Y = 1)。这是什么意思?意思是X = 2 的世界被分成 Y* 的不同设定。观察到,例如 P(X=2|Y=3)*P(Y=3) = P(X=2,Y=3)。现在可以看到 P(X=2)分为{P(X=2, Y=1 )、P(X=2, Y=2 )、P(X=2, Y=3 )}。求和{P(X=2, Y=1 )、P(X=2, Y=2 )、P(X=2, Y=3 )}得出 P(X=2)。用文字来说,持有学士学位的人的世界分为{(持有学士学位并很穷的人),(持有学士学位并拥有中等财富的人),(持有学士学位并超级富有的人)}。忽视富人的状况会让你回到拥有学士学位的人的世界。
  • **分子也构成分母的一部分:**观察到 P(X=2|Y=3)*P(Y=3)在我们把方程改写成… (2) 时同时出现在分子和分母中。P(X=2|Y=3)*P(Y=3)其实就是 P(X=2,Y=3)。这意味着我们正在测量感兴趣的关节 P(X=2,Y=3)在分母 P(X=2)世界中的比例,它由其他关节组成,这些关节都是 X=2,但具有不同的 Y 赋值。
  • **解读分母中被分割的世界——它们只是比率乘以比例:*……(2)…(3)*中带绿色的部分为例(P(X=2|Y=1)*P(Y=1))。P(X=2|Y=1)表示 Y=1 的世界中 X=2 的个数,所以是 1/5(Y=1 的世界中 5 行满足 Y = 1,1 行满足 X=2)。你也可以理解为一个比值:X=2 每 Y=1 的个数。有了这个比例,我们就可以乘以一个适当的比例,P(Y=1),我们数据的宇宙中 Y=1 的个数。现在这个乘法的结果是 X=2 和 Y=1 的人的总数,是的,这是连接点。我们不仅对 Y (Y=1)的一个设置,而且对 Y (Y=1,Y=2,Y=3)的所有设置都这样做。换句话说,绿色部分表示我们试图通过每个中等富裕者拥有学士学位的人数与中等富裕者总人数的比率,找出拥有学士学位和中等富裕者的总人数。

现在你知道分母的组成了。在正常的贝叶斯设置中考虑一下:Y 是我们的模型或信念,X 是我们的数据。分母包括模型世界中数据的可能性与该模型先验 概率的比值!我们对所有的模型做这些来得到分母,把我们感兴趣的放在分子中,现在我们得到一个叫做后验概率的比例!

在上述理解的帮助下,以下部分将讨论贝叶斯定理如何帮助我们理解人类的偏见。

人类偏见的来源——忽略其他证据

在我看来,贝叶斯定理可以给我们一些线索来解释人类的一些偏见。为什么这样我问你:你觉得正常人能区分条件概率 P(Y|X)和联合概率 P(X,Y)的区别吗?大概不会。人类用眼睛作为传感器来接收信息。我们看到的事情,把一起出现的事情联系起来,这就是有效的联合事件(联合概率)。为了找出条件概率,我们将需要做一些进一步的处理,而人类不太可能这样做,尤其是当他们需要使用他们的“快速系统”做出快速反应时[1]。然而,有时对他们来说,不知道联合和条件是不同的并没有什么害处,他们这样做甚至可能是“正当的”。为什么?因为 P(Y|X)是 P(X,Y)的直接变分,所以人们“有理由”用 P(Y|X)来近似 P(X,Y)。然而,在某些情况下,我们做近似计算是要付出代价的。

让我们研究另一个例子。假设我正在一家位于中央商业区的餐馆吃午饭。我的朋友告诉我,在金融公司工作的人被要求穿西装。这实际上是说条件概率 P(穿西装的人|在金融公司工作的人)高,而我们在金融中心附近所以 P(在金融公司工作的人)也相对高。这样,联合概率 P(一个穿西装的人,一个在金融公司工作的人)也相当高。这时,一个穿西装的人进来了,我很自然地问:那个人在金融公司工作的可能性有多大?

你可能会想,很有可能,对吧?但是概率可能没有你想象的那么高。为什么?因为也有很多律师、政府官员和餐馆工作人员在附近工作,他们都被要求穿西装!(等价的,这是在说 P(穿西装的人,在非金融企业工作的人)= P(穿西装的人|在非金融企业工作的人)*P(在非金融企业工作的人)也“高”。所以,仅仅观察一个人穿西装并不能帮助我们确定这个人在哪里工作。如果我们忽略其他很多人也需要穿西装的反例,我们就很难做出 P(一个在金融行业工作的人|一个穿西装的人)高的判断。

因此,偏差的来源是我们有时忽略了反例。回忆到 P(y|x) = P(x,y)/(P(x,y)+P(x,~y)。如果反例 P(x,~y)很少见,我们可以放心地忽略它,用 P(x,y)来近似 P(y|x)。但是,当反例 P(x,~y)也很常见时,分母变大,P(y|x)变“小”,或者至少没有你最初想象的那么高。

(练习:假设你爸爸有胡子(而且你很久没见到他了)。假设你在街上遇到的人有胡子,那么这个人是你父亲的可能性有多大?)

人类偏见的来源——忽略先验

假设 Y 是一个教授,X 是一个带书的人。

假设我观察到教授们总是喜欢随身带一本书(P(x|y)高)。我坐在餐馆里。一个人带着一本书进来,他是 P(y|x)教授的概率是多少?

嗯,你可能会认为它很高,因为没有多少人带一本书。这可能是真的,但事实是教授非常罕见,我不太可能正常遇到一个(所以 P(y)很低)!如果观察到教授的先验概率非常低,那么 P(y|x)的分子也会非常低!

(练习:观察到头晕的症状,患听神经瘤(一种罕见的癌症)的概率有多大?)

人类偏见的来源——不知道我们在问什么

这个部分的可选标题可以是:混淆 P(X|Y)和 P(Y|X) 或者知道你的问题。一开始,我觉得问“如果我有学士学位,我变得富有的可能性有多大”和“一个富人有学士学位的可能性有多大”几乎是一样的。事实上,这可能完全不同。

如果我有学士学位,我变得富有的可能性是 P(Y=3|X=2)。就是富人和学士学位持有者的比例(P(X=2,Y=3)) 在学士学位持有者的世界里 P(X=2)。

另一方面,富人拥有本科学历的可能性为 P(X=2|Y=3)。就是有钱人和本科学历持有者的比例(P(X=2,Y=3)) 在有钱人的世界里 P(Y=3)。

两种情况下的分子是相同的(P(X=2,Y=3)),但是分母不同。如果分母的世界是一个大的世界(例如 P(X=2)是大的),则有可能存在许多可能的反例(例如 P(X=2,Y!=3)都大),使得兴趣的结果变小(例如 P(Y=3|X=2)变小)。

(旁注:知道了计算 P(X|Y)或 P(Y|X)都需要 P(X,Y),你在做推断和预测的时候就知道找到一个联合分布 P(X,Y)的灵活性、重要性和威力了。可以将 P(X,Y)除以 X 求和得到 P(Y)来帮助你计算 P(X|Y),也可以将 P(X,Y)除以 Y 求和得到 P(X)来帮助你计算 P(Y|X)。当然,P(X,Y)也称为生成模型,很难建模。)

对数据的讨论

我使用的数据收集方法不是随机抽样。如果我关注的人群是所有人,但我只包括我熟悉的人,这就有问题了。这些样本对整个人口来说不够有代表性。

此外,我离散化连续数据(净值)的方式是主观的,可能对结果有很大影响,特别是如果数据集很大的话。

这里不讨论的事情

在上面的例子中只使用了两个随机变量,它们都是离散的。这样做是为了让我们专注于主干,并理解贝叶斯定理的计算。然而,当涉及更多随机变量时,还有一些更有趣的情况,在概率图形模型领域更明显,这也是我正在研究的领域。

为简单起见,这里不讨论概率分布模型。贝叶斯统计将概率分布的参数视为随机变量,这一点也没有提到。

结论

本文使用了几个简单的现实生活中的例子来介绍贝叶斯定理的概念和计算,并了解为什么会出现一些人类偏见。我希望这篇文章能为你明确这个方程,让你对这个重要的定理有更深的理解!

感谢您的时间,我很想知道您的想法:)

参考

[1]丹尼尔,K. (2011 年)。思考,忽快忽慢。美国纽约艾伦巷

[2]布利兹泰因,J. K .,&黄,J. (2014 年)。概率介绍。查普曼和霍尔/CRC。

数据科学专业人员的贝叶斯定理及示例

原文:https://towardsdatascience.com/bayes-theorem-with-example-for-data-science-professionals-55b4d52f8967?source=collection_archive---------8-----------------------

贝叶斯定理是条件概率的推广。条件概率帮助我们确定给定 B 的概率,用 P(A|B)表示。所以贝叶斯定理说,如果我们知道 P(A|B ),那么我们可以确定 P(B|A ),因为 P(A)和 P(B)是已知的。

在这篇文章中,我将专注于贝叶斯定理,假设你对条件概率有很好的理解。如果你想修改你的概念,你可以参考我之前关于条件概率的文章,并举例

公式推导:

根据条件概率,我们知道

  • P(A|B) = P(A 和 B)/P(B)
  • P(A 和 B)= P(B)* P(A | B)———[ 1]

类似地

  • P(B|A) = P(B 和 A)/P(A) = P(A 和 B)/P(A)[按联合概率顺序不重要]
  • P(A 和 B)= P(A)* P(B | A)—-[2]

根据等式[1]和[2],

  • P(B) * P(A|B) = P(A) * P(B|A)
  • P(A|B) = P(A) * P(B|A) / P(B)

这意味着如果我们知道 P(A|B ),那么我们可以很容易地确定 P(B|A ),反之亦然。假设我们知道总概率 P(A)和 P(B)。

更广义的定义:

设 A1,A2,A3… Ak 是互斥且穷尽的事件的集合,概率为 P(Ai),I = 1,2,3…k。那么对于 P(B) > 0 的任何事件 B

P(Ai|B) = P(Ai 和 B)/P(B)= P(B | Ai)* P(Ai)/∑[P(B | Ai)* P(Ai)

下面是贝叶斯定理的树形表示。

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

现在让我们解决一些例子来感受一下贝叶斯定理

示例 1

当自动化生产线出现故障时,技术人员会定期进行维修。Janak 负责维修 20%的故障,20 次维修中有 1 次是不完全维修。Tarun 为 60%的故障提供服务,10 次中有 1 次是不完全维修。为 15%的故障提供服务的 Gautham 每 10 次中有 1 次不完全修复,而为 5%的故障提供服务的 Prasad 每 20 次中有 1 次不完全修复。对于被诊断为由于初始维修不完整而导致的生产线的下一个问题,Janak 进行初始维修的可能性有多大?

解决方案:

首先,让我们尝试使用概率树来可视化。

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

实施例 2 临床试验

流行病学家声称,50 多岁的白人女性患乳腺癌的概率为 0.005。一项已建立的测试识别了乳腺癌患者和健康人。一种新的临床试验中的乳房 x 光检查正确检测癌症的概率为 0.85。在没有乳腺癌的女性中,阴性结果的几率为 0.925。如果一名 55 岁的高加索妇女乳腺癌检测呈阳性,那么她实际上患乳腺癌的概率是多少?

解决方案:

  • p(癌症)= 0.005
  • p(测试阳性|癌症)= 0.85
  • p(测试阴性|无癌症)= 0.925
  • P(癌症|测试阳性)= P(癌症)* P(测试阳性|癌症)/ P(测试阳性)

给定问题的概率表和树形可视化

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

示例 3

SpamAssassin 的工作原理是让用户训练系统。它在被用户标记为垃圾邮件的电子邮件中寻找单词模式。例如,它可能已经知道“免费”一词出现在 20%被标记为垃圾邮件的电子邮件中。假设 0.1%的非垃圾邮件包含“免费”一词,用户收到的所有邮件中有 50%是垃圾邮件,请找出如果“免费”一词出现在邮件中,该邮件是垃圾邮件的概率。

解决办法

给出的数据:

  • p(免费|垃圾邮件)= 0.20
  • p(免费|非垃圾邮件)= 0.001
  • P(垃圾邮件)= 0.50 => P(非垃圾邮件)= 0.50
  • p(垃圾邮件|免费)=?

使用贝叶斯定理:

  • P(垃圾邮件|免费)= P(垃圾邮件)* P(免费|垃圾邮件)/ P(免费)
  • p(垃圾邮件|免费)= 0.50 * 0.20/(0.50 * 0.20+0.50 * 0.001)
  • p(垃圾邮件|免费)= 0.995

现在使用概率树进行可视化:

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

这就是数据科学中的贝叶斯定理。在接下来的文章中,我将会写概率分布,这将会完成数据科学的概率系列。

数据科学概率系列之前的文章有:

我希望你喜欢这篇文章。对于任何意见,请使用下面的评论部分给我回信,或者您也可以使用【https://ashutoshtripathi.com/contact/】的直接给我写信。我会尽量回答你所有关于 DS,ML,AI 的疑问。

谢谢大家!

原载于 2019 年 8 月 20 日http://ashutoshtripathi.com

用 Python 进行贝叶斯 A/B 测试:简易指南

原文:https://towardsdatascience.com/bayesian-a-b-testing-with-python-the-easy-guide-d638f89e0b8a?source=collection_archive---------4-----------------------

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

如果你登陆了这个页面,你已经知道什么是 A/B 测试,但是也许你对如何在贝叶斯框架内分析结果有一些疑问。

在这篇文章的开始,那么,让我指出贝叶斯方法与经典的“频繁主义者”方法的实际区别:区别在于你实际上想要研究的度量的形式。对于常客来说,这是一个简单的数字,而对于贝叶斯人来说,这是一个分布

虽然用分布代替数字看起来只是一个复杂的问题,但它在很多情况下非常有用,在 A/B 测试中也是如此。通过这篇文章,你会发现在实践中处理起来并不困难。事实上,只有几行代码。

Edit 18/01/2018:该页面代码已成为与Mixpanel配合使用的 A/B 测试工具的基线。

直奔主题

我答应了一个简单的向导。因此,在这一部分中,我将只向您展示代码,在下一部分中,如果您感兴趣,您将看到隐藏在它背后的一些细节。

请注意,没有使用任何近似方法:没有马尔可夫链蒙特卡罗(MCMC),或任何其他随机(和缓慢)过程。因此,不需要主动的编程框架。

让我们来介绍一下样本数据:我们已经运行了一个 A/B 测试来检查一个网页的转化率(CR,从现在开始),结果在下面的表 1 中。

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

Table 1: The data

这是代码。你只需要安装 Scipy 和 Numba,插入你的数字,你就会得到你的结果。

和模块导入的内容,calc_prob.py:

根据表 1 中的数字,测试选项的性能比控制选项好得多:几乎提升了 60%,有超过 98%的可能性更好。

如你所见,这些都是赤裸裸的、不可知的结果。他们是好是坏取决于你的情况。关于阈值的更深入的考虑将在另一篇文章中讨论,但是就概率而言,任何高于 95%的值都足够好了。

很简单,对吧?现在让我们深入了解一下细节。

细节

在代码中,我初始化了两个“Beta”函数,每个选项一个,用我们在表中的数字填充它们:

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

这些实际上是为 A/B 测试建立数据模型的函数。为了更好地介绍它们的行为,请查看下面的动画:

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

Figure 1: animation of the Beta distribution for a fixed CR. The ‘X’ axis has been zoomed.

每个函数都建立在平坦的、无信息的函数之上,由β(1,1)定义。我们在这个基础上增加的信息(数据)越多,这个函数就变得越窄。

现在你大概在想:真的这么简单吗?为什么存在一个看起来完全是为模型 A/B 测试而构建的函数?

答案在于贝叶斯定理的精确性。在不深入细节的情况下,贝叶斯定理的解通常很难(如果不是不可能的话)精确求解,这就是为什么很少有近似方法被开发出来,如马尔可夫链蒙特卡罗(MCMC)。你可以在网上找到很多使用这种方法的文章。

但是 A/B 测试是一个幸运的案例,我们实际上可以基于"共轭先验"的概念得到一个精确的解。当这个概念适用时,贝叶斯定理的后验函数与前一个后验函数属于同一族,因此我们可以通过迭代过程来构建最终函数。

A/B 测试是随机实验,只有两种可能的结果,“转换”或“不转换”,因此被描述为伯努利试验,贝塔分布是这种过程的共轭先验。这就是为什么我们敢用我所用的简单方法来使用它。但是如果你仍然有疑问和/或你想更深入地挖掘,你可以在这里查看数学细节:维基百科页面上的例子正是我们的例子。

回到我们的例子,让我给你看两个分布:

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

Figure 2: distributions for the two CR.

您可以注意到,两个分布的峰值与您以经典方式计算的值一致:

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

如前所述,不同之处在于 CR 有一个完整的概率密度函数( PDF ),而不是一个简单的数字。由于这一点,你可以计算,例如,CRs 上的方差(俗称“误差”),它也显示在图中的标签上。

现在,您可以计算所谓的“提升”,即相对于控制选项,测试选项增加了多少 CR:

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

但是,在这一点上,你需要评估这个结果的可信度。怎么会?嗯,你可以估计一个选择比另一个更好的概率!

注意,在经典的“频率主义者”范式中,你没有办法计算这样的概率。在这种方法中,你通常会计算“ p 值”,然后检查它是否落在任意选择的阈值之下(“α值”,通常为 5%),最终你可以宣布一些几乎不可能向任何经理/客户/董事会解释的事情:“在 95%的置信水平下,我们可以拒绝零假设”。然后,你必须解释这个声明与“这个假设比另一个有 95%的可能性更好”是非常不同的,这正是他们真正想从你那里听到的句子。

但是现在我们在贝叶斯世界里,我们可以这么说。事实上,我们有定义 CR 的 pdf,概率由曲线下的面积给出。实际上,这就是 PDF 的定义。

一个简单的例子:你希望测试选项的 CR 的概率大于 0.003 吗?它只是测试曲线下 0.003 和 1.0 之间的区域,在图 3 中用阴影表示。

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

Figure 3: The probability for the Test option CR to be greater than 3E-03.

在数学语言中,你通过在两个极限之间的曲线上积分来计算面积:0.003(我们选择的极限)和 1(硬极限)。

借助 Python,我们可以精确地计算这个积分(仍然:不需要蒙特卡罗),这是由 Mpmath 库提供的:

在这个例子中,我们只考虑了一个分布(测试分布),但是为了测量我们提升的可信度,我们必须考虑两个分布(控制和测试),因此为了可视化这种情况,我们必须增加一个维度。因此,我们要测量的概率不再由面积来定义,而是由体积来定义。特别是,试验组和对照组在联合概率分布下的体积大于对照组。让我们看看它是什么:

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

Figure 4: the Joint PDF of the two options. Left: 3-d visualization. Right: view from the top (zoomed). The gray plane (or line, in the 2-d) separate the zone where the Test dominate the Control.

把图 4 左边的图想象成一座山的图片,右边的图是从卫星上看到的。关注右侧的地块,您可以看到灰色线是属于测试选项(上方三角形)的土地和控制选项的土地之间的边界。在这种情况下,问题就变成了:测试比控制多了多少山?

更新(13/05/2019) :因为我有几个关于这个的请求,下面你可以找到重建图 4 情节的代码,对吧。这使用蒙特卡罗抽样,需要大量的点来产生一个好看的图形:

Code for creating the right plot of the Figure 4.

为了计算这个量(在图 4 的上三角中),我在网上看到了很多帖子,这些帖子也使用了近似的方法(比如蒙特卡罗)。好吧,写它们的人不知道约翰·库克已经在 2005 年部署了一个精确的方法(第二章,这里)。模块calc_prob.py中的代码复制了这个公式,并且几乎完全来自最初由 Antti Rasinen 编写的版本

在我们的例子中,面积是 0.98,这意味着“测试”选项以 98%的概率比“控制”选项表现得更好。

让我强调一下,如果结果本质上是 50%,那么这座山是完全共享的,这意味着没有选项比另一个更好,而较小的值意味着测试选项实际上比控制选项更差。

仅此而已。

如你所见,这篇文章开头的几行代码背后的细节很深奥,而且不那么简单。但是我希望我已经清楚简单地描述了这些概念,正如我在标题中所说的。

贝氏盗匪简单地解释道

原文:https://towardsdatascience.com/bayesian-bandits-explained-simply-a5b43d9d5e38?source=collection_archive---------6-----------------------

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

Photo by Alice Wu on Unsplash

探索还是剥削?

勘探和开发在任何业务中都起着关键作用。

任何好的企业都会试图“探索”各种可以盈利的机会。

同时,任何优秀的企业也会努力专注于已经发现的特定机会,并努力“利用”它。

让我用一个思维实验来进一步解释这个问题。

思想实验: 假设我们有infinite老虎机。每个吃角子老虎机都有一些获胜概率。但是我们不知道这些概率值。

你必须一个接一个地操作这些老虎机。你如何想出一个策略,在最短的时间内从这些吃角子老虎机中获得最大的收益。

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

你最有可能从试用一些机器开始。

你会坚持使用一台有一定可能性的机器(开发)还是继续寻找更好的机器(探索)?

这是勘探开发的权衡。

问题是我们如何平衡这种权衡,从而获得最大利润?

答案是贝氏盗匪。

为什么?业务使用案例:

有很多地方可以进行这样的思维实验。

  • AB 测试:你有各种各样的资产可以在网站上展示。每个资产都有特定的成功概率(被用户点击)。
  • 广告点击:你有各种各样的广告可以展示给用户。每个广告都有特定的点击率
  • 金融:选择哪只股票回报最高。
  • 作为人类,我们面临着完全相同的问题——探索或开发,我们大多处理得相当出色。我们是应该去找一份新工作,还是应该做我们知道会赚钱的事情来赚钱?

在这篇文章中,我们将集中讨论 AB 测试,但是这个实验可以解决上面的任何问题。

问题陈述:

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

我们的问题是,我们有不同的资产,我们想在我们的网站上展示,但我们真的不知道该展示哪一个。

一个资产是蓝色(B),另一个是红色®,第三个是绿色(G)。

我们的 UX 团队说他们喜欢蓝色的。但是你喜欢绿色的。

在我们的网站上显示哪一个?

贝叶斯无处不在:

在我们深入研究解决这个问题的算法之前,让我们重温一下贝叶斯定理。

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

记住贝叶斯定理说后验概率*先验

贝塔分布

我们只需要一个小小的尝试来理解贝塔分布。β分布是定义在区间[0,1]上的连续概率分布,该区间由两个正的形状参数参数化,用 α 和 *β表示。*贝塔分布的 PDF 为:

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

并且,对于 αβ 的不同值,pdf 看起来如下:

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

如果您还不了解 beta 分布,请不要担心。

请记住,贝塔分布经常用于模拟概率的行为,因为它位于范围[0,1]内。

贝叶斯强盗

所以在了解了上述概念之后,让我们回到我们目前的问题上来。

我们有三项资产。

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

为了解决这个问题,让我们假设我们也知道这些资产的点击概率。

蓝色(B)获胜概率是 0.3,红色®是 0.8,绿色(G)是 0.4。请注意,在现实生活中,我们不会知道这些。

我们的算法会隐藏这些概率,我们会看到我们的算法如何收敛到这些真实的概率。

那么,我们对这些资产的概率有什么先验(信念)?

因为我们没有观察到任何数据,所以我们不能对我们的三个资产中的任何一个有先验的信念。

我们需要对我们的先验概率建模,我们将使用 beta 分布来完成。 参见上述α = 1 和β=1 的β分布曲线。

它实际上只是在范围[0,1]上的均匀分布。这就是我们想要的资产的先验概率。我们还没有任何信息,所以我们从概率值的均匀概率分布开始。

所以我们可以用贝塔分布来表示我们每个资产的先验概率。

策略:

  1. 我们将从资产的 3 个分布中随机抽取一个变量。
  2. 我们将找出哪个随机变量是最大的,并将显示给出最大随机变量的资产。
  3. 我们将了解该资产是否被点击。
  4. 我们将使用步骤 3 中的信息更新资产的先验信息。
  5. 重复一遍。

更新以前的:

我们用贝塔分布来模拟概率的原因是因为它有很好的数学特性。

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

如果先验是 f(α,β),那么后验分布也是β,由 f(α+#成功,β+#失败)给出

其中#success 是点击次数,而#failures 是浏览量减去点击次数。

让我们编码

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

现在,我们已经具备了编写代码所需的所有知识。我将使用非常简单和标准的 Python 功能来做这件事,但是也有像 pyMC3 这样的工具来处理这类问题。

让我们一步一步地解决这个问题。

我们有三种不同概率的资产。

real_probs_dict = {'R':0.8,'G':0.4,'B':0.3}
assets = ['R','G','B']

我们将努力看看我们上面给出的策略是否奏效。

让我们多次运行这个策略并收集数据。

这是我们跑步的结果。你可以在 kaggle 看到我用来可视化后验分布的函数。正如您在下面看到的,在 20 次运行结束时,我们几乎已经收敛到最佳资产。概率也是粗略估计出来的。

在开始时,我们有一个制服在先。 当我们运行时,我们看到“红色”资产的后验分布向更高的平均值收敛,因此选择的概率更高。但请记住,这并不意味着绿色资产和蓝色资产永远不会被选中。

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

让我们看看在我们做的 50 次运行中,每种资产被选择了多少次。

Pick 1 : G ,Pick 2 : R ,Pick 3 : R ,Pick 4 : B ,Pick 5 : R ,Pick 6 : R ,Pick 7 : R ,Pick 8 : R ,Pick 9 : R ,Pick 10 : R ,Pick 11 : R ,Pick 12 : R ,Pick 13 : R ,Pick 14 : R ,Pick 15 : R ,Pick 16 : R ,Pick 17 : R ,Pick 18 : R ,Pick 19 : R ,Pick 20 : R ,Pick 21 : R ,Pick 22 : G ,Pick 23 : R ,Pick 24 : R ,Pick 25 : G ,Pick 26 : G ,Pick 27 : R ,Pick 28 : R ,Pick 29 : R ,Pick 30 : R ,Pick 31 : R ,Pick 32 : R ,Pick 33 : R ,Pick 34 : R ,Pick 35 : R ,Pick 36 : R ,Pick 37 : R ,Pick 38 : R ,Pick 39 : G ,Pick 40 : B ,Pick 41 : R ,Pick 42 : R ,Pick 43 : R ,Pick 44 : R ,Pick 45 : B ,Pick 46 : R ,Pick 47 : R ,Pick 48 : R ,Pick 49 : R ,Pick 50 : R

我们可以看到,虽然我们大多选择 R,但在后面的运行中,我们有时还是会选择 B(选择 45)和 G(选择 44)。总的来说,我们可以看到,在最初的几轮中,我们专注于勘探,而在后面的几轮中,我们专注于开发。

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

结束注释:

我们看到了使用贝叶斯方法解决这个问题如何帮助我们收敛到一个好的解决方案,同时最大化我们的利润,并且不丢弃任何资产。

这种方法的额外优点是,它是自我学习的,并且如果点击红色资产的概率降低而蓝色资产增加,它可以自我校正。例如,当用户偏好改变时,这种情况可能发生。

全部代码贴在 Kaggle 内核里。

另外,如果你想了解更多关于贝叶斯统计的知识,你可以关注的最新和最好的资源之一是用于机器学习的 贝叶斯方法

我以后也会写更多这样的帖子。在 媒体 关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

贝叶斯篮球:多伦多真的是 NBA 2019 赛季期间最好的球队吗?

原文:https://towardsdatascience.com/bayesian-basketball-were-the-toronto-raptors-really-the-best-team-during-nba-2019-season-e524a26b43a1?source=collection_archive---------19-----------------------

让我们回到过去,看看我们是否能为 NBA 2019 年的冠军找到一个不同的赢家。怎么会?

通过使用贝叶斯模拟。

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

Photo by Markus Spiske on Unsplash

【本文灵感来源于 Baio 和 Blangiardo (2010)的作品,Daniel Weitzenfeld 的伟大博客 文章 ,以及 Peadar Coyle 的 教程 关于层次模型。】

介绍

贝叶斯模拟很大程度上依赖于统计分布来模拟结果,因此是一种模拟场景的工具。它的基础是贝叶斯定理。贝叶斯公式包含 4 个部分:后验、先验、似然和证据。深入每一个细节并不是本文的目标,但请记住这个过程如下:从我们认为模拟我们观察到的现象的先验 分布开始(想想“扔硬币”),我们收集数据(可能性,并使用该数据更新我们对分布先验信念,并将其转化为后验分布。

为什么适合我们的案例研究?

我们想要估计每个团队的实力,并且能够用这些信息运行模拟。我们能得到的唯一信息就是分数。我们事先不知道每个队的实力(即我们说这是一个潜在变量),但我们知道,如果我们有一个队的实力,我们可以选择另一个队,比较他们的实力,看看哪一个将赢得对抗。最后但同样重要的是,为了评估一支球队的实力,我们使用分数,但这些数据可能会有噪音:它可能不会揭示一支球队在特定时刻的真实实力,例如,如果它最好的球员受伤了,等等。希望贝叶斯能够帮助我们,因为贝叶斯模拟允许我们:

  • 给定观测值的模型潜在变量
  • 得到变量的分布,而不是点估计,如果我们想考虑不确定性,这很好
  • 从获得的分布(我们现象的生成模型)中取样,以模拟新的观察结果

回到过去

现在你确信贝叶斯模拟是我们需要的,我们将及时后退一步,回到 2019 年 4 月 12 日。
常规赛刚刚结束,季后赛明天就要开始了。NBA 联盟的 30 支球队都打了 82 场比赛。我们需要这些数据来构建贝叶斯模型,以便评估每个团队的实力。

一旦我们掌握了每支球队的实力,我们将模拟几个季后赛场景,看看最终哪支球队获胜。准备好了吗?

收集数据

这些数据是从网站https://www.basketball-reference.com收集的,在那里你可以获得 2019 赛季的所有结果。我们把所有东西都存储在一个数据帧中,并确保我们只保留常规赛的比赛。

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

然后,我们将所有团队映射到一个唯一的 id:

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

准备模型

模型取自 Baio 和 Blangiardo(此处的论文)。这是一个简单的对数线性模型,允许模拟任何两队对抗的比赛。它是这样工作的:

  • 对于给定的游戏,分数可以建模为 (y1,y2) ,其中每个 yi 取自泊松分布(提醒:泊松分布是一种离散值分布,用于对固定时间段内的计数事件进行建模)。
  • 给定 yi 的每个泊松分布由比率θ(I)参数化,比率θ(I)表示团队的攻击强度和对手的防御强度的组合。
  • 因此,如果 A 队进攻强,而 B 队防守弱,则θ(A)将会很大,因此从泊松(θ(A))分布获得的样本也将会很大。从而增加了 a 队的得分
  • 为了确保θ为正,我们将其建模为对数线性方程。

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

Baio and Blangiardo paper excerpt

瞧!

选择先验

现在我们有了将观察到的分数与泊松相关联的模型,因此θ,我们必须对等式的def 部分建模。在我们的例子中,我们认为攻击强度 att 和防御强度 def 应该平均为零。强队的价值高于零,弱队的价值低于零。
此外,我们对 attdef 没有
先验信念,因此我们将使用一个正态先验,其平均值取自一个允许值接近于零的超先验(在 cour 情况下,是一个围绕零的高度偏斜的正态)。对于正态先验的标准差,我们将使用超先验,它允许标准差的小正值(在我们的例子中,它是伽玛分布)。

模型如下:

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

*顶部的圆圈, mu 和 *tau,是我们的超先验。这个模型被称为分层贝叶斯模型。

这是代码:

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

请注意我们是如何忽略等式中的“home”参数以及我们是如何添加“intercept”参数的。

运行蒙特卡洛

PyMC3 使用蒙特卡罗马尔可夫链为我们的模型寻找合适的分布。解释 MCMC 已经超出了本文的范围,但是如果你想了解更多,我可以推荐 Thomas Wiecki(pymc 3 的主要贡献者之一)的这篇优秀的文章

运行 MCMC 采样器后,我们直观地检查我们的分布。如果给定变量的分布重叠,这是一个好现象,表明 MCMC 已经收敛到一个稳定的解。检查收敛的另一种方法是通过查看图形右侧的轨迹,看这些轨迹是否像白噪声(即趋势没有变化,幅度没有变化)。

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

In convergence we trust

看到每个变量的分布是如何重叠的了吗?当然,还有其他检查收敛的方法,其中之一是 R-hat 统计。您可以通过绘制给定参数的森林图来查看它:

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

Teams attacks (left) and defense(right)*

R-hat 在所有情况下都是 1,这表明我们的算法已经收敛。根据这些图表,我们可以看到哪些球队的进攻和防守最好(小心:符号是反着做防守的!好的防守有负分!):

  • 攻击:密尔沃基,金州,新奥尔良
  • 防守:印第安纳,孟菲斯,迈阿密

让我们总结一下散点图(为了更好的可读性,我颠倒了防御的符号:好的防御=正得分):

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

红标:有资格进入季后赛的球队。蓝点:西部联盟;绿点:东部联盟。

根据上面的图表,密尔沃基似乎有最强的进攻,总的来说防守“一般”。多伦多猛龙的攻击强度明显较低,防守强度略高。

现在我们有了每个队的进攻和防守强度分布,我们可以模拟游戏了!如果我从这些分布中取样,我可以计算

  • score _ A = sample _ 泊松(sample _ attack(A)+sample _ defense(B)+intercept _ mean)
  • score _ B = sample _ 泊松(sample _ attack(B)+sample _ defense(A)+intercept _ mean)

比较 score_A vs score_B 可以让我得到胜者!

代码如下:

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

模拟季后赛

基于常规赛结果(记住,我们目前是 4 月 12 日!),下面是我看到的:

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

根据这些排名,我知道第一轮季后赛将会是:

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

下面是一个场景的过程:

  • 对于第一轮配置中的每场比赛,我们为每支球队计算 7x2 个样本(7 次进攻,7 次防守),以了解 7 场比赛的获胜者(不允许平局)。我们保留 8 名获胜者。
  • 然后我们有一个胡人配置。(还剩 8 支队伍)
  • 对于半决赛中的每场比赛,我们为每支球队计算 7x2 个样本(7 次进攻,7 次防守),以了解 7 场比赛的获胜者(不允许平局)。我们保留 4 个获胜者。
  • 然后,我们有一个会议决赛配置。(还剩下 4 支队伍)
  • 对于大会决赛中的每场比赛,我们为每支球队计算 7x2 个样本(7 次进攻,7 次防守),以了解 7 场比赛的获胜者(不允许平局)。我们保留两个赢家。
  • 这样我们就有了两支球队的 NBA 总决赛。
  • 我们再次计算 7 场比赛的样本,以得出最终的赢家

结果

下面是我们运行 1000 次季后赛模拟的结果:

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

Outcomes of 1000 playoffs simulations

密尔沃基在超过 25%的情况下赢得冠军!超过 15%的情况下,多伦多会赢。Golden Stats 以大约 15%的胜率排名第三

说明

常规赛期间由于分区不平衡,数据略有偏差。因此,密尔沃基很可能来自一个“弱”的分区,因此高估了进攻和防守的实力。同样,多伦多的分区在实力上更加均衡,因此被低估了。让我们比较一下密尔沃基和多伦多的分区:

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

结论

希望你在重温 NBA 2019 季后赛时玩得开心。请随意分享对结果的任何想法,以及你将如何在我们的模型中加入“除法”效应来解释不平等的除法水平!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值