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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

德雷克——用自然语言处理来理解他的歌词

原文:https://towardsdatascience.com/drake-using-natural-language-processing-to-understand-his-lyrics-49e54ace3662?source=collection_archive---------1-----------------------

简介 :

每隔几年,就会有一位艺术家席卷全球。在过去,这是甲壳虫乐队和迈克尔·杰克逊等人的作品。这些艺术家天生就有能力用他们的创作天才影响数百万人。似乎当我们开始 21 世纪的第二个十年时,许多艺术家都在争当第一。然而,也许出乎意料的是,一个名叫奥布里·格雷厄姆的多伦多人以艺名“德雷克”登上了顶峰。

德雷克最初成名是因为他在 21 世纪初的流行青少年情景喜剧《德格拉斯:下一代》中扮演的角色。然而,当德雷克想成为一名说唱歌手时,他离开了节目。李尔·韦恩是当时最有影响力的说唱歌手之一,他把这位土生土长的多伦多人作为自己的门生。在与韦恩的唱片公司 Young Money Entertainment 签约后,德雷克发行了他的第一张录音室专辑《T4》。它被认证为白金唱片,加速了德雷克迅速上升到嘻哈世界的顶峰。在接下来的八年里,他又推出了四张录音室专辑、一张混音带和一张播放列表,其中《蝎子》是他的最新专辑。

我们知道德雷克的作品很受欢迎,但为什么他的大多数歌曲如此受欢迎呢?是制作的原因吗?是市场营销吗?大概是多种因素综合作用。然而,我将关注的是他的歌词。德雷克的工作内容广泛,证据充分,因此获取文本数据并不是一项困难的任务。然而,弄清楚如何分析它。但是由于 NLP(自然语言处理)最近的改进,分析文本数据现在比以往任何时候都容易。

根据维基百科,自然语言处理(NLP)“是计算机科学和人工智能的一个领域,涉及计算机和人类(自然)语言之间的交互,特别是如何编写计算机程序来处理和分析大量自然语言数据。”NLP 是我认为机器学习最有趣的领域。文本以如此多的不同形式产生,它给我们提供了如此多的数据。

在过去的 5-10 年里,NLP 得到了快速发展,这与深度学习的兴起直接吻合。神经网络已经成为无数 NLP 算法的通用框架。今天,有多种多样的工具可供使用,因此从业者可以解决大量的 NLP 问题。这些工具让我得以研究德雷克的歌词。

寻找歌词来源:

在开始实际分析之前,我必须先拿到德雷克的歌词。虽然网上有几个歌词资源,但我还是决定用 Genius.com。对于那些不知道的人来说,Genius 是一个注释歌词的网站。Genius 有一个非常好用的 API 。

第一部分

哪首公鸭歌的歌词最独特?

德雷克经常受到批评的一点是他的创造力——或者说缺乏创造力。在过去,他曾被指控窃取其他说唱歌手的音乐流和雇佣代笔人。我开始观察他的批评者的抱怨是否有根据。

每首歌使用一些独特的词的灵感来自于这篇漂亮的文章,它可视化了说唱中最大的词汇。在我看来,由于当今艺术家的重复性,总字数不是衡量创造力的标准。

一旦我清理完文本数据,我就开始分析每首歌中独特的歌词数量。下面是德雷克所有歌曲中独特歌词的分布直方图。似乎他的大多数歌曲都有 100 到 200 个独特的词。没有参考其他艺术家歌曲的分布,这个直方图并没有告诉我多少关于德雷克的创造力。

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

更好的方法是通过专辑来了解他的创造力。下图中的情节是在 Tableau 中创作的。x 轴上是作品名称。y 轴代表唯一单词的数量。每个泡泡代表一首歌。没有一张专辑看起来更有创意(就独特的歌词而言)。不过,从独特歌词的数量来看(减去蝎子),似乎每首作品都至少有一个离群值。看到他最新发行的专辑《蝎子》(25 首歌曲)中的歌曲在独特的歌词数量上几乎没有变化,这有点令人着迷。

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

现在,回答这个问题,哪首歌的歌词最独特?答案似乎是纽约时间下午 6 点。其余的前 10 名在下面。

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

第二部分

命名实体识别

命名实体识别是“信息提取的一个子任务,它试图定位文本中的命名实体并将其分类成预定义的类别,例如人名、组织、位置、时间表达式、数量、货币值、百分比等。”(维基百科)。NER 是一项特别棘手的任务。英语的复杂性使得创建对所有文本源都准确的 NER 算法非常困难。一个算法可能在一个文本语料库(在我们的例子中是德雷克歌曲集)上表现很好,而在另一个语料库上表现很差。这种不一致性使得有必要尝试几种 NER 算法。正如你将看到的,算法不是很不准确。

我实现的第一个是由 NLTK 提供的命名实体算法。“Ne_chunk”使用分配了词性标签(词性标签)的单词列表来推断哪些单词是命名实体。从我找到的结果可以看出,NLTK 的算法本身并没有做得很好。

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

我尝试的第二个命名实体算法是斯坦福大学开发的。斯坦福大学的计算语言学系可以说是世界上最负盛名的。这个受人尊敬的部门开发的众多令人印象深刻的工具之一是他们的 NER 工具

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

与 NLTK 的算法相比,这个工具需要更长的时间来运行,但是它也产生更精确的结果。虽然它并不完美,但这是一个巨大的进步。

第三部分

主题建模:

NLP 中最有趣的学科之一是主题建模。主题模型是一种用于发现出现在文档集合中的抽象“主题”的统计模型。主题建模是一种常用的文本挖掘工具,用于发现文本主体中隐藏的语义结构(来源)主题建模有几种比较突出的算法。其中最突出的是显式语义分析和非负矩阵分解。然而,出于本文的目的,我选择使用的是潜在的狄利克雷分配( LDA )。LDA 是由吴恩达、迈克尔·乔丹和大卫·布雷提出的一种生成统计模型。基本上,它首先学习给定语料库中固定数量主题的表示。给定这个数量的主题,LDA 学习语料库中每个文档的主题分布。

话题建模所有公鸭歌词

我想用 LDA 做的第一件事是学习德雷克所有歌曲中最突出的主题。为了做到这一点,我将所有歌曲放入一个列表中。然后,使用 SciKitLearn 的计数矢量器,我创建了一个代表所有这些歌曲的单词包。单词包是通过矩阵表示(链接)来表示单词的一种简单方式。然后,使用 SciKit learn 的 LDA 版本,我拟合了一个模型,目标是在给定的文本中找到 8 个主题。

可视化主题

我发现了两种可行的方法来可视化 LDA 模型。第一个是通过我写的函数。基本上,它输出每个主题中最突出的单词。

这里的结果很有趣,但只给我提供了适量的信息。很明显,主题 7 不同于主题 2,但是没有提供足够的信息来告诉我它们有多么不同。

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

LDA Topics

辅助主题没有提供足够的信息来区分彼此。出于这个原因,我制定了另一种方法来显示文本中的主题。

在 Python 内部,有一个很棒的库叫做 pyLDAvis 。这是一个专门的库,使用 D3 来帮助可视化 LDA 模型创建的主题。 D3 可以说是最好的可视化工具。但是,它是针对 Javascript 用户的。对于不太了解 JavaScript 的人来说,拥有这个插件非常有用。为了可视化数据,该库使用了降维技术。维数约减将具有许多变量的数据集压缩成更少量的特征。降维技术对于可视化数据非常有用,因为它可以将数据压缩成两个特征。对于我的特定可视化,我决定最好使用T-SNE(T-分布式随机邻居嵌入)进行降维。

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

Visualizing Topics

似乎从我的模型的拟合来看,德雷克的大部分歌词都可以归类到一个占据了大部分图表的巨大主题中。相比之下,其余的话题就显得微不足道了。

Drake 所有主要版本的主题是什么样的?

为了做到这一点,我遵循了与之前相同的步骤,除了运行 LDA 算法为每张专辑精确地找到一个主题。然后,我使用我之前定义的函数来显示他所有主要作品中最突出的词。

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

Most Prominent Words in all Drake’s Major Works

结论:

德雷克可以说是世界上最受欢迎的艺术家。当他决定退休时,他将成为有史以来最有成就的说唱歌手之一。因此,每当他发布一首新歌或一张专辑,就一定会引起一片热烈的反响。他的作品几乎总是登上流行排行榜的榜首。结果,他的歌词瞬间成为 Instagram 和脸书数周的主要标题。他的歌曲令人难忘,他的歌词是主要原因。

就我的第一个 NLP 项目而言,我认为这是成功的。我觉得通过这里的工作,我对德雷克的歌词有了更具体的理解。虽然在未来的工作中,我当然可以尝试许多其他的 NLP 任务,但是主题建模和命名实体识别是一个很好的起点。

感谢你阅读这篇文章!如果您对未来的工作有任何建议或对我的工作有任何批评,请随时评论或联系我。

注意事项 :我把歌词里的脏话去掉了,让这篇文章更亲民。

提前下结论

原文:https://towardsdatascience.com/draw-conclusions-early-with-incvisage-45c608634ca0?source=collection_archive---------3-----------------------

可视化增量生成的新范式

这篇博客文章是对我们 VLDB 17 年论文的高度概括,标题为“我已经看够了:为快速决策而逐渐改进可视化”,github 上有 代码。本文延伸版此处 。主要由 Sajjadur Rahman 撰写,我做了一些小的编辑;合著者包括 Maryam Aliakbarpour、Hidy Kong、Eric Blais、Karrie Karahalios 和 Ronitt Rubinfeld。

越来越大的数据集上的数据可视化仍然很麻烦:当数据集很大时,生成可视化可能需要几个小时,这阻碍了交互,阻止了探索,并延迟了洞察力的提取。

更快生成可视化效果的一种方法是使用采样——我们可以显示随着时间的推移逐渐改进的可视化效果,并最终收敛到对整个数据计算的可视化效果。然而,这种中间可视化是近似的,并且经常剧烈波动,导致不正确的结论我们提出了基于采样的增量可视化算法,可以快速揭示“显著”特征,同时最大限度地减少错误,实现快速、无错误的决策。

**示例:**在下面图 1 的第一行中,我们描述了当获取更多样本时当前采样算法的变化:在t1T2T4T7以及当所有数据都已被采样时。这可能就是可视化标准采样算法的结果所能提供的。如果用户在任何中间时间点看到可视化,他们可能会做出错误的决定。例如,在时间 t_1 时,用户可能会得出错误的结论,即开始和结束时的值低于大多数趋势,而事实上,情况正好相反——这种异常是由于到达 t_1 时抽取的样本有偏差。在 t_2t_4t_7 处,可视化继续变化,数值根据抽取的样本随机波动。

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

Figure 1: Example

另一种方法,我们称之为 IncVisage ,并在第二行中描述如下:在每个时间点 t_i ,通过在 t_{i-1} 分割趋势线的一个线段,显示一个 i 线段趋势线的附加线段,此时工具有足够的信心这样做。因此,IncVisage 在 t_1 处非常保守,仅提供整个范围的平均值,然后在 t_2 处,它将单个段分成两个段,表明趋势向末端增加。总的来说,在 t_7 之前,该工具已经表明了趋势的许多重要特征:它从高点开始,中间有一个凸起,然后向终点增加。这种方法按照重要性的顺序揭示了最终可视化的特征,允许用户获得早期的洞察力并尽早得出结论。所提出的方法也可以应用于热图可视化——如第 4 行所示,对应于第 3 行所示的标准采样方法——在热图中很典型,值越高,颜色越深。

增量改进可视化:增量方法

我们如何着手产生这些增量呢?考虑预先知道所有组的集合(x 轴值)时的设置。因此,我们不需要执行采样,并且问题简化为仅在每次迭代 k 时寻找最佳 k 段近似。在每一次迭代中,我们最终将前一次迭代中的一个片段分割成两个新的片段。

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

Figure 2: Improvement Potential

现在,我们如何决定在哪里分裂?让我们看一个例子(见图 2)。给定段 S ,有许多分裂的候选——我们只显示了三个。但是我们选哪一个呢?嗯,在这种情况下,底部的候选项给了我们最大的“跳跃”——直觉上,我们希望选取一个足够大的段来分割,并且值之间的差异也很大。这种分割的想法被称为改进潜力的概念所捕捉,在这个概念中,我们考虑了价值之间的差异和细分规模。(详见我们的论文。)

我们现在将我们的方法推广到在线采样,其中我们在迭代中抽取样本。*事实证明,我们可以使用相同的改进潜力测量的经验版本,并且仍然可以获得最佳结果。*现在,我们应该在每次迭代中抽取多少样本来获得最佳结果?有点令人惊讶的是,如果我们在每次迭代中跨 x 轴组均匀地绘制样本,我们仍然可以满足保证。我们还推导了底层算法的采样复杂度的匹配下界。此外,我们证明了通过几何地减少在迭代中抽取的样本总数,我们获得了一个高度交互的算法,对近似的精度只有很小的影响。我们在论文中详细讨论了支持这些主张的定理。

实验外卖

那么这在实践中是如何运作的呢?以下是我们实验评估的一些要点。报纸上还有很多!

增长速度极快。

我们的方法比读取整个数据集的顺序扫描方法快几个数量级。在图 3 中,我们在三个不同大小的数据集上绘制了 Scan 的执行时间和 IncVisage 的不同迭代。黑色垂直箭头突出显示了 IncVisage 和 Scan 之间的完成时间差异。从图 3 中可以明显看出,IncVisage 通过相当快地揭示重要特性(图 3 中的迭代 5、10 和 50)促进了更快的决策制定。同时,随着数据集大小的增长,顺序扫描的执行时间也会增加,而 IncVisage 的不同迭代的执行时间几乎保持不变,与数据集无关。

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

Figure 3: IncVisage is orders of magnitude faster than Scan

IncVisage 提供高度可解释的可视化和更好的决策。

我们进行了两项用户研究,评估 IncVisage 的可解释性和可用性。第一项研究表明,IncVisage 生成的可视化效果具有高度的可解释性。在第二项研究中,我们将 IncVisage 与标准方法进行了比较,标准方法是在取样时描述整个可视化评估,这是根据决策能力进行的。该研究表明,在准确性方面,IncVisage 优于标准方法(IncVisage = 94.55%,标准= 45.83%),而延迟相当。此外,用户认为使用 IncVisage 更容易找到答案并尽早终止。我们在此展示一些用户反应:

“…更容易知道我什么时候想停下来,因为我首先有了总体想法。然后我就等着得到确切的答案,因为我知道它就要来了……”

“……随着时间的推移,看起来真的很有趣。特别是,起初当事物是一两个颜色块时,然后看着数据出现,然后看着不同的盒子变成某种东西……我实际上发现自己看了很长时间。”

“…我更喜欢 IncVisage,因为它可以更容易地缩小范围…与标准方法相比…如果你选择了错误的方法,你可能会犯很大的错误。”

结论

我们开发了一种逐步改进的可视化生成算法,当分析师有信心时,它会向分析师揭示见解,从而允许更快、更准确地做出决策,同时还开发了一种名为 IncVisage 的工具来实现这种算法。

我们希望 IncVisage 代表了体现这些原则的可视化工具开发的有希望的第一步——帮助用户在非常大的数据集上获得早期但自信的见解。

承认

非常感谢 NSF、NIH、Siebel Energy Institute、Adobe 和 Google 对这项研究的支持。

用深度学习画动漫少女

原文:https://towardsdatascience.com/drawing-anime-girls-with-deep-learning-4fa6523eb4d4?source=collection_archive---------4-----------------------

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

这篇文章是关于玛丽·凯特·麦克弗森的一个兼职项目。我们喜欢做一些辅助项目,比如音乐视频的人工智能,以及派对按钮。这个想法是尝试一种对抗性神经网络,它在对一组人类创造的动漫面孔进行训练后生成新的动漫面孔。我们从一个网上的例子开始。该作品和动画人脸数据集的原始代码可以在这里找到。

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

Running training on the original code from here.

正如你在上面的图像中看到的,生成敌对网络(GAN)随着时间的推移在生成逼真的图像方面不断改进。GAN 包含一个生成新图像的发生器和一个为发生器提供建设性反馈的鉴别器。生成器和鉴别器都是卷积神经网络(CNN)。

以下是训练数据的示例:

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

下图是最终输出的一个很好的例子。

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

Anime faces generated entirely using artificial intelligence.

在上面的图像中,你可以看到右下角的角色头上有一个弓,眼睛和嘴巴通常在脸上的正确位置。正如我们在第一行左起第二行看到的,一些生成的输出有点混乱。图像总体上看起来不错,尽管它们不是很大(3 个颜色通道的 64 乘 64 像素)。

这是一个很酷的结果,但是 CNN 有一些已知的限制。例如,Capsnets 比 CNN 更能理解图片中事物的位置(见下图)。

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

CNNs do not mind “seeing” faces when everything is in the picture, but in weird places (source here and further reading here). This is a problem capsule networks aim to address.

现在,作为一个超常发挥者, Mary Kate MacPherson 决定使用带有胶囊网络的 g an 代替 CNN 来尝试这项任务。数据集已从原始代码库转移到 capsule 网络代码库。胶囊网码来自这里的,来自胶囊网码的生成器被来自动漫项目的生成器所取代,从而做出动漫少女而不是手写数字。

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

Running training on the new neural architecture with capsule network.

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

Final output of the capsule network GAN. Some are really good. Others, like the second from left on the first and last rows, don’t have the right face parts.

我们没有看到使用胶囊网络代替 CNN 作为鉴别器有很大的改进。也许生成和区分图像的统计特征会给我们带来更好的结果(想法来自 nVidia 研究论文此处)。我们正在努力。我们向生成器的预测添加了一个维度,它生成生成图像的梯度方向直方图(HOG) 。HOG 用于帮助检测物体,因此它看起来很适合我们希望能够教会生成器神经网络更好地预测真实人脸的东西。我们也在考虑清理数据集。玛丽·凯特·麦克弗森会在我们有好结果的时候,在推特 上的一个 专用推特频道上发布这次冒险的结果。如果你有自己的发电机,我们也很乐意公布你的结果。到目前为止,这种新方法看起来并不是非常有前途,但这就是这些副业项目的进展:它并不工作,直到突然开始工作。

未来工作思路二:拥有多个胶囊网络的 GANs!

因此,总之,人工智能可以用来创造艺术,以一组现有图像的风格创造新的图像。

如果你喜欢这篇关于生成动漫女孩面孔的文章,请点击关注按钮,看看我过去读过的一些文章,比如“如何为人工智能项目定价”和“如何聘请人工智能顾问”除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习

编码快乐!

-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI

您可能喜欢的其他文章:

从比例的 A/B 测试中推断:频率主义者与贝叶斯方法

原文:https://towardsdatascience.com/drawing-inferences-from-a-b-tests-on-proportions-frequentist-vs-bayesian-approach-c85590382b14?source=collection_archive---------11-----------------------

对许多数据科学家来说,从 A/B 测试中做出推论是一项不可或缺的工作。我们经常听到频率主义者(经典)的方法,在这种方法中,我们指定 alpha 和 beta 比率,看看我们是否可以拒绝零假设而支持替代假设。另一方面,随着更多的证据变得可用,贝叶斯推理使用贝叶斯定理来更新假设为真的概率。

在这篇博文中,我们将使用 R 来遵循[1]中的示例,并将其扩展为灵敏度分析,以观察调整先验对结果的影响。[1]对频率主义者和贝叶斯的优缺点有很好的讨论,我推荐阅读。我的主要收获是:

  1. 贝叶斯经常因主观先验而受到批评,我们将在敏感性分析部分对此进行检验
  2. Frequentist 因不同的实验设置具有不同的 p 值而受到批评,我们将在下一节停止规则中对此进行研究
  3. “…对于任何决策规则,都有一个贝叶斯决策规则,在精确的意义上,它至少与规则一样好”——对于数据科学家来说,在进行推理时获得另一种视角不会有什么坏处

案例研究背景

实验的目的是检查硬币是否有偏差,假设进行实验的人(让我们称他为研究者)与进行结果分析的人(让我们称他为分析师)不是同一个人。

研究者有两种方法可以停止实验(停止规则):

  1. 投掷硬币 6 次,并报告人头的数量
  2. 投掷硬币,直到第一个头像出现

研究者向分析师报告 HHHHHT 和他的停止规则。然而,分析师忘记了什么是止损规则。

频繁主义方法

频率主义分析师建立了一个假设:

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

二项分布

在停止规则(1)下,人头数服从二项式分布。更正式地说,观测头数为~ Bin(6,0.5)

# Binomial Distribution
n = 6
num_heads = c(1:n)
pmf_binom <- dbinom(k,size=n,prob=0.5)
plot(num_heads,pmf_binom,type="h", main = "Prob mass function of a Binomial distribution")

# The following two lines are equivalent
1-pbinom(q=4,size=6,prob=0.5)
pmf_binom[5]+pmf_binom[6]

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

概率(6 次投掷中有 5 或 6 个头)= 0.1094

因此,我们无法在 0.05 的显著性水平上拒绝零假设。

几何分布

在停止规则(2)下,直到头出现所需的翻转次数服从几何分布。

number _ failures _ until _ 1st _ head ~ Geometric(0.5)

# Geometic Distribution
num_fails = c(0:10)
pmf_geom = dgeom (x = num_fails, prob=0.5)
sum(pmf_geom)
plot(num_fails, pmf_geom, type = "h", main = "Prob mass function of a Geometric dist.")# The following two lines are equivalent
1- pgeom(q=4,prob=0.5)
1-sum(pmf_geom[1:5])

p(在第一个磁头之前至少需要 5 次故障)= 0.0313

因此,我们在 0.05 的显著性水平上拒绝零假设。注意同样的数据如何导致相反的结论。

在 Frequentist 方法下,决定随机变量分布的停止规则必须在实验前指定。

贝叶斯方法

我们想估算θ,它被定义为硬币正面朝上的真实概率。我们使用一个贝塔分布来表示共轭先验。为了不失去案例研究的重点,我们在附录中介绍了 beta 分布。

作为先验分布,我们假设先验分布在 Beta 分布(3,3)下,这表明在 0.5 左右是一个相当平坦的分布。这表明分析师认为硬币是公平的,但使用(3,3)作为他的不确定性的指示。我们将在灵敏度分析部分研究改变这两个参数的影响。现在,我们来看看:

Theta_prior ~ Beta(3,3)

在实验过程中,我们有 6 次翻转,其中一次是正面。让我们填写下表:

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

# Bayesian Approach
theta=seq(from=0,to=1,by=.01)
plot(theta,dbeta(theta,8,4)
,type="l"
, ylim = c(0,6)
, col = "red"
, lwd =2
, ylab = "Prob. Density Function"
, main = "Prob. Density Function")

lines(theta,dbeta(theta,3,3),type="l", col = "green", lwd =2)
lines(theta,dbeta(theta,5,1),type="l", col = "blue", lwd =2)

abline(v=0.5, col='grey')

legend("topright",
legend = c("Posterior", "Prior", "Experiment"),
col = c("red", "green", "blue"),
bty = "n",
text.col = "black",
horiz = F ,
inset = c(0.1, 0.1),
lty = 1, lwd=2)theta=seq(from=0,to=1,by=.01)

1-pbeta(0.5, 8,4)

P(theta > 0.5 | data) = 0.89,即 0.89 是红色曲线下的面积,在 0.5 的右边。在下一节中,我们将研究改变先验分布的形状对后验概率的影响。

先验分布对后验概率影响的敏感性分析

从β(3,3)改变先验分布对θ> 0.5 的后验概率有何影响?在本节中,我们将改变分布的方差和期望值,作为敏感性分析的一部分。

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

(1)改变方差 —当我们注入一个方差更低的更强的先验,说明硬币是公平的,后验概率从 0.89 降低到 0.84。

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

## Sensitivity Analysis - change the variance

par(mfrow = c(2,2))

alpha_prior = 5
beta_prior = 5

alpha_expt = 5
beta_expt = 1

alpha_post = alpha_prior + alpha_expt
beta_post = beta_prior + beta_expt

title = paste0("Prior Beta(", alpha_prior, "," , beta_prior, ")")

# Bayesian Approach

theta=seq(from=0,to=1,by=.01)
plot(theta,dbeta(theta,alpha_post,beta_post)
     ,type="l"
     , ylim = c(0,6)
     , col = "red"
     , lwd =2
     , ylab = "Prob. Density Function"
     , main = title)

lines(theta,dbeta(theta,alpha_prior,beta_prior),type="l", col = "green", lwd =2)
lines(theta,dbeta(theta,alpha_expt,beta_expt),type="l", col = "blue", lwd =2)

abline(v=0.5, col='grey')

# Prior Mean
alpha_prior / (alpha_prior + beta_prior)

# Prior Variance
(alpha_prior * beta_prior) / ((alpha_prior + beta_prior)^2 * (alpha_prior + beta_prior+1))

# P(theta > 0.5 | data)
1-pbeta(0.5, alpha_post,beta_post)

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

Above: Effect of changing prior variance whilst keeping mean constant. Green: Prior; Red: Posterior; Blue: Experiment

**(2)改变均值——**同样,和预期的一样,如果我们注入硬币偏向尾部的先验,当实验偏向正面时,我们就不那么有信心硬币偏向正面了。

给定均值和方差,我需要计算α和β。谢天谢地,我们有这个 stackoverflow post 帮助我们做到这一点:

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

为简单起见,我们将α和β四舍五入为最接近的整数。因此方差可能有点不同。

par(mfrow = c(2,2))

mean = 0.7
variance = 0.036

alpha_prior = ((1-mean)/variance - 1/mean) * mean^2
beta_prior = alpha_prior * (1/mean - 1)

alpha_prior = round(alpha_prior,0)
beta_prior = round(beta_prior,0)

alpha_expt = 5
beta_expt = 1

alpha_post = alpha_prior + alpha_expt
beta_post = beta_prior + beta_expt

title = paste0("Prior Beta(", alpha_prior, "," , beta_prior, ")")

# Bayesian Approach

theta=seq(from=0,to=1,by=.01)
plot(theta,dbeta(theta,alpha_post,beta_post)
     ,type="l"
     , ylim = c(0,6)
     , col = "red"
     , lwd =2
     , ylab = "Prob. Density Function"
     , main = title)

lines(theta,dbeta(theta,alpha_prior,beta_prior),type="l", col = "green", lwd =2)
lines(theta,dbeta(theta,alpha_expt,beta_expt),type="l", col = "blue", lwd =2)

abline(v=0.5, col='grey')

# Prior Mean
alpha_prior / (alpha_prior + beta_prior)

# Prior Variance
(alpha_prior * beta_prior) / ((alpha_prior + beta_prior)^2 * (alpha_prior + beta_prior+1))

# P(theta > 0.5 | data)
1-pbeta(0.5, alpha_post,beta_post)

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

Above: Effect of changing prior mean, keeping variance constant. Green: Prior; Red: Posterior; Blue: Experiment

结论

总之,我们已经证明了小样本 A/B 测试的贝叶斯观点。我们看到,在频率主义方法中,停止规则在建立 p 值时是至关重要的,而在贝叶斯方法中不考虑停止规则。给定先验和实验结果,贝叶斯方法也给出假设为真的概率。最后,我们还观察了后验概率如何受到先验分布的均值和方差的影响。

附录— Beta 分布

贝塔分布是定义在区间[0,1]上的一族连续概率分布,区间[0,1]由两个正的形状参数参数化,用α和β表示。有三个原因可以解释为什么贝塔分布对贝叶斯推断很有用:

  1. 区间[0,1]适合表示概率。
  2. 它有一个很好的性质,即后验分布也是贝塔分布。需要明确的是,先验分布是指我们在进行任何分析之前认为θ表现出的分布,而后验分布是指我们在观察一些样本后认为θ表现出的分布。
  3. 我们可以通过改变 a 和 b 来指定大范围的信念——给定 a 和 b,θ的概率密度函数如下:

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

从上面的等式中,我们看到α和 b 控制分布的形状,事实上,它们被称为形状参数。让我们把一些值代入 R,观察形状的不同。期望值由α / (α+β)计算得出。

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

theta=seq(from=0,to=1,by=.01)

plot(theta,dbeta(theta,0.5,0.5)
,type="l"
, ylim = c(0,3)
, col = "black"
, lwd =2
, ylab = "Prob. Density Function")

lines(theta,dbeta(theta,1,1),type="l", col = "red", lwd =2)
lines(theta,dbeta(theta,3,3),type="l", col = "blue", lwd =2)
lines(theta,dbeta(theta,5,5),type="l", col = "yellow", lwd =2)

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

请注意,所有四个分布的平均值都是 0.5,可以指定不同的分布。这就是我们所说的大范围的信念可以用贝塔分布来确定。

参考

[1]杰里米·奥尔洛夫和乔纳森·布鲁姆。 18.05 概率和统计导论。【2014 年春天。麻省理工学院:麻省理工学院开放课件,【https://ocw.mit.edu】T4。许可:知识共享协议 BY-NC-SA

最初发表于www . Joshua Kim . io

DREAM.ac:利用人工智能建立团队

原文:https://towardsdatascience.com/dream-ac-build-teams-using-artificial-intelligence-c4f1fdd7ee66?source=collection_archive---------11-----------------------

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

人工智能正在被用来解决许多人类问题,最近谷歌的 Duplex 可以通过与人对话来代表你预订座位

我们在人力资源领域有一些非常有趣的客户,这是一个以人际互动为主的领域。我们从客户那里看到的主要问题是,如何使用人工智能来进行猎头或为候选人匹配职位。今天,我想向你们介绍我们在人力资源领域的一个客户的解决方案架构,并让你们了解如何部署人工智能来自动化和改善人力资源流程。

DREAM.ac 与 A.I .一起建立团队,让更多的项目和创业公司获得成功。激励问题很简单:68%的项目失败,90%的创业公司失败。这些失败往往可以追溯到错误的团队,领导不力,或未能筹集资金。梦想是由已经在人力资源领域的自由职业者中取得成功的创始人建立的,因此这些要求是由创业行业问题的现实经验驱动的,而不是在餐巾纸上画画。

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

Teams have a set of roles that need to be filled in order to complete the project.

梦之队想要首先解决的问题是建立成功的团队。早在 2000 年代,我致力于将 DVD 与人们想要的 DVD 列表相匹配(见 zip.ca )。DVD 分配问题技术名称是转运问题。考虑到一张 DVD 一次只能邮寄给一个人的物理限制,这个想法是为了最大化每个人的快乐。同样,对于梦想,我们只能用一个人来完成一项工作,一个人只能做这么多工作。

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

DREAM.ac connects people to projects using A.I.

为了让一个人适合某个角色,我们使用回归来给候选人列表中的每个可能的人一个适合度分数,该分数代表他们将在工作中做得很好的可能性,并延伸到团队将成功实现他们的目标。个人与工作的匹配分数基于个人过去从事此类工作的历史(经验)以及该类型的人在该类型的角色中表现良好的历史。使用聚类来“发现”人员和角色的类型。候选人按前 n 名排序,这样就可以为每个职位考虑最适合该工作的人选。这个匹配系统的目标是最大化团队的成功,而不是最大化职位的完成。为了涵盖尽可能多的一般规则和例外,我们设计了一个使用广度和深度学习的解决方案。

最终的解决方案是一个推荐系统,这是我最喜欢的,因为这是我在 T2 的博士论文的主题。

一些开源数据集在实践中证明这种想法的有效性时非常有用。Kaggle 列出了以下数据集,以及其他一些数据集,供您开始使用:

正如我在上一篇文章中提到的那样,拥有专有数据集是获得竞争优势的关键。DREAM 不是建立在这些公共数据集的基础上,而是围绕私人会员数据进行设计,这些数据由平台用户所有,并与公司共享,以提供培训示例。该公司只拥有衍生训练系统,而不是原始数据,用户可以选择通过关闭他们的帐户拿回。

让我们看看团队是如何建立的,目标是让团队成功。

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

A high level view of how teams can be assembled using a recommender system, with the overall objective of maximizing the likelihood of team success.

构建成功项目的问题是一个层次问题,需要神经网络模型来理解(建模)团队和角色。我们正在继续开发一些非常酷的技术,以解决当今传统人力资源方法组装项目的方式中的这一差距。

总之,人工智能可以用来根据角色的“适合度”(得分)来确定团队中某个职位的最佳候选人。这可以在组建团队的更大过程中完成,甚至可以在开发成功项目的更大范围内完成。

要阅读更多关于 DREAM.ac白皮书的内容,只需点击那些链接。

如果你喜欢这篇关于使用人工智能建立团队的文章,请点击关注按钮,看看我过去读过最多的文章,比如“如何雇用人工智能顾问”除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习

编码快乐!

-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI

您可能喜欢的其他文章:

彩色梦

原文:https://towardsdatascience.com/dream-in-color-faf1ea5190e9?source=collection_archive---------3-----------------------

一个机器学习解决方案来设计你的新娘派对

介绍

婚礼行业正在蓬勃发展。2016 年美国婚礼的平均费用估计在 35329 美元左右,高于 2006 年的 27852 美元(1,2)。同样,在科技领域,与婚礼相关的产品和解决方案也有越来越多的机会。这个项目旨在创建一个这样的解决方案。

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

在传统的婚礼策划中,新娘会为所有的伴娘选择一件礼服。一种被称为“不匹配的伴娘”的新趋势背离了上述传统,并且越来越受欢迎。为了达到“不相配的伴娘”的效果,每个伴娘都有不同风格和/或颜色的礼服,它们都符合一个共同的主题。这种外观很难实现,在线工具也很少。在 2016 年对伴娘的一项调查中,一位受访者引述道:

“我知道让每个人都穿不同的颜色是 Pinterest 的时尚,但这对伴娘来说是一种痛苦。”

一场婚礼平均有 5 名伴娘,打造一套巧妙搭配的礼服需要大量的协调工作。大多数在线服装零售商在其网站上只提供 12-14 种颜色的选择。在这个项目中,我的目标是完成以下工作:

  • 创建一个机器学习算法,可以将服装分为几个特定的颜色类别
  • 将该模型应用于目前可在线购买的服装
  • 让应用程序可供新娘和伴娘使用

材料和方法

我把这个项目当作一个图像分类问题。我希望能够根据在线零售商提供的图片对服装进行分类。网上出售的每件衣服都有图片,而描述或颜色名称并不总是可用,也不总是在零售商之间保持一致。最终,一切都取决于服装的外观,而这最好通过图片来评估。

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

数据收集

通常需要成千上万的图像来训练一个成功的图像分类算法。我使用了两个批量图像下载应用程序,通过谷歌图像搜索、谷歌购物搜索以及一些在线服装零售网站从网络上收集图像。图像质量的范围很广,从零售/专业质量到手机图片。

为了训练算法对图像进行分类,需要对图像进行标记。我选择了 64 种可能的颜色标签,并与网络开发人员 Robb Prescott 合作,建立了一个在线标签系统(color.suprinfinity.com)。标签系统如下所示。单击第一个图像中显示的颜色组之一,会显示更多特定的颜色供标签选择。

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

Above: Labeling page at color.suprinfinity.com

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

Above: Specific color labeling groups at color.suprinfinity.com

一旦图像被标记,数据就被收集到 Postgres 数据库中。其他标签(除了颜色)被收集用于项目中的潜在用途:

  • “图像细节”标签帮助我从建模中排除了某些类型的图片
  • 长度和织物标签未在当前项目中使用,但可能用于未来的改进/功能。

我收集了 18,630 张图片,存储在亚马逊网络服务(AWS)的 S3 存储桶中。为了给这个项目贴上足够多的标签,我通过亚马逊土耳其机器人外包了标签任务。MTurk 是一个你可以付钱给个人来完成可追踪的在线任务的系统。

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

虽然 MTurk 对于完成大量标签是有效的,但是标签工作的质量并不好。在使用 MTurk 之后,我花了几天时间重新标记(清理)数据集,直到它达到可以接受的建模形状。我使用了我们标签网站的“管理服装”页面,这允许我查看所有的服装及其标签,以及查看特定标签下的所有图像。下面的截图显示了前几件标有“teal5”颜色的裙子。我最终得到了超过 10,000 张的可用的带标签的图片来训练我的模型。

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

Above: Admin Dresses page showing ‘teal5’ label

模型构建

为了创建一个可行的产品来实现项目目标,我希望我的模型比典型的服装零售网站有更多的颜色类别。我在我所有的模型中使用了 30 到 35 种颜色。这些颜色类别由原始 64 种颜色标签的不同组合构成。

我尝试了一些建模算法,但选择专注于卷积神经网络(卷积网),因为它们对图像分类很有效。为了增加计算能力,我通过谷歌云平台计算引擎设置了一个带有一个 NVIDIA Tesla K80 GPU 的 Ubuntu 虚拟机(8 个 vCPUs,52 GB 内存),并安装了带有 Keras 的 tensorflow-gpu 进行建模。

图像预处理和数据准备

由于每个类的图像数量相对较少,我使用 Keras 预处理工具(ImageDataGenerator)来扩充图像以进行建模。下面是这个 Keras 工具如何工作的一个例子。通过拉伸、翻转和应用其他修改,同一个图像可以多次使用,有效地增加了用于训练模型的样本大小。

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

卷积网络架构

我尝试了几个不同的参数,这个项目最有效的 convonet 架构如下所示。对于这个模型,我使用了校正的线性激活,50 %的丢弃,以及 16 的批量大小。这个相同的体系结构被应用于一些不同的分类安排,并且总体上比其他体系结构表现得更好。

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

结果

为了评估每个模型的性能,我首先查看了典型的性能指标:准确度、精确度、召回率和 f1 分数。准确性是衡量模型总体预测正确的服装数量。精确度和召回率是模型在每个颜色类别中表现如何的度量,f1 是这两者的调和平均值。

这些指标帮助我优化初始模型参数,调整颜色分类,并识别高性能和低性能模型,而无需过度耗时的评估。通过这个过程,我创建了一个有 31 个颜色类别的有效卷积网(Model_31)。

Model_31 分数汇总:

  • 整体模型精确度:81 %
  • 平均精度:81 %
  • 平均召回率:80 %
  • 平均 F1: 81 %

为了进一步评估 Model_31,我观察了每个颜色组的表现。我检查了每个单独颜色组中被算法错误分类的图像。通过这个过程,我对模型错误标记的图像进行了两个关键观察,并相应地解决了每个问题:

该模型经常预测一个非常接近的颜色组。

  • 对于我的产品来说,这是一个可以接受的结果。例如,浅黄色的服装可以归类为黄色服装。它仍然属于同一个颜色系列,可能会被挑选浅黄色礼服的伴娘看到。然而,一件浅黄色的衣服被错误地归类为翠绿色是不可接受的,原因有几个。
  • 由于上述原因,我创建了自己的**【接近得分】**指标来评估模型。我计算了 1 个和 2 个颜色组中的“接近整体模型准确度”和“接近回忆”分数。这包括将 1 或 2 个相近颜色组内的任何分类作为“相近阳性”而不是“真阳性”进行计数。

模型实际上正确地标记了一些图像(我错误地标记了它们)。

  • 我发现颜色组中的一些图像在建模前被贴错了标签。例如,该模型将几件灰色连衣裙归类为米色。当我打开这些图片时,它们实际上是我贴错标签的米色连衣裙。
  • 由于在评估 Model_31 时的这一发现,我回去在建立更多模型之前进一步清理了我的数据。

下图展示了这两种观察结果。它展示了来自珊瑚群的图像,这些图像被错误地标记为暗粉色或亮粉色。

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

*Above images and classification were from final selected model (Model_35)

型号选择

在进一步清洗标签,又尝试了几个型号后,我用上面的流程选择了我的最终型号: Model_35

Model_35 分数汇总:

  • 整体模型准确度:79 %
  • 平均精度:80 %
  • 平均召回率:79 %
  • 平均 F1: 78 %
  • 平均关闭(1)召回率:87%
  • 平均关闭(2)召回率:93%

应用

http://dreamincolor.suprinfinity.com

为了使用我的模型创建一个可行的产品,我需要收集当前可用服装的数据,以便分类并显示给用户。我从以下六家主要的网上伴娘礼服零售商那里搜集了数据:

  • 诺德斯特龙
  • 威丁顿路
  • 卢卢斯
  • Asos
  • 德西集团
  • 绳结

我使用 Xpath、scrapy spiders 和其他策略从这些网站收集数据。对于每件衣服,我收集了以下信息:

  • 服装图片链接
  • 价格
  • 链接到产品
  • 产品名称
  • 零售商名称

在清理和编译数据后,我使用我的模型从图像中预测颜色类别,并将所有内容提供给 Robb,以便与网站集成。罗柏为 dreamincolor.suprinfinity.com 完成了所有的网页开发工作。我将生产图像存储在另一个 AWS S3 存储桶中用于生产访问,网站是通过 Heroku 和 postgres 数据库建立的。

我总共收集了3670 件衣服在网站上展示。

该网站的访问者可以一次选择多达 5 种颜色类别进行查看。该网站显示所选颜色类别中的所有服装以及与每件服装相关的所有信息。当用户点击一件衣服时,它会直接把她带到零售商的购买页面。

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

Above: Snapshot of Emerald Dresses displayed at dreamincolor.suprinfinity.com

生产中的模型性能

下图显示了基于验证数据的颜色组的召回分数。下面的分数与 web 应用程序的实际模型性能之间存在一些有趣的差异。三个颜色类别特别展示了这些差异。

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

Above: Image shows True and Close(2) recall scores across color groups. Website color names are shown and differ from class names during modeling.

无装饰的

  • 这位模特在裸色服装上得分很低,可能是因为在标签上重叠了相近的颜色组。裸色、腮红、米色、金褐色和玫瑰色组都包含非常相似的服装颜色。这是一些最常见的伴娘礼服颜色,所以我想有单独的选择。更好的标注可以提高分数。这位模特在制作裸色服装时表现得非常出色。

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

Nude dresses

拿铁咖啡

  • 这一颜色类别的分数也很低,但可能是出于不同的原因:阶级不平衡。拿铁咖啡(棕色)的图片最少。然而,巧克力色(深棕色)和金黄色也比其他颜色类别的图像少得多,但总体表现良好。缓解班级失衡可能会提高各颜色组的模型分数。再说一次,这位模特在生产过程中对拿铁礼服进行了有效的分类。

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

  • 这一类别的高分表明模特应该准确地对银色礼服进行分类。在生产中,该模型的表现不如预期。这也可能是由于类别中的错误标记以及一些潜在的背景和图像质量噪声。更多的训练图像和更好的标记可能会提高这种性能

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

额外功能

寻找相似的服装— 从 Model_35 卷积网的最后一个密集层,我为每张产品图像提取了一个 64 维向量。这是通过构建一个具有相同架构的网络,从 Model_35 的层插入权重,并从每个图像的第一个密集层输出矢量(省略 softmax 输出层)来实现的。利用 64 维向量集,我创建了一个余弦相似矩阵。该矩阵基于卷积输出向量给出相似服装的“分数”。

我的余弦相似矩阵的目标是为网站创建一个功能,允许用户查看与他们喜欢的衣服相似的衣服。我的希望是,在神经网络的回旋中,除了颜色之外的一些服装特征可能被捕获(例如,长度、织物质地、光泽)。我看了一些例子,这似乎是成功的。

下面,我选择了一条香槟色的亮片长裙。《黑客帝国》中最相似的裙子都是长的,颜色非常相似,有些有某种光泽、纹理或亮片。

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

在第二次测试中(见下图),我选择了另一条亮片长裙。这条参考裙子(左上角的轮廓图)是海军蓝,但是模特把它误归类为黑色。有趣的是,余弦相似矩阵中所有最相似的裙子都被正确归类为海军蓝。他们也很长,有些有亮片或花边。

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

余弦相似性矩阵对于寻找相似服装的有效性看起来相当成功。更大范围内的表现仍需评估。找出这一特征中的弱点,识别多少件衣服在风格/颜色相似性上有明显的差异,将是有用的。我想这将受到参考服装颜色类别中可用服装数量的严重影响。

**其他类似产品——**从发饰到个性珠宝,再到指甲油和相配的坡跟鞋,伴娘的套装不仅仅是她的礼服。同样,伴郎也需要搭配(想想领结、吊带、方巾、袜子)。考虑到这一点,我想看看我的 convonet 是否可以用在其他与婚礼相关的产品上。

我首先在蝴蝶结上测试了这个理论。领带和领结的零售图像通常集中在产品上,背景简单,没有太多其他干扰。Model_35 在识别领结的小样本的颜色类别方面非常有效。下图显示了领结和模型预测颜色类别。有效性的进一步评估是有保证的,这看起来像一个非常有前途的网站的潜在功能!

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

未来的工作和结论

提高模型性能的一些未来策略包括进一步清理图像标注、收集更多数据、解决类别不平衡,以及尝试背景扣除或通过 RGB 值标注。我还想尝试迁移学习和具有本地化能力的应用程序。该网站本身可以在许多方面进行改进,包括更好的 UX 设计,添加上述特殊功能,以及快速清理分类错误的服装。

使用卷积神经网络对服装图像进行分类是实现我的目标的有效方法。数据收集、清理和贴标签是该项目的最重要和最耗时的部分。最终的网站比典型的在线零售商提供了更多的颜色选择,这是一个很好的起点,在许多方面都有改进的潜力。

资源

  1. 西弗玛姬。"全国平均婚礼费用达到 35329 美元."结。https://www.theknot.com/content/average-wedding-cost-2016
  2. “婚礼$eason。” CNN 财经http://money.cnn.com/2006/02/10/pf/weddings_costs/。2006 年 2 月 10 日。
  3. 安德烈·伯克。"技术利润和 3000 亿美元婚礼空间的支点."赫芬顿邮报。http://www . huffington post . com/Andre-bourque/technology-profit-and-PIV _ b _ 7193112 . html。2016 年 05 月 01 日。
  4. 凯特琳.肯尼。"如今当伴娘是什么感觉:调查结果."终极伴娘。http://ultimate 伴娘. com/2016/05/04/what-its-like-to-be-a-a-伴娘-今日调查-结果/
  5. “根据 2016 年 Knot Real Weddings 研究,美国婚礼的成本创下新高,夫妇们为每位客人花费更多,以创造一个难忘的体验。” xo 组。 http://www .美通社/news-releases/the-knot-the-1-wedding-site-releases-2014-real-wedding-study-statistics-300049675 . html。2017 年 2 月 2 日。

硅谷的饮酒机器人、新技术和年龄歧视

原文:https://towardsdatascience.com/drinkbots-new-technologies-and-ageism-in-silicon-valley-26fa18172fb8?source=collection_archive---------8-----------------------

从去年到今年,发生了一些根本性的变化。

去年被认为是伟大的机器人,今年却显得老派、过时、简单、无趣。**游戏变了。**从根本上。在数量级上。

在某种程度上,一年一度的 DNA Lounge DrinkBot 竞赛是对整个硅谷的隐喻。

当 TikiTron 今年获得第二名时,可以听到失望的呻吟。这很令人满意,因为我也很失望,然而,我已经明白抱怨对你没有任何好处。更好的办法是学习和调整,然后变得更强。

我确切地知道我们为什么会被打败,在比赛之前就知道,低估了它的重要性,低估了它的紧迫性:

现在最重要的是新技术:机器学习和人工智能。

陈述的评判标准都是无关紧要的,除了一个。因为我们已经确定了所有的类别,除了最后一个:

评判将基于:

时尚与优雅:你的那个机器人有多聪明、多敏捷?

醉酒效率:它制作的饮料好喝吗?

全资产:半资产的反义词。这个地狱般的装置真的能工作吗,还是你必须站在那里不停地调整它?

这不会有好结果:可怕的想法和疯狂的科学会得到额外的考虑。

风格和优雅:你选择一个贴有你选择的鸡尾酒标签的提基神像,通过祈祷将神像扔进火山来献祭,你听到神像痛苦地尖叫,然后鼓声开始,你的鸡尾酒被分配到提基龙巨大的提基嘴里。

TikiTron 是纯粹的艺术。事实上,我们故意隐藏了这项技术,因为当它变得神奇时,体验会更好。当人们问它是如何工作的,回答是,“提基神知道你所有最深的渴望!”TikiTron 是一种表演。饮料本身几乎是事后的想法。

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

我在精心制作的东西中发现美。你可以看出什么时候有人不辞辛苦地从头开始做东西。有一种对过程的热爱,在这里创作不是关于完成,而是关于制作的旅程。这是最后的润色,最后的 10%占用了 90%的时间。这不仅仅是证明这个概念,而是把这个概念带到一个更高的存在状态。

现在不是这样的。

《神风敢死队》几乎没有任何艺术。它只是一台电脑、一台抽水设备和一张夹在框架上的塑料板。它利用面部识别将酒精喷入你张开的嘴中。

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

Kamikazi Blaster is insane fun: get alcohol squirted into your open mouth! (Credit: photo taken by the author) (Note the paper towels…!!!)

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

我问项目上的编码员是怎么训练他的模型的,他说他没有建模型,只是用了 OpenCV 里的面部识别库。

就这么简单。

今天,it 只是为了证明这个概念。但是证明一个比以前更大的概念,这才是重点。因为有了新的可用资源,你可以在几天内从概念到成品——如果你想得更大,不加工产品,你可以利用这种加工的便利来创造更大规模的产品。你现在可以做更大更复杂的东西了。

以前,使用处理器构建主板是一个完整的过程,但 Arduino 和 RaspberryPi 已经下架,教程甚至全功能代码都已经构建好并准备就绪。硬件不再是过程的一部分,它仅仅是一个更大项目中的一个小而简单的步骤。

这就是要点:当你卸载过程,你可以在更高的水平上创造。

*这改变了人类的一切思维方式。*它改变了我们现在能解决的问题的层次。**大项目不再用一辈子,可以用一个周末。**现在一切都扩大了:需要资金?点击几下启动 kickstarter 需要捏造点什么?3D 打印出来。有如此多的软件,人们几乎不需要编码。仅仅通过把碎片放在一起,使用模板,下载库,利用像云这样的大量资源,你就可以创造出仅仅在几年前难以想象的规模。

仅仅一年前。

风格和优雅几乎无关紧要。快速构建,快速迭代,经常失败是新的思考方式。

我们这些老古董需要更新我们的游戏。

**陶醉的效率:**tiki tron 使用经典的鸡尾酒配方,以及精心校准的泵来提供一贯出色的鸡尾酒——如果我自己这么说的话(代码是我写的。)人们通常会对我们的鸡尾酒有多好感到惊讶。

我们的不含酒精的菜单是我女儿和她的朋友们用我为他们添加的程序创建的,他们可以分配微量的酒精,这样他们就可以尝试很多次来得到一种恰到好处的新饮料。

实用性、有用性:你交付了用户需要的功能吗?

我对 Slack 的第一次体验更加深了事情的变化。我参加了一个在线课程,该课程使用 Slack 让学生进行协作。我发现这种体验令人无法抗拒——因为“信噪比”相当低,但当信号存在时,它是高质量的,这意味着我必须费力地通过信号来获得好的金块。我的意思是有很多闲聊,但偶尔有人问了一个很好的问题,其他人给出了一个非常有见地和有用的答案。我会看到这些对话框经过,并知道我以后会需要这些信息,但我不能将它们加入书签,当它们滚动到顶部时,它们就永远消失了。

我向组织者抱怨——说因为我有家庭,所以时间有限,很难跟上 Slack,再加上好的想法没有存档供以后阅读。(我的错误。)他们的回答是,因为大多数公司都使用 Slack,即使是有家庭的大龄学生也需要学习如何使用它。年龄歧视者认为我太慢,这让我感到震惊和侮辱。我不是在抱怨它不好用。我抱怨它在整理和归档有用信息以供日后使用方面功能不佳。在课程中,好的想法应该为新学生所用——好的想法应该积累和建立,一切都随着时间的推移而改进。我认为 Stack Overflow 可能是一个更好的地方,以一种易于搜索的方式来存档想法,但 Stack Overflow 对他们来说太昂贵了,无法进行商业许可。

在快速迭代的世界里,有用性没有快速迭代重要。“那是昨天的事了”,所以应该从顶部滚下来,永远消失。懈怠是今天的工具,不是昨天的。

回到神风敢死队。我自己试过,虽然这种液体很美味,但我不会说它有效率或令人陶醉。大约是半口混合鸡尾酒,一半在我的脸上和脖子上。完全疯狂,愚蠢和有趣!

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

Kamikazi Blaster: about half made it into my mouth (Credit: photo by the author taken of the screen of the automatic photo taken during dispensing)

《神风敢死队》是关于体验,而不是陶醉。TikiTron 也是一种“体验”,但没有那么浮华和疯狂的乐趣!

为去年的比赛,Tikitron 在 4 个月的过程中建造,并在去年为今年进行了改进。它是由一个具有丰富建筑经验和经典蒸汽朋克艺术感的团队建造的。我不知道神风爆能有多快,但它可以在几周内,甚至一个周末内轻松完成。

这就是要点:获得你(短暂)注意力的体验比完善和精炼的体验重要得多。

我们这些老古董需要放弃完美。

我相信你现在已经知道事情的发展方向了。

TikiTron 是一件经过打磨的艺术品。它充满了细节,从手工建造的干冰烟雾机,到闪烁的“恶魔之眼”,到盛放牺牲的 tiki 偶像的宝盒,以及隐藏油管的塑料藤蔓。这确实是一件艺术品。这些提基神像是经过多年的庭院浏览精心收集的。照明经过了深思熟虑——从火山内部的 led,到 tiki hut 灯,再到照亮整件作品的聚光灯。所有的技术都是隐藏的,将艺术完全放在前面和中心。

如果我也可以说,它是精心设计的。去年和今年,代码从下午 5:30 运行到晚上 10:30,没有崩溃,没有中断,并且(今年)没有发生故障。它在用 Python 编写的 5 个类中运行 1500 行代码。所有的命令和分配的饮料都有记录。它根据杯子的大小调整饮料,灌注所有的泵而不丢失一滴,在关闭之前将液体流回瓶子,并被校准到不到十分之一盎司。设置和关闭模式让跑步变得如此简单——我会在家里打开它,为自己调制一杯鸡尾酒。外壳上布满了连接器,每一个都不一样,以免在安装时混淆。灯指示哪个泵当前正在泵送,并且计划了大多数意外情况(例如,瓶子用完了,新瓶子需要单独灌注。)整个东西可以放在大多数紧凑型汽车的后座上——让前座敞开着。我带着它去过很多地方,只是为了好玩,因为它很容易打包和安装。

神风爆能枪进行了一些微调、瞄准和调整。在夜晚结束时,它射错了站在舞台上的人(不是这张照片中的人,但是他们在摄像机的视野中,可能有危险。)

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

Kamikazi Blaster — the person behind might be in danger of getting sprayed! (Credit: photo by the author)

这个系统有很大的改进空间。可能有某种艺术主题。背景本可以更有趣。我对一个人说,也许应该把地板布的边缘翻起来,用胶带粘住,防止液体流出,但他似乎不在乎。他们不得不向酒吧借地垫来装液体。他们不得不手动要求顾客向前或向后移动以瞄准——他们甚至在地板上没有一个可以站立的地方。该机制可以使用一个漂亮的外壳来保持东西整洁。不确定这张桌子是不是他们的。放所有多余物品的盒子会让桌子保持整洁。在桌子上盖个布帘盖住下面的内脏会更好看。

我不能说 Kamikazi Blaster 在工程方面有多糟糕(它看起来大部分时间都工作得很好),但是,在第一次安装时,它确实需要大量的调整和测试。

简而言之,它看起来像一个正在进行的科学实验,而不是一个经过打磨的机器人。

这就是要点:一个项目组合在一起的感觉是吸引力的一部分。这看起来像疯狂的科学!这是半吊子,但它的工作。对观众来说,参与疯狂科学的体验是最有趣的部分。

我们这些老古板需要在几乎不起作用的时候,在仍然危险的时候展示正确的东西。

**这不会有好结果:**这让我们回到了现实,唯一重要的标准——这在硅谷很重要:你有多前沿?

TikiTron 获得了第二名,但第一名和第三名的机器人使用了最新的技术:Kamikazi Blaster 使用计算机视觉进行面部识别,史蒂夫使用语音识别。这些技术现在掌握在外行人手中,而且非常容易使用,可以整合到像 DrinkBots 这样琐碎有趣的项目中。

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

Old school: this bot, Chassis, was beautiful, made excellent cocktails, and was well executed. It lost. (Credit: photo by the author)

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

New School: this bot, Steve, had little art, and a backup plan, but it used Google Home to recognize your voice and help you decide on your ideal cocktail. It won third place. (Programmer is in the background.) (Credit: photo by the author)

我知道这是必然会发生的!我知道 ML/AI 是最新的东西,而且很重要。我甚至正在为 TikiTron 添加语音识别功能,所以你实际上必须向 Tiki 神祈祷才能得到你的饮料:

A test of voice recognition to get the TikiTron to accept real prayers for your drink!

我做了一个简单的实验——最重要的部分成功了:在一连串的祈祷中识别饮料的名字。但是这个板通过云工作,萨姆很久以前告诉我,带宽是酒吧的一个问题。(对于去年的大奖得主 N. E. Bree 8 来说,带宽是一个大问题。)所以在 Maker Faire 上,我得到了第二个语音识别板,它独立存在,没有云连接,并且正在将它从 Arduino 转换为 RasPi…

我受到了波兰语的阻碍——我希望它能一直正常工作。

我应该把那只小狗放在那里,甚至可能伪造它,甚至根本不把它集成到代码中,只是把盒子放在那里,让它识别你的声音。如果我有连接问题,我不应该担心,只是看起来很疯狂,因为我试图在演出期间让它工作。我应该熬夜让它勉强工作。

我应该使用最新的技术,并以其创造性的使用给评委留下深刻印象。

但是我回到了老学校。

那是一个非常非常大的错误。

所以我对第二名感到失望——不是因为我觉得它不值得。神风敢死队是一个…爆炸!这是疯狂的,疯狂的,有趣的,取悦大众的。我们为酒吧赚的钱可能比神风敢死队还多,但这无关紧要。

神风敢死队是疯狂的科学。

然而,结局确实很糟糕。第一名和第三名的机器人都有人工智能的所有缺点。两个人都表现出了种族偏见——一个黑皮肤的男人告诉我,神风敢死队员认不出他的脸,一个法官说史蒂夫对她的口音有问题。有时候,没有好的想法的快速原型会产生意想不到的——非常糟糕的——后果。两者都需要运营商做大量的工作。我敢打赌,没有一个人会在明年回来时变得更优雅或更有技巧。

这不会有好结果

机器学习和人工智能是已经在学术界酝酿多年的巨大话题,只适用于那些在数学和统计领域度过多年的人。但是现在 ML 和 AI 任何人都可以用,不考虑编码能力。我甚至看到教程和课程是这样工作的:那些大师仍然在线性代数和统计模型中思考,并试图从那个角度教授它。现在的学生不需要知道引擎盖下是什么。他们只需要调用一个简单的函数。《神风敢死队》的编码员并没有自己建立他的面部识别模型。他刚刚使用了图书馆调用。

这就是司机和机械师的区别。

在汽车刚问世的时候,驾驶汽车需要大量的工程知识。但是现在汽车很容易使用,你甚至不需要了解除了加油之外汽车是如何工作的。

哦,当然,如果你了解引擎盖下是什么会有所帮助,但是没有必要利用汽车的实用性。这使得越来越多的人可以使用汽车。电脑本身也是如此——因为它们容易使用,奶奶有电子邮件和 Skype。

现在 ML/AI 也一样。这些工具变得非常容易使用,以至于你不需要理解数学或统计学就能使用它们。

这种转变改变了一切。

认为世界上有一种新的方式。它已经从理解所有的部分,到把它们拼凑在一起,当东西坏了,然后试图弄清楚它是如何工作的,发生了什么。这开启了一种快速的原型制作模式,不仅更快,而且比 T4 快了很多倍。它改变了任何人都可以做的问题和项目的规模。

这种思维的转变将改变人类。

这是我们这些老古董需要学习的一课:如何停止试图理解,开始只是把东西粘在一起,直到它们起作用,然后把它们送出门。

年龄歧视和硅谷缺少什么

然而,最大的问题是,所有其他因素也很重要:风格、实用性和抛光。这些是有经验的人的领域。

年轻人根本看不到在各个层面都做得很好的事情的价值。因此老程序员的谨慎和智慧不受重视——我们看起来又慢又笨。对问题的必要思考减缓了快速创新的速度。然而,有些事情做得好就会有回报——年轻的程序员没有足够的生活经验来看到很多回报。

这就是经验的全部意义:投资的回报。

真正的答案是我现在正在走的路:学习这种超级原型的新方法,在不理解的情况下进行构建,同时利用我的经验比随机的疯狂科学做得更好。

深度学习在机器人学中的应用

原文:https://towardsdatascience.com/drone-follow-me-ed0d15e62498?source=collection_archive---------4-----------------------

W 帽子是跟我来机器人

“跟我来”是机器人学中的一个领域,用于在模拟中识别和跟踪目标。

像这样所谓的“跟我来”应用是许多机器人领域的关键,您在这里应用的相同技术可以扩展到自动驾驶汽车的高级巡航控制或工业中的人机合作等场景。

在这个项目中,一个深度神经网络被训练来识别和跟踪模拟中的一个目标,即一个被称为“英雄”的人,他将与其他人混合在一起。在下图中,有一个跟随“英雄”的无人机的表示。

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

Drone follow (mid of the image) follow a target on bottom right corner

你听说过卷积网络吗?

记住神经网络的概念,将卷积网络应用于图像识别有两个主要优点:

  • 参数共享:在图像的一部分有用的特征检测器(例如垂直边缘检测器)可能在图像的另一部分也有用。
  • 稀疏连接:在每一层中,每个输出值只依赖于少量的输入,这使得它具有平移不变性。

通常,卷积网络架构的结构如下:

作为每层的激活函数,RELU 应用逐元素的非线性。

即使卷积网络是用于对象分类的现有技术,对于对象检测,必须应用架构调整来提供逐像素的网络学习。这种架构被称为全卷积网络

W 什么是全卷积网络?

全卷积网络(FCN) 是一种允许在整个网络中保留空间信息的网络架构,这对于图像中的对象检测来说非常简洁。此外, FCN 可以接收任意维度的输入。

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

Fully convolution network architecture

关于架构, FCN 的架构如下:

  • 编码器(上图中的前 3 个元素)
  • 1x1 卷积层(上图中的第四项)
  • 解码器(上图中最后 3 次)
  • 跳过连接

编码器对应于上一节中描述的传统卷积网络。编码器允许学习最重要的特征,以便稍后进行上采样并获得图像中的对象分割。

一个全新的概念是 1x1 卷积层。简单来说,就是保存空间信息的卷积层。此外,1x1 通过在来自编码器的输入层上应用 1x1 滑动窗口来执行逐元素乘法和求和。最后,1x1 卷积通过降低编码器架构的深度来降低计算成本。类似地,1x1 卷积图层的工作方式类似于全连接图层,因为它线性组合深度图层并输入 RELU,尽管与全连接图层相反,它会保留空间信息。

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

1x1 convolution

最后,解码器由双线性上采样层、卷积层+批量归一化和与编码器层的跳跃连接组成,以改善丢失的空间特征分辨率。

让我们来分解这三个重要的概念:

  • 双线性上采样
  • 批量标准化
  • 跳过连接

双线性上采样是一种重采样技术,它利用位于给定像素对角线上的四个最近的已知像素的加权平均值来估计新的像素强度值。加权平均值通常取决于距离。

让我们考虑这样一个场景,其中有 4 个已知的像素值,所以本质上是一个 2x2 的灰度图像。需要将此图像上采样为 4x4 图像。下图更好地展示了这一过程。

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

Bilinear Upsampling for 2x2 input image

让我们记住,双线性上采样方法不像架构中的转置卷积那样是一个可学习的层,并且容易丢失一些更好的细节,但它有助于提高性能。

例如,转置卷积是一种具有可学习参数而不是插值的方法。转置卷积有些类似,因为它产生的空间分辨率与假设的反卷积图层相同。然而,对这些值执行的实际数学运算是不同的。转置卷积层执行常规卷积,但恢复其空间变换。

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

Tranpose convolution from 2x2 to 4x4

关于转置卷积数学的更多细节,请点击这里

第二个重要的概念是批量标准化,它基本上是指网络内每小批训练数据的正常数据。这个过程允许网络快速学习。此外,它限制了网络内部激活函数的大的变化,即在隐藏层中有一个更平滑和坚实的学习。

第三个重要概念是跳过连接,它基本上从编码器的初始层获得更高的分辨率,并与解码器层结合,以获得卷积层期间损失的更多空间分辨率。这种方法对解码器很重要,因为上采样不能恢复所有的空间信息。

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

Skip connection

最后,跳过连接对于训练越来越深的网络也很有用,比如 ResNet 架构。

在建立并训练了一个 FCN 之后,一个问题自然产生了:我们如何知道我们的对象检测模型是否表现良好?这时*insection Over Union(IoU)*度量就派上用场了。在下一节中,我们将讨论这一概念,以及为什么是对象检测性能的良好指标。

欠条是怎么回事?

IoU 测量地面真实图像与我们的 FCN 模型产生的分割图像重叠的程度。本质上,它测量了从地面和分割图像 FCN 网络的像素联合中分割的像素数量。因此,度量的数学公式是:

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

IoU

现在你在想,你的模型怎么办?有哪些障碍?最终结果是什么?下一节再说吧。

这个伟大的工程怎么样?

该项目分为三个主要阶段:

  • 生成并预处理来自模拟器的图像
  • 设计模型架构
  • 对模型进行训练和评分

预处理步骤将来自 sim 的深度掩模转换成适于训练神经网络的二进制掩模。

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

Pre-processed image on the right

最终的模型架构可视化是:

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

FCN architecture (final model)

首先,使用编码器和解码器来应用图像中对象的分割是基于逐个像素的学习,而不是像在空间信息不太相关的图像分类中使用的图像不变性滤波器。用于导出模型架构的总体策略始于深度为 32 的初始卷积层的基础,其具有 3×3 滤波器、深度为 8 的 1×1 卷积以及深度与编码器相同的解码器。这样做的原因是基于图像输入尺寸 256X256X3。从这一点上,几个卷积层增加了深度(基于 2 的幂)。这种方法是基于斯坦福大学使用的 SegNet 架构来分割图像中的对象。值得一提的是,1x1 层深度增加与数据生成相关,以减少过拟合和模型性能改善。数据生成对于减少训练和验证数据集的误差(交叉熵)以及克服局部最小值和允许网络继续学习是重要的。

正如你所记得的,最终得分是由一个叫做 IoU 的指标来定义的,是 0.49。通常,将分割确认为预测对象的标准是> 0.5。虽然,对于作为 Udacity 项目的这个项目,标准被降低到 0.4。

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

Original image on the left; Binary mask in the middle; Prediction from model on the right

github:https://github.com/BrunoEduardoCSantos/Follow-Me

用于卫星图像分割的神经网络

原文:https://towardsdatascience.com/dstl-satellite-imagery-contest-on-kaggle-2f3ef7b8ac40?source=collection_archive---------4-----------------------

我们的卡格尔 DSTL 卫星图像竞赛项目概述。该项目在公共测试数据集上获得了 0.46 的分数,在私有测试数据集上获得了 0.44 的分数,这将在私有领导板上的 419 个团队中排名第 7。代码在我的 github 上。

数据可视化和特征合成

训练数据集包括 25 个图像,每个图像具有 20 个通道(3 个波段(3 个通道,RGB) + A 波段(8 个通道)+ M 波段(8 个通道)+ P 波段(1 个通道)),以及对象的相应标签。用等高线标注的重叠对象有 10 种( wkt 类数据),其中 0。建筑物,1。杂项,2。路,3。音轨,4。树木,5。农作物,6。水路,7。死水,8。大型车辆,9。小型车辆。

我们的策略是首先将轮廓转换成掩模,然后为每一类对象训练一个逐像素的二元分类器。下图显示了 20 个通道和标签的示例。值得注意的是,A 波段(下面中间一行)的分辨率比其他波段低得多,因此在我们的模型中没有直接使用。M 波段相对于 3 波段显示出轻微的空间偏移,并且被插值到与 3 波段相同的分辨率,并且进一步配准到 3 波段。我们还根据给定的 3、A、M 波段创建了另外 4 个指数, CCCINDWIEVISAVI 。这些指数已被证明与传统 GIS 中的某些类别的对象有很好的相关性,并且可能使特征学习更容易。因此,我们总共有 16 个通道(3 个波段(3 个通道)+ M 波段(8 个通道)+ P 波段(1 个通道)+ 4 个合成通道)输入。

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

Examples of all channels of training data and class labels

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

An example of the 3-band image with class labels overlay

班级统计

与包含大约 100 万张训练图像的 ImageNet 分类挑战相比,这个训练数据集相当小,只有 25 张图像。然而,本次竞赛中的标签是在像素级别上,因此每个像素都是一个训练示例,该数据集的有效大小为 3300 * 3300 * 25 = 2.7 亿。

对所有训练图像的所有类别的百分比面积的统计显示了大多数类别的真标签和假标签之间的高度不平衡,以及真标签在类别之间的严重不平衡分布。因此,我们决定为每个类别训练一个二元分类器,而不是用单一模型来预测所有类别。

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

Statistics of percentage area for all classes of all the training data. (Note: on some images, the sum is over 100% because of overlap between classes.)

U 网模型

在 tensorflow 中开发了具有批量归一化的 U-net,并用作分类模型。该模型被训练 9000 批,每批包含 60 个图像补片。每个图像块都是原始图像的 144144 裁剪。类似于最初的 U-net 论文,由于边缘像素仅接收部分信息,因此仅在中心 8080 区域上计算损失。

损失函数:比较了两种损失函数,包括加权交叉熵和软 Jaccard 指数,这两种损失函数都可以解释真假标签的不平衡。发现加权交叉熵在训练期间对交叉验证数据产生振荡性能。给定评估度量是类的平均 Jaccard 指数,使用 Jaccard 指数作为损失函数是理想的。不幸的是,Jaccard 指数是不可微的。相反,软 Jaccard 指数是可微分的,并且在非常有把握的预测中接近 Jaccard 指数。交叉熵(H)和软 Jaccard 指数 (J)的组合,L = H -log(J),被用作损失函数。

优化器:使用初始学习率为 0.0001 的 Adam 优化器。虽然 Adam optimizer 应该自然地执行步长退火,但我们发现每 4000 批学习率衰减到 0.1 确实改善了训练。

批量大小:原来的 U-net 模型使用每批中的单个图像进行训练,显然不适合这个问题。从职业统计可以看出,职业分布在不同的图像中变化很大。大批量(此处为 60)是可取的,以确保每个有效批量的统计数据(考虑动量)与整个训练数据集的统计数据一致。批量大小也必须与有效训练区域妥协,因为边缘像素必须被丢弃。太大的批量将导致用于训练的中心区域非常小。

在 CPU 上创建两个独立的线程进行数据预处理,预处理后的数据被推入两个队列,并分别在 GPU 上进行训练和交叉验证。这减轻了 GPU 的负担,加快了训练的速度。所有训练数据都被预加载到 RAM 中,以避免训练期间缓慢的文件 I/O。

该项目是通过对 21 幅图像进行训练,使用另外 4 幅图像进行交叉验证而开发的。最终的模型是用所有 25 幅图像训练出来的。

训练数据扩充

训练数据扩充包括随机水平和垂直反射和平移,以及 360 度旋转(1 度步长)。旋转破坏了 CNN 的平移对称性。选择 1 度的步长,因为对于 144 的裁剪大小,围绕其中心旋转 1 度会在边缘产生约 1.3 个像素的偏移,从而为 CNN 产生不同的输入图像。有趣的是,通过实验确定旋转在多大的步长下停止改善性能。

测试时间增加

U-net 模型的一个优点是它是完全卷积的,因此用于训练和推断的输入数据的空间维度不必相同。如上所述,在训练中,相对较小的图像补片和较大的批量是可取的。然而,对于推断来说,使图像块尽可能大以减少由丢弃边缘上的预测而产生的开销是有益的。受 GPU 内存的限制,我们每次只能将大约四分之一的图像(~1900*1900)送入 U-net 进行推理。图像的每四分之一旋转 0、90、180 和 360 度,并且水平和垂直翻转,用于放大。并且最终预测掩码是 8 个掩码的算术平均值,以减少预测中的方差。与最初的 U-net 论文类似,我们在边界上应用了反射,以改进边缘像素上的预测。

预测和结果

在线评估在私人排行榜上的得分为 0.44113,在 419 分中排名第七。下图显示了 0 级建筑物的真实标签和预测标签之间的比较。

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

一些有趣的观察:该模型能够从训练数据中纠正一些不精确的标签。如下图所示,3 波段图像似乎有一个小的“空”区域,充满了自然光产生的阴影,位于建筑物的中间。虽然“真实”标签将整个区域作为建筑物类包括在内,但预测掩膜能够正确排除阴影区域。我们在预测中发现了几个这样的例子。

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

水类:我们已经注意到,对于建筑物类,如果只使用 2 个图像进行训练,U-net 会完全过拟合,但是对于≥21 个训练图像,U-net 可以很好地推广。了解确切的界限在哪里以及为什么会有意思。这也意味着深度学习在这场比赛中对水类不起作用,因为水类只在很少的图像上有实例。我们已经发现,对于水类,阈值 CCCI 优于深度学习模型。

一些评论

  1. 该模型主要基于其在 0 级(即建筑物)上的性能而开发。通过为每个类定制模型参数,结果肯定可以进一步改善。
  2. 我们的模型完全无法预测大型和小型车辆类别,可能是由于严重的真假标签不平衡和车辆的空间尺寸太小。诸如对真实标签的过采样和大批量训练等技术可能有助于前者。

伙计,我的车呢?回顾 Udacity SDCND 第 2 期

原文:https://towardsdatascience.com/dude-wheres-my-car-looking-back-at-udacity-sdcnd-term-2-e518fede30a1?source=collection_archive---------4-----------------------

Udacity 自动驾驶汽车纳米学位项目的第二个学期介绍了传感器融合、定位和控制。即使仅仅是过去的主题本身,这个术语也有许多其他重要的变化。首先,术语 1 通常侧重于您可以从已经创建的库中导入的算法(在使用深度学习进行交通标志分类和驾驶行为克隆以及支持向量机进行车辆检测的情况下),术语 2 需要更具体的编程-您必须学习实现所介绍的各种技术所需的精确数学方程。这导致了一些复杂的方程和矩阵,如下面的雅可比矩阵:

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

Looks fun right?

我承认,在进入第二学期的时候,意识到有多少数学是直接涉及的,这是相当令人生畏的。尽管我对自己的数学能力很有信心,但第一学期更多的机器学习/数据科学基础更在我的掌控之中。

然而,一旦你对这些方程有了感觉,它们在代码中的实际实现就没那么难了。这让我们看到了 Term 2 的第二个重大变化:Term 1 完全是用 Python 编写的,而 Term 2 完全是用 C++编写的。这给我提出了一个比数学更大的问题,因为我以前从未使用过 C++。幸运的是,这个学期的大部分内容只需要基本的 C++技能就可以完成,我还使用了一些在线资源来让自己感觉更舒服一些。这是我对第二学期有一点遗憾的地方,因为我已经决定将第二学期从最初的 12 月份的时间表提前到 11 月份的时间表,我认为在第二学期开始前多学习一些 C++或许会让我受益匪浅。

我在 Slack 上看到的关于第一学期的一大抱怨是,Udacity 的创始人巴斯蒂安·特龙&也许是自动驾驶汽车的“父亲”,在这个学期的大部分时间里都是失踪的。这在第二学期得到了纠正,尽管主要是通过使用 Sebastian 的用于机器人课程的人工智能,该课程可在 Udacity 上免费获得。如果你是一名未来的 SDC 纳米学位学生,或者正在第一学期和第二学期之间消磨时间,我强烈建议你去看看那门课,因为它将是第二学期的一大助力。由于 Sebastian 的课程是 Python,Udacity 从梅赛德斯-奔驰和优步·ATG 请来工程师对内容进行了一些更新,并涵盖了一些 C++方面的实现。

第二学期的最后一个变化也是基于我在网上看到的第一学期的一些反馈,学生们经常提出比预期更高的学期时间承诺。我当然觉得这在学期的早期得到了改善,尽管我确实认为一些后来的项目(尤其是第五个带有模型预测控制的项目)需要比 Udacity 目前提供的更多的课程;虽然课程本身是一个很小的时间承诺,这意味着你经常被困在自己试图找出一些更先进的概念。

项目一——扩展卡尔曼滤波器

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

Tracking a Bicycle with an EKF

第一个项目是卡尔曼滤波器概念的介绍,第二个项目是更高级的版本。课程首先介绍项目中要融合的两种传感器,雷达和激光雷达,以及它们各自的优缺点。虽然目前昂贵得多,激光雷达的分辨率确实比雷达高,但雷达可以在更广泛的天气情况下工作。雷达也可以直接测量速度(转换坐标空间后),而激光雷达不行。雷达和激光雷达传感器在输入数据中都包含噪声,在传感器融合过程中的每一步都必须考虑噪声(通常通过高斯分布的方式)。

扩展卡尔曼滤波器的工作原理是首先基于初始传感器测量值初始化值,也许是为了跟踪车辆前方的物体。对于随后的时间步长,它预测被跟踪的对象将在哪里(基于在给定单个时间步长上的先前状态的情况下获取其运动预期),获取当前传感器测量值,然后基于结合来自传感器的测量数据及其预测来更新它认为对象实际在哪里。在更新步骤中结合这些测量值和预测值有助于解决每个传感器中固有的噪声。对于雷达和激光雷达,此更新步骤必须以不同的方式完成-雷达需要线性近似(EKF 不能使用非线性函数,因为您输入的是高斯函数,而想要返回的是高斯函数)来转换到计算中使用的测量空间,这最终会给模型增加一点不准确性(参见前面提到的雅可比矩阵)。EKF 的另一个缺点是它们基于恒速的概念,这在车辆转弯时尤为明显。请注意,上图中的 KF 估计值(蓝色)沿曲线越来越偏离地面真实值,该模型预测被跟踪的对象比实际情况更远离转弯圆。

项目二——无味卡尔曼滤波器

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

Tracking a Bicycle with UKF. Note that the UKF estimate does a better job overlapping the ground truth (in blue), so much that it cannot really be seen above.

无味卡尔曼滤波器改进了 EKF,因为它允许跟踪非线性模型,通过使用“西格玛点”,该点是使用平均位置周围的噪声产生的。这些西格玛点被输入到非线性函数中,并有助于根据得到的西格玛点的分布进行预测。我将在这里跳过许多细节,因为它很容易成为自己的 10 分钟长的帖子,但本质上,你将再次做一个预测和更新的过程。此外,EKFs 使用恒定速度(CV)模型,UKFs 使用恒定转弯角速度和速度幅值(CTRV)模型。这个模型将偏航(转弯)和偏航率(汽车转弯的速度)添加到模型中(旧的状态空间只有 x、y 和速度)。如上所示,UKF 在沿曲线进行估计时表现得更好。

项目三——粒子过滤器(被绑架的车辆)

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

Localizing the vehicle using a particle filter’s observation of map landmarks

接下来是本地化的概念。你可能已经猜到了,这是基于汽车知道它在哪里。GPS 当然可以给我们一个相当接近的估计,但自动驾驶汽车需要比 GPS 所能提供的更精确的位置。由于信号中断,GPS 在高楼林立的城市等地区也很难工作。这些课程还深入研究了可用于定位的不同运动模型,在这些模型中,预测再次发生,并与测量(基于所用的传感器,测量总是有一定量的噪声)相结合,以更新到更准确的位置。

粒子滤波是一种很好的方法,因为它们可以处理多峰分布,而卡尔曼滤波只能处理单峰分布。这是有帮助的,因为汽车最初在新环境中可能相当不确定它的确切位置(本课给出了一个走廊的例子,该走廊在两侧几乎相同,直到遇到侧室中的物体)。简而言之,大量“粒子”分布在地图中,与最近的已知地图地标相关联,然后基于地标、新的预测和测量,粒子过滤器慢慢过滤掉不太可能给出某个测量的“粒子”。这是通过用相应的误差对粒子进行加权来实现的,不太精确的粒子被慢慢剔除。这里一个重要的中间步骤是坐标转换——汽车有自己的本地坐标系,而地标来自的地图也有自己的。没有这种转变,汽车将无法实现本地化。

的最终结果是一辆虚拟汽车,它可以在基于不太精确的 GPS 数据进行初始化后,根据其环境中地标的传感器测量来定位自己。

项目四——PID 控制

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

Back to the Udacity simulator!

第四个项目是关于比例-积分-微分(PID)控制,这有助于驾驶车辆。虽然该项目本身带回了之前在 Term 1 中用于行为克隆的 Udacity 模拟器,但这次是在没有深度学习的情况下完成的。该名称的“比例”部分来自于与跨轨迹误差(CTE)成比例的转向,或者从车道中间到汽车实际位置的距离。这很有道理,因为你肯定希望大部分时间都待在车道中间。然而,如果模型只由 P 控制驱动,它总是超调,导致它在中心来回驱动大波浪。这可以通过名字的“衍生”部分来改进。PD 控制器会考虑 CTE 的变化是正还是负,以及多少,这意味着当汽车接近车道中心时,它会减小转弯角度,有助于减少超调。

现在,你们中的一些人可能已经注意到,在把你自己的车拿到商店后,你的车倾向于向某个方向拉。把手从方向盘上拿开,车慢慢漂移出车道!在模拟器的情况下,这会在最终的转向角度中产生系统偏差——如果汽车存在这种偏差,PD 控制器将总是计算错误的角度,汽车将慢慢偏离轨道。这是通过名字的“积分”部分解决的,如果在一个给定点上所有 CTE 的总和向一个方向偏离太远,转向角将被补充以对此进行校正。

PID 控制器的主要重点是确定这些部分的系数:P、I 和 d。PID 控制器的实际基础实现非常短(如果您已经检查了上面链接的 Github),但找到这些值是该项目的真正挑战。旋转 &随机梯度下降法在这里都是潜在的方法——虽然我在选择最终值时尝试了一下这两种方法,但我最终没有在最终版本中包含它们。PID 控制器在实际应用中对我来说似乎是无效的,所以当我得知现在大多数机器都使用这种方法时,我有点惊讶!

项目五——MPC 控制

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

MPC, a much more advanced, yet much more accurate control method than PID

很多人类司机都是反动司机。他们几乎只是专注于保持他们的车道和速度(你们中的一些人可能也想争论),如果有问题发生,他们会对问题做出反应。然而,要成为一名好司机,你需要积极主动,能够预测在你前面会发生什么事情。如果你在高峰时间行驶在高速公路上,看到前方远处的刹车灯,你可以猜测你前面的车也将很快刹车,并可以放油门。如果你还没有从早期的项目中注意到,预测对于自动驾驶汽车来说至关重要——它们不仅需要看到车辆前方和周围的情况,还需要能够预测十字路口的行人可能会进入它的道路,或者前面的汽车突然转向意味着潜在的事故和需要刹车。一辆自动驾驶汽车提前一点刹车,甚至可以帮助其他人类司机提前一点看到尾灯,从而做出反应。

第二学期的期末项目,模型预测控制,将这一点推到了前沿。该项目不仅能够规划未来的行动以遵循一条路径(见上图中黄色的轨迹路点,绿色的汽车预测路径),而且还增加了计算时间与转向角和油门/制动的执行器值之间的延迟。我考虑这种延迟的方法是实际上根据延迟结束时汽车的预测位置为我的模型提供一个预测状态空间,从而使所有结果计算都像是实时的(当然是基于原始预测)。当然,这个项目不仅仅是延迟,我认为这可能是迄今为止整个 Nanodegree 中对我最具挑战性的,需要结合论坛、Slack 频道和查看项目 Q & A。我的 Github 文章比之前的一些文章更广泛,所以如果你想更深入地了解它,我建议在那里阅读。

到了期末

我非常惊讶地看到自动驾驶汽车纳米学位的最后一个术语!到目前为止,这是一次相当疯狂的经历,在这么短的时间里,我学到了比我想象中更多的东西。第三学期侧重于路径规划、专业化(如果你已经阅读了我关于深度学习车道检测的之前的 帖子,你可能会猜到我会关注高级深度学习专业化),以及系统,其中甚至有可能我的一些代码(以及潜在团队中的其他人的代码)会出现在 Udacity 自己的自动驾驶汽车上!那绝对会让我大吃一惊。在我开始下一个学期之前,我还有几个星期的时间,但我很兴奋地想知道接下来会发生什么。

使用 Word2Vec、XGBoost 和自动编码器的重复问题检测

原文:https://towardsdatascience.com/duplicate-question-detection-using-word2vec-xgboost-and-autoencoders-f9353d58ba34?source=collection_archive---------8-----------------------

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

Photo by Emily Morter on Unsplash

在这篇文章中,我解决了根据问题对是否重复进行分类的问题。这对于像 Quora 或 Stack Overflow 这样的公司来说很重要,在那里发布的多个问题是已经回答的问题的重复。如果算法发现了一个重复的问题,用户可以被引导到这个问题,并更快地找到答案。

两个重复问题的一个例子是“我如何阅读和找到我的 YouTube 评论?”以及“我如何才能看到我在 Youtube 上的所有评论?’,非重复问题是“是什么导致某人吃醋?以及‘我能做些什么来避免嫉妒某人?’。有两种方法适用于这个问题:

  1. 通过自动编码器方法训练的序列编码器和用于分类的动态池
  2. 具有逻辑回归和 XGBoost 分类器的词袋模型

ngrams = 4 且 min_df = 0 的词袋模型在 XGBoost 的情况下实现了 82 %的准确度,相比之下,在 Bi LSTM 和 attention 的文献中报告的最佳准确度为 89.5%。这里实现的编码器方法实现了 63.8%的准确度,这低于其他方法。我发现这很有趣,因为 autoencoder 的实现和这种方法考虑了可变长度序列的短语和单词之间的相似性。或许,可以通过改变动态池矩阵的维度、不同的数据清理方法以及拼写检查来提高效率。

分类器可以基于三种不同的评估指标进行比较,即对数损失、auc 和准确性。对数损失或交叉熵损失是分类器输出的概率分布相对于类别标签的真实概率分布有多不同的指示符。接收器操作特性绘制了真阳性率对假阳性率,曲线下面积(auc)为 0.5 对应于随机分类器。AUC 越高,分类器越好。准确度是一个简单的指标,用于计算正确预测标签的比例。

在这篇文章中,我使用准确性作为比较的标准,因为没有理由不这样做。完整的代码可在这里获得。

船首模型

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

如图所示,当 min_df 从 0 变为 600 时,对于 ngram = 4,精度从 80%降低到 72 %。min_df 根据计数对词汇表中出现的 ngrams 进行阈值处理。语料库中出现频率低于 min_df 的任何 ngram 都被忽略。不使用超过 4 的 n gram,因为当 n gram 从 3 增加到 4 时,精度变化可以忽略不计。使用 Tf-idf 矢量器而不是计数矢量器来加速计算,并且它还少量地提高了精度(对于一个数据点不到 1%)。通过 XGBoost 运行相同的输入可以获得 82%的精度。

对于 BOW 模型,参数 sweep 词汇表的大小范围从 703912 (n-grams = 4 和 min_df =0)到 1018 (ngrams = 1 和 min_df = 600)。

自动编码器和动态池 CNN 分类器

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

上图显示了实现的模型,类似于 Socher 等人的 Word2Vec 嵌入是根据 Tensorflow Word2Vec 开源发布,使用 skip gram 模型,以 100000 的词汇量生成的。在这些嵌入中,共享相似上下文的词具有较小的余弦距离。关键问题是处理不同长度的问题。通过训练自动编码器来压缩句子的信息内容。这种方法背后的主要动机是通过比较整个句子以及句子中的短语来找到句子之间的相似性。不同长度的问题通过如下所述的上采样和动态池来解决。

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

使用左图所示的方法对句子进行编码。这三个单词和两个编码被认为是生成相似性矩阵的输入。使用 Tensorflow 对自动编码器进行训练,如右图所示。右图描述了编码器和解码器的架构。我为编码器和解码器使用了单层神经网络,也可以考虑多个隐藏层。多批字被连接并馈入编码器,在理想情况下,解码器的输出应该与输入相匹配。神经网络的均方误差损失用学习率为 0.1 的梯度下降优化器最小化。1e-4 的 L2 正则化系数用于编码器和解码器权重。

这里的 autoencoder 使用任意两个词进行训练,可以批量训练。它不同于 Socher 等人使用的方法,作者对整个句子进行编码,并通过将其展开为一个问题来解码。展开自动编码器在 Tensorflow 中很难甚至不可能实现。像 pytorch 这样的动态计算图构造工具可能更适合实现完整的方法。

整个句子及其中间编码可以用作上采样和动态池阶段的输入。在上采样阶段,通过重复从向量中随机选择的编码来对所考虑的问题对的较小向量进行上采样,以匹配其他问题编码的长度。为每个短语向量生成成对的相似性矩阵,并且可变维度矩阵被汇集成 n pool×n pool 的矩阵。我用的是 npool = 28。这个矩阵被馈送到 CNN 分类器,以分类为重复或不重复。npool 的超参数优化也可以提高精度。该模型的准确率为 63.8 %。

问题

我面对一些与 sklearn 的逻辑回归有关的问题。该模型确实输出了正确的分类标签,但却输出了错误的概率。我还没有想出解决这个问题的办法。XGBoost 没有这个问题。

Github 回购

https://github.com/aspk/Quora_question_pairs_NLP_Kaggle

参考

最佳问题对匹配方法:王、志国、Wael Hamza 和 Radu Florian。“自然语言句子的双边多视角匹配。”arXiv 预印本 arXiv:1702.03814 (2017)。

理解交叉熵损失和可视化信息:【http://colah.github.io/posts/2015-09-Visual-Information/

展开递归自动编码器的方法:Socher,Richard,et al .〈释义检测的动态汇集和展开递归自动编码器〉神经信息处理系统进展。2011.

Word2Vec 嵌入式 tensroflow 开源发布:https://github . com/tensor flow/tensor flow/blob/r 1.9/tensor flow/examples/tutorials/word 2 vec/word 2 vec _ basic . pytensor flow:https://www.tensorflow.org/

DYK flexdashboard 解决了数据科学家的 javascript 文盲问题

原文:https://towardsdatascience.com/dyk-flexdashboard-solves-data-scientists-javascript-illiteracy-96b82a8d7f?source=collection_archive---------6-----------------------

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

Image Courtesy: https://unsplash.com/search/colors?photo=5IHz5WhosQE

问题:

I-am-a-R-coder 数据科学家的最大问题是他们在网络友好的交互式可视化方面遇到的巨大障碍。因为在大多数组织中,数据科学家的角色不仅仅是构建复杂的统计模型,更多的是从数据块中提取有价值的见解,其最终结果是(漂亮的)可视化。

这个世界还没有完全排除 Powerpoint 演示,但当前需要的是交互式仪表板,因为少即是多——仅在鼠标悬停时显示信息比将这些值刻在图表上好得多,交互式可视化也使分析师能够比静态图像输入更多的信息(需要时会显示出来)。

救援计划:

但是作为一个 R 主导的数据科学家,尤其是那些面临 js 挑战的数据科学家,移动友好的交互式可视化世界突然变得空白,这时你必须知道,有一种叫做’flex dashboard的东西,它将拯救你!

[## flexdashboard:用于 R 的简单交互式仪表板

仪表板分为列和行,输出组件使用 3 级降价标题(###)描述…

rmarkdown.rstudio.com](http://rmarkdown.rstudio.com/flexdashboard/)

虽然flex dashboard有很多不错的特性,但我想指出两点:

  1. 支持包含html widgets

[## R 的 html 小部件

HTML 小部件的工作方式就像 R plots,除了它们产生交互式 web 可视化。一两行 R 代码就是全部…

www.htmlwidgets.org](http://www.htmlwidgets.org/index.html)

2。灵活的 布局 (类似于自举)

[## flexdashboard 布局示例

此页面包括各种示例布局,您可以将其用作自己的仪表板的起点。

rmarkdown.rstudio.com](http://rmarkdown.rstudio.com/flexdashboard/layouts.html)

前者将 js 可视化库带到了 R 程序员的手中,而后者有助于将它们布置在一个响应性(移动友好)的网格布局中。文档使得从期望的布局开始变得非常容易(除非有非常复杂的业务需求,这是非常不可能的,因为它不是一个成熟的仪表板)

## Markdown *Code to create an interactive heatmap using d3heatmap```
library(knitr) 
library(d3heatmap) 
library(flexdashboard)url <- "http://datasets.flowingdata.com/ppg2008.csv" 
nba_players <- read.csv(url, row.names = 1) 
```### Stats by Player {data-width=650}  
```{r} 
d3heatmap(nba_players, scale = "column") 

**还有,发货:**

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/00fb0149f51e5746ae2593b315266e84.png)

Screenshot of Interactive Heatmap generated with above code snippet

一旦构建了可视化,有两个简单的部署选项:

1.  [R-Shiny App](https://walkerke.shinyapps.io/neighborhood_diversity/)
2.  [针织面料(如 HTML](https://beta.rstudioconnect.com/jjallaire/htmlwidgets-d3heatmap/htmlwidgets-d3heatmap.html)

通过很少的学习曲线(浏览文档和理解所需 htmlwidgets 的功能和参数的能力)和对 javascript 的零知识,

> Flexdashboard 支持 R-only 数据科学家部署交互式可视化(就像 js-wizard 一样——至少定制较少)

# 电商正在(几乎)吃掉一切。这是它的意思。

> 原文:<https://towardsdatascience.com/e-commerce-is-eating-almost-everything-heres-what-that-means-90d7328efc49?source=collection_archive---------28----------------------->

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/329aa5219828093f220b7f00e2fe041c.png)

美国人口普查局的新数据显示,现代人对点击购物的喜爱正在增长。与此同时,商品目录正在减少,零售店面正在萎缩,美国就业市场的前支柱正在严重衰退。

各个行业的情况并不一致。经济的某些部分继续抵制互联网的邀请——尽管当你读这篇文章时,这种情况可能正在改变。

我们深入研究了人口普查局发布的[数据以及其他相关数据,以调查美国电子商务的现状,以及这对美国公民意味着什么。这是我们的发现。](https://www.census.gov/newsroom/press-releases/2018/estats-report.html)

# 电子商务悄然兴起

消费者仍然亲自购买他们的大部分产品,但是电子商务已经取得了重大进展。根据零售和目录销售(包括在线目录)的综合数据,2016 年消费者在网上花费了 13.5%的产品美元。

如果当前的电子商务趋势继续下去,2018 年在线购买将占所有消费品购买的近 17%,并可能主导一些子市场。2016 年,网购占业余爱好购买的 32%,包括书籍、玩具、体育用品和乐器。

这与 1999 年占消费者购买量不到 2%的电子商务相比是一个巨大的变化,这种快速变化与零售业的巨大变化相对应。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/5f2461c7fc5db8f724fd36029ea9bb49.png)

# 零售启示录

虽然网上购物让生活变得更容易,让消费者可以舒舒服服地坐在沙发上(和睡衣)点任何他们想要的东西,但所有重大的经济变革都有受害者。随着亚马逊和其他主要在线零售商的崛起,他们留下了实体零售连锁店的废墟,如 Borders,Blockbuster 和最近的[玩具反斗城](http://www.businessinsider.com/amazon-walmart-target-killed-toys-r-us-2018-3)。

更多的传统零售商可能会及时倒下。虽然梅西公司的股票自 2018 年初以来已经恢复了大约 50%,但该公司 6 月份每股 40 美元的高点与其 2015 年每股 72 美元的[高点相比相形见绌。与此同时,自 2017 年 12 月以来,西尔斯(也拥有 K-Mart)的股价一直低于每股](https://www.google.com/search?biw=1279&bih=722&tbm=fin&ei=i60eW7CpC83CzgLzkYyAAg&stick=H4sIAAAAAAAAAONgecRoyi3w8sc9YSmdSWtOXmNU4-IKzsgvd80rySypFJLgYoOy-KR4uLj0c_UNzKtyisqKeQDUEIrYOgAAAA&q=NYSE%3A+M&oq=mac&gs_l=finance-immersive.1.0.81l3.1111774.1111971.0.1113790.3.3.0.0.0.0.129.324.1j2.3.0....0...1.1.64.finance-immersive..0.3.324....0.Zt2uymnX_Bo#scso=uid_5rEeW7HhA4uV5wKDlafoDw_5:0)4 美元的[。随着世界上最大的在线零售商进军汽车维修领域,这个曾经的零售巨头已经被压低到](https://www.google.com/search?biw=1279&bih=722&tbm=fin&ei=5rEeW7HhA4uV5wKDlafoDw&q=sears&oq=sears&gs_l=finance-immersive.3..81l3.107323.108248.0.108602.5.5.0.0.0.0.101.423.4j1.5.0....0...1.1.64.finance-immersive..0.5.421....0.uMoFFTduLc0#scso=uid_U7MeW_7IFcTAzgK4y7QI_5:0)[与亚马逊](https://www.marketwatch.com/story/sears-shares-spike-after-announcing-tire-partnership-with-amazon-2018-05-09)合作的地步。

虽然分析师和评论员认为这些公司都是因为公司领导而不是电子商务而苦苦挣扎,但电子商务不可否认是它们压力的一部分。

# 专家对电子商务趋势的看法

随着实体零售商的消亡或缩减规模,它们的衰落对购物中心产生了残酷的影响。

哥伦比亚商学院(Columbia Business School)教授、包括西尔斯加拿大(Sears Canada)在内的几家零售品牌的前首席执行官马克·科恩(Mark Cohen)在一次采访中告诉我们,美国有大约 230 家顶级购物中心“不仅在生存,而且在蓬勃发展。”

然而,在顶级公司之外,许多公司都在苦苦挣扎。

瑞士瑞信银行在 2017 年报告称,预计到 2022 年,全国 1211 家购物中心中有多达四分之一将[关闭。很多](http://money.cnn.com/2017/06/02/news/economy/doomed-malls/index.html?iid=EL)[已经有了](http://www.businessinsider.com/american-retail-apocalypse-in-photos-2018-1#it-was-temporarily-used-by-religious-congregations-who-held-services-in-old-stores-in-september-2017-amazon-announced-plans-to-build-a-17-million-square-foot-fulfillment-center-in-its-place-3)。在一个特别具有讽刺意味的案例中,亚马逊买下并拆除了一个[克里夫兰地区的购物中心](http://www.crainscleveland.com/article/20170928/news/137036/amazon-makes-euclid-warehouse-go),代之以一个履行中心。这一趋势使得西蒙地产集团的股票大幅贬值,该集团拥有超过 130 家购物中心。

科恩说,在网络购物成为主要因素之前,今天失败的购物中心通常会将市场份额输给更新或更好的购物中心。他们仅靠一两家主要零售商和一小群专卖店勉强维持微薄的收入。但互联网时代迫使锚店缩减规模,导致本已疲软的商场关门。

# 固定轴环绕

科恩说,一些购物中心的业主试图通过安装健身房或攀岩墙,将他们的物业改造成“生活方式购物中心”。“一些二级商场正在实现这一目标,但很少,因为这需要大量投资。”科恩告诉我们。其他购物中心租用了呼叫中心、紧急医疗诊所、疗养院或社区大学的空间。

科恩说:“在很大程度上,他们基本上正在慢慢倒闭。”。“一个空置量越来越多的购物中心越来越像一家空荡荡的餐厅,这是许多人不想去的地方。”

随着房东收取的租金越来越少,他们也不太愿意在草坪护理或更换停车场坏灯等基本维护上投资。

科恩说:“购物中心呈现出‘不要去那里’的特点。然后它关闭,成为景观上的一个污点,损害当地经济,使当地社区迫切需要某种东西——任何东西——来取代它。

# 商业房地产卷轴

尽管这种损害在购物中心最为明显,但电子商务的兴起与零售地产的疲软有着明显的关联。

全国保险专员协会[在 2017 年](http://www.naic.org/capital_markets_archive/170601.htm)报告称,在 2009 年至 2016 年期间,约有 10%的零售物业处于空置状态。国家房地产投资者公布的数据[显示,商业地产的估值正在趋于平稳——特别是在中央商务区,PNC 房地产研究公司的数据显示,自 2015 年初](http://www.nreionline.com/finance-investment/latest-readings-show-commercial-property-prices-continuing-moderate)以来,美国累计关闭的商店多于开业的商店[。](https://www.bloomberg.com/graphics/2017-retail-debt/)

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/1df5ea11059753f2483bb1243f595b22.png)

虽然在可预见的未来,美国似乎将继续失去实体零售点,但最糟糕的情况可能已经过去。总部位于芝加哥、专注于房地产行业的投资管理公司 JLL 表示,与 2017 年相比,2018 年的有效倒闭数量下降了 41%。

# 混合比

零售业的动荡改变了消费者可以进入的实体店的组合。根据美国劳工统计局的数据,美国零售商店的数量从 2008 年开始大幅下降。尽管零售商店自 2011 年以来有所恢复,但仍未达到 2001 年的数量,这是 BLS 有数据的最早年份。各个行业的复苏也不均衡。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/a155f4953debf414c4d3937c63bd5069.png)

与 2001 年相比,2017 年食品和饮料商店的数量增加了约 4%,而餐馆的数量增加了 33%。像沃尔玛这样的百货商店的数量增加了 45%以上。所有其他类型的零售商都看到自己的部门在萎缩——其中一些还急剧萎缩。电器商店、家具店、书店、体育和业余爱好商店以及杂货铺的数量都下降了至少 15%。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/8a0fbfb7592ea8fdb75e2e0c2d171f47.png)

根据 JLL 公布的数据,这一趋势可能会继续,甚至可能会加速。在 2018 年 3 月的一次展示中,该公司表示,预计 2018 年开设的餐厅(1328 家)和一元店(1645 家)将超过其他任何一种商店的总和。

841 家服装店关门最多。虽然这并不奇怪(时尚行业是出了名的不稳定),但它们不会被取代。服装店关门比开张多 53%。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/cb588376422486638fe87efff7557243.png)

# 模糊界限

随着零售品牌努力保持相关性,它们已经整合了在线和面对面的存在,为客户提供更大的灵活性。梅西百货和其他商店已经推出了他们所谓的“[点击并收集](https://www.cnbc.com/2016/01/13/like-it-or-not-click-and-collect-is-here-to-stay.html)”,让顾客在网上购买产品,然后几个小时后在附近的商店取走。

科恩说,本质上,这些零售商把他们的商店作为一个履行网络。但不清楚这种做法对他们的底线有多大帮助,如果有的话。

他说,点击收集“非常昂贵”,因为它“完全违背了商店的组织方式。”商店支付人工成本,让一名工人先把产品搬到展示区,然后让另一名工人把它们放在旁边的房间里。

科恩说,商店希望点击收取顾客在他们访问期间购买其他东西,但不清楚这种情况发生的频率。他说,零售品牌对这些计划的成功一直讳莫如深,但值得注意的是,梅西百货[在 2017 年关闭了 68 家门店](https://parade.com/537063/sphillips/macys-releases-list-of-stores-closing-in-2017/),而[将在 2018 年再关闭 11 家](https://clark.com/shopping-retail/major-retailers-closing-2018/)。

快餐连锁店也加入了“点击领取”的潮流。星巴克在 2015 年推出了[移动点餐](https://news.starbucks.com/news/starbucks-mobile-order-pay-now-available-to-customers-nationwide),允许顾客在短暂逛店取咖啡前在线点餐和支付。Dunkin Donuts 在 2016 年通过他们的 DD Perks 应用程序推出了类似的选项,麦当劳在 2017 年跟风。

# 弹出式零售

一些品牌,包括[耐克、Birchbox 和 Kanye West](https://www.insider-trends.com/top-50-pop-up-stores/) ,已经把实体店变成了他们自己的活动。弹出式商店在一个特定的地方短时间内提供独家商品。

科恩说,弹出式商店为新企业表达和建立品牌提供了一个很好的机会,但它们也代表了一个病态零售生态系统的另一个症状。这些商店通常出现在长期休眠的零售空间,科恩说,房东大幅折扣弹出式租金,甚至可能免费提供空间。

科恩说:“房东的存在是一个空商店。

具有讽刺意味的是,[易贝](http://www.dailymail.co.uk/sciencetech/article-3982264/Is-future-shopping-eBay-pop-shop-tells-Christmas-presents-buy-based-facial-reactions.html),[亚马逊](https://www.amazon.com/b/ref=s9_acss_bw_cg_FYS_3c1_w?node=14303222011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=merchandised-search-2&pf_rd_r=091BQKWHWWW6TED0TY5G&pf_rd_t=101&pf_rd_p=486f4087-ceb1-4474-9c15-84a4cb56cce1&pf_rd_i=17608448011), [Etsy](https://www.etsy.com/pages/dossier) 和其他网络零售商都在黄金地段开设了华丽的弹出式商店。因此,正是那些造成零售地产疲软的品牌找到了直接从中受益的方法。

# 整个经济领域的电子商务趋势

虽然电子商务对零售业的影响最为明显,但在线平台仍在侵蚀经济的各个方面。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/ca4db1ef19d4bf9ed08d38f278665f79.png)

根据人口普查报告,2016 年近 65%的制造订单是在线处理的,高于 1999 年的 18%。基于制造业的电子商务在 2016 年的出货量为 3.5 万亿美元,实际上让零售电子商务相形见绌。

该部门采用电子商务的部分原因是其业务关系的性质。当企业对企业的客户定期订购同样的东西时,人类处理交易的优势会迅速减少。消费者也基本上看不到这种变化,他们通常只看到成品。

随着我们越来越接近消费者,电子商务变得不那么流行了。电子商务占制造商销售分支和办事处销售额的 46.2%,占所有其他商业批发商总销售额的 27.2%。2016 年,商店货架上的大多数产品仍然是通过电子商务平台以外的途径到达那里的。

# 自助服务

经济中的服务部门仍然对电子商务的入侵具有惊人的抵抗力。根据人口普查数据,只有 4.2%的服务销售是通过在线平台进行的。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/c3afdf33c8a9bdb0d458bbf3de89eca5.png)

然而,某些服务部门比其他部门更容易接受在线平台。基于电子商务的平台在航空运输部门以及旅行安排和预订部门取得了重大进展。

# 抗药性

尽管 WebMD 和其他专注于健康和保健的网站盛行,但健康和保健部门一直抵制电子商务的影响。

根据人口普查数据,即使在目录渠道,2016 年也只有 23%的药物、健康辅助设备和美容辅助设备是在网上购买的——而与此同时,健康相关产品的购买在所有渠道都有所增长。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/3cfe9f57f22fdf0ab032b261ba72a305.png)

这种脱节吸引了科技初创企业和科技巨头的注意。【2017 年 8 月,亚马逊推出了一系列药房基本药物,包括布洛芬、泻药和抗过敏药物。此举引发了连锁药店 Rite-Aid、Walgreens 和 CVS 投资者的不安,他们担心亚马逊可能会成为下一个进入处方药游戏的公司。

这种易激动是恰当的。2018 年 6 月 28 日,[亚马逊以不到 10 亿美元的价格收购了 PillPack](https://techcrunch.com/2018/06/28/amazon-buys-pillpack-an-online-pharmacy-that-was-rumored-to-be-talking-to-walmart/) 。这家总部位于波士顿的初创公司将药丸(包括处方药和维生素)预先分类并包装到一卷塑料袋中。到了下一次服药的时间,顾客拿出下一个袋子,撕开它,然后服药。到了续杯的时候,[药丸包](https://www.pillpack.com/how-it-works)会给保险公司开账单,然后送货上门。

PillPack 在这个领域并不孤单。总部位于纽约市的创业胶囊公司还将处方药送到顾客家中,并自动处理医生和保险公司的配药。虽然 Capsule 还没有被更大的公司收购,但它正在成长;根据 LinkedIn 的数据,自 2016 年以来,该公司的员工人数增加了两倍多。

# 缩小:互联网和通货膨胀

除了让消费者更容易获得他们想要的产品,电子商务可能对日常生活产生更大和更广泛的影响:保持低价。

国际货币基金组织(International Monetary Fund)发表的一篇 2017 年[论文](https://www.imf.org/~/media/Files/Conferences/2017-stats-forum/session-3-coffinet.ashx)得出结论,互联网销售在短期内缓解了通胀——尽管作者不确定互联网将如何长期影响通胀。

导致这种情况的影响错综复杂,但归结起来主要有两点:

1.  电子商务让顾客更容易比较价格,这也让零售商更难提价。
2.  电子商务减少了对昂贵的物理基础设施的需求,这使得在线零售商能够保持低价。

虽然低通胀对购物者来说是好事,但对工人来说并不总是好事。随着商店关门或削减成本,零售业的工作机会正在减少。趋势如此糟糕,以至于纽约市服装店的零售人数已经连续四年下降[。考虑到该市人口在 2010 年至 2017 年间增长了 5.5%(T5),这一下降尤为显著。](https://fred.stlouisfed.org/series/SMU36935614244810001A)

# 包裹

电子商务趋势大大小小地改变了我们的生活。它阻止了产品价格的攀升,但也削弱了美国经济长期依赖的部门。

目前,这一趋势没有停止的迹象。即使亚马逊开设了实体店,传统的小盒子零售的需求仍在继续减少。可能的结果似乎是一个购物中心更少、精品店更少、沃尔玛、一元店和餐馆更多的世界。

*本帖* [*原版*](http://blog.visme.co/ecommerce-trends/) *最早出现在 Visme 的* [*视觉学习中心*](http://blog.visme.co/) *。*

# 对脸书的每一次反应都让它更加丰富。

> 原文:<https://towardsdatascience.com/each-reaction-on-facebook-makes-it-richer-b5ea07f1bbc7?source=collection_archive---------6----------------------->

2016 年初,脸书上标志性的 like 按钮增加了 6 个反应。脸书成功地将我们所有的情感冲动浓缩成一组六种反应。用户可以自由地表达他们对新闻内容的愤怒或悲伤。但是,这是脸书帮助广告商的一个微妙举措..随着人工智能能力的增强,它可以即兴发挥到未知的极限。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/57e2d22faf1fe6b2e09b6574b5a1a1bd.png)

Reaction set available on Facebook

反应能力增强了。现在,我们可以对您在 Messenger 上的评论和私人对话做出反应。要理解它如何为脸书增加几个数字的收入,我们需要理解它是如何做生意的,以及资金是如何流入资产负债表的。

# ***脸书提款机的心脏。***

脸书的核心业务一直是为终端用户提供广告服务。*FB 的独特销售主张(USP)一直是有针对性的广告。它的算法选择特定广告的目标受众,这有助于广告商。它通过创建你的兴趣、爱好、你去过的地方以及你是否与有相似兴趣的人联系的图表来实现这一功能。简而言之,算法确切地知道你是谁,你在那个时间点想要什么,以及你避免什么。反应往往会给这个算法增加更多的力量。这有助于脸书为广告精选提炼受众。很明显,在这个信息时代,数据是新的货币,它仔细收集关于你“惊叹”的元素和你“愤怒”的事物的数据。*

## 这是如何工作的?一个例子。

我是一个普通的脸书用户,每天要花将近 30 分钟的时间浏览新闻,回复无数的新闻,查看朋友的信息,发布产品公告。几天前,我在微软的官方页面上“惊叹”了新 Surface Book 的产品发布。脸书算法足够聪明,能够了解我对平板电脑的渴望。我看到了安卓、Windows 和 iPads 的广告。然而,几天前发生了 WWDC。我对新 iPad Pro 的发布漠不关心。我也对新 iPad 的高价感到“愤怒”。脸书的算法这次聪明了亿万倍。他们发现我需要一台 Windows 平板电脑。他们不再给我提供关于安卓和 iPads 的广告。对于 iPads 的销售者来说,我不是他们的目标受众。范围缩小了。如果没有这些反应,这显然是不可能的。

> ***在单位经济学层面,它被称为每用户平均收入(ARPU)。脸书已经非常成功地从其平台上的每个用户身上赚钱了。这些反应有助于定向广告,并直接提高 ARPU。这增加了更多的广告收入。***

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/3b981c375a3c34fbde0b98480ae095f2.png)

ARPU of Facebook for Q1 2017\. Source — FB Investor relations.

提升在所有有进一步成长空间的地区都是可见的。

## 不仅仅是钱。它提高了用户的参与度。

沉迷于脸书是众所周知的现象。这推动了每个人的参与,这是通过新闻源实现的。新闻提要是通过多种算法为每个用户量身定制的。这些算法需要更多地了解用户来提炼提要。这些反应为他们提供了更多的数据,并反过来使他们的最终结果变得更好。新闻提要与用户建立了非常私人的关系,并使他们与平台保持联系。随着脸书在人工智能(AI)和图像识别技术方面取得的进步,我们可以期待这种馈送会更加亲密。这一切都有助于脸书继续旋转广告之轮,赚取广告收入。

## 新闻供稿和脸书的未来。

脸书希望将新闻内容个性化到几乎无法忽视的程度。它希望将生活、文化、政治和哲学的所有元素嵌入我们的饲料中,以消费和实现其关于可持续全球社区的愿景。它已经成功地获得了人工智能和机器学习方面的能力,以改善平台的各个方面。它确切地知道我们喜欢什么,不喜欢什么,我们关心什么,我们“惊叹”什么,以及让我们“生气”的事情。为了了解更多,它甚至允许我们对帖子和消息的评论做出反应。

> **所有这些关于每个用户的校准数据都将被输入到机器学习算法中,以即兴发挥用户体验的各个方面,甚至可以用于开发一种现在无法想象的新产品。它知道的越多,人工智能产生的结果就越好。这就是所谓的机器学习的正反馈定律。**

***种种的推进,正使脸书权倾一时。收集的每一点数据都增加了它对社会的影响力。从政治到社会生活,世界的每一个角落都已经感受到了影响。我们应该让脸书通过其平台上大约有近 20 亿人的庞大数据来利用其力量促进人类进步。***

# 利用卫星图像预测早期玉米产量

> 原文:<https://towardsdatascience.com/early-corn-yields-prediction-using-satellite-images-dcf49b24efab?source=collection_archive---------10----------------------->

在一个以农产品分销为主要业务的家庭中长大,决定我们何时销售产品以及销售多少产品总是一个挑战,因为这些最终取决于在季节结束时收获多少产品。如果有一种方法可以预测在赛季结束时将会得到多少,我们将会更容易做出决定。这个项目的意义不仅仅是我的家族企业。当然,大企业可以使用这个模型来优化他们的价格和库存,政府可以为粮食短缺做准备,甚至农民如果知道地区产量,也可以被告知适当的销售价格。

先前的研究表明,卫星图像可以用来预测每种作物的种植面积[1]。这就留下了知道那些种植区的产量的问题。为此,这个项目旨在利用几幅卫星图像的数据来预测一种作物的产量。在这项研究中,我们选择玉米作为样本作物。玉米通常在 10 月份收获,因此,我最终的目标是只用 10 月份之前的数据来预测玉米产量。

在这个中页,我将概述该项目的简要总结,更多详细分析请访问[这里,](https://tpjoe.gitlab.io/)和该项目中使用的代码,请到我的 Github [页面](https://github.com/tpjoe/SpringBoard/tree/master/Project%20II)。

**数据来源**:

我查询了从 3 月到 12 月的谷歌地球引擎数据集中 4 颗卫星的图片(总共 146 GB)在县一级。这些卫星包括,

1.  MODIS 地表反射率
2.  MODIS 地表温度
3.  USDA-FAS 表层和次表层水分
4.  美国农业部-NASS(用于掩蔽)

每年为一个县收集 38 幅图像(3 月至 12 月),每幅图像共有 11 个波段(前三颗卫星的波段总数)。该年和县的相应产量从美国农业部 QuickStats 的县级数据中收集。

我收集了 2010 年至 2016 年的数据。我将使用 2010-2015 年的数据进行训练,我们将使用 2016 年的数据进行测试。如果我们将来自每一年和县的数据视为一个视频(38 帧),则总共有 7,709 个用于训练集的视频和 1,353 个用于测试集的视频。

**探索性数据分析**

同样,详细的分析可以在我的[网页](https://tpjoe.gitlab.io/)上找到,这里我只放重要的数字和简要的分析。让我们首先看看图 1 中的图像是什么样的。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/f5e21f84f906a8ed0948657782674e3d.png)

**Fig. 1.** Example of the image from the first band from each satellite (Scott County, Iowa, 2010).

现在让我们看看来自每个卫星的每个通道的值是否与图 2 和图 3 中该县的年产量相关。原来是有的!

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/de3ceb9bf05a714e74fc30cd9024bc7c.png)

**Fig. 2\.** The correlation between yearly-averaged values in each band of MODIS Terra Land Reflectance and corn yields.

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/5395e014521c7f1e19b294ed65a259df.png)

**Fig. 3.** The correlation between yearly-averaged values in each band of MODIS Land Surface Temperature and USDA-FAS Land Moisture and corn yields.

**建模结果**

即使对图像进行了预处理,但要将所有 9,062 幅图像(每幅图像有 11 个波段,平均大小约为 100 × 100 像素)放在一起,训练过程将会极其缓慢。因此,在放入模型之前,我们对图像进行了进一步的处理。具体来说,我们将每个通道中的值装入 128 个箱*,即* 1 行。例如,在 MODIS Terra Land 反射率波段 1 中,我们会将该波段中的图像值分为 128 个像元,从 0 到 4000 等分这些值,然后使用该图像波段中非零像素的总数对计数进行归一化。这将大约 100 × 100 的整个图像缩小到只有 128 个元素。这背后的逻辑是基于每个农场的产量与其周围环境无关。因此,每个县的平均产量只应与该县农场的产量分布相关。图 4 总结了从数据收集到输入模型的过程,并显示了数据的维度。这种技术来源于以前的研究[2]。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/4ffb7dd07fdb16c47908ad86225b9f2a.png)

**Fig. 4\.** Summary of the workflow from data collection, preprocessing, binning, and model concept.

数据经过充分预处理后,将被输入到模型中。我们可以将这些数据视为视频或音频文件,其中每年我们最多生成 38 帧(高度和宽度分别为 1 和 128)。因此,在本研究中,我们选择了 5 个可用于视频分类问题的模型,并针对回归问题对它们进行了修改。这些包括

1.  自建卷积神经网络(CNN)后接递归神经网络(RNN)。这里,长短期记忆(LSTM)被用于 RNN,因为它通常被用于避免香草 RNN 中的梯度消失/爆炸问题。
2.  与 1 相同。但是我们用可分离的 CNN 代替。
3.  兴健等人定义的 CNN-LSTM[3]
4.  三维(3D) CNN
5.  美国有线电视新闻网-RNN 其次是 3D 有线电视新闻网。

图 4 示出了单层 CNN-RNN 的概念,其中在 RNN 编码空间数据之前,将 CNN 应用于所有输入。RNN 然后把每一帧(时间输入)作为一个输入。来自 RNN 的序列输出然后被馈送到 CNN-RNN 的另一层(*即*堆叠层)或全连接层(具有适当的丢弃和正则化),最后被馈送到激活层以产生该县在某一年的预测玉米产量。

例如,Keras 中模型 1 的代码如下所示:

def CNN_LSTM(self):frames_input = Input(shape=self.input_shape)
vision_model = Sequential()
vision_model.add(Conv2D(64, (1, 2),
activation=‘relu’,
padding=‘same’,
input_shape=self.image_dim))
vision_model.add(BatchNormalization())
vision_model.add(MaxPooling2D((1, 2)))
vision_model.add(Flatten())
vision_model.add(BatchNormalization())
encoded_frame_sequence = TimeDistributed(vision_model)
(frames_input)
encoded_video = LSTM(256,
activation=‘tanh’,
return_sequences=True)
(encoded_frame_sequence)
fc1 = Dense(64, activation=‘relu’,
kernel_regularizer=regularizers.l2(0.05))
(encoded_video)
out = Flatten()(fc1)
out = Dropout(0.5)(out)
output = Dense(1, activation=‘relu’)(out)
CNN_LSTM = Model(inputs=frames_input, outputs=output)
return CNN_LSTM


每种类型的模型的目标是有 4,500,000 到 5,200,000 个训练参数,并通过改变退出和隐藏层数进行粗略研究。每个模型的结果如表 1 所示。请注意,平均值的百分比误差是测试集的平均产量的百分比误差。

**Table 1.** Summary of model performance in term of mean absolute error and percent error from the mean of the test set (yields from year 2016).

下一步,我们想确定我们在哪个县做得最好,在哪个县做得不好。这将有助于识别模型中的弱点,并使我们能够做出更好的决定,看看我们是否可以信任预测。图 8 显示了美国各地 2016 年的地面真实玉米产量,图 5 和图 6 显示了地面真实预测值的百分比误差。

**Fig. 5\.** The ground truth corn yields across U.S. in 2016 (test set).

**Fig. 6\.** The percent error of the predicted value from the ground truth.

到目前为止,我们已经在每个县使用 38 帧视频进行年产量预测。在这最后一节中,我们想要调查我们可以多早预测产量,*即*减少每年的帧数。图 7 显示了 2016 年使用不同帧数预测玉米产量的平均误差。请注意,第 0 帧开始于 3 月,第 38 帧在年底。结果表明,随着帧数的增加,正如人们所预期的那样,误差越低。值得注意的是,我们可以看到,通过仅使用 20 帧(大约 8 月的第二周),我们已经可以实现低至 14.57%的百分比误差(相比之下,如果我们使用全年的图像,则为 10.46%)。这是玉米通常在 10 月收获前的 2 个月,尽管在温暖的州这甚至可能在今年晚些时候。因此,该模型将允许用户能够在季节早期预测县一级的玉米产量。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/01487d2106bb290f53df8dd2bd0a6ae7.png)

**Fig. 7\.** The mean absolute error (MAE) of the model using different number of frames input per year with using just 20 frames per year (August) is sufficient to predict with only 15% error from the mean value of yields in year 2016.

总之,我们展示了不同卫星图像(包括反射率、土地温度和土地湿度)与美国玉米产量之间的相关性。我们利用这些相关性构建了一个模型,该模型可以捕捉这些数据的空间和时间信息,以预测一年的玉米产量。测试集(2016 年玉米产量)上表现最好的模型是 ConvLSTM,与平均产量的百分比误差仅为 10.46%。为了实现早期预测,我们降低了每年所需的帧数(从最大的 38 帧)。结果表明,即使仅使用 20 帧,我们仍然可以获得良好的模型性能(百分比误差 14.57%)。一年中的第 20 帧对应于 8 月份,这是大部分玉米收获前的 2 个月。这将对农业分销和相关产业的商业模式产生重大影响。

**参考文献**

1.  多时卫星图像的作物分类。
2.  萨比尼、马克、吉利·鲁萨克和布拉德·罗斯。"理解基于卫星图像的作物产量预测."(2017).
3.  卷积 LSTM 网络:降水临近预报的机器学习方法*神经信息处理系统的进展*。2015.

# 提前停止

> 原文:<https://towardsdatascience.com/early-stopping-2f92c29ce0ae?source=collection_archive---------11----------------------->

有时候不值得走到最后,尤其是在超参数调优中

M ost 机器学习模型具有由用户固定的超参数,以便在底层数据集上构建这些模型的训练。例如,在训练随机森林时,您需要指定树的深度和数量(以及其他超参数)。还有许多其他的[【真实世界】](/demystifying-hyper-parameter-tuning-acb83af0258f)超参数的例子。一旦设置了超参数,模型的训练就可以用标准的优化器如梯度下降来处理。指定不当的超参数会导致更长的训练时间或有偏差的模型。所选超参数的质量通常是在一个公开的测试数据集上测量的。

[贝叶斯优化](/the-intuitions-behind-bayesian-optimization-with-gaussian-processes-7e00fcc898a0)是一种旨在尽可能少的迭代中识别最佳超参数的方法,但每次迭代都需要在评估超参数的质量并进入下一次迭代之前完成给定超参数配置的模型训练。在许多超参数调优问题中,数据科学家可能在训练结束(或开始)之前就知道某些配置不会产生很好的结果!).在本文中,我们将研究一种叫做冻融的方法,它将贝叶斯优化中超参数调整的 ***【提前停止】*** 系统化。因此,这种方法可以更有效地利用超参数调优中的计算资源,并减少整体调优时间。

# 冻融贝叶斯优化

> [冻融](https://arxiv.org/pdf/1406.3896.pdf)使用在训练机器学习模型的过程中获得的部分信息,以便决定是否暂停训练并开始新的模型,或者恢复先前考虑的模型的训练。

在模型训练期间提供的部分信息实质上是模型的训练损失,其指示模型对训练数据的预测有多差。一个例子是均方误差,它是每个例子的平均平方损失,由以下公式给出:

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/14d51c09b40ec0d54554b30b49b898a9.png)

例如,线性回归的最佳权重使损失最小化,这就是为什么在图 1 中,损失比第二种情况高得多(并且模型差得多)。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/4d96959e0d72b49d44537eb46053299a.png)

Figure 1: loss of the trained model (red) for linear regression models (blue) trained on data points (yellow)([source](https://developers.google.com/machine-learning/crash-course/descending-into-ml/training-and-loss))

冻融的工作原理是假设大多数机器学习模型的训练损失大致遵循朝向未知最终值的指数衰减。这种假设被编码在他们的贝叶斯优化方法的先验中,这允许他们预测部分训练模型的最终结果。

更简单地说:

*   贝叶斯优化为我们正在优化的底层函数构建了一个代理模型
*   在这种情况下,这是一个高斯过程,通过观察函数值和预测域的其他点来建立。
*   在冻结-解冻 BO 中,来自模型训练的部分信息用于预测最终损失,然后将最终损失纳入替代模型
*   换句话说,代理模型是对模型训练结束时的预测

一旦已经预测了替代物,贝叶斯优化策略适于“打包”一篮子 **B = B_old + B_new** 候选模型,这些模型已经用不同的超参数值进行了部分训练或者没有进行训练。然后,贝叶斯优化程序将确定尝试哪些新配置以及恢复哪些“冻结”配置。更详细的解释可以在他们的[论文](https://arxiv.org/pdf/1406.3896.pdf)中找到。

在众所周知的问题上,冻融法相对于其他贝叶斯优化方法的性能增益如图 2 所示。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/590418961cac3a4ad286951b123c3218.png)

FT vs GP EI MCMC on MNIST (a), LDA (b), PMF/Movie Lens (c)

收益是显著的,但是严重依赖于训练损失遵循指数衰减的假设。这项工作的扩展可以研究这个假设不成立的模型。提前停止是 [Mind Foundry](http://mindfoundry.ai) 的一个重要研究领域,很快将在我们的贝叶斯优化 API[opta as](https://optaas.mindfoundry.ai)中实现。

【**更新**:我开了一家科技[公司](http://www.legislate.tech)。您可以在此了解更多

1: K .斯维斯基、j .斯诺克和 R. P .亚当斯。冻融贝叶斯优化。 [arXiv:1406.3896](https://arxiv.org/abs/1406.3896) 【统计。ML]

# 数据保留:处理带有许多缺失值和少于 1000 个观察值的数据

> 原文:<https://towardsdatascience.com/easy-data-science-with-r-and-python-diabetes-among-the-pima-indians-an-exploratory-analysis-d7bc321d0fa7?source=collection_archive---------7----------------------->

当前项目中使用的数据包含皮马印第安人后裔妇女中二型糖尿病的一些诊断方法,以及该个体是否患有二型糖尿病。数据集是在([https://www.kaggle.com/uciml/pima-indians-diabetes-database](https://www.kaggle.com/uciml/pima-indians-diabetes-database))从 Kaggle 获得的。总共有 768 个观察值和 9 个变量。数据集中的变量有:

*   怀孕
*   葡萄糖——2 小时口服葡萄糖耐量试验后的血浆葡萄糖浓度。
*   血压——舒张压(毫米/汞柱)。
*   皮肤厚度——三头肌的皮褶厚度(毫米)。
*   胰岛素— 2 小时血清胰岛素(μU/ml)。
*   身体质量指数——身体质量指数(千克/平方米)
*   DiabetesPedigreeFunction——基于家族史确定二型糖尿病风险的函数,函数越大,二型糖尿病风险越高。
*   年龄。
*   结果—此人是否被诊断为二型糖尿病(1 =是,0 =否)。

# 预处理

library(readr)
library(tidyverse)
library(dplyr)
library(knitr)


# 概观

glimpse(Diabetes)Observations: 768 Variables: 9
$ Pregnancies 6, 1, 8, 1, 0, 5, 3, 10, 2, 8, 4…
$ Glucose 148, 85, 183, 89, 137, 116, 78, …
$ BloodPressure 72, 66, 64, 66, 40, 74, 50, 0, 7…
$ SkinThickness 35, 29, 0, 23, 35, 0, 32, 0, 45,…
$ Insulin 0, 0, 0, 94, 168, 0, 88, 0, 543,…
$ BMI 33.6, 26.6, 23.3, 28.1, 43.1, 25…
$ DiabetesPedigreeFunction 0.627, 0.351, 0.672, 0.167, 2.28… $ Age 50, 31, 32, 21, 33, 30, 26, 29, …
$ Outcome 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0,…


# 类型转换

## 因素

结果变量需要转换成分类变量。在不久的将来,它将被订购用于分析目的。

Diabetes O u t c o m e < − a s . f a c t o r ( u n l i s t ( D i a b e t e s Outcome <- as.factor(unlist(Diabetes Outcome<as.factor(unlist(DiabetesOutcome)) Diabetes O u t c o m e < − f a c t o r ( D i a b e t e s Outcome <- factor(Diabetes Outcome<factor(DiabetesOutcome, levels=c(“1”, “0”), labels = c(“Positive”, “Negative”)) summary(Diabetes$Outcome)Positive Negative 268 500


我们可以看到没有患糖尿病的人几乎是患糖尿病的人的两倍。虽然目标变量的行数没有统一的界限,但这应该足够了。

我们只需要确保你的模型有足够的数据来学习如何区分这两者。

## 数字的

以下变量:

`* Glucose`

`* BloodPressure`

`* SkinThickness`

`* Insulin`

`* BMI`

需要从其当前整数类转换为数值变量。这些变量具有十进制值,如果没有这些值,可能会产生误导性的结果,并扭曲这些医学测试所代表的特定风险范围。

Diabetes G l u c o s e < − a s . n u m e r i c ( D i a b e t e s Glucose <- as.numeric(Diabetes Glucose<as.numeric(DiabetesGlucose) Diabetes B l o o d P r e s s u r e < − a s . n u m e r i c ( D i a b e t e s BloodPressure <- as.numeric(Diabetes BloodPressure<as.numeric(DiabetesBloodPressure) Diabetes S k i n T h i c k n e s s < − a s . n u m e r i c ( D i a b e t e s SkinThickness <- as.numeric(Diabetes SkinThickness<as.numeric(DiabetesSkinThickness) Diabetes I n s u l i n < − a s . n u m e r i c ( D i a b e t e s Insulin <- as.numeric(Diabetes Insulin<as.numeric(DiabetesInsulin) Diabetes B M I < − a s . n u m e r i c ( D i a b e t e s BMI <- as.numeric(Diabetes BMI<as.numeric(DiabetesBMI) Diabetes A g e < − a s . i n t e g e r ( D i a b e t e s Age <- as.integer(Diabetes Age<as.integer(DiabetesAge)


# 处理缺失值

数据集中 6/9 的变量有许多零标记。在分别对每一列和每一行求和后,数据集中似乎有 763 个零值。令人担忧的是,这几乎代表了我们 100%的观察结果。

list( Column = colSums(Diabetes0),
Row = sum(rowSums(Diabetes
0)) )$Column
Pregnancies 111
Glucose 5
BloodPressure 35
SkinThickness 227
Insulin 374
BMI 11
DiabetesPedigreeFunction 0
Age 0
Outcome 0 $Row
[1] 763


# 怀孕

值“0”不一定意味着它是缺失值。例如:*一名妇女的怀孕记录为零,因为这名妇女没有怀孕。*

这是一个例子,说明在对数据进行丢失值的预处理时,您必须非常小心。零不代表它不见了。然而,除了这一点,零值在传递给机器学习模型时可能会产生问题。当变量为零时,像回归这样的技术可以给你一个输出的估计。另一种处理零的方法是绑定变量,然后创建一个分类变量。

`Diabetes$Pregnancies <- ifelse(Diabetes$Pregnancies==0, "No", "Yes") %>% factor()`

> `summary(Diabetes$Pregnancies)`
> 
> `No Yes 111 657`

# 胰岛素

胰岛素中 50%的行具有 0 值。让我们从实际的角度来看它。有时身体产生很少或没有胰岛素,这是 1 型糖尿病的一个迹象。但我怀疑这一次是不是这样。胰岛素对于糖尿病来说是一个非常重要的变量,但是当一个变量充满了缺失值时,你就必须采取措施了。你可以只是估算这些值,但这是医学数据,有一半的值是缺失的。在我看来,仅仅用它的意思来估算行是不合适的。这就是为什么再重要也要**去掉**的原因。这是你需要做出艰难抉择的时候之一。

Diabetes$Insulin <- NULL


# 表皮厚度

对于`SkinThickness`也可以这么说。31%的行的值为 0。实际上,一个人怎么可能有 0 毫米厚的皮褶。这个变量也没有给我们太多的用处。因此,我也将删除这个变量。

Diabetes$SkinThickness <- NULL


# 身体质量指数

身体质量指数可以补充其各自的肥胖标准范围。身体质量指数只有 11 0 个值,所以预计不会引起太多麻烦。如果它高得多,宁滨不会真正解决问题,因为分配的 bin 可能不是正确的 bin。

`Diabetes$BMI <- ifelse(Diabetes$BMI<19,"Underweight", ifelse(Diabetes$BMI>=19 & Diabetes$BMI<=25, "Normal", ifelse(Diabetes$BMI>=25 & Diabetes$BMI<=30, "Overweight","Obese"))) %>% factor(levels=c("Underweight","Normal", "Overweight","Obese"))`

> `list(BMI = summary(Diabetes$BMI))`
> 
> `$BMI Underweight Normal Overweight Obese
> 15 108 180 465`

现在我看到`Underweight`有 15 行,这意味着有 15 行的身体质量指数小于 19,并且知道`BMI`有 11 个零值,我们知道大多数行都是零。因为太少了,所以我选择留着它。此外,我们已经删除了两个变量,我想保留尽可能多的数据,同时确保它可以增加价值。

# 葡萄糖

对于 2 小时的“口服葡萄糖耐量试验”(OGTT),如果在进行该试验 2 小时后,患者的水平低于 7.8 mmol/L,则认为患者没有糖尿病。为了对葡萄糖耐量水平进行分类,我们将使用以下标准:

  • Hypoglycemia (Low Blood Sugar) - <2.2 mmol/L
  • Normal/No Diabetes - >=2.2 mmol/L - <=7.8mmol/L
  • Prediabetes (Hyperglycemia / High Blood Sugar) - >7.8 mmol/L - <=11.1 mmol/L
  • Diabetes - >11.1 mmol/L

**虽然其中一个级别说此人患有糖尿病,但这不是最终的糖尿病。其他因素也必须考虑在内。为了避免误导,这里的“糖尿病”是指 ANME 的检测结果,而不是二型糖尿病的最终诊断结果**

该数据集中 2 小时 OGTT 的测量单位假定为毫克/分升(mg/dl)。它可以转换成毫摩尔每升(mmol/l ),这样我们就可以将定性测试结果应用于数值结果。将当前结果乘以 0.0555 会将其转换为以毫摩尔/升为单位进行测量。

Diabetes G l u c o s e < − D i a b e t e s Glucose <- Diabetes Glucose<DiabetesGlucose*0.0555Diabetes G l u c o s e < − i f e l s e ( D i a b e t e s Glucose <- if_else(Diabetes Glucose<ifelse(DiabetesGlucose<2.2,“Hypoglycemia”, if_else(DiabetesKaTeX parse error: Expected 'EOF', got '&' at position 14: Glucose>=2.2 &̲ DiabetesGlucose<=7.8,“Normal”, if_else(DiabetesKaTeX parse error: Expected 'EOF', got '&' at position 13: Glucose>7.8 &̲ DiabetesGlucose<=11.1, “Hyperglycemia”,“Diabetes”))) %>% factor()list( Test Result = summary(Diabetes G l u c o s e ) ) Glucose) ) Glucose))Test Result
Hyperglycemia Hypoglycemia Normal
192 5 571


似乎 74%的参与者具有正常的葡萄糖水平,25%的参与者具有糖尿病前期/高血糖症/高血糖。只有 1%的人有低血糖症。

我对低血糖的主要担忧是,当我通过机器学习过程时,该水平可能不会在 k 倍交叉验证中出现。在这一点上我不能肯定地说,但这是值得注意的,并在未来牢记在心。

# 血压

测量血压时,使用两种方法:

** Systolic - Measures the pressure in blood vessels when the heart beats.

  • Diastolic - Measures the pressure in blood vessels when the heart rests between beats.*

在该数据集中,仅报告了舒张压。这要求我们谨慎行事。

据疾病控制和预防中心报道,血压是用心脏收缩和心脏舒张单位来测量的。当它们被报道时,我们可以作出如下推论:

*   常态

*收缩压< 120mmHg,*

*舒张压< 80mmHg*

*   高血压前期

*收缩压> =120mmHg — < =139mmHg*

*舒张压> =80 — < =89mmHg*

*   高的

*收缩压:> =140mmHg*

*舒张压:> =90mmHg*

因为没有报道收缩压,所以我对这个变量感到不舒服。这是我的主观决定。

Diabetes$BloodPressure <- NULL


# 数字变量的可视化

# 年龄

ggplot(Diabetes, aes(y=Age, x=Outcome)) +
geom_boxplot() + geom_jitter()+ theme_bw() +
xlab(“Outcome”) + ylab(“Age”) +
stat_summary(fun.y=mode, colour=“Orange”, geom=“point”, shape=16, size=5) +
stat_summary(fun.y=mean, colour=“purple”, geom=“point”, shape=16, size=5) +
ggtitle(label=“Age by Outcome”, subtitle = “Orange=Most Frequent\nPurple=Average Age”) +
theme(axis.text.x = element_text(face=“bold”,size=12), axis.text.y = element_text(face=“bold”,size=12), title = element_text(face=“bold”,size=12), axis.title = element_text(face=“bold”,size=12)) + scale_y_continuous(breaks=seq(20,80,4))


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/aabac1911f699be7dab2555ae9a2f2b9.png)

这个变量中似乎有很多噪声。患糖尿病的年龄没有明显的区别。

# 糖尿病谱系功能

ggplot(Diabetes, aes(y=DiabetesPedigreeFunction, x=Outcome)) + geom_boxplot() + geom_jitter()+
theme_bw() + xlab(“Outcome”) + ylab(“DiabetesPedigreeFunction”) + stat_summary(fun.y=mode, colour=“orange”, geom=“point”, shape=16, size=5) +
stat_summary(fun.y=mean, colour=“purple”, geom=“point”, shape=16, size=5) + ggtitle(label=“Diabetes Pedigree Function by Outcome”, subtitle = “Orange=Most Frequent\nPurple=Average Age”) + theme(axis.text.x = element_text(face=“bold”,size=12), axis.text.y = element_text(face=“bold”,size=12), title = element_text(face=“bold”,size=12), axis.title = element_text(face=“bold”,size=12)) + scale_y_continuous(breaks=seq(0,3,0.5))


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/03a39476cf926a5d2460fce2fc43b566.png)

Scatter Plot of the Diabetes Pedigree Function with the average and most frequent amount

有趣的是,`Diabetes Pedigree Function`似乎没有给出糖尿病结果的清晰图像。这应该是一个分数,分数越高,你越有可能患有糖尿病。这也是一个有很多噪音的变量。

# 分类变量(占结果的百分比)

# 怀孕

(pregnant <- table(Diabetes P r e g n a n c i e s , D i a b e t e s Pregnancies, Diabetes Pregnancies,DiabetesOutcome, dnn = c(“Pregnant”, “Outcome”)) ) Outcome
Pregnant Positive Negative
No 38 73
Yes 230 427pregnant %>% prop.table(2) %>% round(2) %>% kable(format = ‘html’) Positive Negative
No 0.14 0.15
Yes 0.86 0.85


怀孕似乎并不一定会增加患糖尿病的几率,因为患或没患糖尿病的女性中至少有一次怀孕的比例是相同的。

# 肥胖

(bmi <- table(Diabetes B M I , D i a b e t e s BMI, Diabetes BMI,DiabetesOutcome, dnn = c(“BMI”, “Outcome”)) ) Outcome
BMI Positive Negative
Underweight 2 13
Normal 7 101
Overweight 44 136
Obese 215 250bmi %>% prop.table(2)%>% round(2) %>% kable(format = ‘html’) Positive Negative
Underweight 0.01 0.03
Normal 0.03 0.20
Overweight 0.16 0.27
Obese 0.80 0.50


毫不奇怪,80%的糖尿病女性肥胖,16%超重。据报道,只有 3%的人体重正常。在没有糖尿病的女性中,50%肥胖,27%超重,20%正常。

# 葡萄糖

(glucose <- table(Diabetes G l u c o s e , D i a b e t e s Glucose, Diabetes Glucose,DiabetesOutcome, dnn = c(“Glucose Level”, “Outcome”)) ) Outcome
Glucose Level Positive Negative
Hyperglycemia 132 60
Hypoglycemia 2 3
Normal 134 437glucose %>% prop.table(2) %>% round(2) %>% kable(format = ‘html’) Positive Negative
Hyperglycemia 0.49 0.12
Hypoglycemia 0.01 0.01
Normal 0.50 0.87


49%的女性糖尿病患者高血糖呈阳性,50%的女性血糖水平正常。令人惊讶的是,葡萄糖水平似乎不能清楚地区分糖尿病患者。显然,高血糖症患者更有可能患有糖尿病,但根据上表,其程度非常低。

不出所料,87%没有糖尿病的女性血糖水平正常。

# 最终数据

summary(Diabetes)Pregnancies
No :111
Yes:657Glucose
Hyperglycemia:192
Hypoglycemia : 5
Normal :571BMI
Underweight: 15
Normal :108
Overweight :180
Obese :465 DiabetesPedigreeFunction
Min. :0.0780
1st Qu.:0.2437
Median :0.3725
Mean :0.4719
3rd Qu.:0.6262
Max. :2.4200Age
Min. :21.00
1st Qu.:24.00
Median :29.00
Mean :33.24
3rd Qu.:41.00
Max. :81.00 Outcome
Positive:268
Negative:500


在我接下来的文章中,我使用这个数据集来创建一个决策树分类器。

> 如果您有任何问题或顾虑,请发表评论进行讨论,我邀请任何对此感兴趣的人加入。谢谢你

原文可以在我的博客中找到:[用 R 和 Python 实现简单的数据科学](https://easydsrp.com/posts/2018-11-06-diabetes-among-the-pima-indians-an-exploratory-analysis/)

# 带 Spark 的简单度量和立方体

> 原文:<https://towardsdatascience.com/easy-metrics-and-cubes-with-spark-32b883fe7d76?source=collection_archive---------17----------------------->

你有没有参加过这样的会议:双方在同一个指标上有两个不同的数字?从这个指标中得到的任何见解都将被遗忘,获得正确数字的斗争将会开始。从长远来看,这种情况会引发一个更大的问题,那就是对你的数据、你的方法以及最终对你的团队完全缺乏信任。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/b54b2fd9c6e7c531ff749313ac83f6af.png)

Photo by [Micaela Parente](https://unsplash.com/@mparente?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)

提供值得信赖的数据源,建立管道以便其他人不需要重复计算,并提供唯一的真实来源,这基本上是数据工程师的主要工作。

但是……我们应该建哪些管道呢?与业务最相关的指标是什么?我们需要在哪个维度打破它们?

就命名、度量和维度达成一致是一项复杂的工作。我们相信我们的分析师同事能够找到并达成最佳定义。这一部分非常耗时,所以我们希望将他们从任何样板活动中解放出来,以便从数据中分析和提取见解。

为了增加复杂性,我们希望让我们的同事能够自主工作。我们将为他们部署和维护数据管道,但在我们找到促进生产的指标之前,有一个完整的“试错”过程。

## 我们如何促进分析自主性?

命名解决方案很简单;构建 it,没那么简单:
- *为你的同事提供工具,让他们的日常工作变得简单。*

在 [Schibsted 中,我们正在构建工具](https://bit.ly/2mDUoND),以便于[访问数据](https://medium.com/@mitxino77/bigdata-sql-query-engine-benchmark-e8605f355464)。但是如果没有干净、整洁、连贯的数据,这些都是没有用的。数据民主的第二面来了:为正确的受众转换和准备正确的数据。理想情况下,只做一次。

我们在这方面的贡献是尽可能减少将数据转化为价值所需的代码行数和复杂性。为我们的同事提供一个安全的库,以便从包含数百万行的原始数据中创建聚合指标。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/be712d4c762e62e1cdfa355ece13ec10.png)

“A child walking along a park path to catch up with their family” by [Jelleke Vanooteghem](https://unsplash.com/@ilumire?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)

## 度量生成库

让我们从一个典型的用例开始:

> 分析师 M____ 希望从该数据集中提取指标 X、Y 和 Z,并按维度 a、b 和 c 对其进行分组。

你认为最简单的版本是什么?简单易行:
`SELECT col_1, col_2, count(*) FROM my_table GROUP BY col_1, col_2`

为什么我们要为这样简单的用例创建一个库呢?如果像 SQL 这样的东西如此简单、冗长和有意义,为什么还要把代码复杂化呢?因为我们工程师在日常工作中会遇到其他类型的问题。可靠性、可扩展性、自动化、警报和监控、质量等问题

我们需要生成一个软件,我们可以安排它在一个可伸缩的系统中运行,无论何时它需要运行,都是一致和正确的。我们需要知道什么时候出错(失败、不运行、奇怪的结果……)。我们需要将我们的同事 M____ 的这一段代码转换成适当的数据管道。

## 第一个简单指标

指标可以总结为维度组合(浏览器、城市和类别)的值(x 的数量)。我们添加了一个域来提供一些额外的上下文和一个惟一的标识符。我们也强烈鼓励在维度中包含一些时间框架值。

这个小片段非常容易在我们公司的 Jupyter 之间共享,作为交互验证的服务,也可以在以后与我们的自动化工程师共享。虽然这里还有一个问题:你用的是哪些数据?

这些指标背后的神奇之处在于,它们并不真正关心它们使用哪个数据源。让我换一种说法,有一些最低要求,如维度和`userId`列需要存在,但我们没有针对维度 A 或 B 或不同日期的特定代码。只需插入一个数据框,就可以得到指标。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/63b9b757684f73d75353b43ad352c434.png)

Photo by [Bernard Hermant](https://unsplash.com/@bernardhermant?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)

## 事情变得复杂了

在这个简单的用例之后,分析师想要知道的经常性指标是`UNIQUE xxx`。使用 SQL 也很容易,只需添加`DISTINCT`标记就可以了。你甚至在 Spark 里还有一个`countDistinct()`的方法。那是什么问题呢?您不能合计唯一计数。Android 中的唯一用户 iOS 中的唯一用户= =移动中的唯一用户是不成立的。您可能在两个平台上有相同的用户,这意味着您将计算相同用户的副本。

我们修改了 spark 库,给我们一些我们称之为小计的东西。这样,我们就可以计算出一个维度的`ALL`值里面的唯一用户。这是一个非常有用的功能,可以防止我们手动改变数据帧来计算每个维度的`ALL`度量值。还记得阶乘增长有多快吗:2 维> 2 种排列;3>6;4>24;5>120;…

好吧,让我为我们的库给这个问题的简单性感到骄傲:列出你想要计算小计的维度,就这样。重新计算指标,您将看到类似这样的内容:

## 多维数据集与度量标准

用户从来都不容易,他们总是想要越来越多,并且他们中的每一个人都有他们一生中非常特殊的一次用例。通过生成指标而不是计算最终的 KPI,您使他们能够根据相同的指标创建和调整尽可能多的 KPI。但是您也给了他们更多的工作,因为他们需要为每个维度过滤他们需要的维度,并且他们需要在一周内汇总所有指标以获得每周值(请记住,唯一计数除外!!`7*DailyUsers != 1*WeeklyUsers`)。

也有两种使用这些指标的方法:一种是使用指标作为`metric`列中的值;以及那些喜欢将每个指标视为一列的人。简单的度量方法会给我们第一个版本,但对于探索性分析来说,第二个版本确实更容易也更安全,这被称为[立方体](https://en.wikipedia.org/wiki/OLAP_cube)。

在我们的简化范围内,我们会付出更大的努力。我们如何让我们的同事变得如此简单,以至于他们可以毫不费力地从度量方法转变为立方方法?同样,我们提供一个`MetricCalculator`类来计算数据帧的度量值,我们提供一个`CubeCalculator`来做完全相同的事情:

## 实现可重用性

这个库背后的整个想法是让我们的生活更容易,在这个过程中,我们开发了一些不错的功能。这是一个迭代的故事,从一个简单的度量开始,到一个更复杂的度量,最后到立方体。但我们也发现了开发全局函数和转换的机会,我们推广了最佳实践,并简化了为非工程师构建数据管道的过程,我们还提供了广泛的开箱即用过滤器,用于使用我们最受欢迎的数据集并转换为统一的命名约定。

我们已经开始推广这个库,并使它能够在我们所有的数据发现产品中使用,我们希望这将是通往“*单一真理来源*”之旅的又一步。

希望你喜欢这个帖子,
*- Iker*

# 使用 Udpipe 简化 R 中的文本分析

> 原文:<https://towardsdatascience.com/easy-text-analysis-on-abc-news-headlines-b434e6e3b5b8?source=collection_archive---------4----------------------->

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/91194810478499bf8b769440ce1877bb.png)

Courtesy: [https://pixabay.com/en/news-daily-newspaper-press-1172463/](https://pixabay.com/en/news-daily-newspaper-press-1172463/)

文本分析被视为数据分析的黑箱之一。这篇文章的目的是介绍这个简单易用但有效的 R 包`udpipe`用于文本分析。

# 关于 udpipe 包

[UDPipe](https://github.com/bnosac/udpipe) — R 包提供了*语言无关的*对原始文本的标记化、标注、词条化和依存解析,这是自然语言处理中必不可少的一部分。

# 输入数据集

这包括 ABC 网站在给定时间范围内发布的全部文章。每天 200 篇文章的量和对国际新闻的良好关注,我们可以相当肯定地说,每一个重大事件都在这里被捕获。这个数据集可以从 [Kaggle Datasets](https://www.kaggle.com/therohk/million-headlines) 下载。

# 摘要

加载基本摘要所需的包:

library(dplyr)
library(ggplot2)


了解已发表新闻文章的基本分布:

news <- read.csv(‘abcnews-date-text.csv’, header = T, stringsAsFactors = F)news %>% group_by(publish_date) %>% count() %>% arrange(desc(n))## # A tibble: 5,422 x 2

# Groups: publish_date [5,422]

publish_date n

1 20120824 384

2 20130412 384

3 20110222 380

4 20130514 380

5 20120814 379

6 20121017 379

7 20130416 379

8 20120801 377

9 20121023 377

10 20130328 377

# … with 5,412 more rows


试图了解标题出现的频率:

news %>% group_by(publish_date) %>% count() %>% ggplot() + geom_line(aes(publish_date,n, group = 1))


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/b99625e417b754c8055d1dbd24300f2a.png)

在我们继续执行文本分析之前,让我们将年、月和日分开

library(stringr)news_more <- news %>% mutate(year = str_sub(publish_date,1,4),
month = str_sub(publish_date,5,6),
date = str_sub(publish_date,7,8))


让我们看看数据按年份的分布情况:

news_more %>% group_by(year) %>% count() %>% ggplot() + geom_bar(aes(year,n), stat =‘identity’)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/5f1e858e300867ccae97657d460c9dbc.png)

# 预训练模型

Udpipe 包为各种语言(不是编程,而是口语)提供了预先训练的语言模型,我们可以使用`udpipe_download_model()`下载所需的模型

# 加载 R 包并准备好语言模型

library(udpipe)#model <- udpipe_download_model(language = “english”)
udmodel_english <- udpipe_load_model(file = ‘english-ud-2.0-170801.udpipe’)


# 仅过滤 2008 年的数据

news_more_2008 <- news_more %>% filter(year == 2008 & month == 10)


# 注释 2008 年的输入文本数据

这是我们在`udpipe`中使用的第一个函数,用来开始我们的文本分析之旅。`udpipe_annotate()`采用语言模型并标注给定的文本数据

s <- udpipe_annotate(udmodel_english, news_more_2008$headline_text)x <- data.frame(s)


# 通用 POS

从给定文本中绘制词性标签

library(lattice)
stats <- txt_freq(x u p o s ) s t a t s upos) stats upos)statskey <- factor(stats k e y , l e v e l s = r e v ( s t a t s key, levels = rev(stats key,levels=rev(statskey))
barchart(key ~ freq, data = stats, col = “yellow”,
main = “UPOS (Universal Parts of Speech)\n frequency of occurrence”,
xlab = “Freq”)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/8e2892c47d5ad65aca6dfa5977cf573e.png)

# 大多数出现的名词

既然我们已经有了带词性注释的课文,那就让我们来了解一下名词中最常见的词。

NOUNS

stats <- subset(x, upos %in% c(“NOUN”))
stats <- txt_freq(stats t o k e n ) s t a t s token) stats token)statskey <- factor(stats k e y , l e v e l s = r e v ( s t a t s key, levels = rev(stats key,levels=rev(statskey))
barchart(key ~ freq, data = head(stats, 20), col = “cadetblue”,
main = “Most occurring nouns”, xlab = “Freq”)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/a8c253cbe939295b0d9b60754e39c49d.png)

具有讽刺意味的是,仅仅在一个月内——2008 年 10 月 10 日——出现在报纸标题上的顶级名词没有一个带来乐观。

# 出现最多的形容词

很难找到一个不喜欢夸张的新闻机构,在英语中,你用形容词来夸大你的对象。所以,让我们来探索一下出现频率最高的形容词

ADJECTIVES

stats <- subset(x, upos %in% c(“ADJ”))
stats <- txt_freq(stats t o k e n ) s t a t s token) stats token)statskey <- factor(stats k e y , l e v e l s = r e v ( s t a t s key, levels = rev(stats key,levels=rev(statskey))
barchart(key ~ freq, data = head(stats, 20), col = “purple”,
main = “Most occurring adjectives”, xlab = “Freq”)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/e6f3149f9c7eb76c2993fc402acb54c1.png)

# 最常出现的动词

媒体的报道本质可以通过他们使用的动词的方式很好的理解。这些带来了乐观的迹象吗?还是仅仅注入了悲观情绪?动词的用法可以回答它们。

NOUNS

stats <- subset(x, upos %in% c(“VERB”))
stats <- txt_freq(stats t o k e n ) s t a t s token) stats token)statskey <- factor(stats k e y , l e v e l s = r e v ( s t a t s key, levels = rev(stats key,levels=rev(statskey))
barchart(key ~ freq, data = head(stats, 20), col = “gold”,
main = “Most occurring Verbs”, xlab = “Freq”)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/fad6123dd0da8f4fa39c68f70a369284.png)

有了像`charged`、`killed`、`drought`等等这样的词,看起来澳大利亚媒体对在公民中建立乐观心态并不感兴趣,就像任何典型的新闻机构都会寻找热点、热点、耸人听闻的新闻一样,它也这样做了。

# RAKE 自动关键词提取

是时候进行一些机器学习了,或者简单地说是算法。RAKE 是信息检索中提取关键词的最流行(无监督)算法之一。RAKE 是快速自动关键字提取算法的缩写,是一种独立于领域的关键字提取算法,它通过分析单词出现的频率及其与文本中其他单词的共现来尝试确定文本主体中的关键短语。

Using RAKE

stats <- keywords_rake(x = x, term = “lemma”, group = “doc_id”,
relevant = x u p o s s t a t s upos %in% c("NOUN", "ADJ")) stats uposstatskey <- factor(stats k e y w o r d , l e v e l s = r e v ( s t a t s keyword, levels = rev(stats keyword,levels=rev(statskeyword))
barchart(key ~ rake, data = head(subset(stats, freq > 3), 20), col = “red”,
main = “Keywords identified by RAKE”,
xlab = “Rake”)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/f7ef2ce5a85d003c3b8cb9ee328836df.png)

# 顶级名词——动词对作为关键词对

在英语中(或者可能在许多语言中),简单的一个名词和一个动词可以组成一个短语。比如,**狗吠**——用名词`Dog`和`Barked`,我们可以理解句子的上下文。对这些标题数据进行逆向工程,让我们找出热门短语——也就是关键词/主题

Using a sequence of POS tags (noun phrases / verb phrases)

x p h r a s e t a g < − a s p h r a s e m a c h i n e ( x phrase_tag <- as_phrasemachine(x phrasetag<asphrasemachine(xupos, type = “upos”)
stats <- keywords_phrases(x = x p h r a s e t a g , t e r m = t o l o w e r ( x phrase_tag, term = tolower(x phrasetag,term=tolower(xtoken),
pattern = “(A|N)N(P+D(A|N)N)”,
is_regex = TRUE, detailed = FALSE)
stats <- subset(stats, ngram > 1 & freq > 3)
stats k e y < − f a c t o r ( s t a t s key <- factor(stats key<factor(statskeyword, levels = rev(stats$keyword))
barchart(key ~ freq, data = head(stats, 20), col = “magenta”,
main = “Keywords - simple noun phrases”, xlab = “Frequency”)


![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/89cf418fd75c5bbd12482cc7a44b9881.png)

众所周知的事实是,2008 年的金融危机不仅仅是美国市场的崩溃,而是全世界的热门话题,澳大利亚市场也不例外,这份分析将`Financial Crisis`列在首位,在几个话题之后是`Wall st`。

同样值得注意的是,这本杂志(尽管我们在上面已经看到它对突出负面新闻更感兴趣)帮助人们意识到甚至现任美国总统都不喜欢的`Climate Change`。

希望这篇文章能帮助你开始使用 R 语言进行文本分析,如果你想了解更多关于 Tidy 文本分析的知识,请查看 Julia Silge 的教程。这里使用的代码可以在 [my github](https://github.com/amrrs/text-analysis-with-udpipe) 上找到。

# 在手机上阅读漫画的简单方法:Python 3.6 和枕头

> 原文:<https://towardsdatascience.com/easy-way-to-read-comics-on-your-cellphone-python-3-6-and-pillow-104e0d38afbf?source=collection_archive---------8----------------------->

漫威还是 DC?超人还是蝙蝠侠?鸣人还是漂白剂?

所有这些都只与一件事有关…漫画!!!

当我们还是孩子的时候,总是有一种对漫画书的巨大热爱,翻开书页看到我们的英雄在行动是一种幸福。关于谁是最好的超级英雄的多次辩论,关于他们家族历史的严肃讨论,或者梦想自己拯救哥谭市,我们很多人都在童年创造了如此难忘的时刻。

时代过去了,但我们中的一些人仍然在寻找越来越多的漫画。在这个数字时代,人们可以轻松接入超高速互联网,随时随地阅读/下载自己喜欢的漫画书。然而,每当我们试图在手机上阅读漫画时,我们都会面临这样的问题:压缩页面中的每一帧,以便我们可以阅读帧中所写的内容。

每次你不得不这样做的时候,你不觉得有一种强烈的冲动,有能力削减每一帧,使其清晰和舒缓的眼睛吗?如果你的答案是“是”,并且你渴望学习 Python 中的新知识,那么这篇文章将帮助你在手机/平板电脑上轻松阅读漫画。

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/bdf7f0b54e40d0e3d1c153993fb23109.png)

Spongebob Squarepants Comic(White parts have been labelled as “”GUTTER”)

我们来看看上面的《海绵宝宝》漫画。这张图片有 7 帧,如果我们将它们切片,我们将得到 7 张漫画的图片,可以在我们的手机上轻松阅读。输出在期望的位置保存为单独的图像,

![](https://gitee.com/OpenDocCN/towardsdatascience-blog-zh-2016to2018/raw/master/docs/img/e49af3c84c2c7bc13466c00befecf6a7.png)

Output: Individual frames images saved at desired location

在这里,我们将采取从上到下扫描图像的每一行的方法,然后绘制一幅黑白行的图片,白色用于装订线,黑色用于任何其他颜色。我们将再次从左和右列扫描图像,并绘制一张黑白图片。

这种方法将帮助我们获得每个帧的尺寸,然后将每个帧分别保存到我们的硬盘驱动器中。

我们将使用 Python v3.6 版和 PIL/Pillow(Python 图像库)包开发 Spyder v3.2 版。

## 软件要求

**Anaconda v 5.1
点击以下链接下载并安装 Anaconda for Windows、Mac
或 Linux。**

[](https://www.anaconda.com/download/) [## 下载

### 下载 1,000 多个 Python 和 R 数据科学包的 Anaconda 发行版,一个包、环境和依赖项…

www.anaconda.com](https://www.anaconda.com/download/) 

**Python 3.6** 点击以下链接下载并安装 Python for Windows、Mac、
Linux 或其他。

[](https://www.python.org/downloads/) [## 下载 Python

### Python 编程语言的官方主页

www.python.org](https://www.python.org/downloads/) 

**Python 映像库(PIL/Pillow)** 使用下面的
链接下载并安装用于 Windows、Mac、Linux 或其他系统的 PIL/Pillow:

 [## 在 Windows 和 Mac 上为 Python 安装 PIL/Pillow/cImage

### Python 是什么?Python 是一种广泛使用的编程语言,在这里的许多计算机科学课程中都有使用

wp.stolaf.edu](https://wp.stolaf.edu/it/installing-pil-pillow-cimage-on-windows-and-mac/) 

## Python 代码:

点击下面的链接获得完整的代码,

***Python 2*** Python 2 和包 *PIL* (Python 映像库)。[https://github . com/Mozilla monks/comicstrip/blob/master/comicstrip](https://github.com/mozillamonks/comicstrip/blob/master/comicstrip)

***Python 3*** 在这个版本的代码中,我们实现了使用*枕头*包代替*PIL*(Python 3 中不支持)。
*Pillow* 是 *PIL* 的一个分支,在 Python 3 中增加了一些用户友好的特性。[https://github . com/sohamsil/comicstrip/blob/master/comicstrip _ python 3.6](https://github.com/sohamsil/comicstrip/blob/master/comicstrip_Python3.6)

让我们从第一步开始,导入必要的库!

import sys
import inspect
import zipfile
import os
import PIL
import fnmatch
from math import log
from PIL import Image
from PIL.ImageFile import Parser
from PIL.ImageEnhance import Contrast
from PIL.ImageFilter import BLUR
from optparse import OptionParser
from PIL.ImageOps import autocontrast


由于大多数漫画都有白色的装订线空间,让我们创建一个名为 *gcolor* 的变量,并将值指定为 255(RGB)。此外,每个槽框的尺寸为 *gwidth* = 10 和 *gheight* = 10。

gutter color

gcolor = 255# gutter width and height
gwidth, gheight = 10, 10


我们需要从水槽中去除噪声并数字化图像,让我们通过创建一个变量*对比度*并赋值 0.8 来改变对比度。(您可以根据需要更改该值)

contrast = 0.8


在我们继续我们的方法之前,创建一个名为 *barrier* 的变量,它将帮助我们区分装订线和漫画其余部分的颜色。

***关卡*** (以 1 到 255 的刻度来表示)。如果颜色的值小于屏障的值,颜色将转换为黑色,否则将转换为白色。在我们的例子中,我们选择值为 210。

barrier = 210# debug method
def debug(switch, *args):
if switch:
callerframe = inspect.getouterframes(inspect.currentframe())[1]
line, caller = callerframe[2], callerframe[3]
context = “%s:%d” % (caller, line)
print(“%-20s:” % (context), " “.join(map(str, args)))def nopfn(*args):
pass# We will now create our class called “page”,
class page(object):
“”“A page of the book””"


现在让我们来看看我们的方法。定义一个方法***_ isGutterRow()***来判断一行是否为装订线,并返回值 TRUE 或 FALSE。

def _isGutterRow(self, left, row, right):
“”“Is the row from [left, right) a gutter?”“”
nongutter = [x for x in range(left, right) if gcolor !=
self.img.getpixel((x,row))]
return len(nongutter) == 0


类似地,我们为列定义了另一种方法。***_ isGutterCol()***检查一列是否为装订线,并返回值 TRUE 或 FALSE。

def _isGutterCol(self, col, top, bot):
“””Is the column from [top, bot) a gutter?”””
nongutter = [r for r in range(top, bot) if gcolor !=
self.img.getpixel((col,r))]
return len(nongutter) == 0


每遇到一行,我们都会通过 ***_getRow()*** 方法传递,进一步细化一帧的上下边界。确定一个帧的上限值和下限值后,该方法返回这两个值。

def _getRow(self, l, startRow, r, b):
debug(self.debug, “startRow:”, startRow)
if startRow >= b:
return (-1,-1)# move down as long as the rows are gutter
row1 = startRow
while row1 < b and self._isGutterRow(l, row1, r):
row1 += 1debug(self.debug, “row1:”, row1)
if row1 == b:
return (-1, -1)# There are no more rows , we have finished the image

We assume a frame height of at least fheight(minimum frame height)

pixels and add it to the value of row1 as those rows can be

skipped. Next we check if we have reached the bottom of the frame,

else we check more columns until we reach the bottom of the framerow2 = row1 + self.fheightdebug(self.debug, “row2 starting with:”, row2)

if row2 > b:
return (-1, -1)# probably looking at the area after the last row (e.g. pagenum)
while row2 < b and not self._isGutterRow(l, row2, r):
row2 += 1debug(self.debug, “row2:”, row2)
if row2 - row1 < self.fheight:
return (-1, -1) # Not a proper framereturn (row1, row2)def _prnfn(self, symbol):
print(symbol),
sys.stdout.flush()def _nlfn(self):
print


***_getRows()*** 帮助我们跟踪图像中的所有行,并让我们确定这些行的帧边界。该方法有两个参数,self 和 startRow。

***_isGutterRow()*** 和 ***_getRow()*** 被调用,第一个检查一行是否为装订线,第二个返回一帧的顶行和底行。

def _getRows(self, startRow):
top, rows = startRow, []
count = 0
l,r,b =
self.lignore,self.img.size[0]- self.rignore,self.img.size[1]-1while True:
top, bot = self._getRow(l, top, r, b)
if top != -1:
debug(self.debug, “got row:”, top, bot)
rows.append((0, top, self.img.size[0]-1, bot))
top = bot + (gheight//2)
count += 1else:
debug(self.debug, “No more rows”)
break
debug(self.debug, “rows:”, rows)
return rows


类似于行,我们每遇到一列都会通过 ***_getCol()*** 的方法来传递,进一步细化一帧的边界。在确定一个帧的最左边和最右边的值之后,该方法返回这两个值。

def _getCol(self, startCol, t, b):
debug(self.debug, “startCol, t, b:”, startCol, t, b)
r = self.img.size[0] - 1
if startCol >= r:
return (-1,-1)# move right as long as the columns are gutter
col1 = startCol
while col1 < r and self._isGutterCol(col1, t, b):
col1 += 1
if col1 == r:
return (-1, -1)

There are no more columns, we have finished the image# We assume a frame width of at least fwidth(min.frame width)pixels

and add it to the value of col1 as those columns can be

skipped.Next we check if we have reached the right most column of # the frame, else we check more columns until we reach the right

most column of the framecol2 = col1 + self.fwidth

debug(self.debug, “Starting with column:”, col2)
if col2 > r:
return (-1, -1) # no frame here - just gutter area on the rightwhile col2 < r and not self._isGutterCol(col2, t, b):
col2 += 1
debug(self.debug, “col2:”, col2)
if col2 - col1 < self.fwidth:
return (-1, -1) # not a proper frame
return (col1, col2)


***_getCols()*** 帮助我们跟踪图像中的所有列,并让我们确定帧的边界。该方法采用三个参数:图像文件、单个帧的顶行和底行。

***_ isGutterCol()***和 ***_getCol()*** 得到调用。第一个函数检查一列是否是装订线,第二个函数返回单个框架的左列和右列。

def _getCols(self, rt, rb):
left, cols = 0, []
while True:
left, right = self._getCol(left, rt, rb)
if left != -1:
debug(self.debug, “got column:”, left, right)
cols.append((left, rt, right, rb))
left = right + (gwidth//2)
else:
debug(self.debug, “No more columns”)
break
debug(self.debug, “cols:”, cols)
return cols


***_getFrames()*** 整体获取一个页面,返回页面中的所有框架。

def _getFrames(self):# Get all the rows, traversing the entire height of the image
rows = self._getRows(self.startRow)
debug(self.debug, “Got rows:”, rows)# Determine the left and right columns for each row
frames = []
for rl, rt, rr, rb in rows:
debug(self.debug, “Row:”, rl, rt, rr, rb)
cols = self._getCols(rt, rb)
debug(self.debug, “Got Columns:”, cols)
frames.extend(cols)debug(self.debug, “=== Frames:”, frames)# Now try to further trim the top and bottom gutters of each

frame (left and right gutters would already be as tight as

possible) and then extract the area from the original imagefimgs = []

for (fl, ft, fr, fb) in frames:
debug(self.debug, “Refining:”, fl, ft, fr, fb)
newt, newb = self._getRow(fl, ft, fr, fb)
if newt == -1 # The frame is already as tight as possible
debug(self.debug, “Cannot reduce any further”)
newt, newb = ft, fbelse:
debug(self.debug, “Got:”, newt, newb)fimg = Image.new(“RGB”, (fr - fl, newb - newt))
fimg = Image.new(“RGB”, (fr - fl, newb - newt))
fimg.paste(self.orig.crop((fl, newt, fr, newb)), (0, 0))
fimgs.append(fimg)
return fimgs


使用以下两种方法数字化和准备页面。

def _digitize(self, color):
if color // barrier == 0:
result = 0
else:
result = 255
return resultdef _prepare(self):
bwimg = self.orig.convert(“L”)
return Contrast(autocontrast(bwimg,10)).enhance(contrast)
.point(self._digitize)keys = [“startRow”, “lignore”, “rignore”, “contents”, “infile”,
“pgNum”,“quiet”,“debug”, “fwidth”, “fheight”]


我们将为类 *page* 定义一个构造函数为 ***__init__()*** ,并根据我们将要处理的漫画页面的类型传递一个类的实例和其他参数。构造函数的参数如下:

***startRow(默认值:0)*** :从哪一行开始分析。这通常是
用于分析漫画的第一页,其中页面的某个顶部
包含标题(我们需要跳过)

***lignore,rignore(默认值:两者均为 0)***:扫描的页面可能在一侧或两侧有一些非白色的颜色,这会干扰装订线检测。当定位装订线时,这些参数告诉装订线检测算法通过 *lignore* 调整左边界,通过 *rignore* 调整右边界

***内容(默认值:True)***:
True =>*infile*是由页面内容组成的字符串
False = > *infile* 是保存要打开的页面文件名称的字符串

***infile*** :保存页面内容或页面文件名的字符串(取决于
contents 参数)

***安静*** :不打印任何状态信息

***调试*** :启用调试打印*宽度*,f *高度*(一帧的最小宽度和高度)

def init(self, **kw):
object.init(self)
[self.setattr(k, kw[k]) for k in page.keys]
quietFns = {False:(self._prnfn, self._nlfn), True:(nopfn, nopfn)}
self.prnfn, self.nlfn = quietFns[self.quiet]
if self.contents:
parser = Parser()
parser.feed(kw[“infile”])
self.orig = parser.close()
else:
self.orig = Image.open(self.infile)
self.img = self._prepare()
self.frames = self._getFrames()


将每个帧作为图像文件导出到指定的目的位置,同时为每个帧的名称添加前缀和计数器。

def getargs(parser):
(options, args) = parser.parse_args()
kw = {}
kw[“infile”] = options.infile
if kw[“infile”] is None:
raise ValueError(“Input File Not Specified”)
kw[“prefix”] = options.prefix
kw[“startRow”] = options.startRow
kw[“lignore”] = options.lignore
kw[“rignore”] = options.rignore
kw[“filePat”] = options.filePat
kw[“quiet”] = options.quiet
kw[“gwidth”] = options.gwidth
kw[“fwidth”] = options.fwidth
kw[“fheight”] = options.fheight
kw[“debug”] = options.debug
kw[“fileList”] = args
return kwparser = OptionParser(usage=“%prog [options]”, version=“%%prog %s
(_version),description=“Split a comic page into individual frames”)parser.add_option(”-q", “–quiet”, action=“store_true”,dest=“quiet”,
help=“Don’t print progress messages to stdout [default:%default]”)parser.add_option(“-d”, “–debug”, dest=“debug”,action=“store_true”,
help=“Enable debug prints [default:%default]”)parser.add_option(“-f”, “–file”, dest=“infile”,type=“string”,
metavar=“FILE”,help=“Name of the input file”)parser.add_option(“”, “–prefix”, dest=“prefix”,
help=“Prefix for outputfiles”)parser.add_option(“”, “–left-ignore”, type=“int”,dest=“lignore”,
metavar=“PIXELS”,help=“How much of the left
margin to ignore when detecting rows [default:%default]”)parser.add_option(“”, “–right-ignore”, type=“int”, dest=“rignore”,
metavar=“PIXELS”,help=“How much of the right margin to
ignore when detecting rows [default:%default]”)parser.add_option(“”, “–startrow”, type=“int”, dest=“startRow”,
metavar=“PIXELS”,help=“From which line of the each page
(other than the first page) should the processing start
[default:%default]”)parser.add_option(“”, “–gutter-width”, dest=“gwidth”,
metavar=“WIDTH”,help=“Minimum width of the gutter
[default:%default]”)parser.add_option(“”, “–min-width”, dest=“fwidth”, metavar=“WIDTH”,
type=“int”,help=“Minimum width of a frame [default:%default]”)parser.add_option(“”, “–min-height”, dest=“fheight”,
metavar=“HEIGHT”,
type=“int”,help=“Minimum height of a frame [default:%default]”)parser.set_defaults(quiet=False,prefix=“cstrip-”,lignore=0,rignore=0,
startRow=0,gwidth=15,fwidth=50,fheight=50,debug=True)kw = getargs(parser)


## 终端中的调用:

`$ comic.py [options]`

有效选项有:
***—版本*** :显示程序的版本号并退出。
***-h,—帮助*** :显示简短的帮助信息并退出。

***-q,— quiet*** :不将进度消息打印到 stdout【默认:False】。

***-d,—调试:*** 启用调试打印【默认:假】。仅用于调试
普通用户不需要启用此功能。使用-d 选项时启用'-q'
会有所帮助,这样常规进度显示就不会
干扰调试输出(反之亦然)。

***-f 文件,— file=FILE :*** 输入文件的名称**(必选参数)。**这个
可能是一个图像文件的名称。

***—前缀=前缀*** :输出文件的前缀。**(强制参数)**

单个帧以下列格式的名称保存到文件中:
*<前缀>00.jpg、
<前缀>01.jpg
<前缀>02.jpg
…* 前导零的数量根据输出帧的数量自动调整。如果您想将输出文件保存到一个特定的目录,只需将目录前缀添加到文件前缀
(例如:前缀/tmp/foo-)

***—left-ignore = PIXELS***:当
检测行时,忽略多少左边距。
【默认值:0】有时(尤其是扫描的漫画)页面中间的

边缘会一直有阴影,使得装订线“非白色”。该
会干扰沟槽检测算法,并阻止
成功检测到沟槽。此参数告诉应用程序在检测装订线时应该忽略左侧多少像素。

注意:这并不意味着页边距左边的像素在
最终输出中被丢弃——这只是意味着它们在装订线
检测期间不被考虑。

***—right-ignore = PIXELS***: *检测行数时忽略多少右边距【默认:0】。与“-左-忽略”相同,除了这是用于
右侧。*

****—startrow = PIXELS***:*从每一页(除第一页
外)的哪一行开始处理【默认:0】。对于扫描的漫画,页面顶部的装订线
可能会有阴影,从而干扰
装订线处理算法。该参数告诉应用程序在检测页面中的行时要跳过多少个
像素,从而允许算法
跳过阴影。**

*****—gutter-WIDTH = WIDTH***:*最小的装订线宽度[默认值:15]***

******—最小宽度=宽度* :** 一帧的最小宽度【默认:100】。更精确的值加速了帧提取算法***

*****—最小高度=高度:*** 一个框架的最小高度【默认:100】。更精确的值加速了帧提取算法**

**谢谢你 Sohini Ghosh。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值