TowardsDataScience 博客中文翻译 2016~2018(一百八十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

让我们用简单的数字编码一个神经网络

原文:https://towardsdatascience.com/lets-code-a-neural-network-in-plain-numpy-ae7e74410795?source=collection_archive---------0-----------------------

神经网络的秘密第三部分

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

像 Keras、TensorFlow 或 PyTorch 这样的高级框架允许我们快速构建非常复杂的模型。然而,值得花时间深入了解和理解基本概念。不久前,我发表了一篇文章,以简单的方式解释了神经网络是如何工作的。然而,这是一个高度理论化的职位,主要致力于数学,这是神经网络超能力的来源。从一开始,我就计划以更实际的方式跟进这个话题。这次我们将尝试利用我们的知识,仅使用 NumPy 构建一个完全可操作的神经网络。最后,我们还将测试我们的模型——解决简单的分类问题,并将其性能与用 Keras 构建的神经网络进行比较。

**注:**承蒙 Jakukyo 弗列尔的礼遇,你也可以用中文阅读这篇文章。显然,今天的帖子将包含大部分用 Python 编写的代码片段。然而,我希望阅读不会太无聊。:)你也会在我认为不明确或者不值得关注的地方找到短评。像往常一样,所有的源代码都可以在我的 GitHub 上获得。

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

Figure 1. Example of dense neural network architecture

重要的事情先来

在我们开始编程之前,让我们停下来准备一个基本的路线图。**我们的目标是创建一个程序,该程序能够创建一个具有指定架构(层数和大小以及适当的激活函数)的密集连接的神经网络。**这种网络的一个例子如图 1 所示。最重要的是,我们必须能够训练我们的网络,并使用它进行预测。

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

Figure 2. Neural network blueprint

上图显示了在我们的神经网络训练过程中需要执行的操作。它还显示了在一次迭代的不同阶段,我们需要更新和读取多少参数。构建正确的数据结构并巧妙地管理其状态是我们任务中最困难的部分之一。由于时间限制,我将不详细描述图中所示的每个参数的作用。我向所有感兴趣的人推荐本系列的第一篇文章,我希望你能在那里找到困扰你的所有问题的答案。

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

Figure 3. Dimensions of weight matrix W and bias vector b for layer l.

神经网络层的初始化

L et 开始初始化每层的权重矩阵 W 和偏置向量 b 。在图 3 中。我准备了一个小备忘单,它将帮助我们为这些系数分配适当的维数。上标*【l】*表示当前层的索引(从 1 开始计数),值 n 表示给定层中的单元数量。我假设描述神经网络架构的信息将以列表的形式传递给我们的程序,类似于代码片段 1 中的列表。列表中的每一项都是描述单个网络层的基本参数的字典:input_dim -作为该层的输入提供的信号向量的大小,output_dim -在该层的输出处获得的激活向量的大小,以及activation -将在该层内部使用的激活函数。

Snippet 1. A list containing parameters describing a particular neural network. This list corresponds to the NN shown in Figure 1.

如果你对这个话题很熟悉,你可能已经听到你脑海中有一个声音带着焦虑的语气说:“嘿,嘿!出事了!有些字段是不必要的……”。是啊,这次你内心的声音是对的。从一层出来的向量也是下一层的输入,所以实际上只需要知道其中一个向量的大小就足够了。然而,我特意决定使用下面的符号来保持所有层中对象的一致性,并使代码对于第一次遇到这些主题的人来说更容易理解。

Snippet 2. The function that initiates the values of the weight matrices and bias vectors.

最后,让我们把重点放在我们必须完成的主要任务上——层参数的初始化。那些已经看过代码片段 2 的代码并且对 NumPy 有一些经验的人已经注意到矩阵 W 和向量 b 已经被小的随机数填充。这种做法不是偶然的。权重值不能用相同的数字初始化,因为这会导致对称性破坏问题。**基本上,如果所有权重都相同,无论输入 X 是什么,隐藏层中的所有单元也将相同。**在某种程度上,我们陷入了初始状态,没有任何逃脱的希望,无论我们将模型训练多久,我们的网络有多深。线性代数不会原谅。

在第一次迭代中,小值的使用提高了我们算法的效率。查看 sigmoid 函数的图表,如图 4 所示,我们可以看到,对于大值,它变得几乎平坦,这对我们的神经网络的学习速度有重大影响。总之,使用小随机数进行参数初始化是一种简单的方法,但它保证了是我们算法的足够好的起点。准备好的参数值存储在 python 字典中,并带有唯一标识其父图层的关键字。字典在函数结束时返回,所以我们将在算法的下一阶段访问它的内容。

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

Figure 4. Activation functions used in the algorithm.

激活功能

A 综合了我们会用到的所有功能,有几个非常简单但功能强大。激活函数可以用一行代码编写,但是它们给了神经网络所需的非线性和表达能力。"没有它们,我们的神经网络将变成线性函数的组合,所以它本身将只是一个线性函数。"有许多激活函数,但在这个项目中,我决定提供使用其中两个的可能性——sigmoid 和 ReLU。为了能够完成整个循环并通过正向和反向传播,我们还必须准备它们的导数。

Snippet 3. ReLU and Sigmoid activation functions and their derivatives.

正向传播

他设计的神经网络将会有一个简单的架构。信息以一个方向流动——它以一个 X 矩阵的形式传递,然后穿过隐藏单元,产生预测向量 Y_hat 。为了更容易阅读,我将前向传播分成两个独立的函数——对单个层进行前向传播,对整个神经网络进行前向传播。

Snippet 4. Single layer forward propagation step

这部分代码可能是最简单易懂的。给定来自前一层的输入信号,我们计算仿射变换 Z ,然后应用选定的激活函数。通过使用 NumPy,我们可以利用矢量化功能——一次对整个图层和整批示例执行矩阵运算。这消除了迭代,大大加快了我们的计算速度。除了计算出的矩阵 A 之外,我们的函数还返回一个中间值 Z 。为什么答案如图 2 所示。在后退的过程中,我们需要 Z。

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

Figure 5. Dimensions of individual matrices used in a forward step.

使用预先准备的一层前向步骤函数,我们现在可以很容易地建立一个完整的前向传播步骤。这是一个稍微复杂一点的函数,它的作用不仅是执行预测,而且是组织中间值的集合。它返回 Python 字典,其中包含为特定层计算的 AZ 值。

Snippet 5. Full forward propagation step

损失函数

在中,为了监控我们的进展并确保我们朝着正确的方向前进,我们应该定期计算损失函数的值。**“一般来说,损失函数旨在显示我们离‘理想’解决方案有多远。”**根据我们计划解决的问题进行选择,Keras 等框架有很多选项可供选择。因为我打算测试我们的神经网络对两个类之间的点的分类,所以我决定使用二元交叉熵,它由以下公式定义。为了获得更多关于学习过程的信息,我还决定实现一个计算准确度的函数。

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

Snippet 6. Calculating the value of the cost function and accuracy

反向传播

最近,反向传播被许多缺乏经验的深度学习爱好者视为令人生畏且难以理解的算法。微分学和线性代数的结合经常使没有受过扎实数学训练的人望而却步。所以如果不能马上理解所有的东西,也不用太担心。相信我,我们都经历过。

Snippet 7. Single layer backward propagation step

人们经常混淆反向传播和梯度下降,但实际上这是两回事。第一个目的是有效地计算梯度,而第二个目的是使用计算的梯度进行优化。在神经网络中,我们计算成本函数(前面讨论过)关于参数的梯度,但是反向传播可以用于计算任何函数的导数。**这个算法的本质是微积分中已知的链式法则的递归使用——计算由其他函数集合而成的函数的导数,这些函数的导数我们已经知道。**对于一个网络层,该过程由以下公式描述。不幸的是,由于本文主要关注实际实现,我将省略推导过程。看看这些公式,很明显为什么我们决定记住中间层的 AZ 矩阵的值。

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

Figure 6. Forward and backward propagation for a single layer.

就像向前传播的情况一样,我决定将计算分成两个独立的函数。第一个——如代码片段 7 所示——集中在一个层上,归结为用 NumPy 重写上面的公式。第二个表示完全向后传播,主要处理读取和更新三个字典中的值的键杂耍。我们首先计算成本函数相对于预测向量的导数——前向传播的结果。这很简单,因为它只包括重写下面的公式。然后从末端开始遍历网络的各层,根据图 6 所示的图表计算所有参数的导数。最终,函数返回一个 python 字典,其中包含我们正在寻找的渐变。

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

Snippet 8. Full backward propagation step

更新参数值

T 该方法的目标是使用梯度优化更新网络参数。这样,我们试图使我们的目标函数更接近最小值。为了完成这个任务,我们将使用作为函数参数提供的两个字典:params_values,它存储参数的当前值,以及grads_values,它存储根据这些参数计算的成本函数导数。现在你只需要对每一层应用下面的等式。这是一个非常简单的优化算法,但我决定使用它,因为它是更高级的优化器的一个很好的起点,这可能是我下一篇文章的主题。

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

Snippet 9. Updating parameters values using gradient descent

把东西放在一起

我们终于准备好了。任务中最困难的部分已经过去——我们已经准备好了所有必要的功能,现在我们只需要按照正确的顺序将它们组合在一起。为了更好地理解操作的顺序,值得再次查看图 2 中的图表。该函数返回作为训练结果获得的优化权重以及训练期间指标变化的历史记录。为了进行预测,您只需要使用接收到的权重矩阵和一组测试数据运行一个完整的前向传播。

Snippet 10. Training a model

大卫 vs 歌利亚

是时候看看我们的模型能否解决一个简单的分类问题了。我生成了一个数据集,由属于两个类的点组成,如图 7 所示。让我们试着教我们的模型对属于这个分布的点进行分类。为了对比,我还准备了一个高层框架的模型——Keras。这两种模型具有相同的架构和学习速率。然而,这确实是一场不均衡的战斗,因为我们准备的实现可能是最简单的。最终,NumPy 和 Keras 模型在测试集上都达到了相似的 95%的准确率。然而,我们的模型花了几十倍的时间才达到这样的结果。在我看来,这种状态主要是由于缺乏适当的优化造成的。

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

Figure 7. Test dataset

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

Figure 8. Visualisation of the classification boundaries achieved with both models

再见

我希望我的文章拓宽了你的视野,增加了你对神经网络内部编译操作的理解。这将是对我努力创建这个帖子的最好回报。我承认,通过编写代码和注释,我确实学到了很多东西。的确,没有什么比弄脏你的手更有教育意义。

如果你有任何问题或者你在源代码中发现了错误,请在评论中告诉我。如果你喜欢这篇文章,请在 TwitterMedium 上关注我,并在 GitHubKaggle 上查看我正在进行的其他项目。本文是“神经网络的奥秘”系列的第三部分,如果你还没有机会,请阅读其他文章。保持好奇!

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

让我们用机器学习模型为慈善事业寻找捐赠者

原文:https://towardsdatascience.com/lets-find-donors-for-charity-with-machine-learning-models-7ad1da9f5538?source=collection_archive---------15-----------------------

监督学习算法的一个应用

欢迎来到我关于数据科学的第二篇博文。我将在这里写一个我用机器学习算法完成的项目。我将解释我做了什么,而不太依赖技术语言,但我会展示我的代码片段。代码问题:)

这个项目是一个假设的案例研究,我必须为一个慈善机构寻找潜在的捐赠者,这个慈善机构为愿意在硅谷研究机器学习的人提供资金。这个名为 CharitML 的慈善机构发现,每位捐赠者的年收入都超过了 5 万美元。我的任务是使用机器学习算法来帮助这个慈善机构在整个加州地区识别潜在的捐赠者。

为了这个项目,我使用了监督机器学习。在监督学习中,您有输入变量(X)和输出变量(Y ),并使用算法来学习从输入到输出的映射函数。我将描述我从一个杂乱的数据集到一个好的工作模型所采取的步骤。

数据处理

从探索数据开始总是好的。基本上,寻找观察的总数、特征的总数、缺失值、哪些特征应该被编码等等。最重要的是,寻找你正在解决的问题的特征。在这种情况下,我感兴趣的是有多少人年收入超过或低于 5 万美元。

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

There are 13 features.

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

变换歪斜连续的特征

一个数据集有时可能包含至少一个其值趋向于接近一个单一数字的特征,但是也将具有比该单一数字大得多或小得多的非平凡数量的值。算法可能对这种值的分布很敏感,并且如果范围没有被适当地标准化,则可能表现不佳。对于我们的数据集,有两个特征符合这个描述:'capital-gain''capital-loss'

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

归一化数值特征

对数字要素执行某种类型的缩放通常是一种很好的做法。对数据进行缩放不会改变每个特征分布的形状(如上面的'capital-gain''capital-loss');但是,规范化可以确保在应用受监督的学习者时,每个特征都得到平等对待。这些特性的值将介于 0 和 1 之间。

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

编码数据

通常,学习算法期望输入是数字,这需要转换非数字特征(称为分类变量)。转换分类变量的一种流行方法是使用一键编码方案。一键编码为每个非数字特征的每个可能类别创建一个*“虚拟”*变量。

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

洗牌并拆分数据

现在所有的分类变量都已经被转换成数字特征,并且所有的数字特征都已经被规范化。与往常一样,我们现在将数据(包括要素及其标签)分成训练集和测试集。80%的数据将用于训练,20%用于测试。

模型度量

在进入我为这个项目测试的不同模型之前,我将详细说明我们如何判断一个模型的质量。我们在决定选择哪个型号时会看什么?在我们希望模型预测得有多好和它的计算代价有多高之间,总会有一个权衡;或者训练它需要多长时间。

模型性能的三个主要度量是:准确度、精确度和召回率。

准确性衡量分类器做出正确预测的频率。它是正确预测的数量与预测总数(测试数据点的数量)的比率。

Precision 告诉我们被我们归类为垃圾邮件的邮件中,实际上有多少是垃圾邮件。它是真阳性(分类为垃圾邮件的单词,实际上是垃圾邮件)与所有阳性(分类为垃圾邮件的所有单词,不管这是否是正确的分类)的比率。

Recall(sensitivity) 告诉我们实际上是垃圾邮件的邮件中有多少被我们归类为垃圾邮件。它是真阳性词(被归类为垃圾邮件的词,以及实际上是垃圾邮件的词)与所有实际上是垃圾邮件的词的比率。

不同的措施对不同的问题有不同程度的影响。因此,我们应该知道哪个指标对我们更重要。例如,将收入不超过 5 万美元的人认定为收入超过 5 万美元的人将对 CharityML 不利,因为他们正在寻找愿意捐款的人。因此,一个模特的 的能力,准确地说 预测那些挣 5 万美元以上的人比模特的 回忆 那些个人的能力更重要。

我们可以使用 F-beta 分数作为同时考虑精确度和召回率的指标:

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

天真基线预测值

如果我们选择一个总是预测个人收入超过 50,000 美元的模型,那么这个模型在这个数据集上的准确性和 F 值是多少?我们想知道未经训练的模特会是什么样子。

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

监督学习模型

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

This is not an exhaustive list

在这些选项中,我尝试并测试了其中的三个: SVM、ADABOOST 和 Random Forrest。

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

Adaboost 模型最适合我们的问题。Adaboost 在测试数据集上的 F 值最高。除此之外,像 RandomForest 一样,训练集和测试集之间的 F 分数没有很大的差异。这很重要,因为我们不希望我们的模型过度适应训练集,并返回一个夸大的 F 分数。Adaboost 在所有训练集规模下的准确率和 F 值都是最高的。训练和测试时间非常短,这意味着该模型的计算速度很快。模型的迭代方面使它能够很好地处理大量的属性,就像我们的例子一样。因此,这是一个很好的选择。

ADABOOST 如何工作

Adaboost ,简称自适应增强是一种集成算法。 Adaboost 算法使用迭代训练来给出精确的模型。它从弱学习者开始,这是数据的初始分类。也就是说,分类是用决策树桩完成的。这意味着分类只是用一条线来分隔数据。它被称为*‘弱’,因为数据还没有被很好地分类。但是由于进一步的迭代,该模型使得学习者关注于误分类点*。更准确地说,在第一步中,弱学习者分离数据,并且所有的点被同等地加权。如果存在错误分类的点,在第二次迭代中,弱学习器试图捕捉这些先前的错误中的大部分,并为它们分配更高的权重。本质上,该模型通过对误差进行更多的加权来关注误差。只要我们指派它去做,这个迭代过程就会继续。因此,随着每一次迭代,模型捕获的数据越来越好。弱学习者被组合起来,并根据他们的表现分配权重。通过计算弱分类器的加权平均值来进行预测。最终的学习者是由弱学习者组合而成的强学习者。

模型调整

我们可以通过使用网格搜索来进一步改进所选择的模型。这个想法是为一些参数使用不同的值,比如估计器的数量或学习率,以便获得更好的性能指标。

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

Hope you’re not tired of these yet

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

我们可以看到优化的模型比未优化的模型表现得更好。准确率从 0.8576 提高到 0.8651,F 值从 0.7246 提高到 0.7396。请记住,朴素预测器给我们的准确度分数为 0.2478,F 分数为 0.2917,这并不奇怪,因为朴素模型不对数据进行任何训练。

特征抽出

在这个数据集中的 13 个特征中,我很好奇哪一个具有最高的预测能力。如果我们只在模型中使用这些,会发生什么?

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

在简化的模型中,精确度和 F 值都下降了。在这种情况下,与完整模型相比,较少的特征使得模型的泛化能力稍差。然而,分数的降低并不高。反过来,训练时间更快,因为模型包含的特征更少。因此,如果训练时间是一个因素,这种权衡将是有意义的,因为我们不会在性能方面损失太多。

汇总

那我们做了什么?我们得到了一个数据集,并设定了一个目标,对年收入超过 5 万美元的人进行分类。我们清理了数据,将必要的变量标准化并转换成数字特征,以便在我们的模型中使用它们。我们将数据分成训练集和测试集。我们设定了一个基线预测值,并建立了另外三个模型。我们选择 ADABOOST 模型作为最佳选择。我们对它做了进一步的调整,使它稍微好了一些。我们试图使用只有五个主要特征的模型,但它的表现稍差。

最后的话

这是它:)如果你通过了这里,我想说一声非常感谢你。我希望这是监督机器学习的一个很好的、清晰的应用。它是数据科学中一个强有力的工具;我目前正在学习并想掌握的东西。如果你有问题,欢迎在下面发表评论,你也可以随时看看这个项目,包括我的 github 上的许多其他项目。

在 LinkedIn 上关注我:https://www.linkedin.com/in/andreigalanchuk/

上帝保佑你们!

让我们解决雅加达的交通问题

原文:https://towardsdatascience.com/lets-fix-jakarta-s-traffic-584058dac87f?source=collection_archive---------6-----------------------

推进公共交通的分析方法

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

Photo by Alexander Popov on Unsplash

众所周知,雅加达的交通状况是一个问题。最近的一项 T2 调查将雅加达列为世界第七差。事实令人震惊——目前道路上的摩托车数量徘徊在 1400 万辆左右,但预计到 2020 年将跃升至 6600 万辆,如果不采取任何措施,这一数字将增长 370%。然而,应对这一挑战并非没有通知或补救措施。雅加达省长和中央政府已经尝试了几种方法来减少交通拥堵。其中之一是单双号交通政策,该政策试图通过控制某一天城市道路上的车辆数量来减少交通流量。虽然这是一项值得称赞的努力,但它只是触及了试图解决更大问题的表面。佐科·维多多总统认识到了这一点,并发布了一项行政命令,集中精力改善公共交通,作为解决城市交通问题的长期方案。

下面来看看实际订单。请原谅我,如果你不会说巴哈萨语…请相信我。;)

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

在第 2 章**“SASARAN DAN KEBIJAKAN PENYELENGGARAAN TRANSPORTASI JABODETABEK”中,**规定到任何公共交通站的最大步行距离应为 500 米。

所以我从一个简单的问题开始:

城市(区域)中有多大比例不在此距离内(基于道路距离,而不仅仅是半径,因为半径并不能完全反映您需要步行的距离)?

我首先收集了目前雅加达所有的公共交通站点,包括小型货车、小型公共汽车、中型公共汽车、Transjakarta 和火车。总共有超过 19,749 站。

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

Pink dots represent individual public transportation stops

接下来,我画出了一个距离每个车站 500 米以内的区域。例如,我模拟了一条 500 米长的可步行路径,从位于 Kelapa Gading 的一个 Transjakarta 通勤站出发。模拟路径是实际街道路线,它必须与 Transjakarta 站连接。街道路径可以是一条主干道或街道小巷(Jalan Gang)。

以下是这一分析的直观描述:

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

Pink Node is the Transjakarta Bus Stop, blue area indicate that within 500 meters walking distance

为什么我选择了道路/路径路线而不是半径?

一个点周围的半径通常不能预测一个人要走多远。是的,从理论上讲,一个人可以通过穿越房产、跳过栅栏、跑过建筑物或其他我们在任何情况下都无法预测的策略来减少步行距离(当然,我们永远不会建议一个人这样做来缩短步行距离)。因为半径代表一种不太可能的情况,我觉得使用实际的道路将是一种更准确的方式来预测步行距离。

然后,我将交通站点数据与 500 米的路线数据合并,并创建了以下模拟。这描绘了当前公共交通生态系统覆盖的城市面积。

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

Black represents the covered area by public transport. Blue is currently uncovered by public transport.

清理最终可视化

我想更好地看看这个城市的差距在哪里。所以,我拓宽并合并了雅加达的所有停靠点,并把它们重新标在了地图上。这让我能够更好地识别和区分覆盖区域和未覆盖区域。然后,出于视觉清洁的目的,我移除了所有的公共停车点。现在我们可以看到公共交通站点未覆盖的剩余区域。

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

Uncovered area within 500 meters walking distance to public transportation

摘要

对地图背后的数据进行一些基本的分析,我估计 45%的地区没有公共交通站。这代表了覆盖大约 3 亿平方米的区域(在该城市的总共 6.55 亿平方米中)。

一个警告:很可能这个区域至少有一部分不是你通常需要步行的地方。例如,如果你站在一条繁忙的高速公路上,距离一个站点 600 米,那么从技术上来说,你是“未被覆盖”的。然而,你不太可能需要从那里走过去(除非你的车坏了或者类似的事情)。因此,虽然我可能稍微夸大了未覆盖的区域,但这可能已经不远了。

最后,这方面的数据设计在改善城市交通挑战方面有着广泛的应用。它还应该让我们所有人都意识到,并继续学习和提问。

跟进问题

为什么行政命令把规则定在“500 米”?

这是一个起点,但也许更好的问题是“步行的合理距离是多少?”。设定这一目标的后果值得考虑。如果 250 米是标准,那么未覆盖的区域将会更大,需要更高水平的投资。如果我们把范围设得更长(比如 750 米),政府的投入会更低,但那样人们可能就不会使用公共交通了。

人们喜欢较短的步行距离还是较短的等待时间?

与其投资新的车站,解决方案可能是增加公共交通“车队”。也许这甚至不是消费者考虑的权衡,但在我们向这个系统投资数十亿美元之前,我们不应该知道吗?

我要感谢我的同事 Raihan Saputra 的分析支持,感谢 GO-JEK 公司重视社会影响。这些都是我探索这个挑战和解决这个项目的关键动力。我的希望是,通过使我们对这个问题的理解更加经验性和基于事实,我们可以改善雅加达居民的流动性。

有兴趣做更多这样的事情吗?邮箱

我们来忽悠一个神经网络!

原文:https://towardsdatascience.com/lets-fool-a-neural-network-b1cded8c4c07?source=collection_archive---------2-----------------------

通过使用对抗性补丁

在这篇文章中将看到如何欺骗一个对象分类器神经网络,具体来说就是 VGG16 ,使用一种新技术来创建对抗性补丁。

原文可以在这里找到,所有代码和资料在这里

介绍

通常,欺骗对象分类器的标准方法是通过以特定的方式迭代地添加一些噪声来创建图像,试图最大化模型的误差。由此产生的图片看起来与人类非常相似,但会给网络带来巨大的误差。这种技巧的一个例子可以 **DeepFool,**在本文中介绍 **。**简而言之,它扰乱图像,使其几乎等同于人眼,但不同于神经网络

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

原始图像被正确分类为“鲸鱼”,而第二个图像(将两个图像相加创建)被分类为“海龟”。

虽然这种方法非常有效,但它不适合现实生活中的场景。引用原文:

这种策略可以产生很好的伪装攻击,但是需要修改目标图像

给出的创建对抗性 补丁 的方法是通过给图像添加一个路径,一个贴纸,而不是完全改变它。

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

因此,人们可以只打印标签,并很容易地将其放置在真实对象附近,以欺骗网络。具体来说,生成路径是为了让模型预测一个错误的类,在我们的例子中是烤面包机。此外,这在现实生活中非常有效,例如,当分类器使用摄像机来执行活体对象检测时。

我强烈建议阅读原始论文的第二部分,以获得如何找到路径的所有细节。

亲自动手

让我们实际尝试一下。该文件提供了一个专门为 VGG16 (广泛使用的对象分类器模型)创建的路径,它使分类器相信图像中有一个烤面包机。我用这个网站来测试它是否有效。

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

Header of the online demo of the VGG16 that I used

一个更科学的方法是下载一个 VGG16 训练过的模型,然后用应用了路径的测试集中的每个图像绘制误差,但是我没有时间这么做。

此外,路径不应直接应用于对象,否则它会覆盖我们试图分类的原始对象。

要将路径应用于图像,您可以使用您最喜欢的图像编辑软件。我决定稍微花点心思,在 node.js 中创建一个命令行来做到这一点。它允许我在标贴上指定目标图像的位置和大小,你可以在这里找到代码

> node index.js ../images/banana.jpg center up 2
Processing image: ../images/banana.jpg
Path will be placed center-up
Image saved at: ../images/banana-pathed.jpg

第一个参数是源图像路径,第二个和第三个分别表示路径的位置,水平和垂直,最后一个是路径相对于源图像的比率。

在这种情况下,脚本获取一个香蕉的图像,在上面粘贴标签并存储它,这就是输出。

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

现在让我们来看看 VGG16 用原始图像和“修补”图像预测了什么。我们使用这个网站是为了更新和获得一个图像的预测。

配原图:

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

Yep, it is a banana

有补丁的那个

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

Now its a toaster!

有用!或者,至少对香蕉来说。让我们试试另一个例子:

node index.js ../images/bird.jpg left center 3

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

We fool it again!

在原始图像上,该模型以 100%的置信度正确预测了类“Jay ”,在修补后的图像上,该模型以 67.1%的置信度预测了“Toaster ”,以 3.5%的置信度预测了“Jay”。是的,我们又骗了它!

我建议你用你自己的图像试试,它很有趣。

结论

所提出的创建对抗路径的方法是一种在不修改目标图像的情况下在现实生活场景中有效愚弄神经网络的新方法。一个路径可以被打印成一个标签,并直接应用于一个对象,以改变预测的类和“愚弄”神经网络,这可能是非常危险的。

原文可以在这里找到,所有代码和资料可以在这里

感谢您的阅读,

弗朗西斯科·萨维里奥

让我们自由地检查一些东西!

原文:https://towardsdatascience.com/lets-go-over-few-things-freeciv-1d400969ad3e?source=collection_archive---------22-----------------------

建立正确的基础是大发展的关键

正如我在上一篇文章中所说,我对用 python 建立一个自由学习环境很感兴趣。但许多人认为,这些细节要么过于宽泛,要么包含了太多的想法。在接下来的几篇文章中,我想澄清一些问题,为这个项目打下基础。

如今,建立一个开源项目非常容易,你所要做的就是注册一个 Github 账户,然后嘣,你就准备好了!但是困难的部分是运行和维护代码库,更困难的是让人们足够关心你的项目,为你的项目贡献任何东西,我想在这里把重点放在后者。通过这些帖子,我想澄清我的想法,并讨论提出的问题。这一次,我想谈谈这三点:

  1. **行动空间:**为什么自由公民的离散行动空间很重要
  2. **游戏结构:**游戏的浩瀚如何与现实世界相似
  3. 多人协作理念:【freeciv 如何支持不同类型的互动,它有什么特别之处

为了更容易理解,我还会在每一点上添加分点。这

我在这里不是问那些很难回答的问题,比如为什么关心任何事情。但是为什么要关心这个项目呢?

1.动作空间

我们宇宙中的每一个动作都可以分解成两种类型,连续动作空间和离散动作空间。通俗地说,离散空间是需要做出艰难决定的地方,而连续空间是要产生分布的地方。

  • 现实生活领域中涉及硬件使用的大多数应用(机器人、自动驾驶汽车等。)需要生成值的分布。用来操作它们的运动矢量是一组力的值和方向。这一领域仍处于早期阶段,但其应用仍将遥遥无期。随着时间的推移,它将继续改进,尽管速度较慢,原因是模拟器不够好(讽刺的是,在机器人模拟器上训练的代理很少在现实生活中给出相同的结果)。我们的算法在样本效率方面并不擅长,在现实生活中的机器人上进行训练将意味着非常长的训练持续时间,这使得它不可行。

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

Self driving car operates in the continuous distribution

  • 离散动作空间有不同的任务,所有那些需要做出艰难决策的应用都有一个离散空间。视频游戏就是一个很好的例子,它们需要一个非常具体的单一动作,需要在任何给定的时刻采取。到目前为止,我们看到的大多数研究都是在这个领域,彻底改变了深层强化学习理念的 DQN 在离散领域采取了行动。在医学领域,我们需要随着时间的推移展开行动,这是离散空间中现实世界应用的一个例子。其他应用包括,优化由于网络条件差而受到影响的流媒体服务的视频质量,社交网站上的通知系统只通知你重要的内容,等等。

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

Montezuma’s Revenge is an Atari game with discrete action space. This also happens to be a notoriously difficult game for AI to master due to its sparse reward structure.

我们不需要一个擅长所有事情的单个智能体,事实上,未来将充满整体架构,其中每个擅长特定事情的多个智能体合作实现远超人类的目标,这就是我们所说的超级智能。作为一款视频游戏,Freeciv 在离散的空间中运行。这是选择它的原因之一,它将是最具挑战性的学习环境之一。尽管在这种情况下仍有可能采取连续的行动。稍后将提供更多详细信息!

Freeciv 将是最具挑战性的学习环境之一,这里所做的研究将是突破

2.游戏结构

说 freeciv 很大是一种保守的说法。你可以做的事情太多了,很难记住所有的事情,而且在任何时候采取的行动都会影响游戏后期的结果。

  • 每个单位都有动态的移动次数,也就是说,每个单位都有不同的行动,每个城市都可以建造新的单位和物品。在下图中,我们可以看到一个单元有 12 个动作。这就要求人工智能根据它在特定时刻控制的单元进行优化。现在你可以有一个复杂的单一网络来运行这个,但我认为使用集成可以获得更好的结果。

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

The game at turn 314 is so advanced, though the game in ‘default’ mode can run to 5000 turns. The small circles at the bottom show the actions that can be takes for any unit. 12 actions can be taken for this particular unit, 1 less than the Atari games! This is an amazing example of the vastness of this game.

  • 除了行动之外,看看技术树可以让你了解必须做出的各种决策的规模及其后果。为了在游戏中进步,代理需要获得新的和不同的技术。每项技术都是大树上的一个节点,要得到一项,需要完成前面的几项。这对人工智能进行长时间步骤的结构规划提出了挑战。这与通过查看当前帧来选择单个动作的现有技术环境非常不同。

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

A sample tech-tree in freeciv. As you can see in the right, to get Electricity, you need to have Metallurgy and Magnetism. This complex intermixing of possibilities make life tricky for our small agent.

  • 我还想谈一下城市。你的城市质量和你的权力之间有明显的关联。城市是这个游戏的核心,改善它们会增加你成功的机会。看看下面一个简单的城市,这是一个大城市。“城市半径”中的每块瓷砖都有与之相关的价值,如食物和黄金。瓷砖的质量越好,你的城市就越好,反过来你的文明也就越好。

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

A sample city, more details about the cities here

  • 由于战争的迷雾(以及不清楚的工作列表、资源),敌人的位置/状态和整个地图并不完全清楚——因此需要高风险的投资(探险队)来获取信息。

如上所示,战略、行动、决策、运动等的多样性。将这种环境推向了一个新的领域。由于所有这些挑战,看看人工智能将如何自我运作是很有趣的。这与现实世界非常相似,在现实世界中,我们需要在大量不完整信息的情况下做出决策,而我们今天的行为会对以后产生影响。

从使用这个平台开发模型和架构中学到的知识可以用来解决各种现实世界的问题。

3.多层协作结构

Freeciv 可以被大量玩家玩,具体来说,在 freeciv 桌面上可以玩 126 人,在 freeciv 网络上可以玩 500 人。游戏是有规则可循的,这些被称为规则集。在经典/默认规则集中,有三种获胜方式:

  • 正如在其他征服和扩张的游戏中,一旦其他文明的最后一个城市和单位被摧毁,你就被默认宣布为胜利者。
  • 一旦技术进步将你带入太空时代,你可能会发射一艘前往半人马座阿尔法星的宇宙飞船;第一个工艺到达该系统的文明获胜。
  • 在没有其他手段决定胜利的情况下,如果还没有飞船发射,游戏将在 5000 回合后结束。然后对幸存的文明进行评级,拥有最高分数的文明获胜。

由于项目的开源性质,可以根据研究人员的需要修改规则集。我们打算让这项工作变得轻而易举,这样研究人员就可以把大部分时间花在开发他们的模型上,而不必担心无聊的事情。这也允许极端定制,可以使这个环境更好。

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

Look at the minimap at bottom left, the opportunity to see how various AIs will compete with each other is one thing that really excites me about this!

  • 外交是这场游戏的重要组成部分,其中的互动非常重要。开放和贸易有利于玩家促进国家的经济发展,但在游戏的后期却变成了敌人并互相争斗。所有这些当然都可以通过改变配置文件中的游戏结构来改变*.fcfg.这种合作可以在整体人工智能系统中产生巨大的成果,其中许多小型人工智能系统组合起来使整个系统工作。

有了大量的玩家可以玩这个游戏,就有了一个研究协作系统如何工作的机会。随着竞技自我游戏合作游戏领域的最新发展,当大量人工智能被单独留在一个类似地球的世界中时,看看世界将如何发展将是有趣的。也许我们会明白聪明的智能将如何从这一团乱麻中脱颖而出。

当大量人工智能被单独留在一个类似地球的世界里时,观察事件如何发展将会很有趣

结论

这些帖子不仅宣传了这个想法,也给了我一个机会来表达我对如何使这个项目成功的想法。对于任何开源项目来说,开始阶段都非常重要。有大量的工作要做,还有很长的路要走。在目前处于设计阶段的第一个版本中,我们更多地关注迷你游戏,所以可以开始小的开发,并且可以进行改编。

欢迎投稿人,如果您有任何疑问/想法,请发我的 LinkedIn 给我,或者留下私人笔记,我不介意现在是凌晨 4 点,我会回复您。

干杯!

先把它学深了再玩深

原文:https://towardsdatascience.com/lets-learn-it-deep-before-we-play-it-deep-6b50cdca5adb?source=collection_archive---------3-----------------------

我记得唐纳德·克努特的《具体数学》一书,这本书是我的一位数学老师写的,他认为有太多的东西被单调地抽象成公式和符号,这本书奠定了数学科学的哲学和思想基础。被标题所吸引,受作者的教科书系列“计算机编程的艺术”的启发,我尝试了一下。令我惊讶的是,它从非常基本的计数问题和已知问题开始,如“河内塔”和其他问题。唯一的区别是,它谈到了如何制定和处理问题,最后给出了公式,这是所有书中常见的唯一的事情。

那是我第一次意识到我滥用递归公式有多长时间了,不知道它真正的意思,但事实上自信地假装理解它。

我们生活在这样一个时代,由于不断增长的业务需求,以及为了快速认识到对“外行人”来说似乎无关紧要的复杂命题的物理和现实意义,我们离不开深入的哲学和基本原理的抽象。这往往导致专业人士走捷径,滥用美丽的概念,当然是为了满足一时的需求,从而污染了整个空间。

在经典编程中,面向对象的编程规则程序员经常争论继承的滥用,仅仅是为了重用的需要,而简单的组合可能是有意义的。由于过度简化的书籍和课程,几乎任何工程师都可以在几个小时内成为 OOPS 程序员,我们有足够的资源来满足我们的业务需求,但潜在的多态性利斯科夫原则却被忽略了。结果是:我们与丑陋、庞大、混乱的遗留系统作斗争,这些系统不符合任何已知的设计模式,并且与预期的架构相去甚远。我们可以看到嵌入式行业花费数百万美元来打破这个僵局。那时我们正忙于构建库,这些库几乎可以做任何事情,从父类继承任何东西。

快进到数据科学时代,我们可以在基于数字的数据革命中感受到类似的需求。随着炒作周期预测新的术语将统治行业,我们看到工程师们在争先恐后地重新掌握技能和适应新的世界。我们有闻所未闻的首字母缩写词,充满幻想,有时甚至令人恐惧的名字,如人工智能、大数据、IoE、DNN 等等。我们经常看到它们中的一些出现在这样或那样的炒作曲线中,其中一些甚至被认为是非常成功的公司的秘方,如谷歌、亚马逊等。

除此之外,我们还有企业家头脑,他们用几本书和面向再技能社区的 MOOCs 充斥着这个领域。他们中很少有人讨论这个主题的具体内容;数学和现实世界的灵感,甚至是导致谷歌和亚马逊的案例研究。他们中的大多数都是简化的有风险的抽象对象;一家主要出版商将其书名命名为《傻瓜书》。

传统编程世界需要库,而敏捷世界需要 API 驱动的平台和 SDK,我们经常发现供应商在推进他们的平台。我们经常看到客户将这些平台称为美化的数据库。嗯,这可能被视为两个错误定位活动的结果:

1.潜在哲学的过分简单化

2.由于误读和不必要的假设,导致客户需求复杂化。

这两者都是我们渴望和贪婪抽象的结果,甚至在我们具体了解数据和转换数据的数学基础之前。

我们非常热衷于利用数据密集型库,甚至在理解这些庞大代码机器的构建模块之前。例如,现在在学习架构中使用 Tensorflow 或 CNTK 模块是一种常见的规范,但根据谷歌大脑项目负责人杰夫·迪恩(Jeff Dean)的说法,深度学习计划需要至少 10 万个例子才能取得可行的成果。我不确定我们中有多少人会幸运并被拯救,足以在一个框架上用如此多的例子开始我们的数据科学计划,甚至在我们制定和了解来到我们面前的数据的性质、种类和特征之前。

随着许多远见卓识者和插图画家试图制定数据驱动智能的黑盒图,一些人将数据表示为石油,一些人将数据模型表示为数据贪婪引擎,还有许多人将人工智能大脑表示为规则挖掘者,将我们的定位与谷歌的定位进行比较是值得的。

与谷歌和其他公司的一个主要区别是,谷歌对数据非常感兴趣。不是任何数据,而是正确的数据。谷歌前数据科学家 Seth Stephens 在他的书《人人都在撒谎》中说:“大数据革命不是收集越来越多的数据。这是关于收集正确的数据。”

有趣的是,自我学习、推荐以及情感和感觉提取的主动性并不是从输入自动数据馈送器的大量密集数据中产生的,而是通过工程师不眠不休地思考微小的样本和数据子集来寻找模式,以解决现有的模式。正如 Seth Stephens 在他的书中提到的,谷歌的重大决策总是来自随机抽样的数据子集,这些数据子集是人工思考和查看的。对我们工程师来说,这似乎是一件可怕而肮脏的工作,这是关于数据的唯一科学的东西。

世界上最令人钦佩的数据科学家之一是 DJ Patil,我想引用他在一次演讲中说过的话,即不要在我们周围的数据科学材料和爱好者中迷失或迷失,这真的很重要。我们应该意识到,我们正在创造我们自己的世界,因此,这应该是完美的。

几年前,在与博世汽车多媒体团队合作时,我是语音车载信息娱乐系统团队的一员。一年后,我可以驾驶安装了它们的汽车。

随着物联网和其他辅助技术和可信软件进入行业领域,我们将更接近成为我们手工制作的产品的受益者。我们总是可以安慰自己,把平庸和缺乏工艺归咎于供应商,因为面对自己工艺的机会非常小。我们永远不希望我们面前有一个不完美的世界,更不希望我们知道是谁设计和制造了这样一个世界。

让我们做一张地图吧!利用 Geopandas、pandas 和 Matplotlib 制作 Choropleth 地图

原文:https://towardsdatascience.com/lets-make-a-map-using-geopandas-pandas-and-matplotlib-to-make-a-chloropleth-map-dddc31c1983d?source=collection_archive---------0-----------------------

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

所以你想用 Python 做地图。我们开始吧!

如果你已经开始用 Matplotlib 和 Pandas 做一些数据可视化,但是正在寻找地理数据入门的下一个简单步骤,我有你。我去过那里。事实上,我花了几个小时浏览在线教程,寻找最简单的软件包来开始制作地图(特别是 choropleths)。虽然有很多选择,但我最终选择了地质公园作为门槛最低的地方。

Geopandas 很棒,因为它就像熊猫一样(但使用的是形状文件之类的地理数据)。Geopandas 数据帧与 pandas 数据帧非常相似,因此两者通常配合得很好。最重要的是,Geopandas 允许您创建快速、独立的 choropleth 地图,而没有许多其他依赖项(也没有太多代码行!).

这是我们将要制作的预览。

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

It’s London! Made with Python.

顺便说一句,有很多制作地图的好方法(值得注意的是, Datawrapper 刚刚添加了一个 GeoJson 包装器来加载你自己的定制地图)。没有放之四海而皆准的方法。然而,大多数这些服务都有某种限制(比如不能下载 svg 格式的文件。此外,用 Python 制作地图有几个独特的好处:

  • 再现性——Python 的一大卖点,尤其是制作超级快速图表。本教程将尽可能简化创建地图的过程(使用全局变量、清理等),以便下次您想要创建地图时,您只需更改 csv 文件(假设它是相同的地理位置)。
  • 最大控制 —定制,下载任何你想要的格式,你打电话。尽管可能需要修改一些代码,但 Matplotlib 非常强大。
  • 很多很多的地图 —如果你需要可视化同一个有很多变量的地图(多个小地图?)或显示随时间变化的地图,将这些代码包装在 for 循环中是一个明智的做法(我将在下一篇文章中介绍)。带有 GUI 界面的图表生成器很棒,但通常不擅长自动化任务。Python 很好。
  • 不需要设计技能——嗯,几乎不需要设计技能。好的数据设计的眼光是有帮助的。但不需要 Adobe Illustrator 或 Photoshop 技能。

好,我们开始吧。这是你需要的。我用一个 Jupyter 笔记本来存放所有的代码(我强烈推荐,这样你就可以预览渲染),但是你可以。

  • 熊猫
  • 地质公园
  • Matplotlib

就是这样!

获取数据

让我们把一些数据记在笔记本上。由于我目前住在伦敦,我将按地方选区(自治区级)制作伦敦地图。伦敦数据存储在使大量数据公开和可访问方面做得很好,我发现这个页面有一堆不同详细程度的形状文件。不错!

点击→下载→另存为→移动到笔记本本地目录。搞定了。

但是 shapefile 只是一层数据。这将有助于绘制地图,但如果我们想将数据绑定到它,我们还需要另一个数据集。回到伦敦数据存储:让我们下载伦敦自治市档案数据集作为 csv 文件(已经预先清理干净)。这个 csv 文件有很多列,我们可以用它们作为变量来可视化。

现在两个数据集都准备好了,我又回到了我的 Jupyter 笔记本上。是时候载入了。shp 和。csv 文件。

# set the filepath and load in a shapefilefp = “datasets/geo-data/gis-boundaries-london/ESRI/London_Borough_Excluding_MHW.shp”map_df = gpd.read_file(fp)# check data type so we can see that this is not a normal dataframe, but a GEOdataframemap_df.head()

现在让我们预览一下没有数据的地图是什么样子。

map_df.plot()

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

酷,是伦敦!

然后,我们加载一个 csv 数据文件来连接地理数据框架。

df = pd.read_csv(“datasets/london-borough-profile.csv”, header=0)df.head()

清洗和连接数据框

太好了。现在我们有两个数据帧准备好了。让我们获取一份我们将要使用的数据。

df = df[[‘borough’,’Happiness_score_2011–14_(out_of_10)’, ‘Anxiety_score_2011–14_(out_of_10)’, ‘Population_density_(per_hectare)_2017’, ‘Mortality_rate_from_causes_considered_preventable_2012/14’]]

这些列名真的很糟糕。让我们将它们重命名为更简单的名称。

data_for_map = df.rename(index=str, columns={“Happiness_score_2011–14_(out_of_10)”: “happiness”,“Anxiety_score_2011–14_(out_of_10)”: “anxiety”,“Population_density_(per_hectare)_2017”: “pop_density_per_hectare”,“Mortality_rate_from_causes_considered_preventable_2012/14”: ‘mortality’})# check dat dataframedata_for_map.head()

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

好多了。现在,我们需要将地理数据与清理后的伦敦数据集合并。我们将使用 pd.join()来实现这一点。

# join the geodataframe with the cleaned up csv dataframemerged = map_df.set_index(‘NAME’).join(data_for_map.set_index(‘borough’))merged.head()

地图时间!

开始贴图吧。首先我们需要为 Matplotlib 做一些准备工作。我们首先将一个变量设置为 map,设置范围并为要绘制的地图创建图形。

# set a variable that will call whatever column we want to visualise on the mapvariable = ‘pop_density_per_hectare’# set the range for the choroplethvmin, vmax = 120, 220# create figure and axes for Matplotlibfig, ax = plt.subplots(1, figsize=(10, 6))

舞台已经搭好了。地图时间。

# create mapmerged.plot(column=variable, cmap=’Blues’, linewidth=0.8, ax=ax, edgecolor=’0.8')

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

就在那里!不完美。有点扭曲,有一个奇怪的轴围绕着整个东西,这并不意味着什么。但是我们有一个 choropleth。现在让我们做一些美化,让它看起来新鲜。

定制地图

首先,那个轴心需要被移除。

# remove the axisax.axis(‘off’)

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

然后,让我们添加一个标题到我们的地图,和一些说明来源的文字。地图通常看起来很好,但是如果你不提供背景信息,它就没有多大意义。

# add a titleax.set_title(‘Preventable death rate in London’, fontdict={‘fontsize’: ‘25’, ‘fontweight’ : ‘3’})# create an annotation for the data sourceax.annotate(‘Source: London Datastore, 2014’,xy=(0.1, .08),  xycoords=’figure fraction’, horizontalalignment=’left’, verticalalignment=’top’, fontsize=12, color=’#555555')

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

漂亮!但是还缺少一样东西。我们可能应该添加一个图例,为用户显示值的范围。这将有助于它看起来不那么压扁。

# Create colorbar as a legendsm = plt.cm.ScalarMappable(cmap=’Blues’, norm=plt.Normalize(vmin=vmin, vmax=vmax))# empty array for the data rangesm._A = []# add the colorbar to the figurecbar = fig.colorbar(sm)

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

地图。制造。

最后一件事:我们需要保存地图,这样我们就可以发布一条带有#dataviz 标签的 tweet。

Matplotlib 在如何保存数据方面给了你很多自由。下面的代码将图片保存为 png 格式,但是如果你想在 Illustrator 中对它进行更多的修改,你也可以保存为 svg 格式。如果保存为 png,请确保使用 200 或更高的 dpi。否则地图和文字看起来会很模糊。没人想这样。

fig.savefig(“map_export.png”, dpi=300)

现在,我们的工作目录中已经有了一份可以发布的地图!太神奇了。

原来如此。您已经设置好了 Geopandas(至少对于 choropleths 是这样)。接下来,我将看看如何使用 Geopandas 制作多个地图,并将其转换成一个很酷的 gif 地图。敬请期待!

你可以在 Github 上查看并下载我的 Jupyter 笔记本。

让我们再次让聊天机器人变得伟大

原文:https://towardsdatascience.com/lets-make-chatbots-great-again-a30f5221a678?source=collection_archive---------6-----------------------

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

Photo by Mohamed Nohassi on Unsplash

聊天机器人曾经很棒。首先,在 1964 年,我们有了著名的聊天机器人伊莱扎,它让人们相信它真的是一名治疗师。然后,在 1968 年我们有了 SHRDLU 。如果你没有听说过,SHRDLU 是一个虚拟“积木世界”的对话界面:

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

SHRDLU’s blocks world (source)

以下是与 SHRDLU 的对话示例:

人:请你把两个红色方块和一个绿色立方体或一个金字塔叠起来好吗?

电脑:好的。

人:哪个立方体在桌子上?

电脑:支撑红色金字塔的绿色大电脑。

人:金字塔后面有大块吗?

电脑:是的,三个:一个大的红色的,一个大的绿色的立方体,还有蓝色的。

人:把一个小的放在支撑金字塔的绿色立方体上。

电脑:好的。

人:把最小的金字塔放在上面。

电脑:好的。

人:最高的金字塔的最矮的东西支撑着绿色的东西吗?

电脑:是的,绿色金字塔。

令人印象深刻。但那是过去的事了。

现在我们有了意向——有几个可以填充的槽的扁平结构。现代系统不太可能理解用户在上述对话中的最后一个查询。

哪里出了问题?

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

Photo by Toa Heftiba on Unsplash

这些“优秀的老式人工智能”系统在许多方面都令人惊叹,但它们也有缺陷。

他们需要大量的努力和工程才能做好。这不是将一堆训练数据粘贴到机器学习算法中并转动曲柄的情况——解释用户查询的自然语言语法是手工精心构建的。

统计技术没有被广泛使用,这意味着系统本质上是脆弱的。查询必须具有完全正确的形式,否则聊天机器人将无法理解。

他们也被限制在一个小范围内。一个可以移动街区的聊天机器人对大多数人来说是没用的。随着复杂性的迅速升级,推广 SHRDLU 这样的系统的努力失败了。

恢复平衡

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

Photo by Jonathan Pendleton on Unsplash

快进到 2018 年,我们已经走到了另一个极端。我们的系统非常强大。我们的解析器使用机器学习,并接受真实数据的训练。但是我们的聊天机器人太没有野心了,和 SHRDLU 比起来就相形见绌了。

他们并没有减少约束。我们现在应该能造出比 SHRDLU 更好的东西了吧?这是怎么回事?

我们已经忘记了我们的历史。我们缺乏想象力。我们忽略了学术界已经开发的技术。

走向综合

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

Photo by Mika Ruusunen on Unsplash

SHRDLU 很脆弱,但是可以处理复杂的查询。现代系统更加强大但简单。我们如何将这些结合起来,以建立比两者都更好的东西?

SHDRLU 由三个主要组件组成:

  1. 一个积木世界的模拟,允许 SHRDLU 知道每一个可能的动作会发生什么。
  2. 一个语法,它将用户查询翻译成 SHRDLU 可以解释的形式
  3. 一个计划器,帮助它探索可能的动作,以找到满足用户请求的序列。

第二和第三个组件对应于自 SHRDLU 开发以来的几年中受到大量关注的两项人工智能技术:

  • 语义解析器是将自然语言表达翻译成计算机理解的形式的工具。在过去五年左右的时间里,该领域重新引起了人们的兴趣,并且随着现代机器学习和新技术的应用,最先进的精确度得到了显著提高。
  • 自动规划是自 SHRDLU 时代以来一直在稳步发展的人工智能领域。自动化规划器已被用于美国国家航空航天局的机器人,玩电脑游戏,最著名的是,在围棋上击败人类。现代搜索技术和机器学习在这个问题上的应用彻底改变了这个领域。

第一个组成部分,世界模拟,是针对我们试图解决的问题的。有规划语言被设计用来描述世界。这些以自动化规划者理解的格式描述世界。

我们需要更好的工具

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

Photo by Matt Artz on Unsplash

最终,是聊天机器人创建工具让我们失望了。

我们需要工具来拓展聊天机器人的潜能。

如果我们构建一个利用这些最新进展的 SHRDLU 更新版本,会发生什么?没人知道,因为没人试过。

我想我们可以建造一些令人惊奇的东西。

请某人建造这个。否则我就得自己动手了。

让我们读一个故事:一项关于使用机器学习工具为儿童讲故事的研究

原文:https://towardsdatascience.com/lets-read-a-story-a-study-on-storytelling-for-children-using-machine-learning-tools-1b631bbbffac?source=collection_archive---------14-----------------------

让我们读一个故事是一项关于伊索寓言的研究,以及使用最近可用的机器学习工具以一种新的有趣的方式探索原始寓言中不同人物和思想之间的联系的可能性。

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

Let’s Read A Story — Using Sketch RNN as a homage to endpapers in bookbinding tradition

你可以在这里找到一个工作演示(chrome 桌面上的最佳性能)。

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

Let’s Read A Story

在下面的帖子中,我将尝试描述这个项目背后的思维过程和一些技术方面。

📜

收集资料。

在这个项目中,我选择关注和分析伊索寓言,在它们不同的句子之间产生新的有趣的邻接,从而创造新的故事。我被《伊索寓言》所吸引,因为它们简洁而丰富的故事情节,使用动物作为隐喻,以及每个故事中蕴含的强烈道德。

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

Aesop Fables for kids, project gutenberg

每个原始伊索寓言包含:

  1. 一个简短的标题,通常非常描述故事的内容和人物。
  2. 故事本身,通常不超过 30 句。
  3. 这个故事的寓意,通常包含一个隐喻,建立在故事中动物固有的本性或特质上。

清理数据集

为了对内容进行分析,我编译了一个 JSON 文件,其中保存了所有分解成单独句子的故事、它们的标题、角色和动物。

这个文件是生成实验新故事的关键,因为它保存了所有的句子,并作为实验的“数据库”。

此外,对于每个新生成的故事(新生成的故事从该故事发展而来),该文件充当从获取种子句子的源。

⚙️

分析句子

使用谷歌的通用句子编码器,一种将文本编码成高维向量的机器学习模型,可用于文本分类、语义相似性、聚类和其他自然语言任务,我分析了所有来自寓言的句子(约 1500 个句子)。

这产生了一个 JSON 文件,其中包含了 512 维空间中每个句子的句子嵌入,这是我用来比较和生成新邻接的相似性图。

文件中的示例行:

{“message”: “There was once a little Kid whose growing horns made him think he was a grown-up Billy Goat and able to take care of himself.”, “message_embedding”: [0.06475523114204407, -0.026618603616952896, -0.05429006740450859, 0.003563014790415764 ………..,0.06475523194004407]}

为了处理和检索句子之间的相似性、平均值和距离的信息,我使用了ML5word 2 vec 类和稍微修改了一下来使用通用句子编码器方案。

💡

第一次结果

从生成 10 个句子开始,第一个结果非常令人惊讶,有意义并且非常令人信服(对于一台机器来说)🤖),虽然对我来说有点阴暗:

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

First test in generating output text from the universal sentence encoder (10 lines from a random seed)

他们哭了。

他哭了。

哦,这是什么?他们哭了。

他们没有伤害我。

他们认为这是他们的盛宴。

现在轮到驴子坦白了。

又烦又失望的他哭了起来。

他独自一人。

一个路人听到了他的哭声,问发生了什么事。

这就是这只可怜的老鼠得到的全部同情。

另一次尝试产生了不同的结果,非常严峻,但仍然有趣:

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

Second test in generating output text from the universal sentence encoder (10 lines from a random seed)

不管他怎么努力,他都不能离开家。

他们说,他再也骗不了我们了。

这孩子知道他没什么希望了。

但他能做的最好的事就是把头伸出来。

我的儿子们,他说,注意我要对你们说的话。

他一时忘记了自己身在何处。

不不。爸爸正在看着,如果他靠近,爸爸会杀了他!

请让我走,他恳求道。

只要一点点就能击垮我,他说,你知道我有多脆弱。

他独自一人。

💻

构建网络应用

对于这个项目的第一个版本,我认为它最好能在网络浏览器上运行,这样几乎每个人都可以访问它。我选择在 Node 上构建第一个版本。JS 用于服务器端(相似性计算、情感分析和提供内容),javascript 用于前端功能(其他所有功能)。

🎨 +🎵

给故事添加插图&音乐短语

为了丰富故事,我选择使用 Google Magenta 的草图-RNN 模型:一个矢量绘图的生成模型来从预先训练的模型中重建插图,以伴随生成的故事。

快速抽奖数据集是由游戏的玩家贡献的跨越 345 个类别的 5000 万个抽奖的集合。。这些画被捕捉为带有时间戳的向量,并标有元数据,包括玩家被要求画的内容以及玩家所在的国家。

谷歌品红的聪明人训练了一个公开可用的递归神经网络模型,名为 sketch-rnn 。他们通过在从 Quick,draw 收集的数百万幅涂鸦上训练它,教会了这个神经网络画画!游戏。虽然我只是用它来简单地重建故事中的动物和其他一般插图,但这个庞大的数据集和网络还有许多其他创造性的应用。

对于 让我们读一个故事 ,我选择使用这个模型,同时对结果句子执行简单的正则表达式搜索。javascript 功能确定哪种动物出现在生成的故事中,然后使用 P5 从训练好的草图 RNN 模型重建插图。JS 。如果句子包含模型中不存在的动物,则有另一个函数“丰富”模型的关键字,并匹配句子中指定的相似动物。

这些插图然后变成基于一些预先确定的‘音乐’规则的音乐短语:

Lion Illustration and Sound

Lion Illustration and sound

当然,这种方法并不旨在可靠地再现故事,也有音乐声音和故事不匹配的情况,但它给了故事一定的触动,并以某种迷人的方式丰富了人物和插图。在未来的版本中,我打算改进这种方法,并加入真实的音乐数据或某种模型,这种模型可以更好地传达情感,以更合适的方式伴随故事的信息或主要人物。

🔮

走进未来

这是一个正在进行的项目,我打算在接下来的几个月里进行,希望它能成为我在 NYU ITP 的论文项目。我打算开发更多的工具,在这些和其他机器学习算法的帮助下,帮助构建更强有力的叙事。在其他平台上进行测试和部署会产生不同的结果,侧重于讲故事实践的不同方面——印刷书籍,以及智能设备、扬声器、平板电脑和其他沉浸式媒体平台。

我想探索的一个关键方面是将它变成一个部署在带屏幕的智能设备中的对话应用程序,因为我认为利用自然语言理解将大大有助于体验,并减少孩子们的屏幕时间。

有些问题没有得到解答:

  • 通过用新生成的故事分析原始故事来检索故事的新生成的寓意。
  • 根据课文中不同的种子句子重写一个故事。
  • 如果一个电脑故事由一个合成的声音来朗读会是什么感觉。
  • 深入挖掘叙事结构,构建更强大、更可靠的故事。
  • 生成多角色插图和动画。
  • 增强音乐主题。
  • 打破常规的动物原型,延伸人物的极限。

【Github 库:https://github.com/itayniv/aesop-fables-stories

这个项目是作为 2018 年秋季在 ITP NYU 举办的 丹尼尔·希夫曼的编程 A2Z 吉恩·科岗的神经美学 课程的一部分完成的。

让我们谈谈 NumPy——针对数据科学初学者

原文:https://towardsdatascience.com/lets-talk-about-numpy-for-datascience-beginners-b8088722309f?source=collection_archive---------3-----------------------

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

Numpy For Beginners

NumPy (数值 Python)是 Python 中的线性代数库。它是一个非常重要的库,几乎每个数据科学或机器学习 Python 包,如 SciPy(科学 Python)、Mat plot lib(绘图库)、Scikit-learn 等都在一定程度上依赖于它。

NumPy 对于在数组上执行数学和逻辑运算非常有用。它为 Python 中的 n 数组和矩阵操作提供了大量有用的特性。

本课程涵盖了作为数据科学初学者需要了解的关于 NumPy 的基础知识。其中包括如何创建 NumPy 数组、使用广播、访问值和操作数组。更重要的是,您将了解 NumPy 优于 Python 列表的优点,包括:更紧凑、读写条目更快、更方便、更高效。

在本课程中,我们将使用 Jupyter 笔记本作为我们的编辑器。

我们走吧!

安装 NumPy

如果您有 Anaconda ,您可以简单地从您的终端或命令提示符安装 NumPy,使用:

conda install numpy

如果您的计算机上没有 Anaconda,请使用以下命令从终端安装 NumPy:

pip install numpy

一旦你安装了 NumPy,启动你的 Jupyter 笔记本并开始使用。让我们从 NumPy 数组开始

NumPy 数组

NumPy 数组只是一个包含相同类型值的网格。NumPy 数组有两种形式:向量和矩阵。向量是严格的一维(1-d)数组,而矩阵是多维的。在某些情况下,矩阵仍然只能有一行或一列。

让我们从在您的 Jupyter 笔记本中导入 NumPy 开始。

import numpy as np

从 python 列表创建 numpy 数组

假设我们有一个 Python 列表:

my_list = [1, 2, 3, 4, 5]

我们可以简单地创建一个名为 my_numpy_list 的 NumPy 数组,并显示结果:

my_numpy_list = np.array(my_list)
my_numpy_list  *#This line show the result of the array generated*

我们刚刚做的是将 python 列表转换成一维数组。为了得到一个二维数组,我们必须转换一个列表,如下所示。

second_list = [[1,2,3], [5,4,1], [3,6,7]]new_2d_arr = np.array(second_list)
new_2d_arr  *#This line show the result of the array generated*

我们已经成功地创建了一个有 3 行 3 列的二维数组。

使用 arange()内置函数创建 NumPy 数组。

类似于 python 内置的 range()函数,我们将使用 arange()创建一个 NumPy 数组。

my_list = np.arange(10)*#OR*my_list = np.arange(0,10)

这将生成从索引 0 到 10 的 10 位数的值。

需要注意的是,arange()函数也可以接受 3 个参数。第三个参数表示操作的步长。例如,要获得从 0 到 10 的所有偶数,只需添加如下所示的步长 2。

my_list = np.arange(0,11,2)

我们也可以生成一个由七个零组成的一维数组。

my_zeros = np.zeros(7)

我们也可以生成一个由五个一组成的一维数组。

my_ones = np.ones(5)

类似地,我们可以生成具有 3 行 5 列的二维零数组

two_d = np.zeros((3,5))

使用 linspace()内置函数创建 NumPy 数组。

函数的作用是:返回指定区间内均匀分布的数字。假设我们想要从 1 到 3 的 15 个均匀间隔的点,我们可以很容易地使用:

lin_arr = np.linspace(1, 3, 15)

这给了我们一个一维向量。

不像 arange()函数将第三个参数作为步数,linspace()将第三个参数作为要创建的数据点的数量。

在 NumPy 中创建一个单位矩阵

处理线性代数时,单位矩阵非常有用。通常,是一个二维方阵。这意味着行数等于列数。关于单位矩阵要注意的一个独特的事情是对角线是 1,其他的都是 0。单位矩阵通常只有一个参数。下面是如何创建一个。

my_matrx = np.eye(6)    *#6 is the number of columns/rows you want*

在 NumPy 中生成一个随机数数组

我们可以使用 rand()、randn()或 randint()函数生成一个随机数数组。

  • 使用 random.rand(),我们可以生成一个形状的随机数数组,从 0 到 1 的均匀分布传递给它。

例如,假设我们想要一个从 0 到 1 均匀分布的 4 个对象的一维数组,我们可以这样做:

my_rand = np.random.rand(4)

如果我们想要一个 5 行 4 列的二维数组:

my_rand = np.random.rand(5, 4)
my_rand
  • 使用 randn(),我们可以从以 0 为中心的标准、正态或高斯分布中生成随机样本。例如,让我们生成 7 个随机数:
my_randn = np.random.randn(7)
my_randn

当你绘图时,结果会给我们一个正态分布曲线。

类似地,要生成 3 行 5 列的二维数组,请执行以下操作:

np.random.randn(3,5)
  • 最后,我们可以使用 randint()函数生成一个整数数组。randint()函数最多可以接受 3 个参数;数组的下限(包括)、上限(不包括)和大小。
np.random.randint(20) *#generates a random integer exclusive of 20*np.random.randint(2, 20) *#generates a random integer including 2 but excluding 20*np.random.randint(2, 20, 7) *#generates 7 random integers including 2 but excluding 20*

将一维数组转换成二维

首先,我们生成一个由 25 个随机整数组成的一维数组

arr = np.random.rand(25)

然后使用 shape()函数将其转换为二维数组

arr.reshape(5,5)

注意:reshape()只能转换成相等数量的行和列,并且必须等于等于元素的数量。在上面的例子中, arr 包含 25 个元素,因此只能调整为 5X5 矩阵。

定位 NumPy 数组的最大值和最小值

使用 max()和 min(),我们可以获得数组中的最大值或最小值。

arr_2 = np.random.randint(0, 20, 10) arr_2.max() *#This gives the highest value in the array* arr_2.min() *#This gives the lowest value in the array*

使用 argmax()和 argmin()函数,我们可以定位数组中最大值或最小值的索引。

arr_2.argmax() #This shows the index of the highest value in the array 
arr_2.argmin() #This shows the index of the lowest value in the array

假设你有一个很大的数组,你想知道这个数组的形状,你想知道它是一维的还是二维的,只需使用 shape 函数。

arr.shape

从 NumPy 数组中索引/选择元素或元素组

索引 NumPy 数组与 Python 类似。你只需传入你想要的索引。

my_array = np.arange(0,11)my_array[8]  *#This gives us the value of element at index 8*

为了获得数组中的一系列值,我们将使用切片符号’ : ,就像在 Python 中一样

my_array[2:6] *#This returns everything from index 2 to 6(exclusive)*my_array[:6] *#This returns everything from index 0 to 6(exclusive)*my_array[5:] *#This returns everything from index 5 to the end of the array.*

类似地,我们可以使用双括号[][]符号或单括号[,]符号来选择二维数组中的元素。

使用双括号符号,我们将从下面的二维数组中获取值’ 60 ':

two_d_arr = np.array([[10,20,30], [40,50,60], [70,80,90]])two_d_arr[1][2] *#The value 60 appears is in row index 1, and column index 2*

使用单括号符号,我们将从上面的数组中获取值’ 20 ':

two_d_arr[0,1] 

我们还可以进一步使用切片符号来获取二维数组的子部分。让我们在数组的一些角落里抓取一些元素:

two_d_arr[:1, :2]           *# This returns [[10, 20]]*two_d_arr[:2, 1:]           *# This returns ([[20, 30], [50, 60]])*two_d_arr[:2, :2]           *#This returns ([[10, 20], [40, 50]])*

我们也可以索引整个行或列。要获取任何行,只需使用它的索引号,如下所示:

two_d_arr[0]    *#This grabs row 0 of the array* ([10, 20, 30])two_d_arr[:2] *#This grabs everything before row 2* ([[10, 20, 30], [40, 50, 60]])

我们还可以使用 & (AND)、 | (OR)、<、>和==运算符对数组执行条件和逻辑选择,以将数组中的值与给定值进行比较。方法如下:

new_arr = np.arange(5,15)new_arr > 10 *#This returns TRUE where the elements are greater than 10 [False, False, False, False, False, False,  True,  True,  True, True]*

现在我们可以打印出在上述条件中为真的实际元素,使用:

bool_arr = new_arr > 10new_arr[bool_arr]  *#This returns elements greater than 10 [11, 12, 13, 14]*new_arr[new_arr>10] *#A shorter way to do what we have just done*

使用条件逻辑运算符 & (AND)的组合,我们可以得到大于 6 但小于 10 的元素。

new_arr[(new_arr>6) & (new_arr<10)]

我们的预期结果是:([7,8,9])

广播

广播是更改 NumPy 数组值的快速方法。

my_array[0:3] = 50*#Result is:* **[50, 50, 50, 3, 4,  5,  6,  7,  8,  9, 10]**

在本例中,我们将索引 0 到 3 中元素的值从初始值更改为 50。

对 NumPy 数组进行算术运算

arr = np.arange(1,11)arr * arr              *#Multiplies each element by itself* arr - arr              *#Subtracts each element from itself*arr + arr              *#Adds each element to itself*arr / arr              *#Divides each element by itself*

我们也可以在数组上执行标量操作。NumPy 通过广播使之成为可能。

arr + 50              *#This adds 50 to every element in that array*

Numpy 还允许你在数组上执行诸如平方根、指数、三角函数等通用函数。

np.sqrt(arr)     *#Returns the square root of each element* np.exp(arr)     *#Returns the exponentials of each element*np.sin(arr)     *#Returns the sin of each element*np.cos(arr)     *#Returns the cosine of each element*np.log(arr)     *#Returns the logarithm of each element*np.sum(arr)     *#Returns the sum total of elements in the array*np.std(arr)     *#Returns the standard deviation of in the array*

我们还可以获取二维数组中列或行的总和:

mat = np.arange(1,26).reshape(5,5)mat.sum()         *#Returns the sum of all the values in mat*mat.sum(axis=0)   *#Returns the sum of all the columns in mat*mat.sum(axis=1)   *#Returns the sum of all the rows in mat*

恭喜你,我们已经到了 NumPy 教程的最后了!

如果你学完了这一课,那么你已经学了很多。坚持练习,这样你新发现的知识就会保持新鲜。

有问题,遇到困难或者只是想打个招呼?请使用评论框。如果这个教程在某些方面对你有帮助,给我看一些👏。

是时候谈谈数据使用中的组织偏见了

原文:https://towardsdatascience.com/lets-talk-about-organizational-bias-in-data-use-92ba83bb2c59?source=collection_archive---------5-----------------------

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

数据使用中的组织偏见长期以来一直不为人所知。然而,它对企业及其底线的影响可能是破坏性的。本文旨在开始关于组织偏见的讨论,包括它是什么以及为什么您需要保持警惕以限制它对业务的影响。

数据使用总是容易受到偏见的影响。永远不可能完全客观。这是因为数据生命周期的所有阶段从收集到分析再到决策都涉及到人类。我们设计如何收集数据。我们决定数据的存储方式以及如何对行动进行分类或量化。我们进行分析或解释数据信号。

人类既是数据的创造者,也是数据的使用者,这一事实意味着偏见有可能蔓延到数据的生命周期中。出于这个原因,我们需要敏锐地意识到所有类型的偏见,以及它如何影响决策中的数据使用。

数据使用中有两大类偏差:

  1. 个体偏见
  2. 组织偏见

本文主要关注组织偏见。

组织偏见与个人偏见

2011 年至 2014 年间,我进行了博士研究,研究商业领袖如何在决策过程中使用数据。具体来说,我研究了影响领导者选择和使用数据方式的因素。

我发现对客观数据使用的最大影响和最大威胁是组织偏见,而不是个人偏见。

可以说,个人偏见更广为人知,讨论也更广泛。个人偏见也更加明确和容易识别。它包括个人或一小群人的偏见和成见。

个人偏见可以简单到在图表上选择颜色,强调一个数据的洞察力而不是另一个来支持一个先入为主的论点。或者可能更微妙,例如研究人员选择熟悉的城市进行研究,而没有充分考虑他们研究设计中的所有领域。你可能听说过两种更常讨论的个体偏差,包括确认偏差和选择偏差。

另一方面,组织偏见是一个在行业文章和出版物中不太突出的话题。然而,它的影响可能特别具有破坏性,因为它通常比个人偏见的影响范围更广。

当文化、高层领导、战略重点和团队组织等因素对数据选择和数据使用的影响达到不再以价值为基础的程度时,就会出现组织偏差。

组织偏见可能比个人偏见更难识别和隔离。这是因为组织偏见嵌入到每一件事情中,从使用的语言,提出的项目的选择,并影响整个企业的工作方式。组织偏见的普遍性质以及它在如此多的核心业务职能中被发现的事实意味着它比个人偏见更有可能被转化、系统化和影响更广。所有这些,提供了潜在的组织偏见,如果不诊断的话,将是特别具有破坏性的。

组织偏差的来源

每个组织都是独特的,因此组织偏见的来源可能来自许多不同的因素和许多因素的组合。

来源因素可能包括内部政治、文化、领导力、企业的行业部门、组织的历史、产品和团队设置等。每个企业都需要监控组织偏见。

以下是我在研究中发现的一些组织偏见的来源:

  1. 高层领导明确和含蓄地告诉他们的团队,一个数据源比另一个“更准确”(相对于根据他们的优点选择数据源)
  2. 团队的构建方式使他们能够更多/更快地访问一个数据源,而不是另一个数据源(而不是平等地访问整体见解和学习)
  3. 基于一个特定数据洞察或数据源的强制策略(相对于由跨部门整体洞察驱动的策略)
  4. 由于糟糕的数据洞察管理、低效的数据共享实践和对学习中心的少量投资(相对于成熟的共享和组织学习发展)而产生的数据孤岛
  5. 热情地采用新的度量技术,并将这些技术强制应用到项目中(相对于根据优点选择正确的度量工具)

限制组织偏见的技巧

限制组织偏见是制定客观数据驱动的决策的关键。

这里有四个系统可以帮助限制组织偏见,并确保高层领导根据最全面的可用数据做出决策。

  1. 使用决策框架。决策框架是在决策过程中培训和支持企业领导者的指导方针。决策框架的作用是鼓励领导者去除情绪。有许多类型的决策框架可以使用。在我的研究中,我设计了一个专门鼓励数据驱动决策的框架。它被称为 ICSAR 框架。阅读更多关于该模式如何帮助您做出更好的商业决策的信息。ICSAR 框架是一个可以使用的模型,但是还有其他的可以选择。
  2. **提供对数据洞察力的民主访问。**更成熟的数据驱动型组织和不太成熟的组织之间的一个关键区别通常在于数据的共享方式。不太成熟的组织控制和限制信息流。出于安全、权力、影响力和所有权等原因,数据由一小部分人控制。成熟的组织在共享数据见解和确保民主访问所有数据方面投入巨大,而不管团队如何。他们不太关注控制数据和花费精力,而不是使用信息的最佳方式。数据成熟度的一个试金石可以在会议中找到。在高层领导的会议中,大量时间花在讨论数据洞察力的准确性上,而较少讨论使用数据的最佳方式,这是数据使用实践不成熟的组织的明显标志。
  3. **结构良好的衡量、学习和发展机制。**许多企业现在面临的最大数据挑战不是收集数据见解,而是实际管理和综合可供他们使用的海量见解。领先的组织正在投资和开发以图书馆管理藏书的方式管理洞察力的方法。他们正在发展所需的团队、专家和基础设施,以对知识进行分类,并规划未来的研究和分析,以填补知识缺口。不太先进的企业通常没有适当的结构来管理他们的见解和数据学习。这导致了知识孤岛、重复的分析、没有全面信息的决策和投资浪费。
  4. **偏倚的外部评估和监测。**虽然有很多工作可以在内部完成以限制组织偏见,但企业也需要外部评估和监控。这是因为组织偏见往往是广泛而隐蔽的。它可能存在于组织中最高层领导的语言和偏见中,因此需要外部支持来帮助这些领导识别任何偏见。爱德华·戴明写道:“一个系统不能理解自己。这种转变需要外界的观点。”这也是事实,因为组织偏见是系统性的,企业需要一个客观的外部评估来帮助他们了解组织偏见可能在哪些方面影响他们的决策,并通过发展机会的建议来支持他们。

结论

2018 年,企业不仅有机会利用数据,而且有机会以更加智能的方式管理和高效地汇集可供他们使用的海量见解。

仅仅收集数据或拥有数据科学和洞察功能是不够的。我们已经放下了。数据的潜力已经得到了很好的证明。

企业在未来几年中脱颖而出并领先的关键方法是有效地综合和协调许多不同的学习,以制定有效的决策和独特的市场战略。如果企业不管理和考虑组织偏见,这些都不会发生。

管理组织偏见不会在一夜之间发生。它将需要在使用决策框架、数据共享民主化工具、构建持续发展跨业务学习的结构以及监控组织偏见的外部支持方面的投入。

然而,最终结果是更客观的、数据驱动的决策的组合。更全面地理解数据和见解。更有效地利用已经在数据基础架构中进行的投资。

提升经前综合症的人工智能水平

原文:https://towardsdatascience.com/leveling-up-ai-literacy-for-pms-dc293b79fe17?source=collection_archive---------16-----------------------

…以及我为什么要为产品经理讲授数据科学

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

AI isn’t magic.

如今,数据比以往任何时候都更加成为产品管理的核心。产品经理越来越多地负责运输机器学习驱动的产品功能,根据机器学习技术做出关键的产品决策,并与他们的数据科学同行建立强大的合作伙伴关系。

但当我问数据科学家和机器学习工程师他们的 PM 同行做得如何时,我听到的是:

“我的项目经理不知道该问什么问题。”

首相“无法将他们试图解决的问题框定为 ML 问题。”

“项目经理和高管对自己的理解过于自信,对可能/容易的事情过于自信。”

“不明白的事情就承认。不要假装你知道的比你知道的多。不要在未与工程师沟通的情况下对业务做出承诺。”

太多的组织正在雇佣数据科学家团队,而没有同时投资于其他人的数据和人工智能素养。因此,有太多的产品经理让数据科学家抓狂(反之亦然)。

以下是产品经理需要具备人工智能素养的原因:

❄️70 亿特殊雪花:你的用户需要它。️️❄️

秘密已经泄露——每个人都想感觉自己(等着瞧…)是一个个体。你、我和我们所有的用户都需要智能的、个性化的体验,让我们感觉自己就是特别的雪花。如果其他人都和我得到一样的东西,那有什么好兴奋的?

当用户通过注册帐户、参与应用程序并提供反馈来为公司提供数据时,他们希望产品随着时间的推移不断改进并变得更加智能。这些改进通常需要将用户参与产品本身所产生的数据产品化。

人工智能产品就在我们身边。Spotify 使用你的收听历史来创建个性化的播放列表,Gmail 使用以前的电子邮件内容来完成你的句子, Woebot 记住过去的对话,以便为你提供个人治疗会话, IntelligentX 的 AI 算法使用你对上一批啤酒的反馈来创建专为你的味蕾量身定制的食谱。是的,没错,你现在可以购买到艾酿造的啤酒。

即使这只是营销炒作,我们被所有这些令人兴奋的发展所包围的事实正是无休止地增加我们的期望和我们的“需求”(或想要)的事情。但是对于产品经理来说,这不仅仅是炒作——实现这些期望是你的工作。

🥣金发女郎项目经理:不要太专业,不要太夸张🥣

项目经理的工作包括设想什么样的未来产品是可能的,以及交付什么是有价值的。为了做到这一点,项目经理需要有恰到好处的数量的关于数据科学技术当前状态的知识。这种金发女孩级别的理解使项目经理能够弥合不同专业团队之间的差距——业务、技术和设计——而不会太沉迷于人工智能宣传,或太深入杂草中。

作为一个整体,项目管理规程已经精通传统的软件开发技术。这是一套全面的牌桌赌注。然而,当谈到数据科学技术时,大多数项目经理并不具备与他们在商业、工程和设计领域相同的技术理解水平,这是因为他们并不总是需要它。

直到现在。随着产品变得越来越“智能”,以满足每一个特殊的雪花用户的需求,越来越多的应用程序决策点将由预测模型取代,而不是由启发式和显式的 if-then-else 逻辑取代。

太多时候,项目经理会让他们的数据科学同行抓狂,要么是太深入技术领域(不太可能),要么是对炒作的应用程序过于热情(更有可能)。最佳时机介于两者之间。一个成功的项目经理需要了解数据建模、数据基础设施、机器学习模型和模型评估指标的基础知识。掌握了适量的知识,项目经理不仅可以发布让当前用户满意的产品,还可以提供未来可能创造的愿景。

🔮“ML 不是魔术”:产品经理需要了解 ML 开发流程,以便有效地与数据科学团队协作。🔮*

为了与他们的数据科学家和机器学习工程师同行建立更好的合作关系(和产品),项目经理需要了解开发过程中的主要差异,以及他或她在哪里可以发挥最有影响力的作用。

具体来说,项目管理系统在两个方面影响最大:模型输入和模型输出。“输出”是 ML 模型将生成的预测。至关重要的是,项目经理清楚地阐明该算法输出的商业价值,以及相关的约束条件——伟大的模型预测并不能保证成功的商业结果。“输入”是特征(也称为属性、独立变量、列等。)输入到模型中。垃圾进,垃圾出。与数据科学团队共享领域知识和上下文可以帮助团队发现更强的信号,从而产生更高质量、更易解释的输出。

至于剩下的——退一步,留给机器学习的黑匣子吧?没那么快。正如一位数据科学家所说,“项目经理需要知道 ML 不是魔术。”除了输入和输出之外,在开发过程中有许多地方,项目管理可能会意外出错。以下是一些潜在的场景:

  • 可解释性:生成个性化优惠券的模型将 75%的优惠券发送给成千上万的客户。首席财务官注意到本周毛利润下降,并询问项目经理为什么发出这么多优惠券,但没有人能确切解释是什么导致该模型向如此多的客户发出如此慷慨的优惠券。
  • 模型监测:一款个性化视频锻炼应用隆重推出。三个月后,一名用户写信给支持团队,想知道为什么该应用程序连续五天推荐相同的 15 分钟腹肌训练,尽管他已经完成了两次。已经着手开发下一个新功能的数据科学团队检查并意识到模型性能已经下降。
  • 数据收集:项目经理认为每周工作时间是预测学生是否会获得在线课程证书的相关特征输入。但是,这些信息不是学生个人资料的一部分,因此不能包含在特征工程过程中。

偏见、数据清理、模型评估……可以说,机器学习产品的开发过程充满了陷阱,很容易破坏精心规划的产品路线图。懂人工智能的项目经理可以更容易地预见并主动解决这些潜在的情况——在它们发生之前。

为了应对这些挑战,尼克·罗斯教授和我在旧金山大学的数据学院开发了一个为期 7 周的认证课程,名为面向产品经理的数据科学。该证书涵盖了关键的数据科学和机器学习概念,包括分析、统计、回归、聚类、分类、NLP、推荐系统和深度学习,重点是产品应用和业务挑战。

通过加强 PMs 的人工智能素养,我们可以在数据科学家和产品经理之间建立更有效的合作伙伴关系,并为 70 亿特殊雪花提供更多智能产品。

*我使用“数据科学团队”作为一个总括术语来指代构建产品的人。这个人的头衔可能是机器学习工程师或数据科学工程师(理想情况下),但有时简称为“数据科学家”。大多数公司仍在寻找组建和命名数据科学团队的最佳方式。

⭐️感谢我的优秀评论家:阿梅里奥·巴斯克斯-雷纳,普里亚·马休,文森特·乔,科纳·申和诺亚·费舍尔

📸照片由莎拉特鲁默从 Pexels。

使用 PostgreSQL、PSequel 和 Python 设置数据库

原文:https://towardsdatascience.com/leveraging-python-with-large-databases-pandas-postgresql-5073825167e0?source=collection_archive---------4-----------------------

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

(image source: https://avataai.com/big-data-streaming-processing/)

随着对数据科学家的需求持续增长,并被各种渠道(包括《哈佛商业评论》)称为“21 世纪最性感的工作”,有人问有抱负的数据科学家在走向他们的第一份数据分析师工作时应该掌握哪些技能。

现在有太多的在线课程来获得数据科学家擅长工作所需的技能(在线资源的优秀评论在这里在这里)。然而,当我自己回顾各种课程时,我注意到许多焦点都放在令人兴奋和浮华的主题上,如机器学习和深度学习,而没有涵盖收集和存储此类分析所需的数据集所需的基础知识。

(大)数据科学

在我们进入 PostgreSQL 之前,我猜想你们中的许多人都有同样的问题:我为什么要关心 SQL?

虽然数据库管理对于有抱负的数据科学家来说似乎是一个无聊的话题,但我知道实现一个狗品种分类器是非常有益的!—一旦你加入这个行业,这是一项必要的技能,数据也支持这一点:SQL 仍然是 LinkedIn 招聘信息中列出的最常见和最受欢迎的技能。

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

SQL is a necessary skills in many data science applications with large datasets (image source: chttp://exponential.io/blog/2015/02/26/big-data-sql/)

Pandas 可以很好地执行最常见的 SQL 操作,但不适合大型数据库——它的主要限制是内存中可以容纳的数据量。因此,如果一个数据科学家正在处理大型数据库,那么在将数据加载到内存之前,SQL 被用来将数据转换成熊猫可以管理的东西。

此外,SQL 不仅仅是将平面文件放入表中的方法。SQL 的强大之处在于它允许用户拥有一组彼此“相关”的表,这通常用“实体关系图”或 ERD 来表示。

许多数据科学家同时使用这两者——他们使用 SQL 查询将数据连接、切片并加载到内存中;然后他们使用 pandas 库函数在 Python 中进行大量的数据分析。

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

Example of an ERD (source: http://www.datanamic.com/dezign/erdiagramtool.html)

这在处理大数据应用中的大型数据集时尤为重要。这样的应用程序在有几十亿行的数据库中会有几十 TB。

数据科学家通常从 SQL 查询开始,在转移到 Python Pandas 进行数据分析之前,SQL 查询将提取 csv 文件所需的 1%的数据。

输入 PostgreSQL

有一种方法可以在不离开深受喜爱的 Python 环境的情况下学习 SQL,在 Python 环境中教授和使用了如此多的机器学习和深度学习技术:PostgreSQL。

PostgreSQL 允许您在处理不是存储在平面文件而是存储在数据库中的大型数据集时,利用令人惊叹的 Pandas 库进行数据辩论。

PostgreSQL 可以安装在 Windows、Mac 和 Linux 环境中(参见安装细节这里)。如果你有 Mac,我强烈推荐安装 Postgres。App SQL 环境。对于 Windows,请查看 BigSQL

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

PostgreSQL 使用客户机/服务器模型。这涉及两个运行过程:

  • 服务器进程:管理数据库文件,接受客户端应用程序到数据库的连接,并代表客户端执行数据库操作。
  • 用户客户端 App :经常涉及到 SQL 命令条目,友好的图形界面,以及一些数据库维护工具。

在实际场景中,客户端和服务器通常位于不同的主机上,它们通过 TCP/IP 网络连接进行通信。

正在安装 Postgres。App 和 PSequel

我会专注于 Postgres。在教程的其余部分中。
安装 PostgresApp 后,您可以按照以下说明设置您的第一个数据库:

  • 单击“初始化”创建新的服务器
  • 一个可选的步骤是配置一个$PATH 来使用 Postgres.app 提供的命令行工具,方法是在终端中执行以下命令,然后关闭&重新打开窗口:
    sudo mkdir -p /etc/paths.d && echo /Applications/Postgres.app/Contents/Versions/latest/bin | sudo tee /etc/paths.d/postgresapp

现在,您已经有了一个运行在 Mac 上的 PostgreSQL 服务器,默认设置为:
Host: localhost, Port: 5432, Connection URL: posgresql://localhost

我们将在本教程中使用的 PostgreSQL GUI 客户端是 PSequel 。它有一个极简和易于使用的界面,我真的很喜欢轻松地执行 PostgreSQL 任务。

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

Graphical SQL Client of choice: PSequel

创建您的第一个数据库

一旦 Postgres。App 和 PSequel 安装完毕,你现在可以设置你的第一个数据库了!首先,从打开 Postgres 开始。应用程序,你会看到一个小象图标出现在顶部菜单。

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

您还会注意到一个允许您“打开 psql”的按钮。这将打开一个 ommand 行,允许您输入命令。这主要用于创建数据库,我们将使用以下命令创建数据库:
create database sample_db;

然后,我们使用 PSequel 连接到刚刚创建的数据库。我们将打开 PSequel 并输入这个名字的数据库,在我们的例子中是:sample_db。单击“连接”连接到数据库。

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

创建并填充您的第一个表

让我们在 PSequel 中创建一个表(由行和列组成)。我们定义了表的名称,以及每一列的名称和类型。

PostgreSQL 中可用于列(即变量)的数据类型可在 PostgreSQL 数据类型文档中找到。

在本教程中,我们将创建一个简单的世界国家表。第一列将为每个国家提供一个“id”整数,第二列将使用可变长度字符串(最多 255 个字符)提供国家名称。

准备就绪后,单击“运行查询”。然后将在数据库中创建该表。不要忘记单击“刷新”图标(右下角)来查看列出的表格。

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

我们现在准备用数据填充我们的列。有许多不同的方法来填充数据库中的表。要手动输入数据,INSERT会派上用场。例如,要输入 id 号为 1 的国家摩洛哥和 id 号为 2 的澳大利亚,SQL 命令是:

INSERT INTO country_list (id, name) VALUES (1, 'Morocco');
INSERT INTO country_list (id, name) VALUES (2, 'Australia');

运行查询并刷新表后,我们得到下表:

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

实际上,手动填充数据库中的表是不可行的。感兴趣的数据很可能存储在 CSV 文件中。要将一个 CSV 文件导入到country_list_csv表中,使用如下的COPY语句:

COPY country_list_csv(id,name)
FROM 'C:\{path}\{file_name}.csv' DELIMITER ',' CSV HEADER;

正如您在上面的命令中看到的,带有列名的表是在COPY命令之后指定的。列的排序方式必须与 CSV 文件中的相同。CSV 文件路径在FROM关键字后指定。还必须指定 CSV DELIMITER

如果 CSV 文件包含带有列名的标题行,则用关键字HEADER表示,以便 PostgreSQL 在从 CSV 文件导入数据时忽略第一行。

常见 SQL 命令

SQL 的关键是理解语句。一些陈述包括:

  1. CREATE TABLE 是一条在数据库中创建新表的语句。
  2. DROP TABLE 是删除数据库中的一个表的语句。
  3. 选择可以读取数据并显示。

SELECT 是您告诉查询您想要返回哪些列的地方。
FROM 是告诉查询从哪个表查询的地方。请注意,该表中需要存在列。例如,假设我们有一个包含几列的订单表,但是我们只对其中的三个子集感兴趣:

SELECT id, account_id, occurred_at
FROM orders

另外,当您只想查看表格的前几行时, LIMIT 语句非常有用。这比我们加载整个数据集要快得多。 ORDER BY 语句允许我们按任意行对表进行排序。我们可以将这两个命令一起用于数据库中的“订单”表,如下所示:

SELECT id, account_id, total_amt_usd
FROM orders
ORDER BY total_amt_usd DESC
LIMIT 5;

探索其他 SQL 命令

现在,您已经了解了如何在 PostgreSQL 中设置数据库、创建表和填充,您可以按照以下教程中的说明,探索其他常见的 SQL 命令:

用 Python 访问 PostgreSQL 数据库

一旦设置好 PostgreSQL 数据库和表,就可以转移到 Python 来执行任何所需的数据分析或争论。

PostgreSQL 可以使用 psycopg2 模块与 Python 集成。它是一个流行的 Python PostgreSQL 数据库适配器。在 Python 2.5 . x 版及更高版本中,它与默认库一起提供

可以通过以下方式连接到现有的 PostgreSQL 数据库:

import psycopg2
conn = psycopg2.connect(database="sample_db", user = "postgres", password = "pass123", host = "127.0.0.1", port = "5432")

回到我们的 country_list 表示例,在 sample_db 中向表中插入记录可以在 Python 中用以下命令完成:

cur = conn.cursor()
cur.execute("INSERT INTO country_list (id, name) \
      VALUES (1, 'Morocco')");
cur.execute("INSERT INTO country_list (id, name) \
      VALUES (2, 'Australia')");
conn.commit()
conn.close()

用于创建、填充和查询表的其他命令可以在教程点PostgreSQL 教程的各种教程中找到。

结论

现在,您已经有了一个可以运行的 PostgreSQL 数据库服务器,可以进行填充和使用了。它功能强大、灵活、免费,被许多应用程序使用。

在后 GDPR 时代利用您的数据

原文:https://towardsdatascience.com/leveraging-your-data-in-a-post-gdpr-world-208064472659?source=collection_archive---------7-----------------------

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

image credit — Modus Direct

搜索、社交媒体、云计算和商业分析已经在很大程度上实现了发展我们经济的全球参与者的承诺。为了保护我们自己的数字投资,我们今天投入资源解决 GDPR 问题也就不足为奇了。尽管如此,这些法规遵从性的努力可能被证明是被误导的,因为你的公司数据永远不会比你的利益相关者对你的数据实践的信心更有价值。在数字经济中,竞争优势依赖于对信任的理解,而不是对数据的理解。让我们探索挑战的本质,GDPR 在多大程度上是答案,以及公司如何利用“设计的信任”为后 GDPR 世界做准备。

为了理解这个赤裸裸的事实,我们需要仔细看看是什么产生了一个组织的底线。消费者购买产品、服务和想法的条件是,有一个普遍接受的经济交换体系,确保交易本身的定义、价值和秩序。由于公司和消费者都无法确保合规,他们传统上向各种中介机构付费,以保证交易所的偿付能力:银行核实账目以促进支付,保险公司监督健康和财产风险,国家本身提供教育、基础设施和社会保障。随着数字经济成为现实,这种对可信中介的需求加速增长:Alphabet、脸书、亚马逊和阿里巴巴利用规模经济和网络效应,形成了事实上的垄断。

信任的悖论:随着企业收集越来越多的数据,信任本身变得越来越稀有和珍贵。

在数字经济中,服务只不过是问题的答案,而数据则为尚未提出的问题提供答案。这些问题中首先也是最重要的是信任的悖论:尽管关于公司、经理和产品的信息从未如此丰富,但信任本身已经变得越来越稀缺和宝贵。这种信任缺失在某种程度上可以用全球经济的本质来解释:信息生产者和消费者之间的物理和感知距离从未如此之大。在第二个层面上,经济和社会交流的数字化创造了营销占主导地位的虚拟交流。最后,商业道德和价值观的衰落证明了后真相经济的假新闻是正确的——产品变成了信息。难怪真理的本质已经从基于对经济的盲目信任转变为作为经济决策基础的“委托信任”。

欧洲的一般数据保护法规既承认数字数据已成为世界经济的新货币,也承认收集和组织这些“交易”的大量记录的私人和公共组织控制着他们的客户。GDPR 明确认识到这种内在的危险,建议对描述我们是谁、我们想什么和我们做什么的私人和敏感数据的商业使用进行监管。 GDPR 推出了欧洲公民数字权利法案欧洲公民(“数据主体”)有权知道这些数据是如何、在哪里以及出于什么目的被收集的。现在要求数据控制员和数据处理员制定流程和内部记录保存要求,以确保符合这些新法规。最重要的是,立法者旨在影响我们数据实践的性质——数据保护应该是我们数据库、应用程序和信息系统设计的前提。

GDPR 保护个人数据,而不是个人隐私和利益

尽管这些努力值得称赞,但 GDPR 优先考虑数据保护,而不是个人隐私,同时将目标对准依赖于信息集中控制的计算机应用程序。随着技术的发展,新的软件迭代正在部署分散管理,以实现更大程度的透明性和可追溯性。分布式账本技术就是这样一种迭代;基于区块链的交易可以在很大程度上消除在我们的边境、我们的行政部门和我们的日常经济交易中保证个人数据有效性的中介需求。这些共享可以透明地实时报告组织的财务交易以及个人收入。区块链可以检查求职者的就业、信用或社会服务的凭证,从而促进更安全、更保密的点对点交易。如果 GDPR 的目标是在保护个人隐私的同时限制企业中介的垄断,那么它反过来也需要发展,以促进这些新一代技术的发展。

Trust by design 是一套数据实践,它结合了短期监管要求,同时探索了新形式 IT 的长期机遇。

" Trust by design "提出了一套数据实践,既考虑了 GDPR 的短期需求,又探索了新形式 IT 的长期机遇。总体愿景是开放、交互式的数据实践,提供透明度、客户授权、可移植性和数据质量。指导原则包括数据合理性 - 为消费者提供捕获其私人数据的既定目标、影响评估 - 记录您的数据存储在内部和云上的过程、数据安全性-确保您的组织拥有安全使用专有和开放数据的专业知识、选择性访问 -允许数据所有者决定其暴露程度,以及开放实践 -制定

我将于 11 月 9 日在柏林的 Group Futurista 的后 GDPR/FODP 峰会上讨论和发展这些主张。请不要犹豫,分享你的想法和建议头导致这一事件。我期待着在那里见到你。

李·施伦克博士

商业分析研究所

2018 年 10 月 27 日

Lee Schlenker 是商业分析和社区管理教授,也是 http://baieurope.com 商业分析研究所的负责人。你可以在的推特上关注白

博士后的生活:❤️的“b 选项”,离开

原文:https://towardsdatascience.com/life-after-a-phd-the-option-b-leaving-a18bc89e2d33?source=collection_archive---------0-----------------------

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

Leaving Academia might feel like pointing to the dessert from a high tower. (“Edge of the World”, Riyadh)

上周,我被邀请去我的博士学校分享我离开学术界的经历。在准备我的想法时,我写了这个,我分享它,希望它也能服务于其他人。按照要求,它包括一个问卷答案。

在科学方面,读完博士后的 A 计划是获得一个或两个博士后,同时发表论文,积累引用。这为最终获得永久职位创造了条件。我们被告知,这是最优秀科学家的最佳案例。这就是科学家的 A 计划。我认为这也是错误的、危险的和短视的。

从科学家的知识基础价值转变为科学家的技能基础价值。

一个选择离开学术界的科学家不应该成为 b 计划。这不比继续进入公共资助的学术研究的漏斗更好或更坏。我们应该致力于让科学家对社会产生最积极的影响。影响的发生通过同行评议论文的确增加了我们对现实的了解,但也非常具体地改善了私营部门的产品和服务,找到了更好的方法来消除贫困,制造自动驾驶汽车,了解政府政策的影响并提出建议。这里的关键是从科学的知识基础价值转移到科学家的技能基础价值。注意我强调的是科学家科学,以及技能知识。不是拥有在论文中发表事实的活字典的价值,而是拥有罕见技能的人的价值,他们必须发展这些技能来获得这些知识。数学技能,建模技能,剖析复杂过程的概念框架,…

我 9 年前拿到了博士学位。我为我的工作感到非常自豪。两年后我离开了研究。起初,我有一种非常强烈的想要其他东西的感觉,但不确定是什么,或者如何得到它。我觉得自己处于某个领域的顶端,但去别的地方就意味着失去这种特权。我也觉得这比停留在学术科学上更没有价值。这可能听起来有些耳熟。这么多年后,我可以分享这条路是怎么走的。我学到的一件重要的事情是,我们通常说科学,当我们指的只是它的一种类型:公共资助的学术研究科学。有很多科学不是公共资助的,或者不是在学术界做的,或者不是为了研究做的。这些年来,我周游世界的次数比我梦想的还要多(我还多次梦想去旅行)。我的贡献在实用主义和经济上都受到高度评价。我遇到了非常有趣的人,并向他们学习。我参与了非常具体的解决方案,涉及非常广泛的主题(比如不丹的榛子物流跨国公司对气候变化的适应,或者在旧金山为自动驾驶汽车制作地图)。我对……选项 b 很满意。世界需要更多……选项 b。事实上,今年 1 月,我决定离开我在世界银行的工作岗位,投身于这一关于科学家在学术界之外的价值的想法。我们需要更多这种撞击科学

当我们只指一种类型的科学时,让我们停止说科学:公共资助的学术研究科学

但不要把这当成建议。我这里提供的是我的经验。我试着解释我的情况,帮助的来源和态度。这充其量只是一个案例奏效的轶事证据。我不知道有多少人尝试过却失败了,也不知道他们做了什么,也不知道有多少无形的玻璃门向我敞开,作为一个没有债务、没有依靠的西方白人。这也是为什么最近我一直在世界各地旅行并收集对那些也离开学术界的科学家的采访的部分原因。为了准备这次会议,我还做了一份快速问卷来获得一些额外的反馈。这不是一个统计研究,但它现在是几个轶事证据的集合,在我写这篇文章的时候有 120 个案例。所有的回答都可以在这里找到(只要回答中包含可识别的信息,我都会匿名)。

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

在目前回答的 120 人中,45%目前不在研究中,58%不在大学或研究机构。“备选方案 B”。

我从问卷中得到的一个惊喜是,科学家离开学术界时自我报告的最大资产与最大障碍密切相关。使科学家优秀的东西似乎也使我们不优秀。那就是解决问题。我们自我报告了一个非常好的解决问题的能力,但也说兴趣更多的是在理解问题本身,而不是那么什么,实现的链接,或将这种解决问题的技能应用于“现实世界”的问题。

从调查问卷中我还了解到,离开学术界的原因很少是积极的,例如扩大科学的应用,对人们的生活产生更直接的积极影响,……在几乎所有情况下,人们似乎都是被推出去的(压力、生活平衡或很少的钱),而不是选择离开。

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

Happiness with academic life now, or at the moment of leaving. 1 is HAPPY (reality meets expectations). 6 is UNHAPPY (reality doesn’t meet expectations).

上图对我来说也很有戏剧性。大多数(> 50%的受访者)不快乐(> 3),尤其是最常见的是第二至最严重的不快乐。如果我分解一下,以“2+博士后”为“最高学术水平”的人最不开心(中位数 4.5)。最快乐的是那些在私营部门做研究的人(中位数为 1)和全职教授(也是 1,但他们也有最高的可变性,总体标准差超过两倍)。

离开学术界的原因不应该(仅仅)是沮丧。我这样说是因为在与人交谈时,我发现这种消极情绪是许多人的主要原因。对非研究任务、文书工作、拨款、内部政治、发表或毁灭的失望……这里有两点要说明。一方面,其中一些确实是生活的一部分。你的工作不会只有好的部分,所以这实际上是一件好事,因为博士生被迫增加那些“支持”活动。博士学位不仅是它的新颖内容,它增加了人类对一个领域的理解,而且创造了一个独立的科学家,包括它所涉及的所有事情,包括组织一次会议和做文书工作。现在,另一方面,学术界有许多破碎的东西是绝对正确的。不可复制的论文只发表正面成果腐蚀心理健康的环境供给过剩的博士后,不一而足。我发现避免美化或贬低任何选项都非常重要。

现在,对于实际的东西。根据我的经历、我面试过的人的经历和我做过的研究(一语双关),我能提供什么建议?这项工作仍在进行中,但我可以提供一些建议:

如果你是一名学者

  • 爱情无国界,跨越界限。测试你在一个领域/地方/主题发展到另一个领域/地方/主题的技能。它有助于看到技能相对于知识的价值。例如,将您对太阳的图像分析技能应用到飓风破坏的地球观测图像上,以更好的图像支持响应行动。看看你是否可以使用其他仪器的数据。创新通常发生在不同领域的界面或交叉点。
  • 你建了什么> CVs。当我招聘的时候,我需要人来解决问题。如果他们坦率地说出他们从头到尾都在做的项目,我会更愿意倾听。雇主需要知道你在第一天就能发挥作用,而不是你有学位。
  • *挑剔≠消极。*我想说,科学家真的很擅长找出漏洞,找出问题所在,找出可以改进或做得更好的地方。有时候,更好的办法是关注什么在起作用,并理解为什么会这样。这在团队工作、尽职调查或提供专业建议时尤为重要。把事情做得更好可能是好的,把事情做好更好。
  • 不要家长式作风。我发现许多科学家,包括我自己,都落入了“照我说的做,因为如果你知道我知道的,你会照我说的做吗”的陷阱。通常你知道你不知道的部分,并且可能有很强的理由说明事情不应该是这样的。比如气候变化。这不仅仅是停止排放二氧化碳,还涉及激励、就业、政治议程、外交……尽管科学家推出了停止排放二氧化碳的数据,但在科学只是其中一部分的场所,进展正在发生,如联合国达沃斯

如果你管理学术

  • 科学家还是科学?。你所在单位的目标是搞科学(这可能意味着获得政府资助的研究拨款),还是培养科学家(拥有科学技能的人,不管他们在哪里应用科学)。如果是后一种情况,它提供了一个起点来建立一个衡量成功的标准,而不是关于数量或论文、资金或给予机构的引用。
  • 心理健康不是管理危机。有一个系统来检查人们并在危机中提供专业帮助是好的,但它也为心理健康、恢复力、压力管理、自省、冥想等提供工具
  • 衡量幸福感。我非常支持测量匿名化的幸福水平。幸福是主观的,部分是个人的决定,是整体的。这通常是一个糟糕的指标。然而,缺乏快乐通常发生在一系列你可以克服的具体障碍上。如果你压力很大,如果你生病了,如果你和你的导师有问题,如果你的通勤时间是 2 小时,如果你没有通过,你就不会快乐。建立集体幸福感意味着努力消除让人们不快乐的障碍。
  • 在培训中加入软技能:雇佣专家来提高沟通技巧(像演员一样),更多面向公众的学生组织的活动,…
  • 提供非研究选项的可见性。联系公司和校友,宣传他们的职位、实习或特定项目。邀请离开学术界的校友分享经验。与其他非研究机构建立联盟和协议,以共享职位空缺、新闻和会议机会。
  • 良师益友。导师的形象很重要,同样重要的是有更专业经验的人来帮助你做出决定或解决问题。你的博士导师通常是你的导师。好友的形象更像是一个刚去过你那里的同伴,所以它能提供更多个人的和具体的建议。伙伴通常是去年的学生或最近的博士后。

发送您对这些话题的想法和反馈。我非常想听听我应该研究的其他经历、观点、人物或研究。谢谢!!

爱丽丝、鲍勃和夏娃的神经网络生活

原文:https://towardsdatascience.com/life-of-alice-bob-and-eve-with-neural-net-6df0ad1d6077?source=collection_archive---------16-----------------------

学习用对抗的神经密码术保护通信

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

Image from pixabay

作为一个“人”,如果说我对我们这个物种有一件事是肯定的,那就是,当我们发现或发明某样东西时,我们会尝试将它与已经存在的技术相结合,不管它可能多么怪异。嗯,我想这是人类的一部分。Martin Abadi 和 David G. Andersen 的论文学习用对抗性神经加密技术保护通信就是这种好奇心的结果。

这篇文章将会是一篇很长的阅读文章,完整地介绍了这个理论,并使用 TensorFlow 在 python 中实现了这个系统。我建议你在我们开始前喝杯热伯爵茶。

我们需要知道什么?

至少有两个话题是在座的各位需要清楚了解的:

  1. 对称密码系统
  2. 甘是如何被训练的

它们都是非常宽泛的话题。出于时间和注意力的考虑,我将对这两者做一个简单的介绍,这样就足够了,如果你已经很熟悉了,可以直接跳过。

对称密码系统

对称密码系统的基本思想可以很容易地用一个古老的三个人的例子来解释,他们是爱丽丝、鲍勃和伊芙。在开始之前,我们假设 Alice 和 Bob 共享了一个密钥。一天,Alice 想给 Bob 发送一条秘密消息,她用共享密钥加密这条消息,生成一条密文。之后,Alice 通过一个可能不安全的通道将密文发送给 Bob。稍后,当 Bob 接收到该密文时,他使用相同的共享密钥对其进行解密并读取消息。另一方面,当密文通过不安全的通道时,它被 Eve 截获,但她无法解密,因为她没有共享密钥。这里要注意的关键点是,即使消息是通过不安全的通道传递的,它也不会受到损害。现在可能会出现一个问题,关于这个共享密钥的起源,这是一个完全不同的故事,它会将我们带入非对称密码系统的世界,我们现在不会研究它。

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

Figure 1 — Symmetric Cryptosystem

上图不仅清楚地展示了刚才所解释的内容,还直观地一口气解释了对称密码系统的基本基础。

甘是如何被训练的

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

Figure 2 image from Generative models and adversarial training by Kevin McGuinness

对抗的:以冲突或对立为特征的

与神经网络作为监督学习算法的常见用途不同,在神经网络中,它学习分类或预测某些东西,在生成对抗网络或简称 GANs 的系统中,通常有两个网络,一个名为生成器,另一个名为*鉴别器。生成器模型的工作是创建自己的假样本。例如,一个图像;而鉴别器的工作是分类它看到的图像是假的(即由生成器创建)还是真的(即取自真实世界)。在训练中,每次迭代生成器都试图愚弄鉴别器,而鉴别器则试图不被生成器愚弄。因此得名*。**在发生器欺骗鉴别器的情况下,鉴别器会根据损耗进行优化,以便更好地区分真假样品。但是如果发生器不能欺骗鉴别器,那么发生器通过损失被优化以创建更好的样本。

如果你对 GAN 的工作方式很感兴趣,我建议你阅读这篇文章或者如果你想看看目前所有的应用,你可以看看这篇文章

**注意:**我们不会使用 GAN,但我使用它是为了解释一种不同类型的训练,其中神经网络可以通过相互竞争来训练,这是本文的重要部分。

走向

现在我们都有了对称密码系统和对抗网络的基本概念,是时候把它们混合在一起了。在这篇论文中,作者尝试使用神经网络,而不是使用严格的对称密钥算法,如 AES、Triple DES 等。加密或解密信息,我们很快就会谈到它的对抗性部分。

我们把神经网络整合到这个密码系统的什么地方?

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

Figure 3

我们训练三个神经网络,即 Alice、Bob 和 Eve,它们的工作如下:

  • Alice 的工作是接收 n 位消息(编码为-1 和 1 的向量,分别代表 0 和 1)和 n 位密钥作为输入,输出 n 位密文。
  • Bob 的工作是获取 Alice 创建的 n 位密文,并使用 n 位密钥作为输入来重构原始的 n 位消息。
  • Eve 的工作是只获取 n 位密文,并尝试重新创建原始的 n 位消息。

与最初的对称密码系统模型相比,除了用神经网络代替了严格的加密和解密算法之外,没有什么变化。
这里要注意的要点是,我们正在创建一个对抗性的神经网络,在这种意义上,Alice 训练使用共享密钥来创建密文,Bob 训练使用共享密钥来解密密文,Eve 训练在不知道共享密钥的情况下从密文重建原始消息。

我们为什么需要夏娃? 由于我们正试图让爱丽丝和鲍勃自己学习一种安全地交流数据的方法,我们无法向他们提供从可用的对称加密算法创建的消息和密码对的数据集。这将违背它自己学习加密和解密的全部目的。此外,仅让 Alice 和 Bob 在模型中可能会导致 Alice 学习将消息原样传递给 Bob,而不进行任何形式的加密或进行某种形式的容易被破解的加密,因此我们需要 Eve 充当安全通信的对手。爱丽丝学会了更好的加密方式来与鲍勃安全地通信,夏娃变得更擅长破解它们,直到达到一个点,在这一点上,夏娃不再能够跟上,没有密钥就无法理解任何事情。现在,我们实际上实现了它并计算了它背后的数学。

希望现在这里的每个人都对我们的讨论有了一些形式的想法,所以,从这一点开始,我们将继续理论的其余部分,同时也构建其相应的代码,这是因为至少对我来说,我一直觉得通过代码来理解事物更舒服,这是由于单词的性质有时可以以不同的方式解释,但代码…代码是绝对的。

让我们使用 TensorFlow 亲自尝试一下

对于那些有足够信心直接钻研其代码的人来说:

[## VamshikShetty/对抗性-神经-密码学-张量流

使用对抗网络模仿对称密码系统

github.com](https://github.com/VamshikShetty/adversarial-neural-cryptography-tensorflow)

创建单个模型

在开始构建单独的模型之前,我们还需要一些东西。为了简单起见,我们将认为文本和密钥具有相同的大小,让我们说 16 位,这是作者在本文中考虑的最小大小。为了训练,作者使用了从 256 到 4096 的小批量。

text_size   = 16
key_size    = 16
batch_size  = 4096

考虑到这一点,现在这些都是必需的参数,我们创建两个张量来保存随机生成的消息和密钥。我们希望一次保存 4096 的整批大小,因为每个文本或键的大小是 16,所以每个张量的形状将是(4096,16)。

在上面的代码片段中,名为model的函数用于创建所需的神经网络。该函数采用三个输入参数,其中collection是模型的名称(“Alice”、“Bob”或“Eve”),因此为模型创建的所有层都在一个范围内。message是保存文本的张量,而key是保存共享密钥的张量。这里需要注意的一点是,如果给定了一个密钥,if条件的计算结果为True,消息和密钥被连接起来形成一个大小为 32 位(text_size + key_size)的张量。这个场景对 Alice 和 Bob 有效。而对于 Eve,if将评估为False,并且仅给出密文作为输入。

在每个模型中,除了输入张量之外,模型的其余部分彼此相似。每个网络都有一个大小为 2n (n =消息/密钥位数)的全连接(fc)层,其后是四个 1 维卷积层。

完全连接的层的作用非常直观。每种加密方法都有某种形式的混合和转换,该层使消息和密钥位能够影响 fc 层中每个独立神经元的输出,因为每个输出位可以是所有输入位的线性组合。

FC 层之后是一系列卷积层,最后一层产生大小适合于明文或密文的输出。这些卷积层学习将一些函数应用于由前一层混合的比特组,以利用空间局部性。因为作者希望局部性(即要组合的位)成为一种习得的属性,而不是像严格对称密钥算法中那样预先指定的属性。

现在是从 2n 位 FC 层获得 n 位输出的棘手部分,因为它后面有 4 个卷积层,并且我们最终没有任何 n 位大小的 FC 层来产生 n 位输出。为了回答这个问题,让我们把注意力转移到第二 Conv 层,我们设置步幅值为 2,填充设置为“有效”。如果你熟悉卷积,那么你一定已经明白,在这个模型中,2N 个单位减半,我们得到一个 n 位张量。

**注:**滤镜、核大小、步幅等参数均按原纸取。

为什么我们在最后一层有 Tanh 作为激活函数?
由于我们分别使用-1 & 1 来表示 0 & 1 位,如果我们的输出也有类似的表示,并且双曲正切函数在-1 和 1 的范围内产生输出,那就更好了。就这么简单。

对于好奇的读者来说,他们想知道Expand_dimsSqueeze函数在扮演什么角色;最初,输入的大小为(4096,32),当进行卷积时,出现了一个称为通道的概念,类似于我们在一幅图像中有 3 个通道,即 RGB。鉴于我们的数据只是一个渠道,我们需要数据来显示类似的特征。因此Expand_dim将(4096,32)转换为具有一个通道的数据,即(4096,32,1),最后Squeeze函数做相反的操作。

模仿对称密码系统

Alice _ out _ ciphew 表示 Alice 模型的输出,即 Bob 和 Eve 将试图解密的 n 位密文。您可以在第 8 行和第 11 行分别看到这个密文作为 Bob 和 Eve 模型的输入。

现在,以这样的方式训练 Alice 和 Bob,使他们能够在不丢失任何信息的情况下进行数据通信,并且还能够自己从头开始学习加密和解密,这样 Eve 就无法理解 Alice 发送给 Bob 的内容。答案隐藏在他们损失函数的形成中。

损失函数

Eve 的丢失很简单,只需尝试使用 L1 范数/距离来最小化 Eve 的输出和原始消息之间的比特差的误差。我们认为损失函数是给定批次的平均 L1 范数损失。

在系统中引入对抗性 本性的真正诀窍落在爱丽丝和鲍勃的损失上,分为两部分。第一部分类似于 Eve 的损失,即尽量减少位数的错误,Bob 学习使用密文和密钥重建原始消息。正如我们已经讨论过的,仅试图最小化比特中的错误可能会导致 Alice 将原始消息本身作为密文传递给 Bob,因为不学习一些花哨的加密方法来加密原始消息并从密文和密钥中重建原始消息更容易。
我们如何确保这种情况不会发生,我们引入了一个损失复制 Eve 作为窃听者。简而言之,夏娃破解他们的密码越好,爱丽丝-鲍勃的损失就越大。用公式表示:

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

这种损失确保 Eve 不会比随机猜测做得更好,即当一半的消息位是错误的而一半是正确的时,这种成分被最小化。在 Alice 和 Bob 的训练中,我们不应该试图最大化 Eve 的重建误差,因为如果我们这样做并使 Eve 完全错误,那么通过简单地翻转所有输出位,Eve 可以在下一次迭代中完全正确。作者选择二次公式是为了强调使 Eve 具有较大的误差。因此,我们需要夏娃的 L1 损失来计算爱丽丝和鲍勃损失函数的第二部分。我们可以在下面提到的代码片段中看到 TensorFlow 编写的内容。

让我们创建一些随机数据集

这里的数据集是一对向量,用于表示具有随机位值(即 0 和 1)的消息和密钥,但是 0 作为神经网络的输入从来都不是一个好的选择,因为它表示没有信号,所以我们只对 0 到-1 和 1 到 1 进行编码。

训练开始

在下面的代码片段中,我们使用了迄今为止我们讨论过的所有函数的顶点。它从创建对称密码系统模型开始,然后我们继续创建用于网络对抗训练的 Alice-Bob 和 Eve 损失函数。稍后,为了表示用于通过训练属于 Alice 和 Bob 模型的张量来最小化 Alice -Bob 通信损失的优化器,我们创建了一个名为 bob_opt 的变量。而另一方面,eve_opt 对 eve 的模型做了同样的事情。

注: Eve 的模型比原始论文中提到的 Alice-Bob 通信模型优化了两倍。(下面代码片段中的第 60 行)

实验和结果

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

Reference - Evolution of Bob’s and Eve’s reconstruction errors during training. Lines represent the
mean error across a mini-batch size of 4096

作者接受了 4096 小批量的 16 位文本和密钥大小的培训。理想的结果应该是 Bob 的重构误差下降到零,Eve 的重构误差达到 8(一半的比特是错误的)。在这个实验中,两个重建误差都很高。一段时间后,爱丽丝和鲍勃开始相当有效地交流,但这种方式也让夏娃提高了理解能力。然后,在第 10,000 步左右,爱丽丝和鲍勃对抗
夏娃的进程。到大约 15,000 步时,训练目标有效地实现了。剩下的步骤只是稍微增加了 Eve 的重建误差。

**注:**在第 0 步,4096 个样本的平均误差为 8 或接近 8。可以认为,给定二进制输出,我们有 50%的机会是正确的,因此 16 位中有 50%是正确的。

作者的一些观察:

  1. 依赖于密钥:改变密钥并保持明文
    不变会导致不同的密文输出。
  2. 密钥中的单比特翻转通常会导致密文中 16 个元素中的 3 到 6 个发生显著变化。

学会有选择地保护

到目前为止,我们已经看到了一个简单的场景,试图通过加密来保护整个消息免受对手攻击,但如果消息由许多部分组成,这些部分可用于发布与该消息相关的一些相关值,并使其对正确的个人可用,但保护消息的其余部分不被对手计算,那会怎么样呢?

理论:

为了测试这些想法,作者构建了一个由四个值(A,B,C,D)的元组组成的数据集。现在,一个系统被创建并训练为使用前三个输入(A、B、C)来输出 D 的两个值,即:

  1. D-public 这是对 D 的最佳可能估计,并且不会透露任何关于 c 的值的信息(由 Alice 产生)
  2. D 预测(对 D 的“真实”预测),这是对 D 的最准确的可能估计(由鲍勃制作)

已知的假设已经存在,即爱丽丝和鲍勃共享一个秘密密钥。这里,Alice 接收(A,B,C)作为输入,除了密文之外,还产生 D-public。Bob 使用 D-public 和带有共享密钥的密文来产生 D . I . e . D . predict 的改进估计。而 Eve 接收 D-public 和密文来恢复 C,充当系统的对手**。**

****目标:证明对抗性训练允许在不暴露 c 的情况下逼近 D。

如何生成这样的数据集,即(A,B,C,D)?

" A、B、C 和 D 是正态分布的浮点值,其上施加有相关矩阵。我们如何生成 A、B、C 和 D 的细节是标准的:我们计算指定成对相关的 4x4 相关矩阵的乔莱斯基分解 LL,我们生成 4 个正态分布浮点值的向量,然后我们将这些向量乘以 L,以便生成 A、B、C 和 D 的值。”

培训流程:

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

训练 Eve 的目标是最小化估计 C 的平方误差。训练 Alice 和 Bob 的目标不仅是最小化估计 D-public 和 D-predict w . r . t . D 的平方误差,而且还要确保 Eve 不能使用 D-public &密文来重构 C,这是通过最小化它们的协方差值来实现的。

结果:

为了检查系统是否工作,作者创建了一个新的模型,称为“盲 Eve”,它知道 C 的分布。盲 Eve 根据其分布的基线信息预测 C 的值。如果可以访问 D-public 和密文的 Eve 的错误等于盲 Eve 的错误,那么我们可以得出结论,Eve 无法从 D-public 和密文中提取有意义的信息,如下图所示:

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

Reference - Training to estimate D while hiding C

  • Public Error是 D-public 和 D 之间的错误。
  • Bob Error是 D-predict 和 D 之间的误差。
  • Blue Dots显示 Eve 相对于盲 Eve 的平均误差改善,但是随着训练的进行,平均误差变为零,这表示 Eve 不能提取任何有用的信息来重建 c

做这一切的目的是什么?

“我们不为这些神经网络指定特定的密码算法;相反,我们进行端到端的对抗训练。我们证明了神经网络可以学习如何执行各种形式的加密和解密,以及如何有选择地应用这些操作以满足机密性目标”

*****-*-马丁·阿巴迪和大卫·g·安徒生

摘要结尾引用的这段话总结了一切,从如何训练神经网络模仿对称密码系统彼此安全通信,到如何对对手隐藏选择性信息,同时确保正确的个人能够使用共享秘密提取隐藏的信息。所有这些都不需要任何先前的领域知识或者已经存在的严格加密系统的帮助。

尽管它可能没有足够的革命性来改变密码学的世界,但它给了我们一个新的视角来看待深度学习和密码系统。

谢谢你看这篇文章,快乐学习!

参考资料:

**[## [1610.06918]学习使用对抗性神经加密技术保护通信

摘要:我们问神经网络是否可以学习使用密钥来保护信息免受其他神经网络的攻击

arxiv.org](https://arxiv.org/abs/1610.06918)** ** [## 张量流/模型

用 TensorFlow 建立的模型和例子。通过在…上创建帐户,为 tensor flow/模型开发做出贡献

github.com](https://github.com/tensorflow/models/tree/master/research/adversarial_crypto)**

如果你认为我们是志同道合的人,应该联系,那么你可以在 LinkedIn 上找到我,或者发电子邮件到 vamshikdshetty@gmail.com 找我。如果您有任何想法、问题或反馈,请在下面随意评论,我很乐意收到您的来信。

生活的小赌注

原文:https://towardsdatascience.com/lifes-little-bets-568a6dc1179c?source=collection_archive---------4-----------------------

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

一个亲戚突然送你 1000 欧元的礼物。这是一笔可观的钱,但还不足以购买梦想中的房子,更不用说退休了。你决定用这笔意想不到的施舍来玩法国国家彩票,宣布的奖金比你想象的要多。即使获胜的可能性很小,坚持一定会有回报。你决定在接下来的一年中每周下注 20 欧元,并打算用你最终的赢款在下一次下注时加倍下注。一年后你会赢多少钱?

你应该相信你最初的直觉,这是一个好主意,还是使用现有的数据来批判性地思考你成功的机会?利用决策科学的原理,我们当然可以做得比瞎猜好得多。我们对决策环境和手头的数据了解多少?我们有一千欧元可以花。我们正在考虑把这笔钱花在为公共项目融资的彩票上。基于从 49 个数字中选择 6 个正确数字,任何一周赢得一些钱的机会是 16.7%。这是一个随机决策环境的例子——问题*“我这周会赢得头奖吗?”*不包含在数据本身中。我们一周可以玩三次,但无法提前知道哪些号码会构成中奖票。

赌博,就像一般的商业,尤其是创新一样,是一种没有绝对保证的概率游戏。【我】在这样的决策环境中,我们仍然可以通过探索手头的数据,选择适当的方法来解决问题的本质,并使用数据来激励行动,从而做出更好的决策。当分析可能的结果时,我们需要从探索我们所知道的独立(条件因素)和从属(可解释的结果)变量开始。然后,我们可以分析上下文来理解事件链的潜在组合和排列。在这种情况下,我们选择的数字和每周的中奖票有什么关系?

统计学中众所周知的问题类型被称为一维随机游走,通常被称为赌徒的破产。如果你每周下注相等的遗产(1/N),你将在 N 周内失去一切。问题的本质是,你输掉每周赌注的概率小于 1(在国家彩票的情况下,赔率严重偏向庄家)。不仅很有可能你会输掉你的每一笔赌注,而且无论输赢,你都离清空你的下注帐户还有 N 步之遥。忘掉你的预感和直觉,把你的 1000 欧元投资在学习如何做出更好的决定上(例如在我们的大师班)会是一个更好的投资…

改善管理决策是商业分析研究所的核心和灵魂。在我们位于巴约纳的暑期学校,以及我们在欧洲的大师班,我们让分析为您和您的组织服务。该研究所专注于管理者数据科学的五个应用:在数字时代工作、数据驱动的决策、机器学习、社区管理和视觉通信。培养你做出更好决定的能力会对你未来的工作和职业生涯产生影响。


Reis,r .(2015),创始人:以下是如何利用概率为你带来优势,Medium

[ii]t . Lieghton,(2006),T14 随机漫步 T15,讲稿,麻省理工学院计算机科学数学

卷积神经网络直观指南

原文:https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-convolution-neural-networks-e3f054dd5daa?source=collection_archive---------1-----------------------

点亮数学机器学习

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

Image by Free-Photos from Pixabay

这是我的系列文章中的第二篇,介绍机器学习概念,同时略微涉及数学。如果你错过了之前的文章,你可以在这里找到(关于 KL 发散)。有趣的事实,我将通过为字母表中的每个字母引入一些机器学习概念来使这成为一次有趣的冒险(这将是字母 C )。

A B CD*** E F**G*** H I J**KL* M**NO P Q R S T U**

*表示中等付费墙后面的文章

介绍

卷积神经网络(CNN)是一种深度网络,可以利用数据(例如图像)的空间结构来学习数据,以便算法可以输出有用的东西。考虑这样一个问题,我们想要识别在给定的图像中是否有一个人。例如,如果我给 CNN 一个人的图像,这个深度神经网络首先需要学习一些局部特征(例如,眼睛、鼻子、嘴等。).这些局部特征在 卷积层 中学习。

然后,CNN 将查看给定图像中存在哪些局部特征,然后产生特定的激活模式(或激活向量),其全局地表示这些局部特征图的存在。这些激活模式是由 CNN 中的 全连接 层产生的。例如,如果图像不是一个人,激活模式将不同于它给出的一个人的图像。

CNN 在一个模块的水平

现在让我们看看 CNN 中存在哪种子模块。一个典型的 CNN 有三个不同的组成部分。它们是卷积层、汇集层和全连接层。关于什么是卷积层和全连通层,我们已经有了一个大致的概念。我们没有讨论的一件事是 池层 ,我们将很快讨论它。

首先,我们深入讨论卷积层的作用。一个卷积层由许多 内核 组成。卷积层中存在的这些内核(有时称为 卷积滤波器 )学习图像中存在的局部特征(例如,人的眼睛看起来像什么)。卷积层学习的这种局部特征称为 特征图 。然后这些特征在图像上进行卷积。这个卷积操作将产生一个矩阵(有时被称为 激活图 )。如果卷积滤波器中表示的要素出现在输入的给定位置,则激活图会在该位置产生高值。

汇集层使 CNN 翻译学习的这些特征不变(例如,不管人的眼睛在[ x=10,y=10 ]或[ x=12,y=11 ]位置,汇集层的输出将是相同的)。请注意,我们讨论的是每层的轻微翻译变化。然而,聚集几个这样的层,允许我们具有更高的平移不变性。

最后,我们有完全连接的层。完全连接的层负责基于激活的特征映射的集合和图像中的位置产生不同的激活模式,特征映射被激活用于图像中的位置。这是 CNN 视觉上的样子。

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

对 CNN 的整体结构有了很好的了解后,让我们继续了解组成 CNN 的每一个子组件。

卷积层

卷积运算到底是做什么的?如果卷积特征存在于给定位置,则卷积运算输出该位置的高值,否则输出低值。更具体地,在卷积核的给定位置,我们对每个核单元值和与核单元重叠的相应图像像素值进行逐元素相乘,然后对其求和。确切的值是根据下面的公式决定的( m —内核宽度和高度, h —卷积输出, x —输入, w —卷积内核)。

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

图像上的卷积过程可以被可视化如下。

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

仅仅知道卷积运算做什么是不够的,我们还需要了解卷积输出代表什么。想象卷积输出值的颜色(0 —黑色,100 —白色)。如果你观想这个图像,它将代表一个二进制图像,在眼睛所在的位置发光。

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

卷积运算也可以被认为是对给定图像执行某种变换。这种变换可以产生各种效果(例如,提取边缘、模糊等。).让我们更具体地理解卷积运算对图像的影响。考虑下图和卷积核。你可以在这篇维基百科文章中找到更多相关信息。

汇集层

现在让我们了解一下池操作是做什么的。池(有时称为子采样)层使 CNN 在卷积输出方面有一点平移不变。实践中使用了两种不同的汇集机制(最大汇集和平均汇集)。我们将最大池称为池,因为与平均池相比,最大池被广泛使用。更准确地说,池化操作在给定的位置输出输入的最大值,该值在内核中。所以从数学上来说,

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

通过对我们前面看到的卷积输出应用池化操作,让我们了解池化是如何工作的。

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

如你所见,我们使用了同一个图像的两个变体;一幅原始图像和另一幅在 x 轴上稍微平移的图像。但是,池化操作会为两幅图像输出完全相同的特征图(黑色— 0,白色— 100)。因此,我们说汇集操作使得 CNN 翻译中的知识不变。需要注意的一点是,我们不是一次移动 1 个像素,而是一次移动 2 个像素。这就是所谓的 步距池 ,意味着我们以 2 的步距执行池操作。

完全连接的层

完全连接的层将组合由不同卷积核学习的特征,以便网络可以建立关于整体图像的全局表示。我们可以如下理解全连通层。

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

全连接层中的神经元将基于由卷积特征表示的各种实体是否实际存在于输入中而被激活。由于完全连接的神经元为此被激活,它将基于输入图像中存在的特征产生不同的激活模式。这为输出层提供了影像中存在的内容的紧凑表示,输出层可以轻松地使用该表示对影像进行正确分类。

将它们编织在一起

现在,我们要做的就是将所有这些放在一起,形成一个端到端的模型,从原始图像到决策。一旦连接上,CNN 就会变成这样。总而言之,卷积层将学习数据中的各种局部特征(例如,眼睛看起来像什么),然后汇集层将使 CNN 对这些特征的平移不变(例如,如果眼睛在两个图像中出现轻微平移,CNN 仍会将其识别为眼睛)。最后,我们有完全连接的层,也就是说,“我们发现两只眼睛,一个鼻子和一张嘴,所以这一定是一个人,并激活正确的输出。

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

添加越来越多的层有什么作用?

增加更多的层,显然提高了深度神经网络的性能。事实上,深度学习中最引人注目的突破性研究与解决 的问题有关,我们如何增加更多的层? ,虽然没有打乱模特的训练。因为模型越深,训练难度越大。

但是拥有更多的层有助于 CNN 以分层的方式学习特征。例如,第一层学习图像中的各种边缘方向,第二层学习基本形状(圆形、三角形等)。)而第三层学习更高级的形状(例如眼睛的形状、鼻子的形状),等等。这提供了更好的性能,相比之下,你可以用一个 CNN 来学习所有这些。

训练 CNN(又名反向传播)

现在,要记住的一件事是,这些卷积特征(眼睛、鼻子、嘴巴)不会在你实现 CNN 时神奇地出现。目标是在给定数据的情况下学习这些特征。为此,我们定义了一个代价函数,奖励正确识别的数据,惩罚错误分类的数据。示例成本函数可以是均方根误差或二元交叉熵损失。

在我们定义损失之后,我们可以优化特征的权重(即特征的每个单元值)以反映有用的特征,从而使 CNN 正确地识别一个人。更具体地说,我们优化每个卷积核和全连接神经元,通过在每个参数相对于损失的梯度所示的相反方向上迈出一小步。然而,要实现 CNN,你不需要知道如何实现梯度传播的确切细节。这是因为,当你定义正向计算时,大多数深度学习库(例如 TensorFlow、PyTorch)在内部自动实现这些微分操作。

用 Keras 实现和运行 CNN

这里我们将简要讨论如何实现一个 CNN。了解基础知识是不够的,我们还应该了解如何使用像 Keras 这样的标准深度学习库来实现模型。Keras 是一个很好的工具,尤其是快速原型模型,看看他们的行动!此处 的练习可用

首先,我们定义想要使用的 Keras API。我们将使用顺序 API 。你可以在这里了解更多信息:

# Define a sequential model
model = Sequential()

然后我们定义一个卷积层如下:

# Added a convolution layer
model.add(Conv2D(32, (3,3), activation=’relu’, input_shape=[28, 28, 1]))

这里,32是层中内核的数量,(3,3)是卷积层的内核大小(高度和宽度)。我们使用非线性激活Relu和输入形状[28, 28, 1],即[image height, image width, color channels]。请注意,输入形状应该是前一层产生的输出形状。对于第一个卷积层,我们有实际的数据输入。对于层的其余部分,它将是前一层产生的输出。接下来,我们讨论如何实现最大池层:

# Add a max pool lyer
model.add(MaxPool2D())

这里我们不提供任何参数,因为我们将使用 Keras 中提供的默认值。如果不指定参数,Keras 将使用内核大小(2,2)和步距(2,2)。接下来,我们定义完全连接的层。然而,在此之前,我们需要拉平我们的输出,因为完全连接的图层处理 1D 数据:

model.add(Flatten())model.add(Dense(256, activation=’relu’))
model.add(Dense(10, activation=’softmax’))

这里我们定义了两个全连接或密集层。第一个全连接层有256个神经元,使用Relu激活。最后,我们定义了一个密集层,它有 10 个输出节点,并激活了softmax。这充当输出层,它将为具有相同对象的图像激活特定的神经元。最后,我们编译我们的模型,

model.compile(
 optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’]
)

这里我们说使用Adam优化器(来训练模型),使用交叉熵损失并使用模型的accuracy来评估模型。最后,我们可以使用数据来训练和测试我们的模型。我们将使用 MNIST 数据集,我们将使用练习中定义的maybe_downloadread_mnist函数下载并读入内存。MNIST 数据集包含手写数字(0–9)的图像,目标是通过分配图像所代表的数字来对图像进行正确分类。

接下来,我们通过调用以下函数来训练我们的模型:

model.fit(x_train, y_train, batch_size = batch_size)

我们可以用下面的测试数据来测试我们的模型:

test_acc = model.evaluate(x_test, y_test, batch_size=batch_size) 

我们将运行几个时期,这将允许您提高模型的性能。

结论

我们在这里结束关于卷积神经网络的讨论。我们首先从一个更高的角度讨论了 CNN 内部发生的事情,然后一节一节地讨论。然后,我们讨论了典型 CNN 的主要组成部分,如卷积层、池层和全连接层。最后,我们更详细地介绍了每个组件。然后我们简单讨论了 CNN 中的训练是如何进行的。最后,我们讨论了如何用 Keras 实现一个标准的 CNN:一个高级的 TensorFlow 库。你可以在这里 找到本教程 的练习。

干杯!

如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!

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

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

thushv89.medium.com](https://thushv89.medium.com/membership)**

想在深度网络和 TensorFlow 上做得更好?

检查我在这个课题上的工作。

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

[1] (书)TensorFlow 2 在行动——曼宁

[2] (视频教程)Python 中的机器翻译 — DataCamp

[3] (书)TensorFlow 中的自然语言处理 1 — Packt

潜在狄利克雷分配直观指南

原文:https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-latent-dirichlet-allocation-437c81220158?source=collection_archive---------1-----------------------

点亮数学机器学习

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

主题建模是指确定最能描述一组文档的主题的任务。这些主题只会在主题建模过程中出现(因此称为潜在)。其中一种流行的主题建模技术被称为潜在狄利克雷分配 (LDA)。虽然名字很拗口,但背后的概念非常简单。

简而言之,LDA 设想了一组固定的主题。每个主题代表一组单词。LDA 的目标是以某种方式将所有文档映射到主题,使得每个文档中的单词大部分被那些虚构的主题捕获。我们将系统地学习这种方法,直到你能足够舒服地自己使用这种方法。

这是数学机器学习系列 之光 A-Z 的第四篇博文。你可以在下面的信中找到以前的博客文章。

A BCDE F G H I JKLMNO P Q R S T U V***

🔈🔥最新文章🔥🔈:M—矩阵分解********

*表示中等付费墙后面的文章。

为什么要主题建模?

主题建模在现实世界中有哪些用途?历史学家可以使用 LDA 通过分析基于年份的文本来确定历史上的重要事件。基于网络的图书馆可以使用 LDA根据你过去的阅读推荐书籍。新闻提供者可以使用主题建模来快速理解文章或者聚集相似的文章。另一个有趣的应用是图像的无监督聚类,其中每个图像都被视为类似于一个文档。******

这篇文章有什么独特之处?这是海里的另一条鱼吗?

简而言之,答案是否定的!我浏览了许多不同的文章。而且有很多很棒的文章/视频给人直觉。然而,他们中的大多数人仅仅停留在回答这样的问题上:

  • LDA 背后的直觉是什么?
  • 什么是狄利克雷分布?

我确实谈到了这一点,但我不认为我们应该就此止步。这些模型的训练方式是我在阅读的许多文章中发现缺失的一个关键部分。所以我试着回答更多的问题,比如:

  • 我们想解决的数学实体是什么?
  • 我们如何解决这个问题?

LDA 背后的大理念是什么?

一旦你理解了这个大概念,我想它会帮助你理解为什么 LDA 的机制是这样的。所以现在开始。

每个文档可以通过主题的分布来描述,每个主题可以通过词的分布来描述

但是我们为什么要用这个想法呢?我们通过一个例子来想象一下。

通俗地说就是 LDA

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

假设您有一组 1000 个单词(即所有文档中最常见的 1000 个单词),并且您有 1000 个文档。假设每个文档中平均出现 500 个这样的单词。怎么才能了解每个文档属于什么类别?一种方法是根据单词在文档中的出现,通过线索将每个文档与每个单词连接起来。类似下面的东西。

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

Modeling documents just with words. You can see that we can’t really infer any useful information due to the large amount of connections

然后当你看到一些文档与同一套单词相关联时。你知道他们讨论同样的话题。然后你可以阅读其中的一份文件,知道所有这些文件的内容。但要做到这一点,你没有足够的线程。为此,您将需要大约 5001000=500,000 个线程。但我们生活在 2100 年,我们已经耗尽了制造螺纹的所有资源,所以它们非常昂贵,你只能负担得起 10,000 根螺纹。你如何解决这个问题?*

深入减少螺纹!

我们可以通过引入潜在(即隐藏)层来解决这个问题。假设我们知道文档中出现的 10 个主题。但是这些话题是不被观察的,我们只观察单词和文档,因此话题是潜在的。我们希望利用这些信息来减少线程的数量。然后你可以做的是,根据单词在主题中的位置将单词与主题联系起来,然后根据每个文档涉及的主题将主题与文档联系起来。

现在假设你得到的每个文档有大约 5 个主题,每个主题涉及 500 个单词。也就是说,我们需要 10005 个线程将文档连接到主题,10500 个线程将主题连接到单词,总计 10000 个线程。**

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

Words are modeled by a set of topics and documents are modeled by a set of topics. The relationships are clearer than the first example because there’s a fewer connections than the first example.

****:我这里用的话题(“动物”、“运动”、“科技”)都是虚构的。在真解中,你不会有这样的题目而是类似(0.3 猫,0.4 狗,0.2 忠,0.1 恶)代表题目“动物”的东西。也就是说,如前所述,每个文档都是单词的分布。

一个不同的观点:LDA 想象文档是如何生成的?

为了给正在发生的事情提供更多的上下文,LDA 假设您看到的任何文档背后都有以下生成过程。为了简单起见,让我们假设我们正在生成一个包含 5 个单词的文档。但是同样的过程可以推广到每个都有 N 个单词的 M 个文档。标题很好地解释了这里发生了什么。所以我就不重申了。

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

How a document is generated. First α (alpha) organise the ground θ (theta) and then you go and pick a ball from θ. Based on what you pick, you’re sent to ground β (beta). β is organised by η (Eta). Now you pick a word from β and put it into the document. You iterate this process 5 times to get 5 words out.

这个图像描绘了一个已经学习过的 LDA 系统的样子。但是要达到这个阶段,你必须回答几个问题,例如:

  • 我们如何知道文档中有多少主题?
  • 你可以看到,我们的场地已经有了一个很好的结构,可以帮助我们生成合理的文件,因为组织者已经确保了场地的适当设计。我们如何找到如此优秀的组织者?

这将在接下来的几节中回答。此外,我们将从这一点开始变得有点技术性。所以系好安全带!

注意 : LDA 不关心文档中单词的顺序。通常,LDA 使用词袋特征表示来表示一个文档。这是有道理的,因为,如果我拿一份文件,把这些单词混在一起,然后给你,你仍然可以猜出文件中讨论了什么样的主题。

变得有点数学化…

在深入细节之前。让我们弄清楚一些事情,比如符号和定义。

定义和符号

  • k —文档所属主题的数量(固定数量)
  • v——词汇量
  • M —文件数量
  • N —每个文档中的字数
  • w —文档中的一个单词。这被表示为大小为 V 的一个热编码向量(即 V —词汇大小)
  • w (粗体 w ):代表一个文档(即 N 字的矢量ws)**
  • D — 语料库,收集了 M 的文档
  • z —一组 k 主题中的一个主题。一个话题就是一个分布词。例如,它可能是,动物= (0.3 猫,0.4 狗,0 人工智能,0.2 忠诚,0.1 邪恶)

更精确地定义文档生成

首先让我们把上面关于生成文档的基础例子,放到一个适当的数学绘图中。

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

Graphical model of the LDA. Here I mark the shapes of the all the possible variables (both observed and hidden). But remember that θ, z, and β are distributions, not deterministic values

让我们破译这是什么意思。我们有一个单一的α值(即底θ的组织者)来定义θ;文档的主题分布将是这样的。我们有 M 个文档,每个文档都有一些θ分布。现在为了更清楚地理解事情,眯起你的眼睛,让那个 M 盘子消失(假设只有一份文件),哇!

现在,单个文档有 N 个单词,每个单词由一个主题生成。你生成了 N 个主题来填充单词。这 N 个字还是占位符。

现在顶板开始工作了。基于η,β具有某种分布(即,准确地说是狄利克雷分布——即将讨论),并且根据该分布,β为每个主题生成 k 个单独的单词。现在,根据占位符所代表的主题,为每个占位符(在 N 个占位符的集合中)填入一个单词。

Viola,你现在有一份有 N 个字的文件了!

为什么α和η是常数?

**α和η在上图中显示为常数。但实际上比这更复杂。例如,α对于每个文档都有一个主题分布(θ ground 对于每个文档)。理想情况下,一个(M×K)形状的矩阵。而η对每个题目都有一个参数向量。η的形状为 (k x V) 。在上图中,常数实际上代表矩阵,是通过将矩阵中的单个值复制到每个单元格中而形成的。

让我们更详细地理解θ和β

θ是一个随机矩阵,其中θ (i,j) 表示第 i 个文档包含属于第 j 个主题的单词的概率。如果你看看上面例子中的地面θ是什么样子,你可以看到球被很好地放置在角落而不是中间。拥有这样一个属性的好处是,我们产生的单词可能属于一个主题,就像现实世界中的文档一样。这是通过将θ建模为狄利克雷分布而产生的性质。类似地,β(i,j)表示第 i 个主题包含第 j 个单词的概率。而β也是狄利克雷分布。下面,我提供一个快速的迂回来理解狄利克雷分布。

快速迂回:理解狄利克雷分布

狄利克雷分布是贝塔分布的多元推广。这里我们讨论一个三维问题的例子,其中α中有 3 个参数影响θ的形状(即分布)。对于 N 维狄利克雷分布,有一个长度为 N 的向量,为α。你可以看到θ的形状随着α值的不同而变化。例如,您可以看到顶部中间的图显示了与θ ground 相似的形状。

主要要点如下:

较大的α值将分布推向三角形的中间,而较小的α值将分布推向角落。

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

How the distribution of θ changes with different α values

我们如何学习 LDA?

我们仍然没有回答真正的问题是,我们如何知道精确的α和η值?在此之前,让我列出我们需要找到的潜在变量。

  • α-分布相关参数,控制语料库中所有文档的主题分布情况
  • θ —随机矩阵,其中θ(i,j)表示第 I 个文档包含第 j 个主题的概率
  • η —分布相关参数,控制每个主题中单词的分布情况
  • β —一个随机矩阵,其中β(i,j)表示第 I 个主题包含第 j 个单词的概率。

阐明我们需要学习什么

如果要我用数学的方式来表述我感兴趣的是什么,那么如下所示:

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

它看起来很吓人,但包含了一个简单的信息。这基本上是在说,

我有一组 M 个文档,每个文档有 N 个单词,其中每个单词由一组 K 个主题中的一个主题生成。我在寻找联合后验概率:

  • θ —主题分布,每个文档一个主题,
  • z —每个文档的 N 个主题,
  • β —词的分布,每个主题一个词,

鉴于,

  • D —我们拥有的所有数据(即,修正数据),

并使用参数,

  • α-每个文档的参数向量(文档-主题分布)
  • η —每个主题的参数向量(主题—单词分布)

但是我们不能很好地计算这个,因为这个实体很难处理。我们如何解决这个问题?

我该如何解决这个问题?救援的变分推理

有很多方法可以解决这个问题。但是在这篇文章中,我将集中讨论变分推理。我们上面讨论的概率是一个非常棘手的后验概率(这意味着我们不能在纸上计算,也没有很好的方程)。所以我们要用一些已知的概率分布来近似这个值,这个概率分布和真实的后验概率非常接近。这就是变分推理背后的思想。

这样做的方法是最小化近似和真实后验之间的 KL 发散作为优化问题。同样,我不打算详细讨论,因为这超出了讨论范围。

但是我们将快速查看一下优化问题

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

γ、ϕ和λ分别代表我们用来逼近θ、 z 和β的自由变分参数。这里 D(q||p)代表 qp 之间的 KL 散度。并且通过改变γ,ϕ和λ,我们得到不同的 q 分布,其与真实后验 p 具有不同的距离。我们的目标是找到γ、ϕ和λ,使近似值 q 和真实后验值 p 之间的 KL 散度最小化。***

一切都很好地定义了,它只是一个迭代求解上述优化问题的问题,直到解决方案收敛。一旦有了γ、ϕ和λ,你就有了最终 LDA 模型所需的一切。***

包裹

本文讨论了潜在狄利克雷分配(LDA)问题。LDA 是一种强大的方法,它允许识别文档中的主题并将文档映射到这些主题。LDA 有许多用途,例如向顾客推荐书籍。

我们通过一个连接线程的例子看了 LDA 是如何工作的。然后,我们看到了基于 LDA 如何想象文档生成的不同视角。最后我们进入了模型的训练。在这篇文章中,我们讨论了 LDA 背后的大量数学知识,同时保持了数学的轻松。我们看了一下狄利克雷分布是什么样子,我们感兴趣的概率分布是什么(即后验分布),以及我们如何使用变分推理来解决这个问题。

我将发布一个关于如何使用 LDA 进行主题建模的教程,包括一些很酷的分析,作为另一个教程。干杯。

如果你喜欢我分享的关于数据科学和机器学习的故事,考虑成为会员吧!

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

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

thushv89.medium.com](https://thushv89.medium.com/membership)****

新的!加入我的新 YouTube 频道

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

如果你渴望看到我关于各种机器学习/深度学习主题的视频,请确保加入 DeepLearningHero

参考

这里有一些有用的参考资料,有助于理解 LDA 是否有什么不清楚的地方。

大卫·布莱教授的原始论文

直观的视频,解释 LDA 背后的基本理念

大卫·布雷教授的演讲

理解决策树的直观指南

原文:https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-understanding-decision-trees-adb2165ccab7?source=collection_archive---------3-----------------------

点亮数学机器学习

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

Courtesy of Pixabay.com

介绍

本文旨在介绍决策树;广受好评的车型,如 xgboost 的流行构建模块。决策树就是一组层叠的问题。当您获得一个数据点(即一组特征和值)时,您使用每个属性(即数据点的给定特征的值)来回答一个问题。每个问题的答案决定了下一个问题。在这一系列问题的最后,您将获得数据点属于每个类别的概率。

:这篇文章在中等付费墙后面。不过代码是开源的,可以通过这个 链接 访问。

注 2 :这是关于数学机器学习 A-Z 的 光系列的第五篇博文。你可以在下面的信中找到以前的博客文章。

A BCD E FG*** H I J**KL* M**NO P Q R S T U V**

*表示中等付费墙后面的文章

为什么是这篇文章?

让我们后退一步!既然有这么多文章解释决策树,你为什么要读这篇文章呢?需要强调的一点是,与我在互联网上找到的文章不同,这篇文章不会停留在高层次的解释上,让读者无所适从。相比之下,我会试着,

  • 提供模型功能的良好直觉,
  • 公正地对待这个模型的核心,
  • 解释过度拟合是如何发生的以及如何预防
  • 用例子来加强整个解释。

我还想提一个重要的警告!吸收本质的目的不是能够从头实现一个决策树(至少不是我所期望的),而是,

当您在实践中使用各种参数(大部分参数)时,很好地理解它们的含义

然而,我提供的代码是一个从零开始构建的决策树,旨在作为一个向导,让您看到整个过程。除了实际看到具体细节,还有什么更好的方法来获得更好的理解呢?

为什么选择决策树?

决策树之所以伟大,有几个原因。但是与任何模型一样,当您在合适的环境中使用模型时,真正的力量才会出现。记住,

垃圾进,垃圾出!

决策树之所以伟大,是因为

  • 它们很容易解释,并且遵循与人类思维相似的模式。换句话说,您可以将决策树解释为一组问题/业务规则。
  • 预测是快**。这是一组比较操作,直到到达一个叶节点**
  • 可适用于处理缺失数据而无需输入数据

决策树入门:

正如我前面说过的,决策树基本上是一组级联问题(形成一棵树的形状)。这些问题测试数据的特征是否满足特定条件(例如,Outlook == Sunny?).让我们稍微充实一下。为此,让我们假设一个典型的天气数据集(我个人不喜欢这个天气数据集——太主流了,所以我稍后会切换到更令人兴奋的东西)。

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

假设我们有上述数据集,并希望预测在给定天气的情况下我们是否会打高尔夫球。此问题的决策树可能如下所示。

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

An example decision tree. Round nodes denote decision nodes, where square nodes denote leaf nodes

决策树的组成部分

让我给你上一堂简单的决策树剖析课。该树有决策节点(圆形)、决策(边)和叶/预测节点(方形)。您首先从一个决策节点(例如 Outlook)开始,根据答案,您可能会有一个叶节点或另一个决策节点(例如 Windy)。决策树可以对任意数量的决策节点继续下去。但是,每个分支都应该以一个叶节点结束。

用决策树进行预测

现在假设你有一个新的数据点,你想预测它的标签。

前景=晴朗,温度=炎热,湿度=正常,有风=真实

为了进行预测,您从树的顶部开始,使用属性(即特征值)沿树越来越深地遍历以做出决策,直到到达叶节点。这个过程描述如下。

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

我猜你不是在打高尔夫。

建造一棵树

当然,还有一个更重要的问题没有解决。

我们怎样才能找到这棵树?

更重要的是,

我们如何在给定的深度决定最佳的特征分区数据?

有几种不同算法用于生成树,

  • CART (分类和回归树)——使用基尼系数来决定划分特征
  • ID3 (使用信息增益-稍后讨论,以决定分区特征,并且不被设计成处理连续特征**)**
  • C4.5 (工作原理类似 ID3,利用信息增益拆分数据。然而,C4.5 可以处理连续特征,并且可以处理缺失数据****

现在让我们来解决一个更令人兴奋的虚构问题。我们想找到一个邪恶的国王,他正在威胁着树木之地的街道。

在街上找到伪装的国王

(数据和特征)

从这一节开始,我将用一个故事来解释决策树,这个故事讲的是一个喜欢在街上伪装自己来愚弄当地人的树之王。这很烦人,因为每当有人无意中对国王不好,他就会受到惩罚。人们很烦恼,一个聪明人(让我们称他为约翰)站出来说他能在 10 天内解决这个问题!

约翰具有国王的几个特征,在公众面前表现出与众不同的形象。其特点是,

  • 从城堡里出来
  • 慢慢走
  • 每天吃 5 次或更多
  • 有一颗金牙

约翰开始观察人们,并创建一个数据集(每人一个数据点)以及目标变量(即,这个人实际上是不是国王)。他有以下的观察。不幸的是,这个数据集是以五个人的痛苦为代价的。

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

利用这个数据集,John 做了以下工作。他根据目标变量写下每个特征,并根据以下逻辑突出显示每个条目:

  • 绿色-如果属性与相应的标签匹配
  • 红色-如果属性与相应的标签不匹配

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

John’s whiteboard

现在,看上面的表,我们可以了解哪些特征对正确预测国王贡献最大。例如,下图总结了上表中的观察结果。

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

Summary of the observations from the highlighted tables

直觉还不足以让你解决问题。您需要可量化的指标来表明这些特性是强大的。事实上,TreeLand 一半的公民都是机器学习工程师!这就是信息增益的来源。

信息增益:通过拆分数据获得了多少信息?

我们已经讨论过,树背后的基本思想是提出一个问题(即针对一个属性测试数据),并根据答案(例如对或错)分割数据。信息增益通过根据决策节点提供的答案分割数据来衡量数据变得可预测的程度(或获得了多少信息)。戴上你的科学护目镜,是时候正式化了。对数据 Y 使用特征 F 获得的信息由下式定义:

IG(Y,F) = H(Y)-H(Y|F)

其中 Y 为目标变量, F 为某特征(如金牙)。因此,功能越强大,通过分割该功能上的数据获得的信息就越多。H(Y)是 Y 的熵,H(Y|F)是以 F 为条件的 Y 的条件熵(稍后讨论)。在代码中,计算信息增益如下所示。

现在让我们看看什么是熵和条件熵。

熵和条件熵

熵衡量转换数据需要多少位。因此,数据越可预测,所需的位数就越少。相反,你的数据越不可预测,你需要的比特就越多。这是这样写下来的:

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

其中(Y 中的 Y)表示 Y 中的唯一结果(例如,在我们的示例中,King = True 或 False)。您可以很容易地用 Python 实现这一点。

通俗地说就是熵

让我们更直观地理解熵。比方说国王一开始就决定绝不愚弄当地人,约翰决定收集数据来解决这个问题。他的熵应该为零。为什么?因为标签是 100%可预测的(即它总是 0)。但是,在我们的数据中,熵是最高的(即 1),因为一个人成为国王或不是国王的机会是相等的。

想象两个人(约翰和丽莎)通过电话交谈。每次 John 呼叫 Lisa 时,Lisa 必须在没有任何附加信息的情况下,针对每个数据点(即 10 次)说出它是否是国王。下面我描述了不同熵值下的对话。

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

Difference of different entropy values

通俗地说就是条件熵

这很好地为解释什么是条件熵(即 H(Y|F ))奠定了基础。现在想象一下,对于每个数据点,约翰告诉这个人是否有一颗金牙。然后,根据特征值(即 F),Lisa 必须预测这是否是王。如果您查看下表,数据现在比没有任何特征更可预测。

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

From Jonh’s whiteboard

总之,信息增益的作用是,

它测量在提供关于特征 F 的信息之前和之后的可预测性的差异。

再次提醒我们,这是信息增益的公式。

IG(Y,F) = H(Y)-H(Y|F)

与此同时,在树木之乡…

(构建树)

约翰计算了 城堡金牙 的信息增益,发现它们比贪婪 好得多。然后约翰首先挑选了特征“ 城堡 ”。

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

Tree with the feature “Castle”

他对左边很满意。他认为,“4/6 分类还不错”。鉴于他只有 10 个数据点,我们会放他一马。但是右侧的结果很差(即 50%正确或 50%错误)。他需要改进结果,所以他继续尝试使用给出最高信息增益的特征来分割左边的余数,结果是" 金牙 "特征,并获得以下结果。

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

Tree with both “Castle” and “Gold Tooth” features

所以你走吧!约翰找到了秘制调味汁!这实际上就是 ID3 算法 的工作原理。更正式地说,你会有下面的伪代码。

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

Peseudocode

这段代码中最重要的函数是 build_tree ,实际上应该是这样的(可以在代码中找到)。

Treeland 的市民又可以放松了…

所以在约翰展示了他的成果后,人们被深深打动了。但是约翰知道更多的数据不仅会改进他的模型,还会验证他的发现。所以他让别人帮他收集更多的数据。但他不知道,他这样做会遇到问题。

这棵树长得太多了…

(过度拟合和正则化)

因此,约翰设法让几个人支持他的想法,扩大数据集并改进模型。他们设法让数据集达到 50 个数据点。因此,在收集数据后,梦想着一个更好更健壮的模型,约翰创造了一个新的树。这是他得到的树。

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

New decision tree

这棵树立刻在约翰的脑海中升起了危险信号。树太复杂了,无法解决这个问题。在一个简单的树形结构中,只需要两到三个特性就足够了。这里发生了什么?这叫 过拟合 !John 没有使用任何规则来控制树的复杂性,导致产生了一个非一般化和不可解释的树模型,这违背了目的。

让我们回头纠正约翰的错误

有几种方法可以防止树模型中的过度拟合。在这一节中,我将讨论三种方法。它们是:

  • 确保每个叶节点至少有 n 个数据点
  • 确保树的深度不超过 d
  • 确保信息增益大于阈值以进行分割

确保每个叶节点在一个叶节点中至少有 n 个数据点是很重要的。因为,通过将单个数据点分配给树中的每个叶节点,您可以为任何训练集构建世界上最完美的树(严重过度拟合)。因此,确保至少有 n 个数据点(例如 5%的数据)会导致更一般化的树模型。

确保树不会呈指数增长,将再次保护我们避免过度拟合。在这种方法中,我们基本上是限制我们可以问的问题的数量来预测模型的类别,这导致选择最好的几个问题来问,而不是问世界上所有可能的问题。

最后一点,确保信息增益高于阈值应该是有意义的。因为,如果我们不能从中获益,种这棵树又有什么意义呢?

因此,在修改这些技术并将其应用于模型后,John 提出了以下模型,该模型更具解释力。

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

Regularised tree

我不打算重复用树来预测,因为这个过程非常简单。这可以使用如下递归函数在 Python 中实现。

我们以此结束了在树岛的冒险。总之,John 收集了数据,建立了一个初始模型,使用信息增益来决定有价值的特征。遇到了过度拟合的问题,并使用正则化解决了它。好消息是,他们已经学会使用 John 开发的模型来避免 king 处理错误的方式。所以他们从此幸福地生活在一起!

使用连续值

到目前为止,我们仅限于观察离散变量。但是你只能用离散变量做很多事情。有趣的问题通常混合了连续变量和离散变量。那么怎样才能在决策树中使用连续变量呢?有两种流行的方式。

  • 通过宁滨将连续要素的范围离散化为相等的条柱
  • 使用 最小熵分割【2】在连续特征中寻找分裂

最小熵分割

最小熵分割(MEP)的工作方式如下。

  • 首先,根据数据分布的范围指定一组切割点(例如,在 T 个位置平均分布切割范围)
  • 然后,对于每个切割点,计算标签 Y 的熵的加权和
  • 选择给出最小熵的切割点

包裹

在本文中,我们详细讨论了决策树。决策树是一种流行的机器学习模型,因为它们更容易解释(例如,与神经网络相比),并且通常提供良好的性能,尤其是在与集成(打包和提升)一起使用时。

我们首先以玩具天气数据集为例,简要讨论了决策树的功能。然后,我们跳到了一个更生动的问题,那就是确定令人讨厌的树地之王是否正在恐吓街道。我们看到了约翰如何使用信息增益来识别有助于识别国王的特征,并随后使用这些特征构建了一个树。后来,我们看到随着数据集变大,诸如“过度拟合”等问题是如何出现的。我们还讨论了如何使用各种正则化方法(例如限制树的最大深度)来防止过拟合。最后,我们结束了在 TreeLand 的冒险,并做了一个快速的边游,看看如何在决策树中处理连续特征。

这篇文章的代码可以在 这里 找到。

参考

[1]CMU 讲稿

[2] 用于分类学习的连续值属性的多区间离散化

Video from Google Developers Youtube Channel

Video from Stanford

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值