TowardsDataScience 博客中文翻译 2019(三百四十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

加速矩阵乘法

原文:https://towardsdatascience.com/matrix-multiplication-the-pytorch-way-c0ad724402ed?source=collection_archive---------12-----------------------

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

让我们用 Python 写一个矩阵乘法的函数。

我们首先找到两个矩阵的形状,并检查它们是否可以相乘。(matrix_1 的列数应该等于 matrix_2 的行数)。

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

然后我们写 3 个循环来逐元素地乘矩阵。最终矩阵的形状将是(矩阵 _1 的行数)乘以(矩阵 _2 的列数)。

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

现在让我们创建一个基本的神经网络,我们将使用这个函数。

在本文中,我们将使用 MNIST 数据集进行演示。它包含 50,000 个手写数字样本。这些数字本来就是 28*28 的矩阵(或者拆包后一个线性向量中的 784 个值)。

因此,我们的神经网络将 784 个值作为输入,并将 10 个类作为输出。

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

现在让我们从 MNIST 验证集中提取 5 个元素,并在这个模型中运行它们。

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

我们看到,对于仅仅 5 个元素,我们花费了650 milliseconds来执行矩阵乘法。这个比较慢。让我们试着加快速度。

为什么速度很重要?

矩阵乘法构成了神经网络的基础。训练神经网络时,大多数操作都需要某种形式的矩阵乘法。因此,做得好、做得快真的很重要。

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

source: fast.ai course: Deep learning from the foundations

我们将通过消除循环并用 PyTorch 函数代替它们来加速矩阵乘法。这将给我们 C 速度(PyTorch 之下)而不是 Python 速度。让我们看看它是如何工作的。

消除最里面的循环

我们从消除最里面的循环开始。消除这种循环背后的想法是,我们可以一次对一行(或一列)进行操作,而不是一次对一个元素进行操作。看看下面的图片。

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

我们有两个张量,我们想把它们的元素加在一起。我们可以写一个循环来实现,或者我们可以使用 PyTorch 的 elementwise 操作 (直接 a + b)来实现。

用同样的想法,我们将消除最里面的循环

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

我们直接做

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

我们的函数现在看起来如下:

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

运行大约需要1.55 milliseconds,这是一个巨大的改进!

如果您不熟悉索引语法,a[i,:]意味着选择ith行和所有列,而b[:,j]意味着选择所有行和jth列。

我们可以编写一个小测试来确认我们更新后的函数给出的输出与原始函数相同。

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

确实如此。

消除第二个循环

我们现在可以继续消除第二个循环。这是最激动人心的部分,因为这一次,我们将从这里开始

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

去做

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

为此,我们需要了解一些被称为 的广播

广播

假设您想要从数据集中的每个数据点减去平均值。同样,你可以写一个循环来这样做,或者你可以利用广播。

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

在广播中,我们取较小的张量,并通过较大的张量进行广播,使它们具有可比较的形状。一旦它们有了可比较的形状,我们就可以对它们执行 元素运算 。让我们看另一个例子。

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

你看到那里发生了什么吗?张量 c 被广播,因此它的行数与 **m 的行数相同。**我们可以通过expand_as()函数找到广播后张量的样子。

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

这是最精彩的部分。PyTorch 实际上并不复制值。它只是假装这样做。我们来看看t的收纳和造型

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

张量 t 仍然只存储为[10,20,30],但是它知道它的形状应该是 3*3。这使得广播内存高效。

使用广播,我们将广播 matrix_1 的第一行,并用 matrix_2 的整体进行操作。我们的函数现在看起来如下:

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

而且只需要402 micro seconds跑!

这是我们能以灵活的方式做的最好的事情。如果你想做得更好,你可以用 爱因斯坦求和 来做。

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

但是最快的方法是使用 PyTorch 的matmul功能。

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

它之所以这么快是因为它在底层也使用汇编语言代码。

这就是本文的全部内容。

如果你想了解更多关于深度学习的知识,你可以看看我下面的深度学习系列。

[## 深度学习系列

我所有关于深度学习的文章的系统列表

medium.com](https://medium.com/@dipam44/deep-learning-series-30ad108fbe2b)

参考:

从基础开始深度学习:fastai 。

机器学习的矩阵发展

原文:https://towardsdatascience.com/matrix-phylogeny-for-machine-learning-7a9e65b8f8aa?source=collection_archive---------28-----------------------

线性代数术语,可视化

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

Source.

如果你像我一样,你用图片思考,而不是文字。

在我自学数学的时候,我不断被各种线性代数术语轰炸:对称矩阵这个,正常矩阵那个,正规矩阵这个和那个。

在某个时候,我屈服了,做了我在这个世界上最喜欢的事情——制作了一个所有事情如何组合在一起的图表:)我将把它贴在这里,以防其他人需要帮助消除歧义,并且是像我一样的视觉人。

事不宜迟,我们开始吧:

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

Right click and “save image as” to download.

自述文件

这张图应该从上到下阅读。我真的建造了它,主要是正方形矩阵。

我做的第一个也是最关键的一个分离是,我根据 a)它们的特征值/向量(“eig”)和 b)它们的行列式行为(“det”)将矩阵分成两种类型。这给了我们两个独立的分支去探索(分别是左和右)。

方框之间的黑色(垂直)箭头表示遗传关系。任何盒子必然是其正上方盒子的子类型,并且必然继承其父的任何属性。例如,每个正规矩阵必然可对角化,每个对称矩阵必然正规。这也意味着每个对称矩阵都有 n 个线性无关(L.I .)特征向量(继承自可对角化矩阵)和与其共轭转置矩阵交换(继承自正常矩阵)。

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

彩色(非垂直)箭头填充矩阵类型的关系间隙,否则矩阵类型不会位于另一个矩阵类型之下。例如,因为正交矩阵位于不同的分支,比如说正常和对称,所以仅跟随黑色垂直箭头不足以理解它们之间的关系。所有正规矩阵都是正交的吗?正交矩阵都是正规的吗?

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

我没有费心去填写每一段可能的关系,只是那些感觉重要的。顺便说一下,如果你更喜欢表格,这是我在画箭头之前填写的表格:

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

(matrices on top defined through matrices on the left)

接下来,颜色。方框内的蓝色文字是我能为每种矩阵类型找到的最好/最简洁的定义。有时,我还用蓝色包含了有用的知识属性,例如“λ是实数”(特征值是实数)或“∃奇异值分解”(存在一个对角形式,可以通过奇异值分解到达)。

方框颜色:

  • 灰色方框=终端和不太有趣的方框。
  • 蓝框=通过光谱定理连接(见图表底部)。
  • 橙色细框=复杂等价物(该图是关于真实矩阵的,但我忍不住包括了一些流行的复杂版本)。
  • 白盒=正常,不属于以上。

箭头颜色:

  • 红色=双向“不一定”关系
  • 橙色=单向“不一定”关系
  • 绿色=旋转矩阵既有缺陷又无缺陷的特殊情况(分别在实数和复数上)

最后几件事:

  • 右下角的数字代表每种类型的示例矩阵。
  • 我在底部加入了谱定理,并列出它是如何根据 A =恰好可对角化、正常还是对称而变化的。这应该是不言自明的。
  • 我还包括了正定矩阵的 5 个规则(从吉尔伯特·斯特朗令人敬畏的 YT 讲座这里偷来的),因为为什么不呢。

活文档

这张图已经尽我所能的完整了,但是我确信我遗漏了一些东西(甚至可能弄错了一些东西🤭🤭🤭).

把这当作一个活的文档——如果你在下面评论任何想法/修正,我会添加修改并更新帖子。

快乐学习!

大声喊出来 机器学习的数学——如果你对 ML 背后的数学比 MOOCs 通常进入的更详细,这是一个惊人的自学资源。完全公开:我从那里偷了树的总布局:)

使用匈牙利最优分配算法最大化白象中的群体幸福

原文:https://towardsdatascience.com/maximizing-group-happiness-in-white-elephants-using-the-hungarian-optimal-assignment-algorithm-17be4f112746?source=collection_archive---------24-----------------------

了解带有 Python 示例代码的匈牙利(Munkres)最优分配算法,以最大化群体优先于个人的偏好。

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

It’s July so we can talk about Christmas, right? Photo by Kira auf der Heide on Unsplash

如果你曾在圣诞节前后参加过一次“白象”活动,你可能会感到焦虑,因为你最终得到了一份你不想要的礼物。问题是,有些人带着他们真正喜欢的礼物回家,而有些人可能带着他们不想要的礼物回家,即使这些礼物对其他人来说可能更有价值!在经历了几个累赘之后,我不得不考虑是否有一个更好的方式来分配礼物,以便最大化群体的满意度,而不是少数幸运儿的满意度。也就是说,你可能得不到你的首选礼物,但是团队作为一个整体会更开心,这样下一年就会有另一个累赘。毫不奇怪,有一个有效的图论算法设计来解决这个问题。

让我们考虑一个简单的场景,其中四个玩家(Alex、Brad、Chloe 和 Daisy)正在参与一个白象。按顺序打开礼物后,每个人都觉得礼物的分配不是很理想。他们觉得如果他们知道每个人有多喜欢每份礼物,他们就可以重新分配礼物,以确保整个团队在一段时间内最满意。为此,每个人都要写下自己对每件礼物的喜爱程度,分数范围是 1-100,100 是最喜欢的,结果可能是这样的:

╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 100  ║ 20   ║ 13   ║ 41   ║
║   Brad     ║ 14   ║ 100  ║ 21   ║ 99   ║
║   Chloe    ║ 31   ║ 43   ║ 100  ║ 21   ║
║   Daisy    ║ 52   ║ 50   ║ 41   ║ 100  ║
╚════════════╩══════╩══════╩══════╝══════╝

在这种情况下,很明显亚历克斯喜欢围裙,布拉德喜欢啤酒,克洛伊喜欢蜡烛,黛西喜欢飞镖。通过如此分配礼物,该组的总快乐(喜好偏好)最大化到 400。然而,让我们考虑一个更复杂的场景,其中人们最喜欢的项目重叠:

╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 99   ║ 99   ║ 13   ║ 41   ║
║   Brad     ║ 14   ║ 99   ║ 21   ║ 11   ║
║   Chloe    ║ 31   ║ 95   ║ 21   ║ 51   ║
║   Daisy    ║ 52   ║ 50   ║ 51   ║ 11   ║
╚════════════╩══════╩══════╩══════╝══════╝

在这种(可能)更现实的情况下,最大化群体幸福的最佳任务应该是什么并不那么直观。亚历克斯、布拉德和克洛伊都喜欢啤酒,但不清楚谁应该喝啤酒,以最大限度地提高群体偏好,而不是只有一个人?我们可以通过置换当前分配的所有可能组合并搜索哪个组合提供组的最高偏好值来以强力方式解决这个问题。

这是上面代码的输出。我们得到行和列的索引,使组的偏好最大化到 300。指数表明亚历克斯应该有围裙,布拉德啤酒,克洛伊飞镖,黛西蜡烛。

>> 
Total preference: 300
Row: [0, 1, 2, 3] Col: (0, 1, 3, 2)

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

上图显示了所有组合的首选项。上面的暴力代码在人少的时候运行得很快,但是它的伸缩性很差,求解时间为 O(N!)。当我们以 10 个人和 10 件物品的团队规模运行模拟时,我们可以计时可能需要多长时间。

>>
Total preference: 8.555711154285648
Row: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Col: (7, 3, 0, 8, 5, 2, 6, 4, 9, 1)
1 loop, best of 3: 37.2 s per loop

在我的 Macbook Pro 上,这花了 37.3 秒,非常慢。它所花费的时间呈指数增长,所以想象一下,如果你试图为一个 20 人的大白象解决这个问题,需要多长时间!。

幸运的是,这个问题在几十年前就已经解决了,被称为匈牙利算法。它也被称为 Munkres 算法,第一个解决方案实际上可以追溯到 19 世纪 90 年代。匈牙利算法在 O(N⁴) 多项式时间内解决问题,甚至下降到 *O(N)。*这个算法是在 Scipy 包中实现的,但是它解决的是最小化一个成本矩阵,而不是像我们的场景那样最大化一个值。虽然我们可以简单地对成本矩阵求逆(乘-1),但这里有一个稍加修改的版本,以便于选择是否求解偏好最大化。让我们看看使用这个函数需要多长时间。

>>
Total preference: 8.555711154285648
Row: [0 1 2 3 4 5 6 7 8 9] Col: [7 3 0 8 5 2 6 4 9 1]
100 loops, best of 3: 2.74 ms per loop

与运行蛮力方法所需的 37.3 秒相比,匈牙利算法实现在不到 3 毫秒的时间内解决了问题!让我们看看引擎盖下,了解发生了什么事。

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

Under the hood. Photo by Erik Mclean on Unsplash

上面的代码实现基于 Bob Pilgrim 的描述,该描述将该方法分为 6 个步骤。然而,该算法的要点可以用以下 5 个步骤来解释。

第一步:遍历每一行,从该行的所有项目中减去最大值项目。这将使每行中最大的项目等于 0。

第二步:检查每一列,从该列的所有项目中减去最大值项目。这也将使列中最大的项目等于 0。

第三步:画出穿过所有 0 的最少的线。

第四步:如果在 n x n 矩阵中画出了 n 条线,则有可能进行最优分配,算法结束。如果行数小于 n ,则转到步骤 5。

第五步:找到没有被任何行覆盖的最大条目,从没有被划掉的每一行中减去这个条目,并把它加到被划掉的每一列中。回到步骤 3。

让我们用我们的示例矩阵来逐步实现这一点。

╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 99   ║ 99   ║ 13   ║ 41   ║
║   Brad     ║ 14   ║ 99   ║ 21   ║ 11   ║
║   Chloe    ║ 31   ║ 95   ║ 21   ║ 51   ║
║   Daisy    ║ 52   ║ 50   ║ 51   ║ 11   ║
╚════════════╩══════╩══════╩══════╝══════╝

步骤 1:从每一行中减去每一行的最大值(99,99,95,52)。

╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 0    ║ 0    ║ -86  ║ -58  ║
║   Brad     ║ -85  ║ 0    ║ -78  ║ -88  ║
║   Chloe    ║ -64  ║ 0    ║ -74  ║ -44  ║
║   Daisy    ║ 0    ║ -2   ║ -1   ║ -41  ║
╚════════════╩══════╩══════╩══════╝══════╝

步骤 2:从每列中减去每列的最大值(0,0,-1,-41)。

╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 0    ║ 0    ║ -85  ║ -17  ║
║   Brad     ║ -85  ║ 0    ║ -77  ║ -47  ║
║   Chloe    ║ -64  ║ 0    ║ -73  ║ -3   ║
║   Daisy    ║ 0    ║ -2   ║ 0    ║ 0    ║
╚════════════╩══════╩══════╩══════╝══════╝

第三步:用最少的行数划掉 0(x 表示划掉)。

_______________x      x
╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 0    ║ 0    ║ -85  ║ -17  ║
║   Brad     ║ -85  ║ 0    ║ -77  ║ -47  ║
║   Chloe    ║ -64  ║ 0    ║ -73  ║ -3   ║
║   Daisy    ║ 0    ║ -2   ║ 0    ║ 0    ║x
╚════════════╩══════╩══════╩══════╝══════╝

第四步:在未覆盖的项目中找出最大值(-3 at Chloe,Dart),从所有未覆盖的项目中减去它(Alex:Chloe,Candle:Dart)。然后我们把这个值加到线的交点上(雏菊,围裙:啤酒)。返回步骤 3,测试最优分配。

_______________x      x
╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 0    ║ 0    ║ -82  ║ -14  ║
║   Brad     ║ -85  ║ 0    ║ -74  ║ -44  ║
║   Chloe    ║ -64  ║ 0    ║ -70  ║ 0    ║
║   Daisy    ║ -3   ║ -5   ║ 0    ║ 0    ║x
╚════════════╩══════╩══════╩══════╝══════╝

我们回到步骤 3,测试最优分配。

_______________x      x     x       x
╔════════════╦══════╦══════╦══════╗══════╗
║ Person\Gift║ Apron║ Beer ║Candle║ Dart ║
╠════════════╬══════╬══════╬══════╣══════╣
║   Alex     ║ 0*   ║ 0    ║ -82  ║ -14  ║
║   Brad     ║ -85  ║ 0*   ║ -74  ║ -44  ║
║   Chloe    ║ -64  ║ 0    ║ -70  ║ 0*   ║
║   Daisy    ║ -3   ║ -5   ║ 0*   ║ 0    ║
╚════════════╩══════╩══════╩══════╝══════╝

我们完了!我们划掉了所有的零,最小的行数等于矩阵的形状。亚历克斯应该拿围裙,布拉德拿啤酒,克洛伊拿飞镖,黛西拿蜡烛。

这里有一个简短的视频,也很好地解释了这个过程

结论

在本教程中,我们看了如何解决一个最优分配问题,其中每个任务或项目必须与一个人匹配,以最大化总喜欢值。我们展示了使用所有组合来解决问题的暴力方法对于大规模的组来说是难以处理的,但是匈牙利算法可以在几分之一秒内解决它。

我希望这有所帮助,也希望今年冬天你会倾向于在你的白象上尝试一下。我可以看到它在给家庭成员或公司员工分配任务时也很有用。节日快乐!

请随意查看我关于统计和机器学习的其他帖子

[## 量化时间序列数据之间同步性的四种方法

用于计算同步指标的样本代码和数据,包括皮尔逊相关、时滞交叉相关…

towardsdatascience.com](/four-ways-to-quantify-synchrony-between-time-series-data-b99136c4a9c9) [## 为什么有重要变量的模型可能是无用的预测器

统计模型中的重要变量不能保证预测性能

towardsdatascience.com](/why-models-with-significant-variables-can-be-useless-predictors-3354722a4c05) [## 机会是不够的:用排列评估模型的重要性

当训练机器学习模型进行分类时,研究人员和数据科学家经常比较他们的模型…

towardsdatascience.com](/chance-is-not-enough-evaluating-model-significance-with-permutations-e3b17de6ba04)

参考

[## 匈牙利算法—维基百科

匈牙利方法是一种组合优化算法,在多项式时间内解决指派问题

en.wikipedia.org](https://en.wikipedia.org/wiki/Hungarian_algorithm) [## 蒙克雷斯

当选择每个赋值时,不考虑行和列。提出的问题是关于…

csclab.murraystate.edu](http://csclab.murraystate.edu/~bob.pilgrim/445/munkres.html) [## 匈牙利最大匹配算法|精彩的数学和科学维基

匈牙利匹配算法,也称为 Kuhn-Munkres 算法,是一种…

brilliant.org](https://brilliant.org/wiki/hungarian-matching/)

利用数据最大限度地利用稀缺的维护资源

原文:https://towardsdatascience.com/maximizing-scarce-maintenance-resources-with-data-8f3491133050?source=collection_archive---------29-----------------------

政府和非政府组织面临的一个共同问题是如何将有限的资源发挥最大的作用。通常,这些组织必须在信息不完全透明的情况下做出决策。这篇文章展示了如何使用数据分析和建模来帮助组织在这种情况下最大化他们的资源。

为了将这些概念付诸实践,我们将使用以下场景:

坦桑尼亚的大部分人口依赖当地的水泵作为他们清洁水源的主要来源。不幸的是,这些水泵有时会坏掉——限制了清洁水的获取,直到水泵修好。坦桑尼亚农业部负责维护这个由数千台水泵组成的网络;然而,该部门几乎没有能力主动跟踪任何单个水泵的状态。 部门主管要求我们帮助她确定下一年应该修理哪些油井的优先顺序。她估计她的部门每天最多可以部署五名员工,每人每天可以访问一个站点。

好消息是,自 2002 年以来,该部门一直在记录他们在全国各地访问的每台水泵的数据(包括水泵是否正常工作)。这些数据使我们能够建立一个模型,该模型可用于预测水泵是否正常工作,是否正常工作但需要维护,或者是否正常工作。有了这个模型,我们可以开始帮助该部门在未来优先安排维护行程。为此,我们获得了描述约 14K 水泵位置的数据,该部门希望我们预测这些位置内的维护需求。

第 1 部分:构建预测模型

初始基线模型利用 RandomForest 估计值,在使用未用于建立模型的数据进行预测时,大约 70%的时间正确地将水泵分类为功能性/需要维修/非功能性。经过一些进一步的工作,模型的准确性增加到了大约 80%(如果您对模型构建过程感兴趣,模型背后的所有代码都可以在 Github 上找到)。请注意,我们可以探索进一步改进我们的模型;然而,80%的准确率将足以解决这个问题(稍后将详细介绍)。

如下所示,我们的模型使用该部门提供的数据进行了以下预测:

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

此时,我们可以向部门报告,我们的模型已经识别出 4,774 台可能需要维修的水泵,并对自己的出色工作表示满意。对吗?我们可以这样做,但是部门可能会不太高兴…

如上所述,该部门每天只能修理 5 口井,假设 252 个工作日(美国时间表),该部门在下一年只能修理 1260 台水泵。这意味着我们需要优先服务哪些泵。

第 2 部分:对我们的预测进行优先排序

鉴于我们无法维修我们的模型预测需要维修的所有水泵,我们应该优先维修我们的模型最有把握实际损坏的水泵。这样做相对来说是微不足道的,我们只需查看我们的模型分配给数据集中表示的每个水泵的“非功能性”概率。对这些概率进行排序,可以让我们确定 1260 个我们最有把握损坏的水泵。

这种方法将我们的关注点从最大化我们的模型的整体精度分数转移到一个称为 k 处的精度的度量。这就是为什么我们的模型“足够好”,有 80%的精确度。考虑到我们有限的资源,我们真的只关心我们的模型对我们有能力修复的水泵的预测。因此,我们在 k 处测量的准确度,在这种情况下 k=1,260,大大高于我们的总体准确度分数。投入到将模型的准确性提高到 80%以上的努力将会被放错地方。

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

有了我们的预测优先级,我们现在可以自信地向部门提交我们的建议。要做到这一点,我们可能应该将我们的优先预测可视化如下:

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

幸运的是,当我们即将把最后的演示文稿发送给印刷商时,一个想法悄悄潜入我们的脑海……'我不想成为一个维护团队,开车走遍全国各地去访问这些分散的站点。也许还有其他因素需要考虑。

第 3 部分:最大化影响

虽然准确性很重要,但在确定服务水泵的优先级时,我们可能还需要考虑许多其他因素。例如,考虑以下情况可能是有意义的:

  • **人口:**多少人被水泵影响?
  • **距离:**这个水泵离其他不工作的水泵有多近?

通过将这些指标与油井失效的预测概率相结合,我们可以得出每个水泵的“影响分数”。得出我们的影响分数的公式可能如下所示:

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

根据影响评分对水泵访问进行优先排序,这使我们建议该部门维修以下水泵:

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

此外,除了对部门的维护访问进行优先排序,我们还可以量化它们的潜在影响:

下一年对优先水泵的维修将 增加约 60 万人获得清洁水的机会

最后一点,重要的是要考虑我们的影响评分可能会有偏差或产生意想不到的结果。例如,如上图所示,我们的影响得分公式明显偏向于水泵和人口密集的地区,这意味着偏远地区的人口更有可能得不到服务。优先井的变化如下图所示:

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

在现实世界中,这种意外后果可能需要我们调整影响评分公式,以更好地代表我们的意图。

结论

在这篇文章中,我们回答了几乎每个组织都面临的一个关键问题:我们如何部署稀缺资源以产生最大影响。在这个人为的例子中,我们考虑了如何对我们的模型所识别的机会进行优先级排序。此外,我们探讨了为什么最大化准确性本身可能不是正确的答案。为此,我们研究了如何将准确性之外的因素融入到优先推荐中。

我希望你喜欢这篇文章,我很乐意在推特上与你联系。如果你想深入这篇文章背后的代码,所有这些都可以在的公共知识库中找到。

脚注

[1]该场景基于驱动数据描述的情况。分析使用由驱动数据提供的数据。

[2]每个地点的人口在 0,1 的范围内缩放,与预测的概率大小相同。

[3]根据经度和纬度,使用 KMeans 估计量,通过创建 5 个聚类来确定距离。这五个集群各自“代表”该部门维修水泵的一名可用工人。然后,从每个地点所属的质心的纬度和经度中减去该地点的纬度和经度。然后计算该位置坐标和质心坐标之间差值的绝对值的平均值。最后,该值在范围 0,1 内进行缩放,与预测概率的大小相同。

机器学习基础(二)

原文:https://towardsdatascience.com/maximum-likelihood-estimation-984af2dcfcac?source=collection_archive---------6-----------------------

最大似然估计

这是我认为机器学习基础的一系列主题的第二部分。第一部分介绍了概率论,我们将在这篇文章中重点介绍它。如果您需要复习概率,请查看第一部分:

[## 概率——机器学习的基础(第一部分)

机器学习所需的概率论概念概述

towardsdatascience.com](/probability-fundamentals-of-machine-learning-part-1-a156b4703e69)

介绍

最大似然估计 (MLE)是一种在给定一些观测数据的情况下估计模型参数的频率主义方法。使用 MLE 的一般方法是:

  1. 观察一些数据。
  2. 写下我们认为数据是如何产生的模型。
  3. 将我们模型的参数设置为在给定数据的情况下最大化参数可能性的值。

我们将涵盖创建模型、理解似然性以及使用最大似然估计过程来拟合参数的基础知识。

模型

一个模型是我们对一些事件或过程的信念、假设和简化的正式表示。让我们看几个例子来阐明这个观点。

示例:抛硬币

我们想要建立一个投掷特定硬币的模型。我们知道些什么?

  • 硬币有两面和一条边。
  • 这些面有不同的设计。
  • 硬币可以放在正面或边缘(见下图,硬币放在边缘)。
  • 硬币的重量。
  • 硬币的直径和厚度。

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

Photo by Ryan Thomas Ang on Unsplash

我们可以做出什么样的假设?

  • 不同的设计可能导致硬币的重心稍微偏向一边。
  • 没有办法测量硬币翻转时受到的力或角度。

让我们先试着写下一个没有简化的模型:

  • 硬币的初始位置来自伯努利分布。这代表脚蹼手更喜欢开始时硬币正面朝上,而不是正面朝下。
  • 施加在硬币上的力是按指数分布的。
  • 力施加的角度是从区间[-π,π]上的截尾正态分布画出的。
  • 硬币的质心在一个以硬币中心为原点的系统中的某个坐标(x,y,z)上。
  • 重力是…好了,我想你明白了。

现实世界可能很复杂。有时候,一个简化的模型可以做得一样好或者更好。让我们做一个简化的模型:

  • 掷硬币的结果来自伯努利分布,正面概率为 p ,反面概率为(1- p )。

我们的简化模型只有一个参数!在第一部分中,我们了解到,我们可以通过简单地抛几次硬币并计算得到的人头数来估计这个参数。拟合复杂的模型需要更多的翻转和困难的计算。那么哪个模型是对的呢?我最喜欢引用乔治·博克斯的话:

“所有的模型都是错的,但有些是有用的。”

有用性是设计模型时的关键指标。在这种情况下,我宁愿使用简化模型,尽管我知道它是错误的。我怎么知道这是错的?我给硬币边缘着地的概率赋值为 0。我从未在现实生活中见过这种情况,所以我做了一个简单的假设,认为这种情况不会发生。

示例:线性模型

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

在本例中,我们将使用上图。我们希望建立一个数据模型,以便在给定 x 的情况下预测 y 的未来值。数据看起来几乎像一条线,所以让我们从它开始作为我们的模型。

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

Equation of a line.

如果潜在的关系实际上是线性的,我们如何解释我们观察到的偏差?想象一下,我们正在使用一个传感器来收集这些数据。大多数传感器的测量都有一定的误差。类似地,我们可以认为与模型的偏差是由易出错的传感器引起的。通常将误差建模为均值为零、方差为σ的高斯分布。平均值为零会将误差平均分布在线的两侧。方差越大,偏差越大。让我们在模型中加入一个高斯噪声项。得到的模型有三个参数:高斯的斜率、截距和方差。

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

Linear model with Gaussian error.

可能性

在这两个例子中,我们根据一些参数写下了我们的模型。一般来说,我们可能有任意数量的参数,所以让我们将它们的整个集合称为 θ (theta)。我们怎么知道 θ 的值应该是多少?这就是可能性发挥作用的地方。在第一部分中,我们讨论了连续随机变量取特定值的可能性。我们从参数固定在某个值的分布的概率密度函数(PDF)中得到这种可能性。给定我们观察到的数据,让我们将可能性视为 θ 的函数,而不是固定参数。对于 PDFf(x|θ)的连续分布,似然函数变为:

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

类似地,对于具有概率质量函数(PMF) P( x | θ )的离散分布,似然函数变为:

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

我们通常有不止一个数据点来为我们的决策提供信息。我们如何计算整个数据集合 X 的可能性?让我们看一下典型的情况,数据是独立同分布的( iid )。同分布意味着每个数据点来自具有相同参数的相同分布。第一部分介绍了独立性,这意味着对于任意两个数据点 xy ,P( x,y)= P(x)P(y)。抛硬币是 iid 数据的一个很好的例子。每一次翻转都使用相同的硬币,并且翻转的结果与之前的翻转无关。对于 iid X,我们将似然函数重写为:

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

Likelihood is the product of probability density for each data point.

请注意似然函数中的乘积运算符。很多时候,个体可能性是非常小的数字。取小数字的乘积会产生更小的数字,计算机很难用有限的精度来表示这些数字。为了缓解这些数字问题(以及后面提到的其他便利),我们经常使用似然函数的对数,恰当地命名为对数似然。为什么记录日志会有帮助?对数的乘积法则说 log(x⋅y) = log(x) + log(y)。所以取对数就把我们的乘积变成了总和!对数似然可以写成:

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

Log-likelihood is the sum over the log of the likelihood for each point.

对数也是单调的,这意味着更大的输入产生更大的输出。因此,对数似然函数的最大值将出现在与似然函数的最大值相同的位置。许多概率分布被写成指数形式或包含指数。对数和指数相互抵消,对数允许我们将指数转化为乘积。这两者都留给我们更简单的方程来最大化。

最大概似法

你可能已经把这些碎片拼在一起了,但是让我们再一次回顾我们的目标。我们可以根据概率分布为我们的数据写一个模型。接下来,我们可以在模型的参数上写下一个函数,该函数输出这些参数生成我们的数据的可能性(或对数可能性)。MLE 的目的是找到该函数的最大值,即最有可能产生观察数据的参数。

假设我们有一些从方差为 4 的高斯分布生成的数据,但是我们不知道平均值。我喜欢把最大似然法想象成取高斯,在所有可能的平均值上滑动,并选择使模型最适合数据的平均值。我在下面创建了这个过程的可视化,我们看到对数似然的最大值出现在平均值为 2 处。事实上,这是创建直方图的分布的真实平均值!

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

我们如何用数学方法来完成这个过程?如果你熟悉微积分,你会知道你可以通过求导并设置它等于 0 来找到一个函数的最大值。函数的导数代表原函数的变化率。如果你看上面的对数似然曲线,我们会发现最初它是正向变化的(向上移动)。它达到一个峰值,然后开始向负方向变化(向下移动)。关键是在峰值时,变化率为 0。因此,如果我们知道导数的函数形式,我们可以将它设为 0,并求解最佳参数。

抛硬币 MLE

让我们从之前的抛硬币模型中推导出 MLE 估计量。我将在以后关于线性回归的文章中讨论线性模型的 MLE 估计量。

回想一下,我们通过伯努利分布来模拟抛硬币的结果,其中参数 p 代表获得正面的概率。首先,让我们写下单次翻转的可能性函数:

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

Likelihood function for Bernoulli distribution.

我已经用数学上方便的方式写出了伯努利分布的概率质量函数。花一秒钟自己验证一下,当 x =1(正面)时,概率是 p ,当 x =0(反面)时,概率是(1-p)。

现在,让我们假设我们看到下面的翻转序列:

X =正面,正面,反面,正面,反面,反面,反面,正面,反面,反面。

因为掷硬币是 iid 的,我们可以把看到一个特定序列的可能性写成每一次单独掷硬币的乘积:

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

Likelihood of a sequence of flips.

插入我们的数据,我们得到:

l(p)=pp⋅(1-p)⋅p⋅(1-p)⋅(1-p)⋅(1-p)⋅p⋅(1-p【1

注意,对于每个正面,我们得到一个因子 p ,对于每个反面,我们得到一个因子(1- p )。让我们把这个归纳为用 h 正面掷硬币:

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

Likelihood for n coin flips with h heads.

我们想找到最大化这个函数的 p 。为了使我们的工作容易些,让我们把双方的情况都记录下来。这将降低指数,并将乘积转化为总和。求和的导数比求积更容易(对数似然的另一个便利之处)。记住,我们可以这样做,因为最大化对数似然的 p 与最大化似然的 p 是相同的。我们的对数可能性是:

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

Log-likelihood of n coin flips with h heads.

为了找到最大值,我们要对这个函数相对于 p 求导。如果你对微积分不太熟悉,重要的是你知道导数是函数的变化率。在这种情况下,导数是:

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

Derivative of the log-likelihood with respect to p.

我们将导数设置为 0,以找到函数的最大值(其中变化率为 0)。设上面的等式等于 0,求解 p (自己试试)给我们:

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

The MLE estimate of p is the number of heads divided by the number of flips!

事实证明,我们硬币的最大似然估计就是正面数除以翻转数!这非常直观,如果你掷一枚公平硬币( p = 0.5) 100 次,你会得到大约 50 个正面和 50 个反面。

结论

最大似然估计是一种将我们的模型与数据拟合的强大技术。MLE 提供的解决方案通常非常直观,但它们完全由数据驱动。这意味着,我们拥有的数据越多,我们的解决方案就越精确,反之亦然。在以后的文章中,我们将会看到包含我们先前对模型的信念的方法,这将在低数据情况下帮助我们。

准备好第三部分了吗?:

[## 机器学习基础(三)

信息论

towardsdatascience.com](/fundamentals-of-machine-learning-part-3-b305933f00cd)

下次见!

最大似然估计解释-正态分布

原文:https://towardsdatascience.com/maximum-likelihood-estimation-explained-normal-distribution-6207b322e47f?source=collection_archive---------1-----------------------

维基百科对最大似然估计(MLE)的定义如下:

通过最大化似然函数来估计分布参数的一种方法,使得在假设的统计模型下观察到的数据是最可能的。

为了理解这个定义,让我们看一个简单的例子。假设我们有一些连续的数据,我们假设它是正态分布的。通过假设正态性,我们简单地假设我们的数据分布的形状符合流行的高斯钟形曲线。我们不知道的是曲线有多“粗”或“细”,或者峰值出现在 x 轴的什么位置。

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

We assumed the general Gaussian bell curve shape, but we have to infer the parameters which determine the location of the curve along the x-axis, as well as the “fatness” of the curve. Our data distribution could look like any of these curves. MLE tells us which curve has the highest likelihood of fitting our data.

这就是估计或推断参数的地方。从统计学上我们知道,我们的高斯分布的具体形状和位置分别来自于 σμ 。换句话说,μ和σ是我们感兴趣的参数。这两个参数定义了我们的曲线,正如我们看到的正态分布概率密度函数(PDF)一样:

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

我们如何使用 MLE?

仍然记住我们的正态分布示例,目标是确定我们数据的μ和σ,以便我们可以将我们的数据与其最有可能的高斯钟形曲线相匹配。用我们的语言来说,技术上是正确的,我们可以说,我们正在寻找一条曲线,在给定一组曲线参数的情况下,使我们的数据的概率最大化。换句话说,我们最大化数据的概率,同时最大化曲线可能性。也许后一种解释是更直观的思考问题的方式,但两者都是正确的,我们将使用第一种视角来处理问题。

为了使用最大似然估计,我们必须做出两个重要的假设,它们通常一起被称为 i.i.d. 假设。这些假设表明:

  1. 数据必须独立分布。
  2. 数据必须完全相同地分布。

换句话说, i.i.d. 假设要求任何给定数据点的观察不依赖于任何其他数据点的观察(每个收集的数据点都是独立的实验),并且每个数据点都是从具有相同参数的相同分布族中产生的。

数学

通常,参数μ和σ一起表示为一组参数θ,即:

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

我们可以将问题建立为条件概率问题,其目标是在给定θ的情况下最大化观察到我们的数据的概率。对于大小为 n 的数据集,从数学上来说,它看起来类似于:

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

然而,因为我们正在处理一个连续的概率分布,上述符号在技术上是不正确的,因为观察到任何一组连续变量的概率都等于零。从概念上讲,这是有意义的,因为我们可以在连续域中得出无限多的可能变量,并且将任何给定的观测值除以无穷大总会得到零概率,不管观测值是什么。

我们需要考虑概率密度而不是概率。不去探究两者之间区别的技术细节,我们将只陈述连续域中的概率密度类似于离散域中的概率。因此,在这个最大化问题中可以使用概率密度。为了纠正我们的符号,我们会说:

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

我们希望将观察数据的概率密度最大化为θ的函数。换句话说,我们希望找到μ和σ值,使得这个概率密度项尽可能高。我们习惯于将 x 作为约定俗成的自变量。但在这种情况下,我们实际上是把θ作为独立变量,我们可以把 x_1,x_2,… x_n 看作一个常数,因为这是我们观察到的数据,不能改变。

从概率论中,我们知道多个独立事件全部发生的概率称为联合概率。我们可以将每个数据点观察视为一个单一事件;因此,我们可以将我们的精确数据集的观察视为一系列事件,并且我们可以如下应用联合概率密度:

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

记住,目标是通过找到最优θ来最大化这个概率密度项。为了用数学方法表示这一点,我们可以说,我们寻求这一项相对于θ的“argmax ”:

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

因为我们在寻找一个最大值,我们的微积分直觉应该告诉我们是时候对θ求导,并将这个导数项设置为零,以找到我们沿着θ轴的峰值位置。这样,我们可以将联合概率密度项的 argmax 等同于联合概率密度项对θ的导数等于零时的情形,如下所示:

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

现在,唯一的问题是,这不是一个很容易计算或近似的导数。幸运的是,我们可以在这个场景中应用一个简单的数学技巧来简化我们的推导。实际上,我们可以使用单调函数来改变导数项,这将简化导数计算,而不会改变最终结果。单调函数是两个变量之间保持原始顺序的任何关系。单调函数要么总是增加,要么总是减少,因此,单调函数的导数永远不会改变符号。我们这里使用的单调函数是自然对数,它具有以下性质(不包括证明):

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

所以我们现在可以把我们的问题写成如下。请注意,下面第三项和第四项之间的等式是一个性质,其证明没有明确显示。

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

为什么可以使用这种自然对数的技巧?由于自然对数的单调递增性质,采用原始概率密度项的自然对数不会影响 argmax,这是我们在这里感兴趣的唯一度量。当然,它改变了我们的概率密度项的值,但它没有改变全局最大值相对于θ的位置。从数学上讲,我们可以把这个逻辑写成如下:

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

为了进一步说明这一概念,这里有几个函数沿着它们的自然对数(虚线)标绘,以表明沿着 x 轴的最大值的位置对于该函数和该函数的自然对数是相同的,尽管最大值本身显著不同。

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

垂直的黑色虚线表示函数与其自然对数之间的最大值对齐。这些线绘制在 argmax 值上。如我们所述,这些值对于函数和函数的自然对数是相同的。这就是为什么我们可以在这个问题中使用我们的自然对数技巧。

回到现在的问题,我们有:

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

我们希望求解θ,以获得最佳参数,使我们的观察数据与高斯曲线最佳拟合。现在让我们考虑一下我们要推断的两个参数,μ和σ,而不是符号表示θ。我们将切换到梯度符号:

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

让我们从求关于μ的梯度开始。我们将在这里用正态分布的 PDF 代替 f (x_i|μ,σ)来做这件事:

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

使用这里没有证明的自然对数的属性,我们可以将其简化为:

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

此外,

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

设最后一项等于零,我们得到μ的解如下:

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

我们可以看到,我们的最优μ与我们的最优σ无关。现在,我们将以类似的方式,通过对σ求梯度来求解σ:

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

设最后一项等于零,我们得到σ的解如下:

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

现在我们有了。如果我们最近做过统计,我们的最佳μ和σ导数应该看起来很熟悉。这些参数计算出的公式与我们用于平均值和标准偏差计算的公式完全相同。这不仅仅是巧合。这是正态分布的一个性质,假设我们可以进行独立同分布假设,这个性质就成立。

但是在这里理解 MLE 的关键是将μ和σ 而不是视为我们数据集的均值和标准差,而是将而不是视为最有可能拟合我们数据集的高斯曲线的参数。当我们将 MLE 应用于贝叶斯模型和分布时,这种思路将会派上用场,在贝叶斯模型和分布中,计算中心趋势和离差估计量不是那么直观。

贝叶斯定理的最大似然估计

原文:https://towardsdatascience.com/maximum-likelihood-estimation-from-bayes-theorem-6cc7f0db9adb?source=collection_archive---------13-----------------------

可能最流行和最简单的参数估计方法之一是最大似然估计,贝叶斯定理作为一个独立的天才,有许多应用。但是有没有可能把 ML(不是机器学习)看成是贝叶斯定理的一个应用呢?让我看看。

让我们用一个非常基本和简单的瓮和球选择问题来概括贝叶斯定理,这种问题是贝叶斯定理应用的第一个问题。问题陈述如下:

假设你有三个相同的罐子,里面装着相同的球。第一个瓮包含 3 个黑球和 3 个红球,第二个瓮包含 4 个黑球和 2 个红球,第三个瓮包含 1 个黑球和 5 个红球。蒙上眼睛,从三个瓮中随机选择一个,然后随机抽取一个球。让抽出的球是红色的球。那你一开始选的是哪个骨灰盒?

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

The setup of urn and balls

一个典型的贝叶斯定理问题。不是吗?让我们解决它。

设 A1、A2、A3 分别是选择第一、第二和第三 urn 的事件。设 B 是选择一个红球的事件。由于骨灰盒是相同的,其中一个是随机选择的,因此

P[A1]=P[A2]=P[A3] …(1)

因为只有这三个 urn,所以选择其中任何一个都是必然的,我们得到 P[A1]+P[A2]+P[A3]=1 …(2)

从(1)和(2)可以清楚地看出,P[A1]=P[A2]=P[A3]=1/3

现在 P[B | A1]= P[从 3 个红球和 3 个黑球中选择一个红球]=3/(3+3)=3/6

P[B | A2]= P[从 2 个红球和 4 个黑球中选择一个红球]=2/(2+4)=2/6

P[B | A3]= P[从 5 个红球和 1 个黑球中选择一个红球]=5/(5+1)=5/6

但是你蒙着眼睛抽了球,所以你不知道 B|A1,B|A2,B|A3 这三个事件发生了哪一个。或者具体地说,A1、A2 和 A3 中的哪一个已经实际发生。现在给定手头的附加信息,即所选球是红色的,让我们使用贝叶斯定理计算 P[A1|B],P[A2|B]和 P[A3|B]。

所以,P[A1 | B]=(P[B | A1]* P[A1]/(P[B | A1]* P[A1]+P[B | A2]* P[A2]+P[B | A3]* P[A3])

或者,P[A1 | B]=(3/6)(1/3)/[(3/6)(1/3)+(2/6)(1/3)+(5/6)(1/3)]= 3/10

同样,P[A2 | B]=(P[B | A2]* P[A2]/(P[B | A1]* P[A1]+P[B | A2]* P[A2]+P[B | A3]* P[A3])

或者,P[A2 | B]=(2/6)(1/3)/[(3/6)(1/3)+(2/6)(1/3)+(5/6)(1/3)]= 2/10

最后,

P[A3 | B]=(P[B | A3]* P[A3])/(P[B | A1]* P[A1]+P[B | A2]* P[A2]+P[B | A3]* P[A3])

或者,P[A3 | B]=(5/6)(1/3)/[(3/6)(1/3)+(2/6)(1/3)+(5/6)(1/3)]= 5/10

我们发现事件 A3|B 在 3 个事件中概率最高。

因此可以得出结论,最有可能的是第三个瓮被选中。这也很明显,因为第三个瓮有最多的红球。

到目前为止还好,没什么特别的,没什么有趣的。

让我们集中注意力。

我们为什么不按照时间顺序来安排与问题相关的不同行动呢?我们去吧。

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

Time wise ordering of actions

这个简单问题的主要吸引力在于,在状态 C 中,你必须猜测在状态 a 中发生了什么。蒙住眼睛发生的动作实际上对你来说是未知的。所以基本上这是一个根据手头的数据(球的颜色)知道所选的未知骨灰盒的过程。

让我们停止贝叶斯问题,转到统计推断。什么是统计推断?是认识未知的过程。比如:估计一个总体的一些参数。那么什么是参数呢?描述一个群体并且对我们来说未知的感兴趣的量。那么我们如何估计参数呢?有几种方法可以做到这一点(一种这样的方法是最大似然估计或 MLE),但对于每一种这样的方法,你至少需要一个样本**。样本只不过是你所知道的总体的一部分。**

现在让我们把注意力集中到 MLE 上。MLE 的下划线理论是什么?给定手头的样本,下划线参数的估计值是多少,以使观察到的样本最有可能获得,即获得给定样本的可能性最大。

不是 ML 估计也是时光倒流吧?因为群体是由一些参数指定的。当从总体中选择样本时,样本是由于一个或多个参数而生成的,但不幸的是,您并不了解它,因此需要基于生成的样本来获取关于它的知识。

找到与贝叶斯问题的相似之处?我希望如此。让我们处理一个简单的最大似然估计问题。

假设你有一个样本 X1,X2,X3,X4 和 X5 be 5 iid 观测值(抽球)来自一个 N(t,1)分布(某瓮)t 未知(但是哪个瓮,你不知道)。基于样本的给定值(所选球的颜色)提供 t 的最大似然估计值(哪个瓮最有可能包含所选球)。

上面给出了一个真正的 ML 估计问题。但是让我们再次解决瓮和球的问题,唯一的区别是现在有无限多个瓮,因为 t 可以取-无穷大到+无穷大之间的任何值。

设 B 是已经产生给定的 5 个观察样本的事件。

因为 t 可以取无穷多个值,并且它们是不可数的无穷个,所以我们不能定义 A1 是事先选择 N(t1,1)的事件,A2 是事先选择 N(t2,1)的事件,等等。取而代之,让我们定义一个 t 的连续分布,因为所有的正态分布都被假定为是等可能性的,所以概率陈述是

对于所有允许的 t 值,f(t)=c。

并且 T 是选择 N(t,1)的事件。

现在类似于球和瓮的问题,我们需要找到

P[T|B],然后推断出 P[T|B]最大的特定 T。

根据贝叶斯定理,

P[T | B]= P[T]* P[T]/P[B]……(*)

我们有,

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

由于这里的 t 既不是有限的,也不是不可数无限的,所以在 P[B]通过全概率定理的表达式中,用积分代替求和。

所以,

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

因此从(*),

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

显然,分母是一个常数,因为它不含 t,并且手头的样本是固定的。

所以要找到使 P[T|B]最大化的 T,数学公式是

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

但实际上是什么呢?不就是 ML 估计的提法吗?是的,的确如此。(我知道我们通常最大化对数似然,但这仅仅是出于计算目的)。

答对了。!!

一开始,在真正的瓮和球问题中,假设每个瓮被选中的可能性是相等的,因此答案将是拥有最多红色球的瓮?同样的假设在 MLE 中是有效的。但是如果骨灰盒被选中的概率不同呢?然后仅仅通过看球的颜色,你不能给出任何解决方案。

类似地,在参数估计中,如果你预先假设参数的分布对于参数的所有允许值都不是常数,那么仅仅通过观察手头的样本,你不能得出关于参数估计值的结论。

在统计学或机器学习领域,贝叶斯方法起着非常重要的作用,而所有这些方法的基础都是贝叶斯定理。这个定理非常简单容易。那它有什么特别的?我的意思是用条件概率规则,P[A|B]=P[A 和 B]/P[B]

类似地,P[B|A]= P[A 和 B]/P[A],因此 P[A 和 B]=P[B|A]*P[A]

替换上式中的,P[A|B]=P[B|A]*P[A]/P[B]。就是这样。这只是一些条件概率的数学公式。

但是这个定理的美妙之处在于,你是**,实际上在改变一个确定事件的概率**。什么是确定的事件?如果 P[A]=1,则调用 A 的事件是确定事件。任何已经发生的事件都是确定的事件。2014 年国际足联 WC 德国夺冠的概率有多大?是 1。当你掷两次 6 面无偏骰子,第一次输出是 5,第二次输出是 1 的概率是多少?答案是(1/6)*(1/6)=1/36。但是当你掷两次 6 面无偏骰子,第一次输出是 5,第二次输出是 1 的概率是多少?答案是 1/6,因为 P[第一个输出是 5]=1,因为它已经发生了。

现在想想,在骨灰盒问题中,你已经选择了一个骨灰盒,所以它是一个确定的事件。P[B|A1]=1 或 P[B|A2]=1 或 P[B|A3]=1 中的任何一个必须为真。但是因为你不知道是哪一个,这个定理实际上允许你回到过去并且弄清楚。

因此,这个定理在统计学上是一个独立的天才,因为它提供的突破性思想是无与伦比的。

感谢您的阅读,任何批评或反馈都欢迎在评论区,或者您可以通过我的 LinkedIn 个人资料联系我

[## SOUMALYA NANDI -联合健康组织助理数据科学家| LinkedIn

查看 SOUMALYA NANDI 在全球最大的职业社区 LinkedIn 上的个人资料。SOUMALYA 有 4 份工作列在…

www.linkedin.com](https://www.linkedin.com/in/soumalya-nandi-95176569/)

现实生活中的最大似然估计:优化学习时间

原文:https://towardsdatascience.com/maximum-likelihood-estimation-in-real-life-optimizing-study-time-d5cc083d25b4?source=collection_archive---------15-----------------------

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

Photo by Mika Baumeister on Unsplash

最大似然估计是一种广泛应用于机器学习的统计技术。它用于选择模型的参数。

考试季节到了,这一次你想更有效地利用你的学习时间。你提前做了计划,并确保跟踪你在过去几轮中为每场考试学习了多少,以及你得了多少分。你最终得到了这个数据集

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

Beautiful dummy data 😁

绘制数据可以更容易地看出你花在考试学习上的时间和最终成绩之间的相关性。

和前几轮考试一样,你面临的最大挑战是,你有多场考试,每场考试相隔几天。你想制定一个学习计划,让你最大限度地提高成绩,但保证你有足够的时间投入到每场考试中。

你是做什么的?

线性模型来救援了!

根据每次考试的学习时间,思考一种最大化成绩的方法,你记得上面散点图中的相关性。你可以使用线性回归来帮助计算出你会得到多少分数,给定你可以为考试投入的学习时间。

这是最能描述当前问题的模型

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

你是根据你学习的时间来预测考试成绩的。你可以使用自己选择的统计软件,对数据集进行线性模型拟合。

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

现在你可以输入你计划学习多长时间,并根据模型的方程式检查你可能获得的分数。

这里是我们模型的总结,使用 Python 的 statsmodels 模块获得。

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

我们可以看到,最小二乘法用于将模型(粉色线)拟合到数据集。参数β0和*β1,*也称为模型的系数,分别对应于 consttime

因此,我们有了模型,并用 Python 计算了参数,但问题仍然存在:我们实际上是如何估计参数的?

幕后的数学

很棒的是,我们可以使用统计软件来完成所有繁重的工作,并为我们的数据集拟合一个线性模型。

但是参数是怎么得到预估的呢?

这些值是随机选取的吗?

这就是统计学家 R. A .菲舍尔想出一个好主意的地方!他发现,我们可以建立一个模型,然后估计参数,使它们最大化获得数据集中观察到的值的可能性。

换句话说,我们正在估计参数,以使观察到数据集中的值的概率(即可能性)尽可能高。

但在我们开始钻研数学之前,这里有一些关于我们数据集的假设:

  • 每个数据点都是独立的
  • 我们的数据集遵循正态分布
  • 我们模型中的误差也遵循正态分布
  • 我们的产出是连续的

在计算参数时,这些假设非常方便。它们促进了某些数学属性的使用,最终简化了计算!

1.解码似然函数

到目前为止,我们知道参数必须最大化似然函数

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

可能性函数实际上是一种条件概率。它依赖于参数,因为我们将只选择最大化观察数据概率的参数值。

让我们用θ来表示参数。

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

我们的线性模型,有两个未知参数—β0,β1

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

所以我们可以将似然函数改写为

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

迄今为止,我们

  • 解读可能性的含义
  • 写下线性模型的可能性表达式,作为条件概率

2.概率密度函数

现在我们知道可能性是一个条件概率,是时候开始深入数学了。

根据我们的假设,我们的数据集遵循正态分布,我们正在处理连续数据。因此,我们将使用正态分布的概率密度函数来定义可能性。

因为每个数据点都是相互独立的,所以通过使用概率密度函数中的 Pi 符号,数据集中所有点的概率被表示为乘积。

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

为了简化即将到来的计算,我们可以将可能性转化为对数可能性。

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

当选择每个参数的值时,这是我们想要最大化的!

但是我们可以让这个表达式更简单。由于我们最大化了与参数 beta 0beta 1 相关的可能性,我们实际上可以忽略其中不包含 beta 0beta 1 的任何术语。

可能性表达式就变成了

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

这个求和看起来眼熟吗?

大家回想一下,我们的线性模型定义为 y = beta0 + beta1x +误差。如果我们求解这个误差方程,我们得到误差= y-β0-β1。

以上是 误差平方和

而且,因为我们也假设我们模型中的误差遵循正态分布,在这种情况下使用最大似然法进行参数估计与计算普通最小二乘法完全相同!

在实践中,在这些假设下,最大化可能性与最小化误差平方和是相同的。

这就是为什么大多数时候我们会看到普通的最小二乘法用于将线性模型拟合到数据集。

3.(最后)估计参数

这是我们停下来的地方

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

为了得到参数值,我们将计算关于β0β1 的偏导数。

从相对于β0 的偏导数开始。

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

搞定一个,还剩一个!

计算关于β1的偏导数,我们得到

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

每当我们使用一些统计软件将线性模型拟合到我们的数据集时,这些都是在幕后发生的计算。

如果我们计算数据集的每个表达式,我们将确认 beta 0= 37.4571beta 1= 12.0495 ,这是模型摘要中显示的确切值。

感谢阅读!

五月版:数据科学职业

原文:https://towardsdatascience.com/may-edition-careers-in-data-science-ae4a955e515f?source=collection_archive---------17-----------------------

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

自《哈佛商业评论》宣布数据科学家是“21 世纪最性感的工作”以来,已经过去了将近九年。从那时起,数据科学领域作为一个整体已经迅速成熟。这些发展中值得注意的是在职业生涯中,从数据科学训练营的兴起到数据科学的本科课程。

因此,进入数据科学领域变得非常困难,因为竞争非常激烈,随之而来的是手头职位的技术要求很高。但是不要害怕,因为 TDS 就在你身边。我们收集了八篇优秀的文章,涉及广泛的数据科学职业生涯的不同方面,既有利于数据科学的有志之士,也有利于已经在该领域工作但希望了解更多未来轨迹的人。我们希望这些文章能进一步告诉你在数据行业实现职业生涯的正确方向。

Haebichan Jung——Recurly 的编辑助理/数据科学家

没人会告诉你的数据科学工作申请

爱德华·哈里斯 — 6 分钟阅读

我是一名物理学家,在 YC 的一家初创公司工作。由于我们公司的工作,我收到了许多电子邮件,询问我关于数据科学职业的建议。

如何在你梦想的公司找到一份数据科学家的工作——我的 Airbnb 之旅

凯利彭 — 8 分钟读完

我一个月前刚开始在 Airbnb 的新工作,是一名数据科学家,我仍然觉得我在这里太幸运了。

如何构建数据科学组合

由迈克尔·加拉尼克 — 17 分钟读完

数据科学怎么找工作?了解足够的统计学、机器学习、编程等知识以便能够找到工作是很困难的。我最近发现的一件事是,相当多的人可能拥有找工作所需的技能,但没有作品集。

绿角数据科学家的 5 大错误

简·扎瓦日基 — 6 分钟阅读
你狂学在线课程,并获得了你的第一份数据科学工作。避免这些错误,马上就能成功。

掌握数据科学面试循环

安德烈·里斯科夫——12 分钟阅读

2012 年,《哈佛商业评论》宣布,数据科学将是 21 世纪最性感的工作。从那以后,围绕数据科学的炒作只增不减。最近的报告显示,对数据科学家的需求远远超过供应。

理想的数据科学家的个人资料是什么样的?

乔治刘 — 6 分钟读完

如果你是一名数据科学求职者,你一定一直在想应该在简历上写些什么技能才能接到电话;如果你想进入这个领域,你可能已经挠了很多次头,想知道学习哪些技术才能成为一个有吸引力的候选人。

给有抱负的数据科学家的六条建议

通过本·韦伯 — 6 分钟读取

数据科学是一个需求巨大的领域,部分原因是它似乎需要作为数据科学家的经验才能被聘为数据科学家。但我合作过的许多最优秀的数据科学家都有从人文科学到神经科学的不同背景,要脱颖而出需要经验。

我们也感谢最近加入我们的所有伟大的新作家,夏羽·比洛多莱·奎弗莱克杰弗里·石安东尼奥·德·佩里奥亚历山大·什罗普希尔纳西尔·赫梅德斯蒂芬·福特汉姆诺姆·尼默达西·里德贝蒂·罗德里格斯 特伦特·戴尔奥罗尼尔·钱德拉纳拉塔纳·普克迪亚当·迪克肖·卢郝明·宁阿内·贝拉萨蒂吉等等。 我们邀请你看看他们的简介,看看他们的工作。

从 MBA 到 IBM 数据科学家:格雷格·拉弗蒂专访

原文:https://towardsdatascience.com/mba-to-ibm-data-scientist-exclusive-interview-with-greg-rafferty-8eebdc689c05?source=collection_archive---------9-----------------------

独家 TDS 采访

TDS 与 IBM 的首席数据科学家讨论公司的工作流程、内部 NLP 项目以及获得第一份数据科学工作。

TLDR: TDS 采访了 IBM 首席数据科学家 Greg Rafferty。Greg 深入研究了 IBM 的数据科学工作流,他负责的具体项目类型,以及他在 TDS 上写的 TwitterBot 文章,这篇文章让他获得了 NLP 专家的声誉,这在他获得 IBM 职位的过程中发挥了很小的作用。

面试官:Haebichan Jung,Recurly 数据科学家,TowardsDataScience.com 编辑助理**

受访者:Greg raff erty,IBM 首席数据科学家**

专注于你以前在国际领域的工作,你能告诉我们你在国外做了什么吗?

格雷格:我大部分时间都在为美国政府做援助工作。我在亚美尼亚生活了几年,在俄罗斯生活了几年。最初它不是数据科学。我主要做项目管理。我在清洁能源项目中工作。我有机械工程的背景,所以我在这些项目上做了一点机械工程。但主要是管理。在亚美尼亚呆了几年后,我去了俄罗斯,继续我的工作。后来,我在一家初创公司做商业分析师。那是我进入科技行业的时候。之后,我来到旧金山,进入了数据科学领域。

最初是什么让你想到了我们的亚美尼亚和俄罗斯?这些是你感兴趣的地区吗?

这既是个人的也是职业的。我提到过我以前是机械工程师。我在采矿业工作,我们在俄罗斯有几个客户,所以我和他们一起工作,为了更好地交流,我开始学习语言。当我获得工商管理硕士学位时,我们与圣彼得堡州立大学有一所姐妹学校。所以我有了一个很好的机会去那里上课。我在圣彼得堡呆了几个月,我喜欢那里,所以我的职业生涯开始与俄罗斯和前苏联国家建立这种势头。2008 年经济崩溃时,我有机会去了亚美尼亚,与政府合作这些援助项目。我真的很想尝试一下,这是一个很好的时机,我做到了。

你在 1990 年开始是一名机械工程师,那么你是如何进入商界的呢?这是一个艰难的转变吗?

实际上非常顺利。我最初是一名机械工程师,后来我开始从事人事管理方面的项目工作,当时我的想法是继续在这家公司工作,并领导一些海外合资企业。在这家公司,他们有各自的 MBA,所以我通过这家公司获得了我的 MBA 学位。

他们实际上支持我,所以我在攻读 MBA 的同时继续工作,这很有回报,但也很紧张。全职在校期间有一份全职工作。这是一个两年的问题,做得很好,度过了一段美好的时光。当我完成的时候,经济正在崩溃,在这家公司做经理的机会真的很少,至少在接下来的几年里,所以这就是为什么我选择那个时间去尝试一些新的东西。

数据和分析何时成为职业生活的一部分?

作为一名工程师,我使用大量的数据和分析。我会建立简单的回归模型,但没有超越 excel。我在莫斯科为一家初创公司工作时就开始编程了。这时候我建立了我的深度模型,不是深度学习,而是可以在 excel 中处理的模型。我确实非常喜欢它。所以当我回到美国时,我的工作非常繁重,这是我第一次接触 SQL。

在那个时候,我开始研究更多的机器学习模型,我真的很喜欢它。然后,我去了训练营“激励”,以便将自己推向极限,真正学习数据科学。

什么是镀锌?

激励是一个训练营。3 个月的沉浸式课程,全日制,大约每天 8-12 小时,每周 5-6 天。只有 3 个月的时间,所以你可以真正摆脱困境,把自己推向边缘,进入数据科学。如果你有基础课程,那会很有帮助,因为它不像硕士课程那么紧张。所以你确实需要知道你会得到什么,这样你才能自己填补空白。

你是如何在 IBM 找到自己的?

所以我一直在 Coursera 平台上工作,自己研究数据科学,并在 Gallup 上做了几个项目,做了另一个非常大的项目,观察特朗普的 Twitter 流。这让我在 NLP(自然语言处理)方面有点名气。IBM 正在寻找 NLP 数据科学家。通过一些关系,我被介绍给了招聘经理,这似乎是一个非常合适的机会。我直接从 galilep 转到 IBM,在 IBM 工作了大约 18 个月。

我一直在做大量的人工智能工作,大量的 NLP 工作,以及一些基于客户的基本分析工作。我是一个咨询团队的成员,所以我经常出差,并且只和客户打交道。我做的很多工作都是和一个客户一起完成的。

在 IBM 你能做什么样的很酷的 NLP 项目?

我做过的最酷的项目之一,我们称之为“无监督注释”,实际上我已经申请了专利。我希望能通过。它所做的是收集成千上万的文档,并识别这些文档的内容。它对它们进行聚类,并对这些注释应用注释,这样您就可以围绕它们构建一个知识图表。

IBM 有一个名为 Knowledge Studio 的工具,这是一个手动注释过程,大约需要三周时间来建立一个手动注释模型。那是非常劳动密集的,不是有趣的工作,需要一个领域专家来做。所以你必须让一个律师给这些文件做三个星期的注释,这真的不是一个很好的时间利用。

所以这个工具做的是,我用 Word2Vec,我用聚类,然后我用一些 IBM Watson API 的特征提取工具。通过这个管道,它创建这些注释。它获取这些文档,并在知识工作室中创建这个知识图表。那是我参与的最大的项目。

** [## 单词嵌入和 Word2Vec 简介

单词嵌入是最流行的文档词汇表示之一。它能够捕捉…的上下文

towardsdatascience.com](/introduction-to-word-embedding-and-word2vec-652d0c2060fa)

这是你为 IBM 开发的内部软件,而不是为其他公司开发的咨询工作吗?

正确。这个项目是内部项目。我们正在寻找可能想要使用它的客户,如果我们能找到一个,那么我们当然会将其应用到我们更广泛的沃森产品中,然后提供给任何人。但目前它仍处于概念验证阶段。

这是 IBM 的正常工作流程吗(制造内部产品,然后吸引外部客户)?

那实际上是一个非常罕见的工作流程。只有少数团队使用这种方法将产品推向市场。大多数情况下,客户提出用例,IBM 确定解决方案,然后直接为客户构建解决方案。如果这个用例可以扩展到其他客户,那么每个合同都是不同的。有时客户拥有知识产权,有时 IBM 拥有,有时有一些共享。但如果 IBM 保持对知识产权的控制,那么我们将为一个客户构建它,但如果它适用于其他用例,我们将围绕其他客户销售它。

这些项目的时间表是什么?

我参与的一些项目只有一周,而有些项目可能长达数年。我做过的最长的项目大概有六个月。我现在正在做的项目是一个我们有两年合同的项目。我不知道我是否会全职参与这个项目,因为有很多不同的工作流,根据你的技能,不同的顾问会加入或离开来填补空缺。但我知道有些顾问做同一个项目做了 12 年。有各种不同类型的项目,不同的安排。这取决于你的技能。

团队是如何组建的?

我的团队,应用人工智能团队,我们经常一起工作,但有时我们会在不同的项目上完全独立地工作。我现在正在做的项目,实际上是我在领导这个团队。由我来决定是否出租。我在印度有三名离岸数据科学家,还有两名本地的岸上数据科学家。对于离岸公司,我想雇用我认识的人。我已经知道了他们技能的名声,所以我带了两个人去我的团队。

执行手头任务的重要特质/技能是什么?

作为一名数据科学家,有各种各样的技能,具体的数据科学技能取决于项目。这可以是从 NLP 到深度学习的任何东西,也可以只是基本的分析。但是 IBM 的每个人都有一个共同点,那就是他们都是顾问。他们需要能够与客户合作。他们需要与高管开会,并能够明智地讨论解决方案。他们需要销售产品。这不是向客户推销解决方案。了解客户的需求,了解我们如何更好地帮助客户。所以当我说卖的时候,这不是我们去找他们说你需要买这个的地方。但是我们深刻理解他们需要什么,以及我们如何改进他们。这不是真正的积极销售。这更像是被动销售,我们向他们展示价值,他们说他们想要。这是一项对顾问来说非常有价值的技能。

所以软硬技能都很重要。

你提起那件事很有趣。昨晚,我和我们的一个合伙人就此进行了一次谈话。他说,如果你是技术技能组合中的前百分之一,你将成为 IBM 的摇滚明星。如果你在以客户为中心的软技能中名列前茅,你也会成为摇滚明星。但是如果你不在前 1%,那么你真的需要具备这两种技能。所以大多数人确实需要有一套基于客户的技术技能。

切换齿轮,你能告诉我们更多关于你在 TDS 上写的 TwitterBot 吗?

这个想法是在川普刚刚解雇詹姆斯·科米的时候产生的。他解雇了他他在推特上说,很遗憾他不得不解雇迈克·弗林,因为弗林向联邦调查局撒谎。每个人都站出来说,那会妨碍司法公正。如果你知道他对联邦调查局撒谎并要求科米不要调查。特朗普对此的反驳是,嗯,我没有写推文,是我的律师写的,是他发的。

所以我说我要做的是分析他的推特流,并试图确定谁在写这些推文,是特朗普还是他的一个助手。我可以这样做的方式是,在他担任总统之前,特朗普总是从安卓设备上发推特,而他的工作人员总是从 iPhones 上发推特。我有推特的数据,你可以看到来源。我用这个来源作为标签,建立了一个模型来确定谁在发微博。在那之后,我建造了一个 TwitterBot,它可以监听特朗普的 Twitter 流,每当他发推文时,它都会捕捉到这条推文,并将其发送给模型。然后,它会再发一条推文,说特朗普刚刚发了这条推文,我有 90%的信心,这是特朗普实际写的。之后,我在 TowardsDataScience 上写了一篇长文,讲述了我构建的功能、结果,以及我如何构建 TwitterBot 并将其投入使用。

关于推特机器人的更多信息,请查看格雷格的原帖:

[## 谁在椭圆形办公室发微博?

我如何建立一个机器学习模型来预测特朗普或他的一个助手是否通过他的账户发了推文

towardsdatascience.com](/whos-tweeting-from-the-oval-office-96ea5b60c03)

对于 TDS 社区,尤其是那些从商业分析、管理等领域转型的人,你有什么至理名言或建议??

我会说最重要的事情,尤其是如果你正在寻找你的第一份工作,是获得一个 Github 页面,并在其中填充真正有趣的项目。项目可能与公司没有直接关系,但你却迫不及待地想要告诉人们。这种热情真的会在面试中表现出来。这是我在面试人时寻找的关键因素之一。建立关系网,然后写博客也很有帮助,因为这真的显示了你的热情。确保你做的每一件事都体现了这一点。

再次感谢 Greg Rafferty 的采访。你可以在这里找到他的 TDS 帖子:

[## Greg Rafferty -走向数据科学

阅读 Greg Rafferty 在《走向数据科学》中的文章。我比烤肉酱还大胆。每天,格雷格·拉弗蒂和…

towardsdatascience.com](https://towardsdatascience.com/@raffg) [## Haebichan Jung - Medium

阅读容格在媒介上的作品。数据科学家@ Recurly |编辑助理@ TDS。每天,Haebichan…

medium.com](https://medium.com/@haebichan) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

另外还要感谢卢多维克·贝尼斯坦特YK·苏吉对项目的审核、指导和支持。**

每个人的直觉

原文:https://towardsdatascience.com/mcmc-intuition-for-everyone-5ae79fff22b1?source=collection_archive---------1-----------------------

容易吗?我试过了。

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

我们都曾听说过蒙特卡洛马尔可夫链。有时在阅读贝叶斯统计时。有时在使用像 Prophet 这样的工具时。

但是 MCMC 很难理解。每当我读到它,我都注意到症结通常隐藏在数学噪音的深层,不容易破译。

我不得不花很多时间去理解这个概念。

这篇博客旨在简单地解释MCMC***方法,并知道它们的用处。***我将在我的下一篇文章中深入探讨更多的应用。

所以让我们开始吧。

MCMC 由两项组成 蒙特卡罗马尔可夫链 。让我们一个一个地谈论个别术语。

蒙特卡洛?

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

Simulation

简单来说,我们可以把蒙特卡罗方法看作简单的模拟。

蒙特卡洛 方法得名于摩纳哥的蒙特卡洛赌场。许多纸牌游戏需要赢庄家的概率。

有时候,计算这种概率可能在数学上很复杂或者非常棘手。但是我们总是可以运行一个计算机模拟来多次模拟整个游戏,并且将概率视为赢的数目除以玩的游戏数目。

这就是你需要知道的蒙特卡罗方法。

没错,只是一种简单的模拟技术,名字很花哨。

马尔可夫链?

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

那么既然我们已经得到了 MCMC 的第一部分,我们还需要了解什么是 马尔可夫链 。但是,在跳到马尔可夫链之前,让我们先了解一点关于马尔可夫性质的知识。

假设你有一个 M 个可能状态的系统,你从一个状态跳到另一个状态。

先不要迷茫。系统的一个具体例子是天气从热到冷再到温和状态的变化。或者另一个系统可能是股票市场,它从熊市跳到牛市,再跳到停滞状态。

马尔可夫性质表示,给定一个在特定时间点处于状态Xn的过程,概率Xn+1 =k,其中 k 是该过程可以跳转到的 M 个状态中的任何一个,将仅取决于它在给定时刻处于哪个状态。而不是它是如何达到当前状态的。

从数学角度来说:

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

直觉上,你不关心市场到达牛市的状态顺序。下一个状态是“熊”状态的概率仅仅由市场当前处于“牛”状态的事实决定。

从实际情况来看,这也是有道理的。

如果一个过程表现出马尔可夫性质,那么它被称为马尔可夫过程。

为什么马尔可夫链很重要?

重要的是因为它的静止 分布

那么什么是平稳分布

在下面的例子中,我将通过实际计算来解释平稳分布。假设你有一个股票市场的马尔可夫过程,如下所示。

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

你有一个转移概率矩阵

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

transition Probabilities, Q

定义了从 Xi 状态到 Xj 状态的概率。在上面的转移矩阵 Q 中,

给定当前状态,下一个状态为“牛市”的概率为“牛市”=0.9

给定当前状态,下一个状态将是“熊”的概率是“牛”=0.075

诸如此类。

现在,我们从一个特定的状态开始。让我们从熊市开始。我们可以用向量的形式把自己的状态定义为【牛、熊、停滞】。所以我们的起始状态是[0,1,0]

我们可以通过将当前状态向量乘以转移矩阵来计算下一个状态的概率分布。

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

**看看概率加起来是怎样的 1。**下一个状态分布可以由下式求出

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

诸如此类。最终,你会到达一个稳定状态 s,在那里我们会收敛:

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

对于上述转移矩阵 Q,平稳分布 s 是:

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

您可以通过编程获得静态分布,如下所示:

Q = np.matrix([[0.9,0.075,0.025],[0.15,0.8,0.05],[0.25,0.25,0.5]])
init_s = np.matrix([[0, 1 , 0]])
epsilon =1
while epsilon>10e-9:
    next_s = np.dot(init_s,Q)
    epsilon = np.sqrt(np.sum(np.square(next_s - init_s)))
    init_s = next_sprint(init_s)
------------------------------------------------------------------
matrix([[0.62499998, 0.31250002, 0.0625    ]])

你也可以从任何其他状态开始;你会达到同样的平稳分布。 改变代码中的初始状态,如果你想看的话。

现在我们可以回答这个问题了- 为什么平稳分布很重要?

稳态分布很重要,因为它可以让你定义一个系统在随机时间的每个状态的概率。

对于这个特定的例子,你可以说 62.5%的时间市场将处于牛市状态,31.25%的时间将处于熊市,6.25%的时间将处于停滞状态。

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

Random Walk

直觉上,你可以把它想象成一个链条上的随机行走。 你处于一个状态,你在给定当前状态的情况下,通过看到下一个状态的概率分布来决定下一个状态。 根据节点概率,我们可能会比其他节点更频繁地访问一些节点。

这就是谷歌在早期互联网时代解决搜索问题的方式。问题是根据页面重要性对页面进行排序。谷歌用 Pagerank 算法解决了。

Google Pagerank 算法中,你可能认为一个州是一个页面,而一个页面在稳定分布中的概率是它的相对重要性。

Woah!这是很多信息,我们还没有开始讨论 MCMC 方法。如果你现在还和我在一起,我们现在可以进入正题了。

那么什么是蒙特卡罗马尔可夫链(MCMC)?

在回答这个关于 MCMC 的问题之前,我先问一个问题。我们都知道贝塔分布。我们知道它的 pdf 函数。但是我们能从这个分布中抽取一个样本吗?你能想出一个办法吗?

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

Think….

MCMC 为我们提供了从任意概率分布中抽样的方法。当我们想从后验分布中取样时,这是最需要的。

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

以上是贝叶斯定理。有时我们需要从后面取样。但是计算后验概率和归一化常数(也称为证据)容易吗?在大多数情况下,我们能够找到可能性 x 先验的函数形式。

但是我们无法计算证据(p(D))。为什么?

让我们扩大证据。

如果 H 只取 3 个值:

p(D) = p(H=H1)。p(D|H=H1) + p(H=H2)。p(D|H=H2) + p(H=H3)。H3

P(D)很容易计算。如果 H 的值是连续的呢?能不能像现在这样简单地写出来,H 可以取无穷大的值?这将是一个很难解决的积分。

我们想从后面取样,但我们想把 p(D)当作一个常数。

根据 维基百科 :

马尔可夫链蒙特卡罗 (MCMC)方法是一类基于构建以期望分布为其平稳分布的马尔可夫链,从概率分布 中进行 采样的算法。在许多步骤之后,链的状态被用作期望分布的样本。样品的质量随着步骤数的增加而提高。

所以让我们用一个例子来解释这一点:

假设我们要从 贝塔分布 中抽取样本。测试版的 PDF 为:

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

其中 C 是归一化常数。它实际上是α和β的一些函数,但我想说明我们并不真的需要它来从β分布中采样,所以我把它当作一个常数。

对于 Beta 版来说,这是一个有点棘手的问题。

实际上,你可能需要处理更难的分布函数,有时你不知道归一化常数。

MCMC 方法让我们的生活变得更容易,因为它为我们提供了可以创建马尔可夫链的算法,该马尔可夫链将 Beta 分布作为其平稳分布,因为我们可以从均匀分布中采样(这相对容易)。

如果我们从一个随机状态开始,并基于某种算法反复遍历下一个状态,我们将最终创建一个马尔可夫链,该马尔可夫链将贝塔分布作为其平稳分布,并且我们在很长时间后所处的状态可以用作贝塔分布的样本。

一种这样的 MCMC 算法是 Metropolis-Hastings 算法

大都会-黑斯廷斯算法

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

Hill Climbing

直觉:

第一,目标是什么?

直觉上,我们想要做的是在某个(凹凸不平的)表面(我们的马尔可夫链)上走来走去,以这样一种方式,我们在每个位置花费的时间量与该位置的表面高度成正比(我们需要从中采样的期望 pdf)。

例如,我们愿意在海拔 100 米的山顶上花费两倍于在附近海拔 50 米的山上花费的时间。好的一面是,即使我们不知道表面上点的绝对高度,我们也可以这样做:我们只需要知道相对高度。例如,如果一个山顶 A 的高度是山顶 B 的两倍,那么我们在 A 的时间将是在 B 的两倍。

提出新地点的方案和接受新地点的规则更复杂,但基本思想仍然是:

(1)挑选一个新的“拟定”位置;

(2)算出那个位置比你现在的位置高多少或低多少;

(3)从概率上来说,按照与地点高度成比例地花费时间的总体目标,留在原地或移动到那个地点。

MCMC 的目标是 从某种概率分布 中抽取样本,而不必知道它在任何一点的确切高度(我们不需要知道 C)。

如果正确设置了“漫游”过程,您可以确保达到这一比例(花费的时间和分布的高度之间)。

算法:

现在让我们更正式地定义这个问题。

设 s=(s1,s2,…)。sM)是期望的平稳分布。我们想创建一个具有这种平稳分布的马尔可夫链。我们从具有 M 个状态的任意马尔可夫链开始,转移矩阵为 P,因此 pij 表示从状态 I 到 j 的概率。

直觉上我们知道如何在这个马尔可夫链上徘徊,但是这个马尔可夫链并不具备所需的平稳分布。

这个链确实有一些平稳分布(这对我们没有用)

我们的目标是改变我们在这个马尔可夫链上徘徊的方式,使得这个链具有期望的平稳分布。

为此,我们:

  1. 从随机的初始状态 I 开始。
  2. 通过查看转移矩阵 p 的第 I 行中的转移概率,随机选择新的提议状态
  3. 计算称为接受概率的度量,其定义为:aij=min(sj.pji/si.pij,1)。
  4. 现在掷一枚硬币,正面朝上。如果硬币正面朝上,接受提议,即移动到下一个状态,否则拒绝提议,即停留在当前状态。
  5. 重复很长时间

很长一段时间后,这个链将会收敛,并且将会有一个稳定的分布 s。然后我们可以使用这个链的状态作为来自任何分布的样本。

在对 Beta 分布进行采样时,我们使用 PDF 的唯一时间是找到接受概率,在这种情况下,我们将 sj 除以 si,即归一化常数 C 被取消

贝塔分布的抽样:

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

MCMC Sampler

现在让我们继续讨论贝塔分布的抽样问题。

贝塔分布是[0,1]上的连续分布,它在[0,1]上可以有无限个状态。

让我们假设在[0,1]上具有无限状态的任意马尔可夫链 P 具有转移矩阵 P,使得 pij = pji =矩阵中的所有元素。

我们不需要矩阵 P,正如我们将在后面看到的,但我想让问题描述尽可能接近我们建议的算法。

  • 从 Unif(0,1)给定的随机初始状态 i 开始。
  • 通过查看转移矩阵 p 的第 I 行中的转移概率,随机选取一个新的提议状态。假设我们选取另一个 Unif(0,1)状态作为提议状态 j。
  • 计算一个称为接受概率的度量:

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

这简化为:

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

因为 pji=pij,并且在哪里

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

  • 现在扔一枚硬币,很有可能击中头部。如果问题悬而未决,接受提议,即进入下一个州,否则拒绝提议,即停留在当前州。
  • 长时间重复

代码:

理论已经讲够了,让我们继续讨论 python,来创建我们的 Beta 采样器。

让我们对照实际的β分布检查 MCMC 采样β分布的结果。

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

正如我们所看到的,我们的采样β值与β分布非常相似。因此,我们的 MCMC 链达到了稳定状态。

我们确实在上面的代码中创建了一个 beta 采样器,但是相同的概念普遍适用于我们想要从中采样的任何其他分布。

结论

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

那是一个大帖子。恭喜你走到了尽头。

本质上, MCMC 方法可能比较复杂,但是它们给了我们很大的灵活性。您可以使用 MCMC Sampling 对任何分布函数进行采样。它们通常用于在推断时对后验分布进行采样。

您也可以使用 MCMC 来 求解具有大状态空间的问题。 例如:背包问题或解密。你可以在我的下一篇博文中看到一些有趣的例子。继续收听。

您可以关注的最新、最好的资源之一是加利福尼亚大学的贝叶斯统计专业。

我将来也会写更多这样的帖子。让我知道你对这个系列的看法。在 等我,或者订阅我的 博客 了解他们。和往常一样,我欢迎反馈和建设性的批评,可以在推特@ mlwish}上找到。

参考

  1. 概率导论约瑟夫·K·布利茨坦,杰西卡·黄
  2. 维基
  3. 堆叠交换

MDLI 报告:2019 年以色列机器学习评论

原文:https://towardsdatascience.com/mdli-report-the-israeli-machine-learning-review-2019-fdc408d31454?source=collection_archive---------19-----------------------

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

关于以色列机器学习前景的完整报告,包括平均工资、人口统计、最常用的图书馆等。

今年,就像去年一样,我们在机器&深度学习以色列社区成员中分发了一份全面的调查。该调查针对数据科学家和相邻角色,评估专业人员的工作条件、普遍面临的挑战、流行的开发工具等。令人印象深刻的是 569 名受访者参与了今年的调查(相比去年的 225 名受访者),代表了该领域多元化的专业群体。在本报告中,我们将讨论调查结果,并为您提供由 Omri Goldstein 完成的对这些结果的深入分析。调查由两部分组成:一部分是关于个人和职业信息,另一部分是关于职业和技术事务的更多信息。

调查的中心话题之一是平均工资,这是根据受访者的经验和教育水平来衡量的。今年,我们的调查得到了不少于 402 名全职工作人员的回复——这代表了该领域的现状。

人口统计数据

在 569 名受访者中,74.1%认为自己是男性,25.3%认为自己是女性。与去年的女性比例相比,这是一个重大进步。然而,这一数字似乎是我们努力接触更多女性参与者的结果,而不是因为有更多的妇女在实地工作。此外,调查受访者的平均年龄为 32.7 岁,其中 50%在 29 至 35 岁之间:

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

男女之间的年龄分布没有差别,尽管与年龄有关的其他变量描绘了一幅有趣的画面。在特拉维夫,平均年龄为 30 岁,而在中央区,平均年龄为 33 岁,如下图所示:

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

特拉维夫是最具代表性的城市,无论是作为家庭基地还是工作目的。特拉维夫吸引了近一半居住在中心区的受访者就业,四分之一居住在海法的受访者,三分之一居住在耶路撒冷的受访者,以及略少于一半来自南区的受访者。特拉维夫也是唯一一个被调查者更经常提到的工作城市,而不是他们生活的城市。

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

在雇主方面,我们研究了不同类型的组织——从公司到军队。正如所料,我们最年轻的受访者为 IDF(以色列国防军)工作。平均而言,年龄最大的受访者为政府工作,年龄中位数为 36 岁,而为初创公司工作的受访者年龄中位数仅为 32 岁:

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

最常见的职称是数据科学家、研究员或科学家、深度学习工程师、机器学习工程师、软件开发人员、算法开发人员、分析师和 CTO。这一结果并不令人惊讶,因为该调查是针对广义上的数据科学家的,但这些结果也没有反映高科技行业的整体情况。与此同时,调查受访者最常见的学位是计算机科学(包括电子工程、软件工程和生物信息学)、工程和精确科学(数学、物理、统计和其他工程学科)、生命科学(化学、生物和脑科学)和经济学。在学位科目方面,值得注意的是,学位科目与工作岗位之间有直接联系:

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

计算机科学毕业生真的可以在所有工作岗位上找到,而大多数精确科学、工程和生命科学毕业生的角色是数据科学家。此外,软件工程师通常是计算机科学毕业生,数据分析师大多来自精确科学,其他职位由生命科学和经济学毕业生分享。

如果我们在 MCA(PCA 的分类姐妹程序)的帮助下将每个回答者的工作职位、教育水平和学术专长可视化到 2D 地图中,它允许我们发现以下内容。我们可以发现变量之间的以下关系:

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

你可以看到几个集群的形成。在左下角,经济学毕业生和数据分析师角色之间有一个链接,尽管相当多的经济学毕业生也是数据科学家。在中间,您可以看到 STEM 毕业生和数据科学家角色之间的联系。在左侧,拥有计算机科学学士学位的受访者与软件工程师和深度学习工程师角色相关联。在右上角,在一个较小的集群中,您可以找到被聘为研究人员的博士学位持有者。在中心,CTO、算法开发人员和机器学习工程师之间还有另一种轻微的联系,他们的教育水平相似,但他们有不同的学术专长。由于这一群体的多样性,他们的职称也趋于多样化。

工作和招聘

招聘行业在过去几年发生了变化,这在我们的调查结果中非常明显。像 Woo幸灾乐祸这样的招聘公司已经改变了求职者寻找工作的方式,尽管大多数受访者似乎没有大规模使用这些公司的服务。LinkedIn 仍然是最受欢迎的招聘网站,超过 400 名受访者表示他们使用 LinkedIn。下一个最受欢迎的策略是通过朋友和家人找工作。最后,受访者还使用我们的社区就业委员会,不到一半的受访者使用招聘机构。

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

工资范围

全职员工的平均工资为每月 31000 NIS(8830 美元),比去年增加了 2000 NIS(568 美元)。50%的受访者认为他们的月工资在 22,500 至 37,500 NIS(6,408 至 10,681 美元)之间,这表明存在显著差异:

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

今年男女平均工资的差距是 2600 NIS(740.5 美元),这意味着 8%的工资差距(与去年的数字相似)。男性平均月收入为 31500 NIS(8946 美元),而女性为 29000 NIS(8236 美元)。

研究人员和科学家的工资最高,平均月薪为 36000 NIS(10224 美元)。紧随其后的是那些拥有 CTO 或机器学习工程师头衔的人,他们的平均月薪为 3.5 万 NIS(合 9940 美元)。另一方面,分析师的平均月薪为 19000 NIS(5396 美元)。

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

女性占人口样本的 23%,45%的分析师职位由女性担任,这可以部分解释工资差距。不管怎样,男性数据科学家每月收入 31000 NIS(8830 美元),比女性高出 3000 NIS(284 美元)。从 37000 NIS(10508 美元)到 34000 NIS(9656 美元),在男性和女性研究人员中也可以发现类似的工资差距。

教育水平是影响工资的一个重要因素。与去年的调查结果类似,最常见的教育水平是硕士学位(51%的受访者),其次是学士学位(33%),博士学位(12%)。同样显而易见的是,工资随着教育水平的提高而增长——学士学位持有者的平均收入为 27000 NIS(7668 美元),硕士学位持有者的平均收入为 31000 NIS(8830 美元),博士学位持有者的平均收入高达 38000 NIS(10792 美元)。这一趋势在下面的场景中尤其有趣:虽然硕士学位持有者的平均工资男女相似,但男女博士学位持有者的工资差距令人震惊——相比之下,男性平均工资为 41000 NIS(11644 美元),女性平均工资仅为 27000 NIS(7668 美元)。

这种工资差距的部分原因似乎是,大约一半的女性拥有生物学、化学或脑科学的博士学位,而不是计算机科学或工程的博士学位。与此同时,拥有博士学位的男性 82%都是计算机科学或工程方面的专家:

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

这就把我们带到了下一个话题,即基于学术专业的工资范围。最常见的专业,伴随着巨大的工资差距,是计算机科学——超过 56%的受访者表示。另外 28%的人专攻工程、物理、数学或统计学,其余的人分布在生命科学、经济学和社会科学领域。在这些专业中,计算机科学家的工资最高,平均月薪为 33000 NIS(&9372)。紧随其后的是工科毕业生,平均月薪为 28000 NIS(7952 美元)。排在第二位的是经济学毕业生,平均月薪为 25000 NIS(7100 美元)。作为额外的观察,还值得注意的是,与计算机科学和工程毕业生不经常拥有博士学位相反,几乎所有生命科学毕业生都拥有博士学位。

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

当然,影响薪水的另一个因素是年龄。不出所料,薪水会随着年龄和经验的增长而增加。男性和女性都是如此,尽管工资差距仍然很突出——特别是在一些工作中最高级的职位持有者中。

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

从数字上看,工资差异较大的一个原因(除了教育水平或工作经验年限)是我们的受访者中有 14 人在为 IDF 工作。这降低了 20 多岁年龄段受访者的平均工资。薪资差距较大的另一个原因是,最高的薪资大多出现在公司和初创企业(被称为“高科技”行业)。与此同时,政府、金融、大学等部门的薪水都比较低。注意,一些薪酬最高的公司是跨国公司,比如谷歌、亚马逊、脸书等等:

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

如果我们考虑到跨国公司的公司规模,那么可以理解(尽管是推测性的)为什么这些公司的薪酬也可能是最高的。然而,无论公司规模如何扩大,公司内部员工的工资仍会波动。对于雇佣超过 10,000 名员工的公司来说尤其如此,25%的受访者月薪超过 46,000 NIS(13,064 美元):

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

请注意,当将工资分布作为一个变量的函数呈现时,可能会产生误导性的结果。例如,生命科学毕业生的平均工资与工程毕业生的工资一样高,尽管生命科学毕业生拥有的博士学位比工程师多。我们还看到,所有 20 多岁的受访者的平均工资都有下降的趋势,因为有一批受访者在为以色列国防军工作。很难完全抵消变量之间的各种相关性,如果我们设法做到这一点,将某些原因归因于这些相关性可能会被证明是额外的挑战。

职业和技术问题

数据科学家日常工作中不可分割的一部分是他或她处理的数据,以及他或她获取这些数据的方式。因此,我们将调查的很大一部分用于围绕数据的问题。 62.7%的受访者表示他们独立收集数据,没有使用额外的数据源。相比之下,26.8%从数据聚合器收集数据,17.8%从谷歌搜索收集数据,15.4%从大学或非营利组织运营的数据库收集数据。其余受访者从 GitHub 或政府网站收集数据。

当深入调查时,我们发现了关于所用数据类型的有趣结果: 46.3%的受访者使用关系数据,而 43.7%的受访者使用视觉数据(即图像)。排在第三位的是文本数据,有 39.3%的受访者使用,其次是传感器数据,有 27.3%的受访者使用。排名最后的是视频数据,只有 19.8%的受访者使用过,而音频数据只有 8.8%的受访者使用过。

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

在了解了哪些类型的数据是受欢迎的以及它们是如何收集的之后,是时候进一步深入了解我们的调查受访者如何处理他们的数据了。我们的下一步是解决日常数据科学中使用的方法和技术。在这种情况下,结果也是千差万别,许多回答者使用了非常不同的技术。排在最前面的是 67.9%的受访者使用的神经网络,其次是 51%的受访者使用的 CNN 和逻辑回归。45.8%的受访者使用随机森林,36.6%使用决策树。然后,31.7%使用集合方法,30.1%使用 SVM,29.5%使用 RNN。排名最末的是 15.9%的受访者使用的 GANs。

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

现在的问题是,我们的调查对象使用哪些库来执行所有这些技术。 TensorFlow 是使用最多的库,50.6%的受访者投票支持它。第二是 Keras,有 46.6%的受访者使用,第三是 PyTorch,有 40.5%的受访者使用。排名第四的是 Gensim,只有 7.6%的受访者使用,排名最后的是 Matlab,有 7.3%的受访者使用。

我们以下面的问题结束:工作者在实践数据科学时面临的最大挑战或最大障碍是什么?不出所料,与去年的调查结果类似, 60.7%的受访者的主要问题是“脏数据”,这对他们的工作流程和产出有害。

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

第二个问题是数据不可获得或不可用,35.1%的受访者指出了这一点。基于这些答案,当今数据科学的关键问题是数据本身,特别是如何收集高质量的数据。最后一个问题是该领域的人才短缺,29.3%的受访者提到了这个问题。数据和信息科学领域的人才短缺是众所周知的问题,该领域人力的缺乏阻碍了许多公司加速发展。

下面的问题涉及到本质上不一定是技术性的方面。24.7%的受访者表示,他们面临的非技术问题是收到难以找到答案的不清楚的问题,而 17.6%的受访者表示缺乏他们可以寻求建议的领域专家。最后,15.6%的受访者提到了定义数据科学家角色的困难以及在数据科学领域工作意味着什么。

摘要

总的来说,今年的调查结果与去年相比没有明显变化。随着该领域的需求越来越多,平均工资往往会增加,而且这种趋势似乎会持续到未来。尽管进入门槛很高,但我相信我们会看到更多人试图融入该领域,迈出机器学习的第一步。我们甚至可能会看到更多的人从非经典的切入点进入这个领域,例如,不同的工作路径和其他学术专业(这种模式已经变得很突出)。另一方面,我们也可能会看到传统公司或老牌创业公司进入该领域,研究他们如何才能最好地实施数据科学,以造福于他们的业务。

去年提出的另一个要点是,该领域的大多数雇主都集中在中央区(“Gush Dan”),更具体地说,是特拉维夫。我倾向于认为大多数人才库都集中在这些领域。无论如何,我们正在看到更多的机器学习社区在耶路撒冷和海法出现,因此明年的调查结果有可能在这方面讲述一个不同的故事。

明年可能见证的最后一个变化是,TensorFlow 的主导地位可能会下降,转而支持 PyTorch,py torch 越来越受欢迎。现在判断谁将领导队伍以及以色列社区是否会证实这一点还为时过早,但我们可以相对肯定地说,PyTorch 的存在在未来一年将大幅增长。

意义表征与 SRL:假设存在某种意义

原文:https://towardsdatascience.com/meaning-representation-and-srl-assuming-there-is-some-meaning-741f35bfdd6?source=collection_archive---------9-----------------------

对意义表征及其需要的详细描述

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

什么是意义表征

意义表征可以被理解为微妙的语言细微差别和我们关于世界的常识性非语言知识之间的桥梁。它可以被看作是一种捕捉语言输入意义的形式结构。在这样做的时候,我们假设任何给定的语言结构都有一些可以用来表达世界状态的东西/信息。

我们如何意识到有人赞扬或侮辱了我们?这就是对意义表征的需求产生的地方。我们通过将语言输入分解成有意义的结构并将其与我们对现实世界的知识联系起来来理解这一点。在这种情况下,它可以是我们对一个特定的人的了解,我们对以前的经历和与那个人的关系的了解,我们对那个特定时刻的了解等等。

如何表达一个句子的意思

有四种常用的意义表示语言:

  • 一阶逻辑
  • 使用有向图的抽象意义表示
  • 使用文本形式的抽象意义表示
  • 基于帧或槽的过滤器表示

在下图中,句子“我有一部电话”有四个联系人。

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

这些方法之间没有太大的区别。他们都认为意义表征是由与对象相对应的结构、对象的属性以及它们之间的关系构成的。

SRL——为什么还要学习和理解一种表现形式?

类似的事件可以用各种不同的结构和句子的混合体来表达。像语义角色标签这样的表征帮助我们捕捉表达相同思想的不同句子之间的共同结构。它帮助我们在我们描述事件的各种方式中识别和提取事件和参与者。我们也有像深层角色和主题角色这样的其他表现形式,但它们有其局限性。深层角色是特定于某个事件的,而主题角色则捕捉了深层角色的参与者之间的语义共性。尽管主题角色是最古老的语义概念之一,但是一致同意的规则要么是非常抽象的级别,即非常少的规则——仅代表少数高层次的想法,要么是非常低级的级别,即大量的规则——详细地代表特定的事件。语义规则可以被看作是一种在高层次和低层次的结构化表示中表示任何语言结构的方法。

SRL 或者如我们所知,语义角色标注帮助我们理解谓词和它的论元之间的语义关系。它帮助我们回答诸如谁在何时何地对谁做了什么之类的问题。语义角色标注是为每个谓词的每个论元自动找到语义角色的任务。

语义角色标记—随着时间的推移而进步

关于语义关系的最古老的工作可以追溯到公元前 8 世纪左右。as . t . a . ̄dhya ̄ȳı——8 本书的集合,描述了 3959 部佛经中梵语的语言结构——一个类似于现代形式语言理论机制的规则体系。̄dhya ̄y ̄ı也有一套规则来描述动词和名词论元之间的语义关系,回答诸如谁在何时何地对谁做了什么之类的问题。这是已知最古老的关于事件和参与者之间语义表达的著作。

如果没有各种语言资源的开发,获得训练 SRL 模型的特征是不可能的,例如,Fillmore(1968)和 Gruber(1965)的主题规则的现代表述,Levin-List 形式的 3100 个英语动词和相应语义类的列表(1993),Kippler 等人的将 Levin-List 链接到 WordNet 和 FrameNet(2000),如 Penn TreeBank(1993 和以后)的大型句法注释英语语言数据语料库, 用语义角色注释句子语料库,如 PropBank(语义注释的 Penn treebank 英语)和 FrameNet 一组定义的框架特定语义角色,称为框架元素,包括一组使用这些谓词的谓词。

当前大多数 SRL 方法都是基于有监督的基于特征的机器学习算法。以下伪代码给出了基于特征的 SRL 模型的更多见解:

*def SemanticRoleLabel(words):
     semantic_role_dict = {}
     ## parsing the words to get maximum coverage
     parsed_words = Parse(words) 
     for each predicate in parsed_words:
         for each node in parsed_words:
     #a feature extraction function to extract needed features
             node_feature = ExtractFeature(node, predicate, parse)
     #a 1 of N class classifier to get semantic role
             semantic_role = Classify_Node(node, parse, featurevector)

        semantic_role_dict[node] = semantic_role
     return semantic_role_dict*

大多数 SRL 系统是建立在语义角色自动标注(Gilda 和 Jurafsky,2000)的基础上的,它包括的特征有:支配谓词、短语类型、成分中心词、成分到谓词的路径等。研究人员也花了很多时间提出最佳的分类方法和优化技术。

SRL 邮报第三波神经网络

语义角色标记的深度模型的大多数当前技术状态是基于使用双向 LSTM 网络处理生物标记的输入数据作为参数和相关的嵌入层。网络的深度一般在 6 到 8 LSTM 层左右。是由何等人提出的网络架构师模型。(2017)在他的作品《深层语义角色标签:什么起作用,下一步是什么》中。

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

The goal is to maximize the probaility of tag-sequence y -- given the input sequence of words.
y^ = argmaxP(y|w)y∈T

在此之后,最近的其他工作也引入了一些伟大的想法,并进一步提高了模型的准确性,看起来在不久的将来,这些网络还会有更多的迭代。谭等将自关注引入到基于 LSTMs 的网络中,以获得更好的准确性和更好的全局优化,【何】等将句法信息作为另一个输入点添加到网络中,以获得输入数据的更详细表示。来自斯特鲁贝尔等人的最新作品。结合了多头自我关注和语法信息,以实现最先进的结果。该模型 LISA 是一个结合了多头自我关注和多任务学习的神经网络模型,它采用仅使用原始标记作为输入的语法,仅对序列进行一次编码,以同时对所有谓词执行解析、谓词检测和角色标记。通过训练一个注意力头来关注每个单词的语法双亲来合并语法。

最后,语义角色标注是一种强大的方法,它弥合了人类语言和计算机理解之间的鸿沟。随着神经网络的快速发展和声控助手的快速发展,SRL 只会成为一个更重要的研究领域。

参考资料:

有意义的指标:累积收益和 Lyft 图表

原文:https://towardsdatascience.com/meaningful-metrics-cumulative-gains-and-lyft-charts-7aac02fc5c14?source=collection_archive---------5-----------------------

如今,所有大公司都非常依赖他们的数据科学能力。就分析的复杂性和多样性而言,业务数据单元变得越来越大,越来越复杂。然而,将数据科学解决方案成功交付到业务现实中很大程度上取决于调查结果的**。即使开发的模型提供了出色的准确性分数,如果它们不符合各种商业利益相关者的需求,它们也可能被忽略。**

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

所有受欢迎的 ROC AUC 分数对于业务部门来说信息不足,因为它对于非技术经理来说是抽象的。出于后一个原因,我将提出两个有意义的指标,每个分析师在说明他们的模型结果时都应该考虑:累积收益和提升图。我将展示电信行业中客户流失案例研究的例子。

想象一个业务场景,当一家电信公司决定通过向其 20%的客户提供一个月的无限制数据使用来最小化客户流失率。其中一位经理建议,为了使促销不偏不倚,应该按照姓氏顺序向每五位顾客发送一份礼物。决定差不多了:除非有人为这次营销推广提出更好的策略。

有了客户的样本数据(实际上可以从我的 GitHub 访问),我们将决定建立一个 RandomForestClassifier 模型来预测促销开始前的客户流失。然后我们会对数据进行预处理,去掉不必要的列,消除多重共线性,可视化。最后一步:用 GridSearchCV 进行模型训练和优化。然而,这篇文章不是关于这个项目的;这是关于你的发现的可解释性。这个案件的问题仍然没有答案。

为此,我将展示累积增益和升力曲线。累积收益曲线是一条评估曲线,用于评估模型的性能,并将结果与随机选择进行比较。它显示了根据该模型,当考虑到某一百分比的人口最有可能成为目标时,所达到的目标的百分比。在 python 中,我们提供了 scikitplot 库 ,它将为我们制作绘图。

*import scikitplot as skplt# Deriving Class probabilities
predicted_probabilities = model_rf_best_params.predict_proba(x_test)# Creating the plot
skplt.metrics.plot_cumulative_gain(y_test, predicted_probabilities)*

首先,我们根据模型的输出对所有的观察值进行排序。在水平轴的左侧,我们根据模型将最有可能成为目标的观察值放置在右侧,反之亦然。在我们的例子中,在水平轴的 20%点,具有最高概率的 80%观察值被定位。在垂直轴上,曲线指示该曲线中包括的所有目标的百分比。因此,如果我们可以瞄准 20%的观察值,模型将确保总共 80%的搅动者在这个组中,而随机选择将只提供 20%的目标。

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

除了累积增益曲线之外,升力曲线也是一种广泛使用的模型性能可视化方法。确切地说,lift 是对目标模型在预测或分类具有增强反应的病例(对于整个人群)方面的性能的一种度量,相对于随机选择目标模型进行测量。构建升力曲线遵循与形成累积增益曲线相似的过程。事实上,它是从增益图中推导出来的。首先,我们在水平轴上排列观察值,最有可能成为左边的目标,反之亦然。在垂直轴上,提升曲线指示该组中包括的目标比平均目标多多少倍。Lift 计算为分类和随机模型的累积收益之比。考虑 20%的提升(期望的提升目标);我们可以注意到,前 20%的观察值包含了 80%的目标。如果目标的平均发生率是 20%,那么升力是 4。因此,与没有模型的随机寻址相比,该模型允许为该组寻址四倍多的目标。

*#Scikitplot library is there to help
skplt.metrics.plot_lift_curve(y_test, predicted_probabilities)*

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

最终,我们准备好展示营销策略的发现。借助我们的模型,如果公司向 20%的客户提供免费促销,我们可以锁定 80%的顾客。而在随机选择的情况下,我们只能关注 20%的搅拌器。

因此,我们能够观察到累积增益和升力图是决策和模型评估的有用工具。它们不仅相对容易被有技术背景的专业人士理解,也相对容易被其他人理解。最终,这些图表可以应用于各种领域,如市场细分目标、财务预算、人力资源评估等。

对于完整的实现,请参考我的 GitHub 库并随意使用该数据进行相同的分析,还包括其他分类模型:GradientBoostingClassifier、LogisticRegression 等。

尝试,失败,学习,成功。

数据挖掘和机器学习中的相似性度量

原文:https://towardsdatascience.com/measures-of-proximity-in-data-mining-machine-learning-e9baaed1aafb?source=collection_archive---------0-----------------------

在分析过程中执行数据转换

Video version of the story, if you are into that sort of thing

我之前的一个帖子 里,我讲过 评估数据挖掘的数据质量&机器学习算法 。这个就继续那个,如果还没看的话,这里看一下以便对我在文章中要讲的话题和概念有一个恰当的把握。

两个对象之间的接近度是两个对象的相应属性之间的接近度的函数。接近度是指相似度和相异度**。相似性和不相似性很重要,因为它们被许多数据挖掘技术使用,如聚类、最近邻分类和异常检测。**

我们将从高级定义开始讨论,并探索它们之间的关系。然后,我们继续讨论具有一个简单属性的两个数据对象中的接近度**,并继续讨论具有多个属性的对象。**

请容忍我的概念部分,我知道这可能有点无聊,但如果你有强大的基础,那么没有什么可以阻止你成为一名伟大的数据科学家或机器学习工程师。

什么是相似性?

→这是两个对象相似程度的数字度量。

→对于更相似的一对对象,该值更高。

→通常为非负值,介于 0 和 1 之间。

0 ~没有相似性,1 ~完全相似

什么是不同?

→它是两个对象不同程度的数值度量。

→对于更相似的一对对象,较低。

→范围 0 至无穷大

变换函数

这是一个函数,用于将相似性转换为不相似性,反之亦然,或者将接近度转换为特定范围。例如:

s’ = (s-min(s)) / max(s)-min(s))

在哪里,

s’=新转换的邻近测量值,

s =当前接近度测量值,

最小值 =邻近测量值的最小值,

最大值 =最大接近度测量值

这个转换函数只是所有可用选项中的一个例子。

简单属性之间的相似和相异

具有多个属性的对象的接近度通常通过组合单个属性的接近度来定义,因此,我们首先讨论具有单个属性的对象之间的接近度。

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

为了更好地理解它,让我们看一些例子。

  • 考虑由一个名义属性描述的对象。如何像这样比较两个物体的相似度?名义属性只告诉我们对象的独特性。因此,在这种情况下,如果属性值匹配,则相似性被定义为 1,否则,相反定义的相似性为 0。
  • 对于具有单个序数属性的对象,情况更复杂,因为需要考虑关于顺序的信息。考虑一个衡量产品质量的属性,等级为{差、一般、好、好、极好}。我们有三个产品 P1,P2,& P3,质量分别为极好,良好,&还行。为了比较有序的数量,它们被映射到连续的整数。在这种情况下,如果刻度分别映射到{0,1,2,3,4}。那么,不同(P1,P2)= 4–3 = 1。
  • 对于区间或比率属性,两个对象之间相异度的自然度量是它们值的绝对差值。例如,我们可以通过说“我重了十磅”来比较我们现在的体重和一年前的体重

如果你不知道不同的属性类型,即名义的、序数的、区间的和比率的**,那么让阅读我以前的关于属性到不同类型的分布的文章。**

** [## 数据挖掘之旅

数据导论

towardsdatascience.com](/journey-into-data-mining-3b5ccfa5343)**

接下来,我们将分别讨论数据对象之间的相似性和不相似性。事不宜迟,让我们开始吧。

数据对象之间的差异

我们从讨论距离开始,距离具有不同的性质。

欧几里德距离

在一维、二维、三维或更高维空间中,两点 x 和 y 之间的欧几里德距离 d 由以下公式给出:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

其中 n 是维数, x(k)y(k) 分别是 xyk属性(组件)。

举例:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

闵可夫斯基距离

它是欧几里得距离的推广。它由以下公式给出:

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

其中 r 是一个参数。以下是闵可夫斯基距离的三个最常见的例子。

r = 1 。城市街区(曼哈顿、出租车、、L1 定额)距离。一个常见的例子是汉明距离**,它是仅具有二进制属性的两个对象之间,即两个二进制向量之间不同的位数。**

r = 2 。欧几里德距离( L2 范数)。

r =无穷大。上确界( L(最大),或 L(无穷大)范数)距离。这是对象的任何属性之间的最大差异。这由以下公式定义:

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

举例:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

距离,如欧几里德距离,有一些众所周知的性质。如果 d(x,y) 是两点之间的距离, xy ,那么以下性质成立。

  1. 积极性

a) d(x,y) > 0 对于所有 xy

b) d(x,y) = 0 仅当 x = y

2.对称
d(x,y) = d(y,x) 对于所有 xy

3.三角形不等式

d(x,z) ≤ d(x,y) + d(y,z) 对于所有点 x,yz

满足所有这三个属性的度量被称为度量。****

数据对象之间的相似性

对于相似性,三角形不等式通常不成立,但对称性和正性通常成立。明确地说,如果 s(x,y) 是点 xy 之间的相似性,那么相似性的典型性质如下:

  1. s(x,y) = 1 仅当 x = y 时。(0 ≤ s ≤ 1)
  2. s(x,y) = s(y,x) 对于所有 xy 。(对称)

对于相似性度量,没有三角形不等式的一般模拟。

二进制数据的相似性度量被称为相似性系数,其值通常在 0 和 1 之间。两个二进制对象之间的比较使用以下四个量来完成:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

简单匹配系数

其定义如下:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

雅克卡系数

其定义如下:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

比较这两种相似性方法的示例:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

余弦相似度

文档通常表示为向量,其中每个属性表示特定术语(单词)在文档中出现的频率。余弦相似度,是一种最常见的度量文档相似度的方法。如果 xy 是两个文档向量,那么

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

在哪里?表示点积||x|| 定义向量 x 的长度。

****余弦相似度度量的一个例子如下:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

相关性

它是对具有二元或连续变量的对象的属性之间的线性关系的度量。两个对象 xy 之间的相关性定义如下:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

其中使用的符号在标准中定义为:

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

Introduction to Data Mining — Pang-Ning Tan, Michael Steinbach, Vipin Kumar

直到现在我们已经定义并理解了数据对象之间的相似性和不相似性度量。现在,让我们讨论一下邻近计算面临的问题。

邻近度计算中的问题

  1. 如何处理具有不同尺度和/或相关属性的酪蛋白,
  2. 如何计算由不同类型的属性(例如,定量和定性属性)组成的对象之间的接近度,以及
  3. 当属性具有不同的权重时,即当并非所有属性对对象的邻近性的贡献相等时,如何处理邻近性计算。

选择正确的邻近测量

以下是一些可能有帮助的一般观察。首先,邻近度量的类型应该适合数据的类型。对于许多类型的密集、连续数据,通常使用公制距离度量,如欧几里德距离**。**

连续属性之间的接近度通常用差异来表示,而距离度量提供了一种将这些差异组合成整体接近度的明确方法。

对于通常由不对称属性组成的稀疏数据,我们通常采用忽略 0–0 匹配的相似性度量。从概念上讲,这反映了这样一个事实:对于一对复杂的对象来说,相似性取决于它们共有的特征的数量,而不是它们都缺少的特征的数量。对于这类数据,可以使用余弦相似度雅克卡系数**。**

以上只是一些需要坚持或者可以遵循的建议。它们没有涵盖所有类型的现有数据集接近度测量的最终确定取决于问题。

我们对邻近度的讨论到此结束。

这个帖子的后续是这里

** [## 数据挖掘和机器学习中的数据预处理

有了详细的概念…

towardsdatascience.com](/data-preprocessing-in-data-mining-machine-learning-79a9662e2eb)**

我将免费赠送一本关于一致性的电子书。在这里获得你的免费电子书。

如果你喜欢阅读这样的故事,那么你应该 在你的收件箱 中收到我的帖子,如果你想支持我成为一名作家,考虑注册成为一名媒体成员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你注册使用我的链接,我会赚一小笔佣金,不需要你额外付费。

** [## 加入我的推荐链接-塔伦古普塔

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

tarun-gupta.medium.com](https://tarun-gupta.medium.com/membership)

感谢阅读。如果你喜欢这个,去看看我在这个索引中的其他文章。

[## 标记故事列表的快速链接—感谢您的访问

我也有一份以快节奏出版为目标的出版物。读书成为作家。

tarun-gupta.medium.com](https://tarun-gupta.medium.com/thank-you-for-visiting-my-profile-9f708062c75e)**

监控和改进用于训练深度学习模型的 GPU 的使用

原文:https://towardsdatascience.com/measuring-actual-gpu-usage-for-deep-learning-training-e2bf3654bcfd?source=collection_archive---------7-----------------------

关于运行权重和偏差的一个令人兴奋的事情是,我们可以研究模型如何在真实世界场景中实际使用它们的计算资源,并且,由于我们正在使监控 GPU 和内存变得容易,我们希望通过查看人们如何利用他们的计算资源来帮助我们的用户。

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

对于接受 GPU 培训的用户,我查看了他们在所有运行中的平均利用率。自发布以来,我们已经跟踪了大量用例、技术和框架的运行。近三分之一的用户平均利用率低于 15%。平均 GPU 内存使用量非常相似。我们的用户往往是经验丰富的深度学习实践者,GPU 是一种昂贵的资源,所以我很惊讶地看到如此低的平均使用率。

这里有几个简单、具体的建议来提高 GPU 的使用率,几乎适用于所有人:

  1. 在整个训练过程中持续测量您的 GPU 使用情况

不测量就无法提高 GPU 使用率。使用 nvidia-smi 等有用的工具来捕捉您的使用情况并不难,但发现问题的一个简单方法是跟踪一段时间的使用情况。任何人都可以使用我们构建的 wandb python 包,通过添加两行代码来跟踪 GPU、CPU、内存使用和其他指标

import wandb
wandb.init()

wandb.init()函数将创建一个轻量级子进程,该子进程将收集系统指标并将它们发送到 wandb 服务器,您可以在服务器上查看这些指标,并使用如下图形进行比较:

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

进行单一测量的危险在于 GPU 的使用会随着时间而变化。这是我们在用户 Boris 训练 RNN 时看到的常见模式;训练中期,他的使用率从 80%骤降到 25%左右。

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

你可以在 https://app.wandb.ai/borisd13/char-RNN/runs/cw9gnx9z/system 的看到他完整的数据和训练日志。

我们经常看到的一个与多 GPU 相关的情况是,在训练过程中,一些 GPU 停止处理任何负载。在这个示例中,两个 GPU 都开始进行计算,但几分钟后,所有负载都被发送到一个 GPU。这可能是有意的,但这通常是代码中难以捕捉的 bug 的迹象。

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

我们看到的另一个常见问题是,有很长一段时间没有使用 GPU,这通常与培训中的测试或验证阶段或一些数据预处理的瓶颈相对应。这是一个典型的图表,在 8 个 GPU 上进行训练,其中所有的 GPU 都在固定的时间间隔内关闭并等待一段时间。

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

2)确保你的 GPU 是瓶颈

这是我们看到的一种常见情况——系统内存被大量使用,并且内存使用量似乎在逐渐增加。随着内存使用率的上升,GPU 使用率下降。当人们试图在本地不可用的数据集上进行训练时,我们也经常看到网络成为瓶颈。

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

3)尝试增加你的批量

这并不是在所有情况下都有效,但是一种可能提高 GPU 利用率的简单方法是增加批处理大小。批处理的梯度通常在 GPU 上并行计算,因此只要有足够的内存将整个批处理和神经网络的多个副本放入 GPU 内存,增加批处理大小就可以提高计算速度。

如果我增加批处理大小,而其他什么都不改变,我可能会得出结论,增加批处理大小会加快计算速度,但会降低模型性能。以下是我用批量 32、64 和 128 训练 CIFAR 的结果。

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

事实上,在 StackOverflow 上有许多的论文和一个的置顶帖警告大批量生产。有一种简单的方法可以让更大的批量工作得相当好。随着批量的增加,提高学习速度。直观地说,这是有意义的,批量大小是训练算法在进行一步之前查看的样本数量,学习率大致是该步的大小。因此,如果模型看更多的例子,它可能会舒服地迈出一大步。这是在论文中推荐的一个并行化卷积神经网络的奇怪技巧以及随后的精确、大型迷你批处理 SGD:在 1 小时内训练 ImageNet中,作者在看到性能损失之前设法将批处理大小增加到 8000。

我尝试在我自己的模型上增加批量的学习率,并得到了相同的结论。当我将学习率乘以 4,将批量增加 4 时,我的模型训练得更快,每一步学习得也更快。

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

脸书的论文做了一些奇特的事情,使模型在非常大的批量下工作良好,他们能够获得相同的性能,但速度要快得多,每批高达 8000 个样本。

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

这些巨大的批量对于分布式训练来说是有意义的,论文中从较低的学习率开始,然后逐步提高的方案在这种情况下看起来非常有价值。如果你正在一个 GPU 上训练,并且没有最大化你的利用率,我有一个快速的建议:加倍你的批量大小和加倍你的学习速度。

您可以在批量报告中深入了解我运行的更多数据。

结论

GPU 变得越来越快,但如果训练代码没有完全使用它们也没关系。好消息是,对于大多数训练机器学习模型的人来说,仍然有许多简单的事情要做,这将显著提高效率。

还有另一种可能更大的资源浪费:闲置的 GPU。我们没有衡量这一点,但我从许多与我们合作的公司那里听说过。很难有效地为 GPU 排队工作,在典型的工作流程中,研究人员将设置大量的实验,等待它们完成,然后花相当多的时间消化结果,而 GPU 却处于闲置状态。这超出了 wandb 的范围,但是像 Paperspace 和亚马逊的 Sagemaker 这样的工具可以很容易地根据需要上下旋转资源。

感谢

感谢萨姆·波廷杰、凯里·菲尔普斯、詹姆斯·查姆、焰炟·厄尔利希、斯蒂芬妮·谢尔的编辑和反馈。

贝塔几何负二项分布— CLTV 预测模型

原文:https://towardsdatascience.com/measuring-customers-value-using-python-lifetimes-d8b19a04e9c1?source=collection_archive---------14-----------------------

与 CLTV 相关的近期、频率和货币

使用概率建模方法的 CLTV

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

Image by author

https://sarit-maitra.medium.com/membership

C 客户生命周期价值(CLTV)是现代以客户为中心的商业场景中最重要的指标之一。它是一个指标,表明在整个关系中,一个企业可以从单个客户那里合理期望的总收入。与 CLTV 的业务不仅量化的关系,但优先考虑的 CRM 活动,并采取必要的步骤,以保持现有的客户满意。这也有助于公司关注那些未来能带来更多收入的潜在客户。

80%的结果来自 20%的原因,这就是所谓的 80/20 法则或帕累托法则……维尔弗雷多·帕累托。

如果我们把帕累托法则放在商业环境中,我们可以有把握地假设 20%的关键客户贡献了 80%的业务收入。许多研究开发了评分机制(例如预测客户未来行为的回归模型)。在所有的实证分析中,对客户过去行为的衡量是他们未来行为的关键预测指标。通常的做法是通过调查近期、频率和货币(RFM)特征来总结客户过去的行为。

让我们使用下面一些简单的等式:

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

*客户价值=平均订单价值(AOV)购买频率

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

  • 流失率:流失率是没有再次订购的客户的百分比。
  • 客户寿命= 1/流失率
  • 流失率= 1-重复率

上面的公式看起来很简单;然而,在给定历史数据的情况下,预测未来销售额和美元值的 CLTV 测量涉及预测分析方面的复杂性。这可以使用回归技术或概率建模方法来完成。

目标:

我们的目标是建立一个概率模型,在非合同环境下预测个人业务层面的 CLTV。利用本练习的结果,经理应该能够:

  • 区分活跃客户和不活跃客户,
  • 为个人客户生成交易预测,
  • 预测整个客户群的购买量。

方法:

此处展示的随机模型以贝塔几何负二项分布(BG/NBD)框架为特色,以捕捉一段时间内的交易流。BG/NBD 讲述了客户如何/何时变得不活跃的故事。

BG/NBD 只需要关于每个客户过去购买历史的两条信息:“最近”(最近一次交易发生的时间)和“频率”(在特定时间段内进行了多少次交易)。用于表示该信息的符号是[X = x,t(x),T],其中 X 是在时间段(0,T)和 t(x) (0 < t(x) ≤T) is the time of the last transaction. Using these two key summary statistics, SMC(2) derive expressions for a number of managerially relevant quantities, such as:

E[X(t)], the expected number of transactions in a time period of length t, which is central to computing the expected transaction volume for the whole customer base over time.

P[X(t) = x], the probability of observing x transactions in a time period of length t.

E[Y (t)| X = x, t(x), T], the expected number of transactions in the period (T,T + t] for an individual with observed behavior (X = x, tx, T).

Therefore, customers will purchase at a randomly distributed interval within a time range. After each purchase they have a certain probability of dying or becoming inactive. Each customer is different and have varying purchase intervals and probability of going inactive.

Let’s explore the data.

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

BG/NBD Model:

  • Frequency (F) is the number of repeat purchases the customer has made.
  • T represents the age of the customer which is equal to the duration between a customer’s first purchase and the end of the period under study.
  • Recency ® is the age of the customer when they made their most recent purchases. This is equal to the duration between a customer’s first purchase and their latest purchase.
  • Monetary Value

After doing the necessary cleaning and creating a new data frame containing CustomerID, InvoiceDate (remove the time) and adding a new column (‘sales’) :

data[‘InvoiceDate’] = pd.to_datetime(data[‘InvoiceDate’]).dt.date
data = data[pd.notnull(data[‘CustomerID’])]
data = data[(data[‘Quantity’]>0)]
data[‘Sales’] = data[‘Quantity’] * data[‘UnitPrice’]
cols_of_interest = [‘CustomerID’, ‘InvoiceDate’, ‘Sales’]
data = data[cols_of_interest]
print(data.head())
print(data[‘CustomerID’].nunique())

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

We can make some observations here. There are 4339 customers and 12346 made single purchase, so the F and R are 0, and the T is 325 days.

df[‘frequency’].plot(kind=’hist’, bins=50)
print(df[‘frequency’].describe())
print(sum(df[‘frequency’] == 0)/float(len(data)))

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

As shown, both frequency and recency are distributed quite near 0. Among all customers, >)中观察到的交易数量,其中 38%的人只进行了零次重复购买,而其余的样本(62%)被分成两个相等的部分:31%的客户群进行了一次重复购买,而另外 31%的客户群进行了一次以上的重复购买。类似地,就近期而言,大多数消费者在他们一生中的早期进行了最后一次购买,然后变得不活跃。事实上,我们一半的客户的最后一次重复购买是在不到一年的时间内(准确地说是 252 天),因为他们第一次购买了 75 个分位数。

现在让我们开始讨论模型:

我们首先需要将客户概率模型与数据相匹配,以便它能够反映他们的行为和模式。这是通过查看每个人的频率、最近和年龄并调整其参数来实现的,以便更好地反映我们的客户群购买的时间间隔。

不同客户的参数也各不相同,因此它是通过两种分布计算的,以便更准确、更灵活地拟合数据。从数学上讲,这是通过在两个分布上取方程的期望值来完成的。

bgf = BetaGeoFitter(penalizer_coef=0.0)
bgf.fit(df[‘frequency’], df[‘recency’], df[‘T’], )
print (bgf)

# Plot
gbd = beta.rvs(bgf.params_[‘a’], bgf.params_[‘b’], size = 50000)
ggd = gamma.rvs(bgf.params_[‘r’], scale=1./bgf.params_[‘alpha’], size = 50000)
plt.figure(figsize=(14,4))
plt.subplot(121)
plt.title(‘Heterogenity of $p$’)
temp = plt.hist(gbd, 20, alpha=0.75)
plt.subplot(122) 
plt.title(‘Heterogenity of $\lambda$’)
temp = plt.hist(ggd, 20, alpha=0.75)

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

可视化 F/R 矩阵;

给定 R(上次购买的年龄)和 F(重复交易的次数),频率/最近矩阵计算客户在下一个时间段的预期交易次数。

该矩阵在 Y 轴上具有客户的最近度,在 X 轴上具有频率,并且热图组件显示了在交叉点处客户在一个单位时间内将进行的未来购买的预测数量。最有可能点餐的顾客是那些之前下过很多订单,最近才被看到的顾客。

plot_frequency_recency_matrix(bgf)

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

RF 图描绘了客户在下一年的预期购买量,以及在给定频率/近期的情况下,他们仍然存在的可能性。直观上,我们可以看到,高频率和新近性的客户有望在未来购买更多,并有更高的机会活着。白色区域的客户也很感兴趣,因为他们离开公司的几率是 50/50,但我们仍然可以预计他们在接下来的一年中会购买大约 2 到 2.5 次。这些客户可能需要一些客户服务才能回来购买更多。有趣的是,对于一个固定的近期,更频繁的客户更有可能被认为是死了。这是模型的一个属性,说明了一个清晰的行为故事:

如果我们观察到一个更长时间的不活动,而不是顾客以前的间隔时间,那么一个更频繁购物的顾客就更有可能死去。

我们可以看到,如果客户购买了 120 次,而他们最近一次购买®是在 120 天之前,那么他们就是你的最佳客户(右下角)。最冷漠的顾客是那些在右上角的顾客:他们很快买了很多东西,几个星期都没见过他们。(20,50)周围的尾部代表不经常购买,但最近没有看到的客户,所以他们可能会再次购买-我们不确定他们是已经死亡还是只是在购买之间。

每个客户活着的概率:

我们可以根据每个客户的频率和新近度来想象他们活着的概率。

plot_probability_alive_matrix(bgf)

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

最近购买的客户几乎肯定是“活着”的。那些大量购买但不是最近购买的顾客,很可能已经退出。他们过去买的越多,就越有可能辍学。它们被显示在右上方。

从最佳到最差排列客户:

让我们将客户从“下期最高预期购买量”到最低进行排序。模型揭示了一种方法,该方法将使用客户的历史记录来预测客户在下一时期的预期购买量。

t = 31*3
df[‘predicted_purchases’] = bgf.conditional_expected_number_of_purchases_up_to_time(t, df[‘frequency’], df[‘recency’], df[‘T’])
df.sort_values(by=’predicted_purchases’).tail(10)

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

此处列出了我们的前 10 名客户,该模型预计他们将在未来 3 个月内购买。我们可以看到,已经进行了 131 次购买的客户,并且是最近购买的,很可能会在下一期再次购买。predicted_purchases 列显示他们的预期购买数量,而其他三列表示他们当前的 RFM 指标。BG/NBD 模型认为,这些人在不久的将来会进行更多的购买,因为他们是当前的最佳客户。

评估模型拟合度(纳入异质性):

拟合模型后,我们有兴趣看看它与我们的数据有多相关。首先是将我们的数据与用我们拟合的模型参数模拟的人工数据进行比较。

plot_period_transactions(bgf)

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

这两者几乎相同,表明该模型非常适合,并且相当好地预测了校准周期中的周期数。未来会重复购买 0、1、2、3 … 6 次的预期顾客数量。对于每次重复购买的数量(x 轴),我们绘制出模型预测的数量和实际数量。正如我们所看到的,在最多 6 次重复购买的情况下,fit 几乎没有错误。让我们做下一个事实检查。

但是,计算总误差百分比(预测交易/实际交易-1)和校准期间完成的每笔交易的误差百分比总是一个好主意。这将有助于我们量化模型与现实的接近程度。

模型测试:

summary_cal_holdout = calibration_and_holdout_data(data, ‘CustomerID’, ‘InvoiceDate’,
 calibration_period_end=’2011–06–08',
 observation_period_end=’2011–12–9' )
print(summary_cal_holdout.head())

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

bgf.fit(summary_cal_holdout[‘frequency_cal’], summary_cal_holdout[‘recency_cal’], summary_cal_holdout[‘T_cal’])
plot_calibration_purchases_vs_holdout_purchases(bgf, summary_cal_holdout)

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

在该图中,我们将数据分为采样(校准)和验证(维持)两个阶段。样本期从年初至 2011 年 6 月 8 日;验证期跨越剩余的持续时间(2011 年 6 月 9 日至 2011 年 12 月 9 日)。该图根据重复购买的次数(x 轴)对校准期内的所有客户进行分组,然后对维持期内的重复购买进行平均(y 轴)。该图根据重复购买的次数(x 轴)对校准期内的所有客户进行分组,然后对维持期内的重复购买进行平均(y 轴)。橙色和蓝色线分别表示 y 轴的模型预测和实际结果。这些线彼此非常接近,这表明该模型在预测每个客户的订单数量方面相差不远。

该模型能够准确预测样本外客户群的行为,该模型低估了 4 次购买和 5 次购买后的行为。

客户交易预测:

根据客户历史,我们现在可以预测个人未来的购买情况:

t = 10
individual = df.loc[12347]
bgf.predict(t, individual[‘frequency’], individual[‘recency’], individual[‘T’])

0.15727742663038222

模型预测客户(id:12347)未来 10 天的交易为 0.157。

关键要点:

客户是企业最重要的资产,CLTV 允许在客户群中评估他们当前和未来的价值。CRM 策略和营销资源分配是基于这一指标。如果我们考虑以客户为中心的业务,企业不仅需要预测客户的保留率,还需要分析客户的购买行为。BG/NBD 是与帕累托/NBD 相关的行为故事中的一个微小变化,但是更容易实现。从指数分布过渡到几何过程(以捕捉顾客流失)不需要任何不同的心理学理论,也没有任何值得注意的管理含义。

我可以到达这里

衡量金融动荡和系统风险

原文:https://towardsdatascience.com/measuring-financial-turbulence-and-systemic-risk-9d9688f6eec1?source=collection_archive---------9-----------------------

这个项目展示了两种测量金融风险的独特方法。

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

内容

简单地

这个项目展示了两种测量金融风险的独特方法。

金融动荡指标衡量全球金融市场随时间的波动。这很重要,因为:

  1. **我们可以预测金融动荡的未来路径,**因为金融动荡在时间上是高度持续的。
  2. 在金融动荡时期,你可以通过规避风险资产来省钱,因为金融资产价格在动荡时期往往会下跌(相对于非动荡时期而言)。

马克·克里茨曼和李元镇在他们题为“头骨、金融动荡和风险管理” (2010)的论文中讨论了这两种说法。

系统性风险指标衡量全球金融市场长期以来的系统性风险。这很重要,因为如果系统性风险很高,那么全球金融市场就彼此“紧密耦合”,这表明金融冲击往往会传播得更快、更广。马克·克里兹曼、李元镇、塞巴斯蒂安·佩奇和罗伯托·里戈本在“作为系统风险衡量标准的主要成分” (2010)中支持这一观点。

一个有用的类比:《三只小猪》

使用这个类比,系统风险处理的是你的房子是用稻草、树枝还是砖块建造的。湍流处理大坏狼在你家吹得有多厉害。因此,系统性风险并不一定表明金融危机迫在眉睫,只是表明全球市场更容易受到动荡的影响。

本文的其余部分将如下进行。

金融动荡指标

Kritzman 和李(2010)提出了基于马氏距离的“金融动荡的数学度量”。

**定性:**金融动荡是指

  • 资产价格的波动异常之大。
  • 资产价格变动违反了现有的相关性结构(相关资产的“脱钩”和不相关资产的“趋同”)。

如果两个条件都满足,湍流将比仅满足其中一个条件时更高。

定量:

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

From “Skulls, Financial Turbulence, and Risk Management” (2010)

金融动荡的用例包括对投资组合进行压力测试,构建抗动荡的投资组合,以及扩大风险敞口。更多详情请见 Kritzman 和李(2010)

本文主要关注“扩大风险敞口”用例。

我个人对计算的修改。在上面的方程(2)中,方程的左手边在我的湍流图中被称为“原始湍流”。为了创建一个更平滑,更可解释的湍流度量,我计算了“原始湍流”系列的指数加权移动平均(EWMA),并将其称为“湍流”。这意味着“湍流”系列中的每个数据点都等于所有先前“原始湍流”值的 EWMA,其中较新的“原始湍流”值被赋予较高的权重。衰减因子“alpha”设置为每个值权重的半衰期为 12 周(12 周大约相当于一个财政季度的长度)。

系统风险指标

Kritzman、Li、Page 和 Rigobon (2010)引入了“一种衡量隐含系统风险的方法,称为吸收比率”。

**定性:**如果全球资产价格变动可以大部分由少数独立因素解释,那么就存在高系统性风险。

**定量:**吸收比(AR)等于(资产收益协方差矩阵的)固定数量的特征向量所解释或“吸收”的一组资产收益的总方差的分数。

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

From “Principal Components as a Measure of Systemic Risk” (2010)

AR的主要用例是以各种方式表明市场脆弱性。更多详情见 Kritzman 等人(2010)

本文着重于使用 AR 来提供解释湍流指数的上下文。

**我个人对计算的修改。**首先,我计算 250 周(250 周大约是 5 年)的资产回报协方差矩阵。对于每个新的数据点,该窗口向前移动。第二,我的系统性风险图中的“系统性风险”系列不是使用上面的 AR 公式,而是资产收益协方差矩阵的所有特征值的基尼系数。这样我们就不用任意选择上面 AR 公式分子中的特征向量个数了。

数据集

理论上,这两个指标都可以在任何金融资产池中进行计算。为了给我的资产池选择资产,我使用了以下标准:

  1. 涵盖全球所有主要金融市场。因此,我的资产池包括 6 个国际股市指数。
  2. **包括描述多个投资者风险回报维度的资产类别。**例如:
  • 美国资产国际资产
  • 股票(有风险)对美国国债(“无风险”)
  • 侵略性行业(周期性)vs. 防御性行业(反周期性)
  • 小市值(风险较大)与大市值(风险较小)
  • 长期债务(风险较大)与短期债务(风险较小)
  • 高收益债券(风险较高)与投资级债券(风险较低)

考虑到这些因素,最终的资产池是:

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

我使用雅虎财经获得了资产池中每项资产的每周价格/回报,因为较高频率(每日数据)包含太多的噪音(随机性),而较低频率(每月数据)包含的信息远远少于每周数据。

销售宣传(或者,“这两个指标如何为您赚钱/省钱”)

利用这两个指标作为金融危机的“预警信号”,投资者可以获得更高的绝对收益更低的波动性(如下图所示)。

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

本文的剩余部分将追踪上图中假设的“基于湍流的策略”的主要决策点。

考虑一个可以做出以下三种选择的投资者:

  1. 100%投资于美国股市(标准普尔 500 指数)。
  2. 50%投资于美国股票市场。
  3. 0%投资于美国股市(投资者持有现金)。

让我们从这位投资者的角度出发,从 1996 年 11 月开始。他 100%投资于美国股市。决策点在以下图表中进行了编号。上图是动荡,下图是系统性风险。

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

Top chart is Turbulence, bottom chart is Systemic Risk

**第 1 号决定:**1998 年 8 月 28 日。1997 年亚洲金融危机发生在去年。动荡指数已经飙升至 5.53(高于一个月前的 4.85),所以现在可能是从桌上拿走一些钱的好时机。将股票市场敞口降至 50%。

**第 2 号决定:**2003 年 6 月 6 日。此前几年经历了几次动荡(1998 年俄罗斯金融危机和 LTCM 救助,科技股泡沫)。既然震荡像再次跌破 4.50,现在是重新进入市场的好时机。不断上升的系统性风险并不令人担忧,因为动荡一直在稳步下行。将股票市场敞口增加到 100%。

第 3 号决定:2007 年 8 月 24 日。湍流指数飙升至 4.07(高于 5 周前的 3.05)。这一点再加上几年来累积的系统性风险,凸显了谨慎的必要性。将股票市场敞口降至 50%。

第 4 号决定:2008 年 3 月 28 日。湍流指数飙升至 5.72,(高于两周前的 5.05)。系统性风险最近也有所上升。事情可能很快会变得糟糕,所以将股票市场敞口降至 0%。

2009 年 10 月 23 日第 5 号决定。随着次贷危机最糟糕的时期过去,动荡指数降至 5.00 以下,并似乎呈下降趋势。将股票市场敞口提高至 50%。

**第 6 号决定:**2010 年 5 月 3 日。动荡跌破 4.00,继续其下降趋势。将股票市场敞口提高至 100%。

**第 7 号决定:**2011 年 19 月 8 日。我们正处于欧洲债务危机的阵痛之中。动荡指数跃升至 4.10(高于 4 周前的 3.33),系统性风险仍在上升。将股票市场敞口降至 50%。

第 8 号决定:2012 年 4 月 27 日。欧洲债务危机似乎暂时得到了控制。尽管系统性风险继续增加,但动荡已降至 3.50 以下,因此将股票市场敞口提高至 100%。

**第 9 号决定:**2016 年 5 月 2 日。动荡在 4.00 以上蔓延,而系统性风险已经积累了几年。与此同时,经济乐观情绪开始降温。现在似乎是将股票市场敞口降至 50%的好时机。

第 10 号决定:2016 年 2 月 9 日。随着市场紧张情绪的消退,动荡回落到 3.50 以下,这表明将股票市场敞口增加到 100%是安全的。

要通过电子邮件定期接收指标值更新,请点击此处

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

如果您还有任何问题,请随时联系我

测量机器学习

原文:https://towardsdatascience.com/measuring-machine-learning-945a47bd3750?source=collection_archive---------12-----------------------

从台式机,到单板机,再到微控制器

Talking at Crowd Supply’s Teardown conference in Portland, OR, on Saturday the 22nd of June 2019.

这是我 2019 年 6 月在俄勒冈州波特兰市举行的 Crowd Supply拆机 大会上的演讲记录。虽然视频是给定的谈话,但文字稿已经扩展了一些自它出现以来发生的事件的细节。

机器学习传统上与重型、耗电的处理器联系在一起。它是在大型服务器上完成的。即使采集数据的传感器、摄像头和麦克风本身是本地的,控制它们的计算机却在远处,决策过程都托管在云中。但这正在改变,事情正在走向边缘。

现在,对于任何已经存在一段时间的人来说,这不会是一个惊喜,因为在整个行业的历史中,取决于技术的状态,我们似乎在瘦客户端和胖客户端架构之间摇摆不定。要么我们的大部分计算能力和存储隐藏在机架中,有时是远程服务器,要么是在离家更近的大量分布式系统中。我们又回到了分布式系统。或者至少是两者的混合体。这并不奇怪,机器学习有一个相当好的划分,可以在开发和部署之间进行。

最初,算法是在一大组样本数据上训练的,这通常需要一个快速强大的机器或集群,但然后将训练好的网络部署到需要实时解释真实数据的应用程序中,这非常适合低功耗的分布式系统。毫无疑问,在这个部署或“推理”阶段,我们看到了向本地处理或边缘计算的转变,如果你想用最新的术语来说,就是现在。

这是一件好事。最近,马萨诸塞大学阿姆赫斯特分校的研究人员为训练几种常见的大型人工智能模型进行了生命周期评估。他们发现,这一过程可以排放相当于超过 62.6 万磅的二氧化碳——几乎是普通美国汽车一生排放量的五倍。

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

Source: Strubell et al. (📊: MIT Technology)

现在我已经听到了很多关于这项研究的消息,我对它有一些问题,以及它如何看待机器学习。首先,它关注的机器学习类型是自然语言处理(NLP)模型,这是社区中正在发生的事情的一小部分。

但这也是基于他们自己的学术工作,他们的最后一篇论文,他们发现建立和测试最终论文价值模型的过程需要在六个月的时间内训练 4789 个模型。这不是我在现实世界中训练和建立任务模型的经验。这种分析到目前为止还不错,但是它忽略了一些关于如何使用模型的事情,关于开发和部署这两个阶段。

因为使用一个经过训练的模型并不需要花费任何资源来训练它,就像软件一样,一旦经过训练,模型就不再是实物了。它不是一个物体。

一个人使用它并不能阻止其他人使用它。

你必须将沉没成本分摊给使用它的每个人或每个对象——可能是数千甚至数百万个实例。在一些会被大量使用的东西上投入很多是可以的。这也忽略了这些模型可能存在多久的事实。

我成年后的第一份工作是在一家现已倒闭的国防承包商工作,当时我刚从大学毕业。在那里,除了其他事情,我建立了视频压缩的神经网络软件。要明确的是,这是在第一次,也许是第二次,机器学习流行的时候,回到 90 年代初,那时机器学习还被称为神经网络。

我围绕神经网络构建的压缩软件在视频流中留下了相当具体的假象,如今我仍不时在视频中看到某些大型制造商的产品中出现这些假象,这些制造商可能在国防承包商破产后以低价收购了该承包商的知识产权。

那些网络,大概现在被埋在一个包裹在黑盒子里的软件堆栈的底部,外面写着“这里是魔法”——我留下的文档可能是那么糟糕——因此仍然存在,大约 25 到 30 年后。

这使得接近预先训练好的模型变得相当重要,也就是俗称的“模型动物园”。因为当你在一个训练过的模型和一个二进制文件,模型被训练过的数据集和源代码之间做类比时。事实证明,这些数据对你——或者至少对大多数人——没有训练好的模型有用。

因为让我们现实一点。机器学习最近成功背后的秘密不是算法,这种东西已经潜伏在后台几十年了,等待计算赶上来。相反,机器学习的成功在很大程度上依赖于谷歌等公司设法建立的训练数据语料库。

在很大程度上,这些训练数据集是秘方,由拥有它们的公司和个人紧密持有。但这些数据集也变得如此之大,以至于大多数人,即使他们有,也无法存储它们,或基于它们训练新的模型。

所以不像软件,我们想要源代码而不是二进制代码,我实际上认为对于机器学习,我们大多数人想要模型,而不是数据。我们大多数人——开发人员、硬件人员——应该着眼于推理,而不是训练。

公平地说,我现在先声明这是一个相当有争议的观点。

然而,正是预训练模型的存在,让我们能够在机器学习的基础上轻松快速地构建原型和项目。这是那些不关注机器学习,而只想把事情做好的人真正想要的。

A retro-rotary phone powered by AIY Projects Voice Kit and a Raspberry Pi. (📹: Alasdair Allan)

直到去年,中端单板计算机,如 Raspberry Pi,还在努力达到其能力的极限,在不与云通信的情况下,执行相当简单的任务,如热词语音检测。然而,在过去的一年里,事情发生了很大的变化。

因为在过去一年左右的时间里,人们意识到并不是所有的事情都可以或者应该在云中完成。旨在以大幅提高的速度运行机器学习模型的硬件的到来,以及在相对较低的功耗范围内,不需要连接到云,开始使基于边缘的计算对许多人来说更具吸引力。

围绕边缘计算的生态系统实际上已经开始感觉到足够成熟,真正的工作终于可以完成了。这就是加速器硬件的用武之地,比如谷歌的 Coral Dev Board,这些都是领先的指标。

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

The Coral Dev Board from Google. (📷: Alasdair Allan)

在这个可笑大小的散热器下面是一个叫做边缘 TPU 的东西。这是我们在过去六个月左右看到的定制硅浪潮的一部分。旨在加速边缘的机器学习推理,不需要云。不需要网络。拿数据来说。根据数据采取行动。把数据扔掉。

但这是一个关于数据隐私的完全不同的话题。

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

The Edge TPU performance demo. On the left we have MobileNet SSD model running on the Edge TPU, on the right we have the same model running on the CPU of the Dev Board, a quad-core ARM Cortex A53. The difference is dramatic, inferencing at around 75 frames per second, compared to 2 frames per second.

新一代定制硅的差异是巨大的,目前市场上有谷歌、英特尔和英伟达的硬件,较小公司的硬件即将推出,或已经投入生产。

其中一些旨在加速现有的嵌入式硬件,如 Raspberry Pi,而另一些则设计为模块上系统(SoM)单元的评估板,将于今年晚些时候量产。

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

An edge computing hardware zoo. Here we have the Intel Neural Compute Stick 2 (left, top), a Movidus Neural Compute Stick (left, bottom), the NVIDIA Jetson Nano (middle, top), a Raspberry Pi 3, Model B+ (middle, bottom), a Coral USB Accelerator (right, top), and finally the Coral Dev Board (right, bottom).

但在我们研究定制芯片之前,我们应该先看看树莓派。直到最近树莓 Pi 3 的型号 B+ 是你能买到的最快的树莓 Pi,它是围绕 64 位四核 ARM Cortex-A53 构建的,主频为 1.4GHz。你应该记住 Cortex-A53 不是一个性能核心,它被设计为一个中档核心,为了提高效率。

上安装 TensorFlow 的树莓 Pi 曾经是一个困难的过程,然而到了去年年中,一切都变得容易多了

**$** sudo apt-get install libatlas-base-dev
**$** sudo apt-get install python3-pip
**$** pip3 install tensorflow

然而,它实际上有点有趣,很难找到一个关于如何做推理的好教程。你会发现很多关于“如何开始张量流”的教程都在谈论训练模型,有些甚至在你训练完模型后就停止了。他们懒得用它。

我觉得这有点令人费解,大概这说明了目前围绕机器学习的社区文化。仍然有点模糊,学术性质的。你会在密码学中看到类似的怪异之处,很多关于数学的讨论,却很少使用它

无论如何,当你使用一个物体检测模型,比如 MobileNet,你期望返回一个边界框时,这大概就是你对一幅图像进行推理的方式。

def inference_tf(image, model, label):
  labels = ReadLabelFile(label) with tf.gfile.FastGFile(model, 'rb') as f:
  graph_def = tf.GraphDef()
  graph_def.ParseFromString(f.read()) with tf.Session(config=tf_config) as sess:
  sess.graph.as_default()
  tf.import_graph_def(graph_def, name='') picture = cv2.imread(image)
  initial_h, initial_w, channels = picture.shape
  frame = cv2.resize(picture, (300, 300))
  frame = frame[:, :, [2, 1, 0]]  # BGR2RGB
  frame = frame.reshape(1, frame.shape[0], frame.shape[1], 3) **out = sess.run([sess.graph.get_tensor_by_name('num_detections:0'),
              sess.graph.get_tensor_by_name('detection_scores:0'),
              sess.graph.get_tensor_by_name('detection_boxes:0'),
              sess.graph.get_tensor_by_name('detection_classes:0')],
              feed_dict={'image_tensor:0': frame})** num_detections = int(out[0][0])
  for i in range(num_detections):
    classId = int(out[3][0][i])
    score = float(out[1][0][i])
    print(labels[classId], 'score = ', score)

给我们的代码一个包含两个可识别对象测试图像,一个香蕉和一个苹果,给了我们合理形状的边界框。

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

Our test image 🍎🍌and resulting bounding boxes.

使用谷歌的 MobileNet 模型 v2 和 v1 对进行基准测试时,运行代码给我们大约每秒 2 帧。现在,v1 模型的处理器密集程度比 v2 稍低,通常返回的检测结果可信度也稍低。我还使用了一种叫做“深度方向可分离卷积”的东西来减少模型的大小和复杂性,这样会降低检测的可信度,但会加快速度。无论如何,每秒 2 帧并不太好。但是它给了我们一个码尺来查看加速器硬件。

现在,英特尔率先向市场推出旨在加速机器学习的定制芯片。他们实际上远远领先于其他人,因为他们收购了一家名为 Movidius 的初创公司,然后在 2016 年重新命名了他们的芯片。采用有点缓慢,但定制硅已经在许多地方出现,大多数你看到宣传自己为机器学习加速器的板、卡、棒和其他部件实际上都基于它。

我们来看看英特尔自己的产品,叫做神经计算棒。事实上,已经有两代英特尔硬件围绕两代 Movidius 芯片发展起来。

我的桌子上有这两个,不出所料,我是一个早期采用者。

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

The Intel Neural Compute Stick 2. (📷: Alasdair Allan)

现在事情开始变得有点棘手了。因为不幸的是,你不能只在英特尔的硬件上使用 TensorFlow。你必须使用他们的 OpenVINO 框架,当然这意味着你不能只是使用现成的 TensorFlow 模型。

幸运的是,你可以 TensorFlow 模型转换为 OpenVINO 的 IR 格式,这很好,因为如果你试图比较事情的时间,你可能会希望所有东西都或多或少保持相同,这意味着我真的需要在这里和其他地方使用相同的模型。然而,这被证明是一个症结,因为我们需要转换 TensorFlow 模型的软件不包括在安装在树莓 Pi 上的 OpenVINO 工具包的精简版本中。

这意味着我们需要一台运行 Ubuntu Linux 并安装了 OpenVINO 的 x86 机器。幸运的是,我们不需要连接神经计算棒。我们只需要一个完整的 OpenVINO 安装,我们可以在云中完成。因此,最简单的方法是在像数字海洋这样的云提供商上启动一个实例,然后在云实例上安装 OpenVINO 工具包并运行模型优化器,这是一款可以将我们的 TensorFlow 模型转换为英特尔的 OpenVINO IR 格式的软件。

不幸的是,事实证明将模型从 TensorFlow 转换到 OpenVINO 是一种黑色艺术,并且除了最基本的模型之外,说明并没有真正涵盖如何转换任何东西。不是公式化的。据我所知,获得这方面帮助的最好也是唯一的地方是英特尔开发人员专区的计算机视觉论坛。整个事情非常令人沮丧,需要对你要转换的模型的细节有一个适度深入的理解。

但是一旦你最终转换了你的模型,你就可以用你的图像来反对它。代码略有不同,但只有在细节上,基本内容是一样的。

def inference_openvino(image, model, weights, label):
  labels = ReadLabelFile(label) plugin = IEPlugin(device="MYRIAD")
  net = IENetwork(model=model, weights=weights) input_blob = next(iter(net.inputs))
  out_blob = next(iter(net.outputs)) exec_net = plugin.load(network=net) picture = cv2.imread(image)
  initial_h, initial_w, channels = picture.shape
  frame = cv2.resize(picture, (w, h))
  frame = frame.transpose((2, 0, 1)) 
  frame = frame.reshape((n, c, h, w)) **res = exec_net.infer(inputs={input_blob: frame})** if res:
   res = res[out_blob]
   for obj in res[0][0]:
     if ( obj[2] > 0.6):
       class_id = int(obj[1])
       print(labels[class_id], 'score = ', obj[2])

这里我们得到了更好的性能,大约每秒 10 帧。因此,通过将您的推理卸载到英特尔的 Movidius 芯片上,我们看到了 5 倍的改进。尽管你应该记住我们在这里对神经计算棒并不完全公平,但 Raspberry Pi 3 只有 USB 2,而神经计算棒是 USB 3 设备。会有节流问题,所以你看不到全速优势,你可以看到。

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

The NVIDIA Jetson Nano. (📷: Alasdair Allan)

接下来是 NVIDIA Jetson Nano 。围绕一个 64 位四核 Arm Cortex-A57 CPU 运行在 1.43GHz,旁边是一个 NVIDIA Maxwell GPU 和 128 CUDA 核心。这是一个相当重的硬件,它真的需要可笑大小的散热器。

现在,理论上我们可以将 TensorFlow 模型放在 NVIDIA 硬件上,但事实证明,虽然它可以工作,但一切都运行得非常慢。傻乎乎地慢慢。看着计时,我有点怀疑“本地”TensorFlow 是否真的被卸载到 GPU 上。如果你想让事情快速运行,你需要使用 NVIDIA 的 TensorRT 框架优化你的 TensorFlow 模型,可以预见的是这是愚蠢的困难。虽然实际上不像试图使用英特尔的 OpenVINO 工具包那样不透明。

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

TensorFlow (on the left, dark blue bars) and TensorRT models (on the right, the light blue bars).

然而,在使用 TensorRT 优化您的模型后,事情进行得更快了,Jetson Nano 具有大约每秒 15 帧的推理性能

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

The Coral Dev Board from Google. (📷: Alasdair Allan)

回到 Coral Dev 板。该板是围绕 ARM 四核 Cortex-A53 构建的,带有一个可移动的模块上系统,带有谷歌的 Edge TPU 。这是他们的加速器硬件做所有的工作。Dev 板本质上是 EdgeTPU 的演示板。但是,与英特尔和 Movidius 不同的是,看起来谷歌并不打算只销售硅片。如果你想在 TPU 边缘地区制造产品,你必须在 SoM 上购买,今年晚些时候它将会大量上市。

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

The Coral USB Accelerator. (📷: Alasdair Allan)

然而,你也可以在类似神经计算棒的形状因子中获得 EdgeTPU,尽管谷歌的 USB 加速器棒有一个 USB-C 连接器。

可以预见的是,你当然不能只使用现成的张量流模型。Coral hardware 希望 TensorFlow Lite 模型能够在 Edge TPU 上运行。

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

这是量化第一次出现。TensorFlow Lite 旨在在移动和嵌入式硬件上运行特别优化(量化)的模型。神经网络的量化使用允许降低权重的精度表示的技术,并且可选地,激活 s 用于存储和计算。

本质上,我们用 8 位来表示张量,而不是 32 位数字。这使得低端硬件上的事情更容易,但也使得硬件上的事情更容易优化,因此有了边缘 TPU。

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

一旦您将 TensorFlow 模型转换为 TensorFlow Lite,这与您的预期一样痛苦,并且只适用于以“量化感知”方式训练的模型。你必须把模型扔给 EdgeTPU 编译器。这曾是网络版,但现在也有了离线版。

def inference_edgetpu(image, model):
   engine = DetectionEngine(model)
   labels = ReadLabelFile(label) img = Image.open(image)
   initial_h, initial_w = img.size
   frame = img.resize((300, 300)) **ans = engine.DetectWithImage(frame, threshold=0.05,
                                relative_coord=False, top_k=10)** if ans:
     for obj in ans:
       print(labels[obj.label_id], 'score = ', obj.score)

另一方面,一旦你有了 TensorFlow Lite 格式的模型,使用推理机的代码就非常简单了。运行速度也快了很多,我们在这里看到的是每秒 50 到 60 帧。

我们也是吗?嗯,看起来这个

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

谷歌的 EdgeTPU 击败了所有竞争者,甚至当我通过 Raspberry Pi 上的 USB 2 连接 USB 加速器而不是使用完整的 USB 3 连接来抑制它时。当连接到 USB 3 时,我希望它的性能或多或少与开发板相当。

不出所料,Jetson Nano 位居第二,两代英特尔硬件都在后面,虽然他们有先发优势,但这也意味着硬件时代开始显现。

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

Inferencing speeds in milli-seconds for MobileNet SSD V1 (orange) and MobileNet SSD V2 (red) across all tested platforms. Low numbers are good!

那么,优势 TPU 硬件胜出?

不,这么快。Coral 硬件的一大优势是量化,如果我们在其他平台上使用 TensorFlow Lite 会发生什么。嗯,它在英特尔硬件上根本不能工作,只有 OpenVINO 支持。

然而,尽管现在还为时尚早,TensorFlow Lite 最近引入了对 GPU 推理加速的支持。使用具有 GPU 支持的 TensorFlow Lite 运行模型应该可以减少在 Jetson Nano 上进行推理所需的时间。这使得 NIVIDIA 和 Google 平台之间的差距有可能在未来缩小。据我所知,大约一周前,他们在努力追捕。

但我们能做的,是再看看树莓派。

可惜 Google 维护的官方 TensorFlow wheel 没有收录 TensorFlow Lite,真的不知道为什么。但幸运的是,有一个社区维护的轮子可以做到这一点。

**$** sudo apt-get update
**$** sudo apt-get install build-essential
**$** sudo apt-get install git
**$** sudo apt-get install libatlas-base-dev
**$** sudo apt-get install python3-pip
**$** git clone [https://github.com/PINTO0309/Tensorflow-bin.git](https://github.com/PINTO0309/Tensorflow-bin.git)
**$** cd Tensorflow-bin
**$** pip3 install tensorflow-1.13.1-cp35-cp35m-linux_armv7l.whl

使用 TensorFlow Lite 的代码与 TensorFlow 有些不同,比它的老大哥更深入底层。但是看起来差不多。

def inference_tf(image, model, label):
 labels = ReadLabelFile(label) interpreter = tf.lite.Interpreter(model_path=model)
 interpreter.allocate_tensors() input_details = interpreter.get_input_details()
 output_details = interpreter.get_output_details()
 height = input_details[0]['shape'][1]
 width = input_details[0]['shape'][2]
 floating_model = False picture = cv2.imread(image)
 initial_h, initial_w, channels = picture.shape
 frame = cv2.resize(picture, (width, height))
 input_data = np.expand_dims(frame, axis=0) interpreter.set_num_threads(4)
 interpreter.set_tensor(input_details[0]['index'], input_data)
 **interpreter.invoke()** detected_boxes = interpreter.get_tensor(output_details[0]['index'])
 detected_class = interpreter.get_tensor(output_details[1]['index'])
 detected_score = interpreter.get_tensor(output_details[2]['index'])
 num_boxes = interpreter.get_tensor(output_details[3]['index']) for i in range(int(num_boxes)):
   classId = int(detected_class[0][i])
   score = detected_score[0][i]
   print(labels[classId], 'score = ', score)

我们看到原始 TensorFlow 图和使用 TensorFlow Lite 的新结果之间的推理速度增加了大约 2 倍。

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

左边的黄色条是 TensorFlow Lite 结果,右边的红色条是我们的原始 TensorFlow 结果。似乎对物体检测的可信度没有任何影响。

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

这让你怀疑是否有量化的东西。因为看起来你真的不需要更多的准确性。

就在上个月,Xnor.ai 终于发布了他们的 AI2GO 平台公测版。他们一直在进行封闭测试,但我听到关于他们的传言已经有一段时间了。他们做的不是 TensorFlow,甚至不是很接近。这是新一代的二进制体重模型。有一些技术白皮书,我目前正在费力地阅读它们。

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

但是测试这些东西很容易。您可以在线配置一个模型“包”,然后将其下载并安装为 Python wheel。

**$** pip3 install xnornet-1.0-cp35-abi3-linux_armv7l.whl
Processing ./xnornet-1.0-cp35-abi3-linux_armv7l.whl
Installing collected packages: xnornet
Successfully installed xnornet-1.0
**$**

推理就是这么简单,一个图像进去,一个检测到的物体列表和相关的边界框出来。

def inference_xnor(image):
  model = xnornet.Model.load_built_in()
  img = Image.open(image)
  initial_w, initial_h = img.size 
  picture = img.resize((300, 300)) **boxes = model.evaluate(xnornet.Input.rgb_image(picture.size,
                                                 picture.tobytes()))** for box in boxes:
    label = box.class_label.label
    print ('Found', label)

然而,给 AI2GO 我们的测试图像包含两个可识别的物体,一个香蕉和一个苹果,与我们习惯于 TensorFlow 的边界框相比,确实给了我们一些奇怪的边界框。

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

Our test image 🍎🍌and resulting bounding boxes for TensorFlow (left) and AI2GO binary weight models (right).

这有点不同。没有错。不疯狂。但绝对不一样。

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

但是把它放在一边,它真的很快,比 TensorFlow Lite 快 2 倍,TensorFlow Lite 比 tensor flow 快 2 倍。

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

将此结果与我们的原始结果进行比较,这使得树莓 Pi 3,模型 B+几乎可以与除 Edge TPU 之外的所有产品相竞争,当然,Edge 也使用量化模型。

这让你想知道我们是否已经提前开始优化硬件,只是有点太快了。如果我们可以从软件中获得那么多的杠杆作用,那么也许我们需要等到嵌入式领域的软件足够成熟,这样我们才知道优化什么?这也使得微软决定暂时坚持使用 FPGA,而不是像其他人一样推出自己的定制 ASIC,看起来更加明智。

只是一些值得思考的东西…

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

The new Raspberry Pi 4, Model B. (📷: Alasdair Allan)

这也使得最近刚刚发布的新款树莓 Pi 4,Model B 的到来更加有趣。因为虽然我们还不能运行 TensorFlow Lite,但我们可以让 TensorFlow 和 Xnor.ai AI2GO 框架在新板上工作。

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

Inferencing time in milli-seconds for the Raspberry Pi 3 (blue, left) and Raspberry Pi 4 (green, right).

NEON 的容量大约是 Raspberry Pi 3 的两倍,对于编写良好的 NEON 内核来说,我们可以期待这样的性能提升。正如预期的那样,我们看到原始 TensorFlow 基准测试和 Raspberry Pi 4 的新结果之间的推理速度提高了大约 2 倍,同时使用 Xnor AI2GO 平台的推理速度也有类似的提高。

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

然而,当我们从谷歌的 Coral USB 加速器的结果中看到一个更大的变化。Raspberry Pi 4 增加了 USB 3.0,这意味着我们看到原始结果和新结果之间的推理速度提高了大约 3 倍。

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

Inferencing time in milli-seconds for the for MobileNet v1 SSD 0.75 depth model (left hand bars) and the MobileNet v2 SSD model (right hand bars), both trained using the Common Objects in Context (COCO) dataset with an input size of 300×300. The (single) bars for the Xnor AI2GO platform use their proprietary binary weight model. All measurements on the Raspberry Pi 3, Model B+, are in yellow, measurements on the Raspberry Pi 4, Model B, in red. Other platforms are in green.

相反, Coral USB 加速器通过 USB 2 而不是新的 USB 3 总线连接时的推理时间实际上增加了 2 倍。这个有点令人惊讶的结果很可能是由于新的 Raspberry Pi 的架构变化。随着 XHCI 主机现在位于 PCI Express 总线的远端,系统中潜在地存在更多的延迟。根据流量模式,您可以想象,与流相反,阻塞使用通道可能会更慢。

新的 Raspberry Pi 4 的性能提升使其成为一个非常有竞争力的边缘机器学习推理平台,与所有定制芯片相比,它的表现相当好。

当然,在加速器硬件出现的同时,我们也看到了机器学习在低功耗硬件上的出现。

微控制器,不是微处理器,我到目前为止谈论的定制硅实际上是嵌入式硬件堆栈的高端。

今年早些时候在 TensorFlow 开发峰会上正式宣布的面向微控制器的 TensorFlow Lite】。这是专门为裸机系统设计的 TensorFlow 发行版,核心库只有 16KB。绝对清楚。虽然玩加速器硬件很有趣,而且它确实很快,但我实际上有点认为这是边缘计算的未来。

现在还为时尚早,但我开始认为,未来一两年,机器学习实践中最大的增长领域很可能是推理,而不是训练。

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

The OpenMV Cam H7 with an IR camera running blob tracking during ARM Dev Day. (📷: Alasdair Allan)

世界上有很多相机,这可能是我们最好的传感器,加入机器学习会让这些传感器变得更好。在微控制器上运行的 TensorFlow Lite 使这一点变得非常重要,它使这一点在那些相机中已经可用的功率和处理范围内变得容易实现。

你是否认为那是一个好主意是另一回事。

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

The SparkFun Edge board, top (left) and bottom (right).

SparkFun Edge 是一块旋转起来充当微控制器 TensorFlow Lite 演示板的板。它是围绕 Ambiq Micro 的最新 Apollo 3 微控制器构建的。这是一款 ARM Cortex-M4F,运行频率为 48MHz,采用 96MHz 突发模式,内置蓝牙。

它使用每 MHz 6 到 10 μA 的电流。因此,在深度睡眠模式下,蓝牙关闭时,功耗仅为 1 μA。这是非常低的功耗,Raspberry Pi 的功耗约为 400 mA,相比之下,ESP32 的功耗在 20 到 120 mA 之间。可能是最接近的比较,北欧的 nRF52840 大约消耗 17mA。该主板的核心芯片运行速度最快,功耗预算低于许多微控制器在深度睡眠模式下的功耗,它运行 TensorFlow Lite。

The TensorFlow Lite for Micro-controllers “Yes/No” demo.

在由单个硬币电池供电的微控制器板上进行实时机器学习,应该可以持续几个月,甚至几年。不需要云,不需要网络,没有私人信息离开董事会。

至少在公开市场上,目前这是在我们当前硬件能力的绝对极限下的机器学习,它不会比这更便宜或更弱,至少在最近之前。

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

The SparFun Artemis.

这是 SparkFun Artemis 。同样的 Ambiq Apollo 3 芯片,在一个 10 × 15 mm 的模块中,应该在下个月的某个时候通过 FCC/CE 的批准,如果一切顺利,在那之后很快就可以量产了。

它完全兼容Arduino,因为 SparkFun 已经在 Ambiq 的硬件抽象层之上构建了自己的内部 Arduino 内核。现在,您可以在 Arduino 开发环境中使用这款低功耗芯片,如果您需要更低的级别,可以从您的 Arduino 代码进入 HAL。

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

The “official” Google port of TensorFlow Lite for Micro-controllers.

当然,有人将 TensorFlow 演示和用于微控制器的 TensorFlow Lite 一起移植到 Arduino 开发环境只是时间问题。结果是阿达果先到达那里。

从 Arduino 环境中提供用于微控制器的 TensorFlow Lite 是一件大事,就像更多预训练模型的可用性一样,这将是新兴边缘计算市场中机器学习可访问性的巨大变化。可以说,或许推动 Espressif ESP8266 成功的主要因素之一是 Arduino 兼容性的到来。

看看机器学习是否也会发生同样的事情,这将是一件令人着迷的事情。

链接到以前的基准

如果您对之前基准测试的细节感兴趣。

[## 基准边缘计算

比较 Google、Intel 和 NVIDIA 加速器硬件

medium.com](https://medium.com/@aallan/benchmarking-edge-computing-ce3f13942245) [## 在 Raspberry Pi 上测试 TensorFlow 和 TensorFlow Lite

我最近坐下来对市场上出现的新加速器硬件进行了基准测试,旨在加快…

blog.hackster.io](https://blog.hackster.io/benchmarking-tensorflow-and-tensorflow-lite-on-the-raspberry-pi-43f51b796796) [## 在 Raspberry Pi 上测试 Xnor AI2GO 平台

我最近坐下来对市场上出现的新加速器硬件进行了基准测试,旨在加快…

blog.hackster.io](https://blog.hackster.io/benchmarking-the-xnor-ai2go-platform-on-the-raspberry-pi-628a82af8aea) [## 在新的 Raspberry Pi 4,Model B 上对机器学习进行基准测试

新的树莓派快了多少?这样快多了。

blog.hackster.io](https://blog.hackster.io/benchmarking-machine-learning-on-the-new-raspberry-pi-4-model-b-88db9304ce4)

入门指南的链接

如果你对我在基准测试期间使用的任何加速器硬件感兴趣,我已经为我在分析期间查看的谷歌、英特尔和英伟达硬件整理了入门指南。

[## 手动珊瑚开发板

开始使用谷歌新的 Edge TPU 硬件

medium.com](https://medium.com/@aallan/hands-on-with-the-coral-dev-board-adbcc317b6af) [## 如何使用 Raspberry Pi 将新固件刷新到 Coral Dev 板上

开始使用谷歌新的 Edge TPU 硬件

medium.com](https://medium.com/@aallan/how-to-use-a-raspberry-pi-to-flash-new-firmware-onto-the-coral-dev-board-503aacf635b9) [## 亲手操作 Coral USB 加速器

开始使用谷歌新的 Edge TPU 硬件

medium.com](https://medium.com/@aallan/hands-on-with-the-coral-usb-accelerator-a37fcb323553) [## 开始使用英特尔神经计算棒 2 和 Raspberry Pi

英特尔 Movidius 硬件入门

blog.hackster.io](https://blog.hackster.io/getting-started-with-the-intel-neural-compute-stick-2-and-the-raspberry-pi-6904ccfe963) [## NVIDIA Jetson Nano 开发套件入门

英伟达基于 GPU 的硬件入门

blog.hackster.io](https://blog.hackster.io/getting-started-with-the-nvidia-jetson-nano-developer-kit-43aa7c298797)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值