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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

数据分析能防止不必要的痛苦吗?

原文:https://towardsdatascience.com/could-data-analysis-prevent-unnecessary-suffering-lessons-to-learn-from-the-vaginal-mesh-scandal-793086d6bbcc?source=collection_archive---------34-----------------------

从阴道网丑闻中吸取的教训。

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

The most frequent words used in the titles of scientific articles concerning meshes for pelvic organ prolapse from 1999–2019. Complications high up.

在阴道网丑闻的余波中,纽约时报和 T2 卫报广泛报道了强生子公司 Ethicon 如何未能警告病人和外科医生他们的产品所带来的“风险”,给成千上万的妇女带来了可怕的痛苦。

一些接受经阴道网片手术修复盆腔器官脱垂(POP)的女性最终出现了可怕的并发症,如网片暴露和侵蚀(当网片刺穿阴道壁或切割内部组织时)、阴道瘢痕、瘘管形成、性交疼痛和盆腔疼痛。使这种手术特别危险的是,一旦植入永久性(不可降解)网片,它通常是不可逆的。它的完全移除是极其困难的,有时是不可能的,因为它已经融入了自然组织。

一个特别令人困惑的经历是阅读 2011 年的 FDA 安全报告(是的,2011 年!),其中说得很明白:“基于包括 11,785 名女性在内的 110 项研究的数据,大约 10%接受经阴道网片修补的女性在手术后 12 个月内经历了网片侵蚀”。该报告还向医生提出了一项建议:“在大多数情况下,POP 可以在没有网片的情况下成功治疗,从而避免了与网片相关的并发症。”

根据 2011 年的报告,NHS 的数据显示在 2011-2018 年间,每年仍有数千名女性接受这种手术,这让我感到惊讶。

更多…英国卫生和社会福利大臣在 2018 年 2 月的辩论中被问及是否会立即暂停使用涉及阴道网状植入物的医疗程序。他所在部门的一名成员回答说:“政府不支持暂停或禁止使用外科手术网片设备。“药品和医疗保健产品管理局(MHRA)认为,外科网片装置在按预期用途使用时,作为适当治疗途径的一部分,在考虑相关风险和益处的情况下,以及在外科网片装置符合欧盟现行法律要求的情况下,是可接受的安全装置。”在我看来,在回应中不说“阴道网眼”使这成为一个相当空洞的交流。外科网片装置可以应用于从疝气到整形外科的任何东西。

但是很快,事情发生了变化。2018 年 7 月 10 日,英国国家医疗服务体系致函英国所有医疗主任,建议立即高度警惕阴道网片限制期。2018 年 9 月 12 日,苏格兰政府指示所有卫生局完全停止所有经阴道网片手术,直到制定出新的‘限制使用协议’。2019 年 4 月 16 日,FDA 通知所有用于经阴道修补的手术网片制造商停止销售和分销他们的产品。那么,什么发生了变化?不是数据。主要是公众压力、澳大利亚法庭案件和新评论完成了这项工作。

作为一名女性(FDA 的同一份报告称,女性一生中患持久性有机污染物的风险估计为 30-50 %)同时也是一名科学家,阅读这篇文章让我感到很困惑。让我们暂时忽略销售产品的公司。为什么医疗机构对自己的发现反应如此缓慢?为什么从 FDA 的审查到一些改变需要 8 年时间?

我只能猜测“模糊”的数据是罪魁祸首。我想知道,如果自 2011 年以来所有要做手术的女性都能获得清晰的统计数据,并充分了解风险,她们会接受手术吗?当然,问题在于这些信息,即使可以获得,也被淹没在乏味的报告和充满术语的科学论文中(其中大部分甚至不为广大公众所知)。更别说和你的医生讨论这个了。我不知道我是否是唯一一个试图利用最近的系统综述与她的医生协商(一个不必要的)医疗程序的人,但我可以告诉你:我没有得到很好的接受。更好地获取数据能增强我们的能力吗?

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

Some of the scary complications have been in the titles of the relevant articles for years. Major complication ‘erosion’ appears since 1998, continuously.

作为一名目前正在开发生物材料及其生物效应数据库的科学家( DEBBIE ),我对从已发表的科学文章中提取生物材料的生物反应数据很感兴趣。这一过程通常被称为“生物固化”。几乎可悲的是,我们作为人类收集的如此多的好的、有价值的知识隐藏在几公里长的文本中,几乎没有人愿意去读,大多是在付费墙后面。那么,为什么我们开采金矿的速度如此之慢呢?为此,处理非结构化数据会面临许多挑战。第一个是自动化识别、提取和评估信息的复杂过程。接下来的问题是如何确保你的结论是可靠的(验证)。最后,使数据清晰并确保其公开需要真正致力于公众利益。我认为是后者在阴道网眼悲剧中起了作用。

我很想快速(也很懒……)看一下科学文献中的阴道网。做一个 PubMed 搜索(PubMed 是访问美国国家医学图书馆书目数据库 MEDLINE 的开放式搜索引擎),我检索了总共 2509 个与‘骨盆器官脱垂’和‘mesh’有关的记录,其中 2197 个有英文摘要。阅读成千上万的文章远远超出了大多数人的时间和耐心,除非你进行系统的审查,否则你甚至不可能阅读所有的标题。但是,即使使用文本挖掘工具包中最简单的现成工具,也可以获得关于文本的基本信息。在这里,我对呈现为词云的词频做了一个快速而简单的分析,并检查了文章标题中关键复杂因素的出现(是的,有很多)。如果你不知道你在找什么,你可以使用一个无监督的主题模型,如 hLDA(见下文),对你的样本中的主要主题有一个粗略的想法,并看到有关于感染、侵蚀和组织反应的报告。这只是为了好玩。想象一下,使用适当的文本挖掘管道在完整的文章上可以提取出大量的信息。

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

In the case of vaginal meshes, the FDA took the trouble to conduct an in-depth systematic review of relevant clinical trials, which is a rather excruciating manual task. Applying hierarchical latent dirichlet allocation topic model (hLDA) to infer some topics from text files is a quick and lazy way to have a less accurate, but a certain idea, of what’s in it. I did just that on the 2197 records with abstracts, minimally optimized the parameters, and anyone can see for themselves the result. Topics discovered with key terms such as ‘infection’, ‘erosion’, ‘tissue’ and ‘response’. The term ‘complication’ was identified as the fourth most important in the largest subtopic discovered in the corpus (1618 abstracts). This is just a starting point.

那么我们还在等什么呢?当然,现在是我们下定决心挖掘我们辛苦收集的科学知识的时候了。不仅仅是为了利润丰厚的 T2 药物研发,也是为了保护公众健康和更多基于证据的实践。为了科学家、医生和患者的利益,组织历史数据的紧迫性似乎比以往任何时候都更加重要,我们必须尽快加强这些努力。花点时间再读一遍那些并发症,想象一下所有本可以避免的痛苦。

财务鸣谢:DEBBIE 项目已经获得了欧盟 Horizon 2020 项目的资助,该项目是根据玛丽·斯科多瓦斯卡-居里赠款协议获得的,项目编号:751277

  • 这里的所有分析都是使用 R 包(ggplot,tidytext,tidyr,dplyr)和 python (nltk,hlda.sampler,matplotlib) 进行的
  • 要实现层次 LDA 主题模型,请参见hlda/hlda/sampler . py中清晰简单的示例代码
  • 从 PubMed 及其 Ebot 中检索文本
#make a word cloud on R from the article titles in df format
#identify words of interest and create a heatmaplibrary(tidytext)
library(wordcloud2)
library(ggplot2)df <- titles %>% unnest_tokens(word, title) %>% anti_join(stop_words) %>% count(word) wordcloud2(data=df, size=0.7, shape=elipse) df_complication <- df[df$word %in% c('complications','adverse', 'pain', 'fistula', 'scarring', 'erosion')]ggplot(df_complication, aes(x=year, y=word, fill=n))+geom_tile()+theme(text=element_text(size=16))

朱莉娅能取代斯卡拉吗?

原文:https://towardsdatascience.com/could-julia-replace-scala-77b73c345f6e?source=collection_archive---------12-----------------------

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

实话实说:我们中的很多人真的希望将 Scala 从我们的数据科学工作流程中移除。Spark 是管理企业级 Hadoop 和协调工人进行深度学习的一种很好的方式,然而,这种努力的开销明显比 R 和 Python 等传统统计语言更重。幸运的是,麻省理工学院开发的一种语言正在进行学术研究,它有很大的潜力将我们喜欢的 Spark、Python 和 R 的所有东西结合到一个方便的包中。

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

Spark 是 Scala 内置的多功能数据管理工具,也是数据科学家最常使用的可扩展语言。Spark 的主要优势来自大数据,因为它与 Hadoop 的集成以及快速的速度使其非常适合用于大型、未管理的数据集,这些数据集需要大量处理才能访问和操作。

然而,Spark 的继承性让它在很多方面都停滞不前,传统上这种语言对于机器学习操作来说是不可行的。Spark 的一个有争议的缺点是,Spark 比数据科学中通常使用的其他语言更难使用和阅读。通常使用的语言包括 R、Python、Matlab 和 Go 等。然而,这些语言中有很多都有自己的问题。在 Python 中,这通常是一项乏味的任务,或者根本不可能处理大型数据集。r 有它自己的缺点,这些缺点源于它的起源。

虽然我肯定不会说 R 很有挑战性(大多数时候),但是像 Python 这样的语言确实从创业的角度把 R 打下了基础。此外,R 也有自己的速度问题,尽管肯定比 Python 快。最后但并非最不重要的是,在 R…

但是当我们将所有这些缺点与 Scala 的缺点进行比较时,Scala/Spark 的启动曲线要困难得多,有时非常难以使用,并且更容易将数据分成不同的文件以读取不同的语言。

对于某些人来说,启动和易于阅读可能不是一个很大的缺点,但是下一个缺点对于数据科学来说绝对是一个很大的缺点。

浮点精度错误本质上是 Sparks 的中名,并且是您可能经常发现自己试图通过操纵软件的前几行来解决的问题。当然,这并不理想:这是一种带有浮点不精确性的统计语言,有时让人无法不弃船退回到 R 和 Python 的舒适环境中。

此外,考虑到它植根于 JVM,任何形式的递归都有许多问题,我已经解释了我对递归的热爱(尽管许多人对它有抱怨。)没有递归优化意味着在循环栈内部固有地需要递归的神经网络运行起来比考虑到递归的最新语言慢得多。有鉴于此,Java 和 SBT (Scala 构建工具)在设计时都必须考虑到统计学。

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

但是朱莉娅呢?

Julia 走在前面,它的结构是 BASIC、Python 和 MATLAB 的奇怪混合。这使得朱莉娅容易学习,也容易阅读。Julia 的优势在于它是一种统计语言,本质上是为了满足数据科学和机器学习的需求而从头开始构建的。最重要的是,Julia 有一个专门用于管理 Hadoop 的包,还有许多支持日常统计和机器学习的包。

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

Julia 非常适合一般的数据科学用途。Julia 是我用过的唯一一种统计语言,它处理大数据的能力一直让我感到惊讶。我曾经遇到过这样的情况,有些数据帧甚至用 R 和 Python 都无法读取,但在 Julia 内部却很容易清理、处理和学习。在我看来,一种能让你避免因缺乏计算能力而丢失数据的语言是一种很棒的语言。我只达到过我个人硬件的极限,从来没有达到过 Julia 的极限,主要是在通过数百万次观察进行深度学习的过程中以内存转储的形式,因为我只有 8g 的内存!

除此之外,浮点问题是不存在的,Julia 在处理数百万种“大浮点”数据类型时仍然表现出色。在可预见的未来,如果 Julia 成为数据科学工作的首选,我不会感到惊讶。

最后一点,不管你扔什么东西,Julia 都很快,递归的问题肯定不存在。正如我在三个不同循环(实际循环、递归循环和迭代循环)之间的速度测试中所展示的,Julia 的递归优化得非常好。

能够用一种语言轻松管理 Hadoop、操作和测试大数据以及编写和利用算法是一个巨大的优势。尽管我非常喜欢 Python、R、Scala/Spark,以及介于两者之间的任何东西,但我经常发现自己希望在使用它们的时候使用 Julia。朱莉娅很强大,非常强大,对我来说,这种力量是不可估量的。Julia 的速度快如闪电,处理大量数据,易于阅读,而且极其准确。朱莉娅是我喜欢的所有语言的完美结合。如果你只是对数据科学感兴趣,或者你碰巧是一名饱受战争摧残的 DS 老兵,我无法表达我对这门语言的热爱,也无法表达我对它是如何扭曲世界的一种尝试。

机器会变得有创造力吗?

原文:https://towardsdatascience.com/could-machines-become-creative-49f346dcd3a3?source=collection_archive---------25-----------------------

人工智能与知识工作

德克·克内梅尔和乔纳森·福利特

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

Figure 01: Creative output from AI, like artwork, has seen its proof of concept in recent years. What can we expect from AI in the years ahead? [Photo: by Martino Pietropoli on Unsplash]

人工智能自动化正在到来,它将影响知识工作者——作家、艺术家、设计师、科学家、经理和企业家。然而,即使当人工智能自动化完全取代了对人类的需求——比如它征服了像国际象棋扑克这样的战略游戏——世界并没有终结,人类元素也没有消失。情况不同了。很大程度上更好,在某些方面更糟,但生活实际上还在继续。人类继续做我们的事。机器变得越来越好,越来越好。人工智能既神奇又被过度炒作。至少在几十年或几个世纪内,人类是安全的。

那么,在未来的几年里,我们能真正期待人工智能带来什么呢?人工智能将如何影响创造力和知识工作的世界?虽然人工智能肯定被用来创作艺术品,但这些作品更多的是好奇或概念验证。2016 年,J. Walter Thompson 的Next rembrant项目教会了人工智能像大师一样绘画。2018 年,纽约佳士得拍卖行首次出售人工智能制作的艺术品《埃德蒙·贝拉米的画像》。该印刷品本身是由法国艺术集体“明显”的人类开发的算法创建的。这些是最近取得的显著成就,但它们是孤立的行动。人工智能协作艺术成为主流没有明确的路径。

为了更清楚地了解人工智能何时可能开始改变各种创造性工作,我们采访了 AI Impacts 的 Katja Grace,这是一家专注于人工智能未来决策相关问题的研究机构。它是预测,广义地说,人工智能的进步和对社会的影响。Grace 是 2017 年一篇题为“人工智能何时会超过人类表现”的论文的第一作者。人工智能专家的证据。”

渐进还是冲刺?

技术进步通常很慢,当一个关键的新进展实现后,就会很快。但是慢的往往不像看起来那么慢,快的也不像我们想象的那么快。因此,不管人工智能如何演变,我们都应该期待它的表现没有我们想象的那么极端。

“你可以想象人工智能的进步是以一种渐进的方式发生的,每年都有比以前稍微好一点的人工智能。或者,你可以想象,在某个时候,我们有了一些惊人的洞察力,从而非常突然地拥有了非常好的人工智能。通常,人们预期后一种情况会发生,并相应地制定计划……我们感兴趣的是这两种情况发生的可能性有多大,”Grace 说。

从历史上看,有很多原因我们可能会认为人工智能将逐步发展。然而,有各种各样的理由期待有突然和令人惊讶的进展。什么可能使人工智能自动化的激增成为可能?“最近我们生活的数字化意味着有更多的数据 Grace 说。“深度学习让你使用大量硬件和数据来获得良好的结果。硬件的出现让科学得以快速发展。”

自动化知识工作

对于大多数人来说,自动化作为创造性工作的核心的想法要么是未知的,要么是不舒服的。然而,在 Grace 作为人工智能研究人员的工作中,自动化作为一种无处不在的力量的模型是清楚的:“我认为怀疑深度学习将自动化知识工作的部分原因是我们认为很可能某种东西最终将自动化知识工作,”Grace 说。“我们知道人类可以做知识工作。因此,或许让机器来做这件事也是可能的——除非你认为人类有某种神奇的意识火花,这是我们永远无法自动化的。”

“我认为许多人怀疑事实并非如此,所以问题是什么技术会让我们做到这一点?怀疑深度学习可能是这样的一个原因是,我们最近看到在自动化一些正常人类功能的一部分方面取得了很大进展,这些功能是我们以前无法做到的,是大多数工作的关键,例如,识别和处理图像、语音和写作。”

“我们已经看到深度学习做了一些看起来相当智能的事情,例如,很好地玩各种游戏。你可能会认为,让我们玩得好的那种技术,不会离我们做好一些相对简单的智力工作的需求太远。我想有些人认为这种技术可能会让我们拥有人工智能,它可以做人类能做的一切事情,但这更有争议。”

grace 2017 年的论文《AI 什么时候会超过人类的表现?来自人工智能专家的证据”,是基于一项对研究人员的调查,这些研究人员在 2015 年神经信息处理系统会议和 2015 年机器学习国际会议上发表了论文。一部分受访者被问及一个强调就业后果的问题。这个问题将劳动力的完全自动化定义为所有职业都完全自动化。那时,对于任何职业来说,机器都可以比人类工人更好、更便宜地完成任务。总体预测认为,50%的可能性在 122 年后,也就是 2138 年前出现。人工智能在各种知识工作中实现人类绩效的中值估计时间表包括:

  • 用 5 到 10 年的时间,写一篇高中作文
  • 在 10 到 15 年内,创作出一首排名前 40 的流行歌曲,并且
  • 在 25 年或更长的时间里,写一本纽约时报畅销书

鉴于 Grace 的论文预测了人工智能将在许多领域超越人类表现的时间框架,我们希望获得她对一些核心知识工作的意见——具体的创造性实践,如写作和音乐。

写作

人工智能多久才能达到人类的水平?“你可能会想象有助于写得更好的工具,但这些工具在过程中并不完全是自动的*。或者你可以想象一些只为你做新闻的事情,”格雷斯说。“我预计相对而言,很快就会有更好的工具出现。”然而,“为了写得足够好,让作者对世界有一个连贯的了解,有一个他们试图传达的信息或目标,有一个他们试图传达给观众的想法,[这]似乎接近 AGI 全集。但是,我预计人工智能能够写出有趣的文字或者让人觉得值得一读的文字可能还为时过早。”*

格雷斯认为,机器独立写作的局限性在于,它们无法将对世界的广泛理解应用到它们所写的东西上。我们将发现背景是人工智能的致命弱点——并且应该在未来十年继续存在——这是一条关键的粉笔线,有助于指导人工智能将做什么和不能够做什么。格蕾丝也将拥有上下文的能力等同于 AGI 的完整性,这意味着有一种人工的普遍智能使人类的能力黯然失色。这与科幻小说和机器将接管世界的叙事如出一辙。虽然这条主线确实是显而易见的,但将语境和 AGI 联系得太紧密是错误的。拥有广博的知识是一回事;拥有广泛行动的能力完全是另一回事。

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

Figure 02: How soon might AI write at a human level?
[Illustration: “The Artist’s Son Writing”, 1887, Paul Cezanne, National Gallery of Art, Open Access]

音乐

流行音乐呢?在调查论文中,“我认为很早就很有趣的一件事是,我们问 AI 什么时候能够基本上像泰勒·斯威夫特一样写一首泰勒·斯威夫特的新歌,这样一个忠实的泰勒·斯威夫特粉丝就无法区分这首新歌和她写的和表演的歌曲之间的区别。[研究人员调查]认为大约 10 年后。你可能会想,为了写作,为了真正成为一名作曲家,你需要理解你所说的话。这些机器学习研究人员可能只是对泰勒·斯威夫特没有很好的看法,他们认为这很快就会自动化。”

抛开所有关于泰勒·斯威夫特歌曲内容的笑话不谈,音乐和艺术都是当今人工智能自动化的目标。例如,Aiva(人工智能虚拟艺术家)是一位人工智能作曲家,他创作了用于电影、广告和游戏配乐的音乐,并且是第一位得到作者权利协会认可的虚拟艺术家。

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

Figure 03: Music is one creative area with numerous AI advances in automation.
[Photo: by Franck V. on Unsplash]

创造性人工智能的后果

创造性人工智能的高级开发有哪些风险或意想不到的后果?“制造一种技术可能很简单,它可以……做出非常高质量的决定,玩游戏玩得非常好,在现实世界中玩得非常好,(例如)赚很多钱。但如果这很容易,而我们还没有想出如何让他们完全按照我们的要求去做,我们可能会以一场巨大的混乱而告终,”格雷斯说。

“如果你可以看看如何建立一家通过生产东西赚钱的公司,但你没有想出让它关心你所关心的所有人类价值——比如河流是否被污染,你往往会以河流被污染而告终。同样,如果你制造的机器非常擅长优化某些东西,但并不真正知道你在乎什么,那么,在没有任何恶意的情况下,它们最终会摧毁你在乎的东西。”

这些听起来和工业革命产生的风险和后果是一样的。当然,即使实际的变化比它应该发生的或者我们可能喜欢的要慢得多,但是心态和意图还是在进化。最终,政策将赶上这一速度,我们将看到国家、企业,最终还有个人大张旗鼓地避免工业化给我们带来的那种破坏性的污染行为。以一种更全面正确的方式做事将会成为做事的基本方式。

那么,机器能变得多聪明,与人类智慧相比又如何呢?“我想问题是:人类有多聪明就有多聪明?怀疑的理由是,人类大脑似乎受到相当大的限制,因为它需要适应人类的大脑,母亲们需要能够生下她们的孩子——生物学上的这种事情——以及它使用了多少能量?…看起来我们的大脑中存在着生物限制,这意味着即使理论上有更高的智力水平,它们也不会给人留下更深刻的印象,”格雷斯说。“即使拥有比我们见过的最聪明的人还要聪明的机器,也会给世界带来巨大的变化。”

Creative Next 是一个播客,探索人工智能驱动的自动化对创意工作者,如作家、研究人员、艺术家、设计师、工程师和企业家的生活的影响。本文附 第一季第 12 集——AI 什么时候会超过人类的表现?

我帮助制造了一个机器人,教自闭症儿童手语——这是我学到的

原文:https://towardsdatascience.com/could-robots-teach-sign-language-to-children-with-autism-8a6d7c3eb23a?source=collection_archive---------37-----------------------

内部 AI

机器人专家和自闭症治疗提供者的试点研究

一年前的 2018 年春天,我进行了一项机器人向自闭症儿童教授手语的试点研究。这篇博文反映了研究的结果,以及我们团队设计机器人的过程。整个研究可通过以下方式获得:

阿克塞尔松,硕士,拉察,硕士,韦尔,博士,凯尔基,V. (2019)。自闭症儿童辅助手语机器人导师的参与式设计过程。在 2019 年第 28 届 IEEE 机器人与人类交互通信国际研讨会(RO-MAN) 。IEEE。接受了。

这项研究是基于我在阿尔托大学的硕士论文。

机器人技术、手语和自闭症儿童

首先,我们来回答第一个大问题:**为什么要在自闭症治疗中使用机器人?**自闭症患者对物体的注意力偏好超过对人的注意力偏好(Kerola 等人,2009 年),自闭症儿童对涉及技术或机器人组件的治疗表现出更大的兴趣(Robins 等人,2006 年)。此外,机器人的操作可以受到严格控制,这可以使自闭症患者的治疗不那么困难(Kozima 等人,2009 年)。

那么,第二个大问题:**为什么要教自闭症儿童手语?**患有自闭症谱系障碍(ASD)的人在交流方面存在问题:40-50%的 ASD 患者在成年后功能性沉默(Bogdashina,2004)。为了缓解这种情况,他们使用了增强和替代沟通(AAC)方法。辅助手语——手语的简化形式——是 AAC 最常见的形式(Tetzchner & Martinsen,2000)。其他常见的 AAC 形式是象征性的图片和照片。

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

An example of a symbolic picture communication system used by children with autism: “We do assignments.”

结合这两个领域——自闭症儿童机器人和自闭症儿童手语——的想法最初来自萨塔昆塔卫生保健区。萨塔昆塔是芬兰西南部的一个小地区,人口 225 000。该地区的质量经理已经了解到一个机器人正被用于向神经典型儿童教授手语(Uluer 等人,2015 年),并希望对自闭症儿童研究同样的方法。

Satakunta 发现我工作的公司( Futurice )制造了一个人形机器人。他们伸出了手,我们组建了一个跨学科团队,重新设计和修改 Futurice 的人形机器人,以适应这一目的。我们的团队有三名来自 Futurice 的机器人专家和三名来自 Satakunta 的自闭症治疗专家:一名神经心理学家、一名语言治疗师和一名质量经理。

我们应该如何设计机器人?

Futurice 制造的人形机器人是一个 InMoov 机器人。 InMoov 由法国雕塑家盖尔·朗之万设计。他将机器人的原理图和软件开源,任何人都可以在网上看到。利用这些,Futurice 建立了自己的 InMoov。Satakunta 想用 InMoov,因为它灵巧的双手使它能够签名。它类似人类的外观也是一个优势:Satakunta 的一位神经心理学家认为类似人类的机器人最适合这种解决方案。

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

The original form of the open source humanoid robot InMoov, designed by Gaël Langevin. Image Wikimedia Commons.

然而,InMoov 并没有准备好。为了使机器人适合自闭症儿童,我们需要修改它的形式、行为、互动和环境。我的工作是设计机器人的这四个维度。我还需要设计人机互动研究,让孩子们和机器人见面并签名。幸运的是,机器人软件和硬件的开源性质使得进行必要的修改相对容易。

我们想在设计机器人时考虑自闭症障碍的特点。ASD 的特征是交流和语言的问题,社会行为的问题,常规的不灵活,以及形成对周围环境的整体感知的问题。然而,自闭症是一个谱系,所以这些特征在不同的人身上有不同的表现。由于不同的演示,我们知道我们无法设计出一个让所有人受益的机器人。然而,我们想找到最好的解决方案,为大多数自闭症儿童服务。

在项目期间,该团队为机器人创建了五个设计准则,这将为自闭症儿童量身定制其设计。例如,自闭症专家提出了孩子在实验过程中可能会分心的担忧。该团队一致认为,为了避免让孩子困惑,机器人的行为应该是一致的和有条理的。这被定义为指导方针:“一致的、结构化的、简单的行为”。为了遵循这个指导方针,语言治疗师和我为机器人和孩子的互动创作了严格的脚本。所有五个指南都是在共同设计讨论中以类似的方式制定的。

用于自闭症儿童的机器人设计指南:

  1. 单形
  2. 一致、有条理、简单的行为
  3. 积极、支持、有益的经历和环境
  4. 模块复杂性
  5. 针对儿童偏好的模块化设计

设计指南帮助团队维持机器人的逻辑和统一设计,并为设计过程中做出的所有决定形成基线。

嵌入式伦理

当团队讨论机器人的设计和实验时,提出了几个伦理问题。这些伦理考虑被嵌入到最终的机器人中。

人身安全 —用户可能会被机器人夹伤或压伤。为了减轻这种担忧,我们决定在互动过程中阻止孩子们触摸机器人。为了做到这一点,我们决定让语言治疗师在房间里陪着孩子,如果需要的话,阻止他们接近机器人。

数据安全 —用户数据的安全至关重要,尤其是在医疗保健应用中。在这里,我们决定对参加研究的儿童的所有数据进行加密。我们也没有记录任何不必要的数据。

适当的行为强制——人们可以从机器人身上学到不礼貌的行为。比如孩子在与语音代理 Alexa 互动后,忘记使用“请”“谢谢”等礼貌用语。Alexa 没有明确要求礼貌的语言,导致人们对它表现不好。在这种情况下,我们不希望孩子们学会虐待机器人,并潜在地将这种不良行为推广到人类身上。我们决定治疗师会干预所有对机器人的不良行为。

用户之间的平等 —人工智能算法在过去已经被证明是种族主义或性别歧视的(例如 COMPAS,一种在美国使用的累犯率预测算法,偏向于非裔美国人)。如果机器人使用算法来运行,算法的设计者需要小心。另一个要考虑的是机器人的形式。机器人设计已被证明会强化性别刻板印象,“天才”机器人通常被贴上男性标签,“服务”机器人则被贴上女性标签。在我们的案例中,我们想设计一个不分性别的机器人,这样每个参与研究的孩子都会感到受欢迎。为了做到这一点,机器人没有性别符号。

透明 —如果用户了解机器人如何操作和决策,他们可以校准他们对机器人的信任程度。在我们的案例中,我们决定在研究结束时告知孩子们和他们的同伴机器人的遥控性质。这样,他们可以避免对当今机器人技术的现状以及如何将其应用于自闭症治疗形成错误的假设。

情感上的考虑——研究表明,人类会像对待活着的机器人一样对待它们,即使它们显然已经不存在了。人们与机器人形成情感纽带。在设计中应该考虑到这一点:这个用例需要多强的绑定?在这种情况下,我们不希望孩子或他们的同伴认为机器人正在取代孩子和治疗师之间的联系。为了确保这一点,语言治疗师会一直和孩子呆在房间里。

平衡之举

为一个复杂的领域(自闭症治疗)建立复杂的技术(机器人)是困难的。问题空间对团队的双方来说都是不直观的:自闭症专家不熟悉技术限制,机器人专家不了解用户群。设计是一种平衡行为:设计中看似微小的调整可能会导致大量的技术工作。反之亦然,一些在设计上意义重大的改变在技术上也很容易实现。这是我花了大部分时间的地方——将团队的不同观点协调成一个好的设计,在我们 6 个月的时间框架内切实可行。我们一起做出了一系列平衡用户体验和技术复杂性的决定。

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

The final InMoov with modifications: new Ada hands, lights attached to its right hand, and a screen on its chest

当设计一个社交机器人时,有大量的运动部件(无论是字面上的还是比喻上的)。机器人的特性都是互相影响的。机器人的操作环境影响它的行为,影响它与用户的互动,影响它的形式。将这些设计考虑因素分离出来,并将其具体化为不同的、可实施的技术任务是一项挑战。

从最初的形式修改机器人花了 4.5 个月(最初的构建在 9 个月内完成)。我们所有的修改都遵循了设计准则:例如,我们将机器人类似人类的声音改为机器人声音,给它一个“简单的形式”(准则 1)。

为了让 InMoov 成为更好的手语老师,我们做了一些大的调整。我们给它新的 Ada hands,由开放仿生学设计,由大都会应用科技大学建造。我们还在它的胸部嵌入了一个屏幕,并在它的手臂上安装了灯光。添加屏幕是为了提供另一种交流模式(AAC 中经常使用照片),添加灯光是为了吸引孩子的注意力。

10 个孩子和一个机器人

10 个孩子参加了实验。有些人和父母一起来,有些人和其他支持者一起来。两名机器人专家(包括我)在实验室旁边的房间里,操作机器人并通过摄像头观察实验。第三个机器人专家在场来解决任何可能出现的问题。语言治疗师和每个孩子都在实验室,促进孩子和机器人之间的互动,并在需要时进行干预。

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

The 9 words the robot signed, and the corresponding images on its screen

机器人表演了 9 个手势。有了⅓的标志,它胳膊上的灯也闪了一下。随着另一个⅓的迹象,它显示了相应的图像在其屏幕上的迹象。对这三种不同的设计条件进行了检查,以确定哪一种最有效。

我对每个孩子与机器人互动的不同感到惊讶。在整个实验过程中,一些孩子以近乎完美的准确度做手势,仅用 6 分钟就模仿了机器人的所有手势。有些人花了长达 28 分钟的时间,与每个标志作斗争。一个特别的孩子——他不太喜欢签名——不停地嘲笑机器人。在整个实验过程中,这个孩子一直试图拥抱或扑向机器人,语言治疗师和神经心理学家在后面追赶,及时阻止他。

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

A child signs with the robot (picture with permission).

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

The speech therapist signals to the robot operators that the child signed correctly (picture with permission).

孩子们模仿并关注机器人

我测量了孩子们的手语准确度和注意力集中程度。孩子们和他们的同伴也完成了关于他们对机器人的看法的调查。

我们学到了什么:

1。孩子们可以模仿机器人,并注意它

10 个孩子中有 7 个成功模仿过机器人至少一次。在 70%的时间里,他们一直盯着机器人,表明注意力集中。参与调查的 8 个同伴中有 8 个也注意到孩子们与机器人有联系。

2。机器人屏幕上的图像很好

机器人在 1/3 的时间里在屏幕上同时显示一幅图像。孩子们的同伴发现这些图像很有用,并认为它们可以帮助孩子们学习。

3。这个机器人被认为不错,但是有点吓人

孩子们和他们的同伴都认为孩子们对机器人的体验很好。然而,一些孩子和他们的同伴指出,孩子们觉得机器人很可怕。在未来的设计中,应该识别并减少造成恐怖感的因素。

4。标志的性能需要提高

语言治疗师和孩子们的同伴都指出,机器人没有很好地标记所有的单词,这可能会影响孩子们对它们的理解。

仍需学习的内容:

1。孩子们理解这些标志吗?

对于这个实验,我只测量了孩子们是否模仿了这些标志。未来的实验需要验证孩子们是否理解它们。

2。谁从机器人中受益最大?

并不是所有的孩子都对机器人有相似的反应。这种基于机器人的手语疗法不太可能对所有自闭症儿童都有用。未来的实验应该考察这种疗法适合谁。同伴的调查结果支持了这种不同的好处:8 个同伴中有 6 个认为机器人作为手语教师可能是有益的。

3。如何输入语言治疗师的命令?

未来要使用机器人,治疗师需要能够独立控制机器人。对于未来的实现,用于编程机器人行为和交互的遥控器或 UI 可能是有用的。

4。准则 4 和 5 将如何影响设计?

在这个实验中,我使用了机器人的静态设计。只有它的交互发生了变化(在不同的点使用它的屏幕和灯光)。未来的研究需要检验设计准则“复杂性模块化”(准则 4)和“特定于儿童偏好的模块化”(准则 5)。这些可以帮助机器人适应不同的用户。

机器人手语教师的未来

人们与机器人密切互动会招致批评。最突出的担忧是机器人取代人类。在这种情况下,机器人并不打算取代人类的护理,而是增加和支持人类的护理。

治疗会议对治疗师要求很高。他们需要计划和进行会议,同时处理潜在的不合作的参与者。在未来,技术工具可以用来减少治疗师的认知负荷。机器人表演手势,而治疗师可以专注于鼓励、辅导和管理孩子。随着认知负荷的减少,会议可能会更长,从而更深入。如果机器人位于孩子的家中,也可能达到同样的效果:孩子将获得一个一致的工具来练习手势,机器人不会因为重复的练习而感到无聊或沮丧。

据我所知,这是第一次使用机器人向自闭症儿童教授手语。我希望这项研究能继续深入下去。我希望我们的飞行员能为将来如何开发这个应用程序提供一些启发。

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

Science — especially pilot studies — sometimes requires improvisation: lights from the robot’s back were reflected on a window behind it, which might have distracted the children. We fashioned a light-reflection-blocker for the robot’s back, out of a towel stolen from our hotel (we did pay for it).

该项目由 Prizztech 的 Robocoast 和 ERDF 基金以及 Futurice 资助。

A short video about the project, by Digitalents Helsinki.

o .博格达什娜(2004 年)。自闭症和阿斯伯格综合症的交流问题:我们说同一种语言吗?。杰西卡·金斯利出版社。

k .凯罗拉、s .库扬帕和 t .蒂莫宁,2009 年。自闭症,第一版。PS-kusta NUS。

科济马,h .,米查洛夫斯基,M. P .,,中川,C. (2009)。坚持住。国际社会机器人学杂志1 (1),3–18。

Robins,b .,Dautenhahn,k .,和 Dubowski,J. (2006 年)。在自闭症儿童与人形机器人的互动中,外观重要吗?。交互研究7 (3),479–512。

Tetzchner,S. V .,& Martinsen,H. (2000 年)。增强式和替代式沟通介绍(第 87-89 页)。呜。

乌卢尔,p .,n .阿卡伦和 h .科塞(2015 年)。一种用于手语教学的新型机器人平台。国际社会机器人学杂志7 (5),571–585。

我们能进化出人工智能吗?

原文:https://towardsdatascience.com/could-we-evolve-an-artificial-general-intelligence-fcceac1e1ae4?source=collection_archive---------29-----------------------

也许试图设计它不是办法…

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

Image by Skeeze, Pixabay

在过去的十年里,机器学习和深度学习的实践者在狭义人工智能问题上取得了惊人的进展。计算机已经非常擅长各种各样的任务,例如检测图像中的东西,这在以前被认为只有人类才能做到。这些程序向前迈进了一大步,但是它们只适用于特定的任务。对他们正在做的事情没有真正的理解。一台能真正思考、真正理解的计算机的梦想仍未实现。

有些非常聪明的人试图在软件和专门的硬件中复制人脑的能力。这还没有完成,可能是因为我们仍然在研究大脑是如何工作的。

我想还有一个办法。我们不必设计它。我们只需要设计一个人工环境,鼓励它进化。我们自己的大脑进化是因为智力为我们的祖先提供了优势。一个适当设计的虚拟环境,由用遗传算法进化的单个软件代理组成,可能会进化出一个人工智能。这可能很昂贵,但以目前的技术来看,这可能是可行的。

我们实际上是在模拟在一个孤立的星球上进化的高级生命。我们不需要从单细胞生物开始——像原始哺乳动物一样,已经安装了感觉和运动的生物会更好。这样我们就有了一个自由的开端,并且我们对这些是如何工作的有一个很好的理解。

不管怎样,我们为什么进化得如此聪明?

关于原始人发展智力的原因,有几种理论。就能量而言,维持一个复杂的大脑是昂贵的。喂养它需要付出努力,较大的头部在出生时带来了挑战。为了进化,它必须为我们最早的后代提供显著的优势。

攀爬的空间意识至关重要,早期简单工具的使用开辟了新的食物来源。有一种理论认为,我们的智力进化很大程度上是因为生活在更大的社会群体中有优势,需要更高的功能来驾驭在这样一个群体中生存和繁殖的复杂性。也有可能是我们的智力使我们能够在快速变化的气候和环境中生存下来。

目前可用的积木

几年来,复杂的神经网络已经通过强化学习成功地学会了玩视频游戏。固定架构的神经网络一遍又一遍地玩游戏,从游戏中接收游戏分数形式的反馈,就像人类玩家一样。神经网络的权重被调整以优化它接收到的分数。人类设计师为神经网络设计布局,并让它运行。

遗传算法,其中设计解决方案的参数以与生物系统相同的方式进化,已被证明在许多问题上相当成功。解决方案的个体特征被编码在虚拟基因中,然后与具有不同基因的大量不同个体竞争。在每次运行结束时,最成功的个体会经历一轮虚拟的变异和交配,它们的“后代”会存活下来再次竞争。重组和突变慢慢引入新的基因,并在环境中进行测试。

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

Image by Free-Images, Pixabay

进场

如果我们将这些方法结合起来,就会有巨大的灵活性。代替人类设计神经网络结构,我们可以将它编码成一组基因,允许网络的设计改变。应该允许它在复杂程度上有很大的不同。我们不知道最优解是什么,所以可供选择的范围应该很大。

为了连接虚拟感觉,我们至少标准化了神经网络输入的子集。我们标准化这些是因为我们对进化新的感官不感兴趣,而是对使用这些感官的大脑感兴趣。

我们必须设计这样的系统,使得虚拟有机体为更大、更复杂的大脑招致能量成本——这不是免费的。有机体必须从大脑中获得竞争优势,这种优势超过了维持它的成本。

现在——这是最昂贵的部分——我们将数千或数百万的这些虚拟生物放入一个复杂的虚拟环境中,顺其自然。

那个虚拟环境是什么样子的?

就图形而言,它不需要很漂亮。用户界面只需要提供状态信息,所以图形渲染可能非常简单。关键在于底层模拟。

我们使用的环境在很大程度上取决于我们想要产生什么样的智能。我们可以利用不同的环境进化出不同强度的智能。例如,一个需要解决复杂数学问题的环境可能会产生一个更适合抽象思维的人工智能。一个主要要求是管理模拟城市的环境可能会训练一个人工智能在现实世界中完成这种工作。

为了这个思想实验的目的,我们将坚持我们可能需要进化出类似我们的东西。

世界是关键

我们的大脑进化成一种帮助我们在复杂、充满敌意的世界中生存的方式。我们的模拟环境需要相当复杂。作为起点,这里是我能想到的可能需要的东西。几乎可以肯定还有更多。

当然,我们不能模拟一个完整的生物群落直到单个细菌。我们必须专注于自然选择的关键驱动因素,以保持所需的计算易于管理。

世界上的能源和其他资源肯定是有限的,而且分布不均匀,就像它们在现实世界中一样。如果能源太容易获得,就没有必要竞争,也没有什么可以推动进化。需要有能杀死粗心的有机体的自然危险,包括自然灾害和食肉动物。

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

Image by David Mark, Pixabay

我们可能想要模拟宏量营养素——蛋白质、碳水化合物和脂肪——在不同食物来源中的不同比例。我们想让我们的生物成为杂食动物,给它们最大的灵活性来收集营养。大型猎物需要强大的防御能力,这将推动合作和武器工具的发展。

环境需要支持简单的工具制作——一些食物资源可能只有使用工具才能获得。代理人需要能够在他们的虚拟世界中与相当小的物体互动。我们已经在较小的规模上做了类似的事情——例如,一个探索奥秘的演示让用户扔纸飞机并与其他小物体互动。模拟一个巨大的世界需要巨大的计算能力,但技术上没有巨大的飞跃。

世界需要以现实的方式做出回应——例如,应该有可能在河流上筑坝来建造鱼笼,或者把东西堆起来组装成简陋的结构。跌倒和受伤应该是一个很大的缺点。

生物体需要一种标准的方式在短距离内与同伴交流。真实的生物使用声音和视觉交流,但我不确定是否需要模拟。在每个有机体中包含一个标准的通信通道就足够了,就像感官输入被标准化一样。我们的目标不是进化通信渠道——而是进化处理与附近生物通信所需的智能。

因为人们认为社会结构推动了更高智能的发展,所以环境中需要有挑战,只有作为一个群体来开发,才能提供优势。应该考虑一种战斗机制,因为不管你喜不喜欢,它都是前进的重要驱动力。同样地,生物必须包含不同攻击程度的基因编码。环境中资源的不均衡分配会推动迁移和战争,这两者都会带来强大的进化压力。

一种计分机制将跟踪环境中每种生物的相对表现,健康的个体将被允许交配和繁殖。遗传算法非常成功地模拟了有性生殖和突变机制,这将是在种群中产生变异的关键。

我们需要确保世界发生一些周期性的快速变化——也许是由火山爆发或彗星撞击引起的重大气候变化。这将为适应性提供进化压力,就像这种变化可能对我们产生的影响一样。

简而言之,我们需要一个用于构建大型在线多人游戏的当前技术的混搭,再加上虚拟现实和强化学习的一些功能。我们只需要把它做大。有了足够复杂的环境和正确的选择压力,AGI 是有可能进化的。

开放式问题和挑战

我认为,最大的挑战是所需计算的庞大规模。我们需要模拟一个庞大复杂的世界,然后是成千上万个复杂的虚拟生物。我们需要非常详细地模拟世界和这些有机体之间的相互作用,并在数千个模拟世代中这样做。不会便宜的。

一个有趣的可能性是允许人们设计他们自己的候选生物体的遗传基因,并把它们放入环境中,观察它们的表现。这将为这一过程增加一个博弈的层面,并有可能加速这一过程。当然,在任何情况下,人类代表他们的有机体干涉世界本身都不是一个好主意——这个过程需要被允许顺其自然。原版《星际迷航》系列中的主要指令将完全生效。

原始人从向父母学习中受益匪浅。目前还不清楚在模拟世界中如何实现这一点。一些基本的本能可能也需要硬编码。

另一个悬而未决的问题是,我们将如何与我们设法进化的人工智能交流。他们会用什么渠道?也许这需要从一开始就建立在这个世界上,并与有机体一起进化。

计算能力越来越便宜。随着专门的神经网络硬件变得可用并且更加可配置,我们可能会达到这样一个点,即尝试这样做变得非常合理。这将会花费大量的时间和金钱,但不会与我们真正关心的其他大规模人类努力相冲突。利用现有的软件和硬件,现在可以创建更简单的世界,在更小的范围内测试这个想法。我觉得这值得一试。

你怎么想呢?可行吗?你有改进的想法吗?

使用 Python 用不到 10 行代码计算汽车数量

原文:https://towardsdatascience.com/count-number-of-cars-in-less-than-10-lines-of-code-using-python-40208b173554?source=collection_archive---------5-----------------------

使用这个简单的代码制作你自己的汽车计数器

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

Blue Volkswagen Beetle (Photo by Tom Arrowsmith on Unsplash)

当你还是个孩子的时候,开车旅行时,你有没有玩过一个游戏,在这个游戏中你会数经过的车的数量?

那曾经是我小时候最喜欢的游戏。

在这篇文章中,我将教你如何用 Python 只用 10 行代码构建你自己的汽车计数器程序。

如果尚未安装以下 python 库,则需要进行安装:

opencv-python
cvlib
matplotlib
tensorflow
keras

以下代码用于导入所需的 python 库,从存储中读取图像,对图像执行对象检测,显示带有检测到的对象的边界框和标签的图像,计算图像中的汽车数量并打印出来。

import cv2
import matplotlib.pyplot as plt
import cvlib as cv
from cvlib.object_detection import draw_bboxim = cv2.imread('cars_4.jpeg')bbox, label, conf = cv.detect_common_objects(im)output_image = draw_bbox(im, bbox, label, conf)plt.imshow(output_image)
plt.show()print('Number of cars in the image is '+ str(label.count('car')))

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

(Left) Original image with cars (source), (Right) Output image with labelled cars

该图像的输出:

Number of cars in the image is 29

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

(Left) Original image with cars (source), (Right) Output image with labelled cars

该图像的输出:

Number of cars in the image is 22

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

(Left) Original image with cars (source), (Right) Output image with labelled cars

该图像的输出:

Number of cars in the image is 25

你的汽车计数器程序现在准备好了。你可以用它来做有趣的实验,比如计算每天经过你家车道的汽车数量。

Python 版本 3.6.9 用于运行这段代码。

运行此代码时安装的最重要的软件包版本如下:

cvlib: 0.2.2
opencv-python: 4.1.1.26
tensorflow: 1.14.0
matplotlib: 3.1.1
Keras: 2.2.5

以下是该计划 Jupyter 笔记本的 GitHub 链接:

[## sabi poks/博客帖子

此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…

github.com](https://github.com/sabiipoks/blog-posts/blob/master/Count_Number_of_Cars_in_Less_Than_10_Lines_of_Code_Using_Python.ipynb)

发现这个帖子有用吗? 在下面留下你的想法作为评论。

希望实现人脸检测。查看我在 上的帖子如何使用 python 在不到 3 分钟的时间内实现人脸检测。

希望实现对象检测。查看我的关于 物体检测的帖子,只用了 10 行 python 代码。

点击这里 阅读我其他关于 AI/机器学习的帖子。

要了解更多关于 cvlib 库的信息,可以访问下面的链接。

[## cvlib

用于 Python 的高级易用开源计算机视觉库。它的开发重点是实现简单的…

www.cvlib.net](https://www.cvlib.net/)

手动计算深度学习模型中的参数数量

原文:https://towardsdatascience.com/counting-no-of-parameters-in-deep-learning-models-by-hand-8f1716241889?source=collection_archive---------3-----------------------

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

Photo by Andrik Langfield on Unsplash

计算 FFNN、RNN 和 CNN 模型参数的 5 个简单例子

W 为什么我们需要再次计算深度学习模型中的参数数量?我们没有。但是,如果我们需要减少模型的文件大小,甚至减少模型推断所需的时间,了解模型量化前后的参数数量将会派上用场。(看视频这里关于深度学习的高效方法和硬件。)

计算深度学习模型的可训练参数的数量被认为是太琐碎了,因为你的代码已经可以为你做到这一点。但是我想把我的笔记留在这里,供我们偶尔参考。以下是我们将浏览的模型:

  1. 前馈神经网络
  2. 递归神经网络(RNN)
  3. 卷积神经网络(CNN)

与此同时,我将使用 Keras 的 API 构建模型,以实现简单的原型制作和简洁的代码,因此让我们在这里快速导入相关对象:

**from** keras.layers **import** Input, Dense, SimpleRNN, LSTM, GRU, Conv2D
**from** keras.layers **import** Bidirectional
**from** keras.models **import** Model

建立model后,调用model.count_params()验证有多少参数是可训练的。

1.FFNNs

  • i ,输入尺寸
  • ,隐藏层尺寸
  • o ,输出尺寸

对于一个隐藏层,

num_params
=
层间连接+每层偏置
=
(I×h+h×o)+(h+o)**

例 1.1:输入尺寸 3,隐藏层尺寸 5,输出尺寸 2

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

Fig. 1.1: FFNN with input size 3, hidden layer size 5, output size 2. The graphics reflect the actual no. of units.

  • i = 3
  • h = 5
  • o = 2

num _ params
*=*层间连接+各层偏置
=
(3×5+5×2)+(5+2)* =32*

 *input = **Input**((**None**, **3**))
 dense = **Dense**(**5**)(input)
output = **Dense**(**2**)(dense)
 model = **Model**(input, output)*

例 1.2:输入尺寸 50,隐藏层尺寸[100,1,100],输出尺寸 50

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

Fig. 1.2: FFNN with 3 hidden layers. The graphics do not reflect the actual no. of units.

  • = 50
  • h = 100,1,100
  • o = 50

num_params
=层间连接+各层偏置
=
(50×100+100×1+1×100+100×50)+(100+1+100+50)* =10451*

 *input = **Input**((**None**, **50**))
 dense = **Dense**(**100**)(input)
 dense = **Dense**(**1**)(dense)
 dense = **Dense**(**100**)(dense)
output = **Dense**(**50**)(dense)
 model = **Model**(input, output)*

2.RNNs

  • g ,单位内人数(RNN 1 人,GRU 3 人,LSTM 4 人)
  • h ,隐藏单位尺寸
  • i ,输入的尺寸/大小

由于每个 FFNN 都有h(h+I)+h参数,所以我们有

**num _ params =g×【h(h+I)+h

示例 2.1:具有 2 个隐藏单元和输入维度 3 的 LSTM。

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

Fig. 2.1: An LSTM cell. Taken from here.

  • g = 4 (LSTM 有 4 个 FFNNs)
  • h = 2
  • i = 3

num _ params
=g×【h(h+I)+h
=4****×【2(2+3)+2】 =

***input = **Input**((**None**, **3**))
 lstm = **LSTM**(**2**)(input)
model = **Model**(input, lstm)***

示例 2.2:具有 5 个隐藏单元、输入大小为 8(其输出被连接)的堆叠式双向 GRU+具有 50 个隐藏单元的 LSTM

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

Fig. 2.2: A stacked RNN consisting of BiGRU and LSTM layers. The graphics do not reflect the actual no. of units.

具有 5 个隐藏单元和输入大小 8 的双向 GRU

  • g = 3 (GRU 有 3 个 FFNNs)
  • h = 5
  • = 8

num _ params _ layer 1
=2**×
g
×【h(h+I)+h
(第一项因双向为 2)=)****

有 50 个隐藏单位的 LSTM

  • g= 4(LSTM 有 4 个 FFNNs)
  • h = 50
  • i = 5+5(双向 GRU 输出串接;GRU 的输出大小为 5,与隐藏单元的数量相同)

**num _ params _ layer 2
=g×【h(h+I)+h] =4×【50(50+10)+50】

total _ params= 420+12200 = 12620

 ****input = **Input**((**None**, **8**))
layer1 = **Bidirectional**(**GRU**(**5**, return_sequences=**True**))(input)
layer2 = **LSTM**(**50**)(layer1)
 model = **Model**(input, layer2)****

merge_mode默认为串联。

CNN

对于一层来说,

  • i ,输入地图(或频道)号
  • f ,滤镜尺寸(只是长度)
  • o ,输出地图(或通道)数量。这也由使用多少个过滤器来定义)

一个过滤器应用于每个输入映射。

num_params
=权重+偏差
=
[(f×f)×o+o
****

示例 3.1:使用 2 个 ×2 个滤镜的灰度图像,输出 3 个通道

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

Fig. 3.1: Convolution of a greyscale image with 2×2 filter to output 3 channels. Here, there are 15 parameters — 12 weights and 3 biases.**

  • i = 1(灰度只有 1 个通道)
  • f = 2
  • o = 3

num _ params
=
[(f×f)×o+o
=【1×(2×3】+******

 ****input = **Input**((**None**, **None**, **1**))
conv2d = **Conv2D**(kernel_size=**2**, filters=**3**)(input)
 model = **Model**(input, conv2d)****

示例 3.2:使用 2×2 滤镜的 RGB 图像,1 个通道的输出

每个输入要素地图有一个过滤器。得到的卷积是逐元素相加的,并且偏置项被加到每个元素上。这给出了具有 1 个特征图的输出。

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

Fig. 3.2: Convolution of an RGB image with 2×2 filter to output 1 channel. Here, there are 13 parameters — 12 weights and 1 bias.**

  • i = 3 (RGB 图像有 3 个通道)
  • f = 2
  • o = 1

num _ params
=
[(f×f)×o]+o
=【3×(2×2)×1]+1****

 ****input = **Input**((**None**, **None**, **3**))
conv2d = **Conv2D**(kernel_size=**2**, filters=**1**)(input)
 model = **Model**(input, conv2d)****

例 3.3:2 通道图像,2×2 滤波器,3 通道输出

每个输入要素地图有 3 个过滤器(紫色、黄色、青色)。得到的卷积是逐元素相加的,并且偏置项被加到每个元素上。这给出了具有 3 个特征图的输出。

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

Fig. 3.1: Convolution of a 2-channel image with 2×2 filter to output 3 channels. Here, there are 27 parameters — 24 weights and 3 biases.**

  • i = 2
  • f = 2
  • o = 3

num _ params
=
[(f×f)×o+o
=【2***×(2×3】)*******

 *****input = **Input**((**None**, **None**, **2**))
conv2d = **Conv2D**(kernel_size=**2**, filters=**3**)(input)
 model = **Model**(input, conv2d)*****

暂时就这样吧!如果您有任何反馈,请在下面留下您的评论!

深度学习相关文章

动画版 RNN、LSTM 和 GRU

带随机梯度下降的线性回归分步指南

10 种梯度下降优化算法+备忘单

经办人:图文并茂的关注

图文并茂:自我关注

关注我上Twitter@ remykarem 或者LinkedIn。你也可以通过 raimi.bkarim@gmail.com 联系我。欢迎访问我的网站remykarem . github . io。******

数披萨:机器学习的度量标准

原文:https://towardsdatascience.com/counting-pizza-metrics-for-machine-learning-4c2ab61b5378?source=collection_archive---------13-----------------------

可视化理解机器学习指标

理解使用机器学习做出商业决策的正确指标很重要。分类说明某样东西是否是别的东西:比如说一张图片是否包含披萨切片。

精度和召回处理可量化的结果用于转化为商业模型的分类。不需要理解机器学习实际上是如何工作的。

任何接触涉及机器学习的商业模式的人都应该理解这些指标。包括创始人、管理层、业务发展和投资者。

对于决策者来说,为数据科学团队提供适合业务模型的指标非常重要。我希望向你们展示,任何会数数的人都能明白该用哪种度量。

假设你想诊断一种罕见的疾病。

  • 当你说一个病人有疾病时,你有多少正确的机会?
  • 你漏掉了多少病例?

对这些问题的回答推动了商业模式的发展。精确和召回是两个各自的答案。

本文旨在给出这些重要指标的直觉。当我们能把一个图像和一个概念联系起来时,直觉往往是最好的。所以让我们来考虑一个直观的例子:下图中有几片披萨?

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

The answer is 4 pizza slices. I ate the other 4. Oops.

现在让我们假设我们已经训练了一个卷积神经网络(CNN)来识别图像中的披萨。我不会告诉你它是如何工作的,没关系!CNN 带回来这些结果:

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

该模型预测了 5 个比萨饼切片。它正确地标记了 3 片比萨饼,但错误地将 2 片馅饼标记为比萨饼。它完全错过了一个比萨饼切片。仔细查看图像,直到您看到所有四个数字都匹配。

现在,让我们回顾一些术语,更深入地了解该模型的表现。精确度和召回率告诉我们从一个分类模型中我们得到什么样的预测。在计算比萨饼的情况下,这些类型的预测是:

  • 真阳性:模型预测比萨饼,它是比萨饼
  • 假阳性:模型预测比萨饼,它不是比萨饼
  • 假阴性:模型预测不是比萨饼,它是比萨饼
  • 真否定:模型预测不是比萨饼,它不是比萨饼

或者我们可以用表情符号来展示这些预测!(注意:馅饼表情符号在技术上是指“不是披萨”的任何东西)

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

美国有线电视新闻网正确预测了 3 个比萨饼切片是比萨饼,所以有 3 个真正的阳性。它错误地预测了实际上是馅饼的 2 片比萨饼,所以有 2 个误报。它漏掉了一片比萨饼,所以有一个假阴性。

  • 真阳性= 3
  • 假阳性= 2
  • 假阴性= 1

现在让我们开始计算模型的表现。精密测量正确性。在这里,正确性意味着:

当模特说披萨的时候,有多少是正确的?

现在我们来介绍一下精度的公式:

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

或者更直观(也更美味):

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

所以精度等于 3 / (3 + 2) = 0.6。这意味着当模型预测某样东西是比萨饼时,它有 60%的几率是正确的。另外 40%的时间里,它错误地预测了比萨饼,而实际上它是馅饼。

另一方面,回忆衡量*完整性。*在这里,完整性意味着:

在所有真正的比萨饼中,模型抓住了多少片?

现在我们来介绍一下召回的公式:

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

或者更形象地说:

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

所以召回率等于 3 / (3 + 1) = 0.75。这意味着在所有实际的比萨饼中,模型捕捉到了 75%的比萨饼切片。它漏掉了 25%的比萨饼切片,也就是图像右下方的那一片。

现在我们面临一个自然的问题:哪个指标对业务决策更重要?每个人都讨厌的答案,因为它太真实了:看情况。

更有意思的是,精确度和召回率直接相互竞争。随着精确度的提高,召回率趋于下降。随着回忆越来越好,精确性越来越差。

因此,如果我们希望模型永远不要说馅饼是比萨饼(100%精确),它将错过更多的比萨饼切片总数(更少的回忆)。这种情况经常发生在商业环境中,在这种环境中,一个错误的决策会带来巨大的代价。精准的座右铭是:

错过一个事件比对一个糟糕的事件采取行动要好。

如果我们希望模型捕捉到每一片披萨(100%召回),它会猜测更多的馅饼是披萨(精确度较低)。这种情况经常发生在商业环境中,错过一个事件会有很大的代价。召回的座右铭是:

抓住所有事件,有时是错误的,比总是正确的要好。

额外收获:更常见的指标

另一个常见的度量标准是普通的老式精确度。它衡量正确预测的比例,包括正面和负面预测。

这里要注意:在处理类不平衡的数据集时,这种度量会产生极大的误导。这基本上意味着一种类型的东西比另一种多得多。假设一个数据集包含 100 张比萨饼图片,而只有 5 张馅饼图片。

虽然它通常很少使用,但有时使用精度是合理的。如果一个数据科学家说一个模型达到了 99%的准确率,问问这实际上意味着什么。

毕竟,考虑一下 1%的人患有罕见疾病的情况。一个总是预测“没有疾病”的分类模型将有 99%的准确率。然而,这样的模型将永远捕捉不到那种疾病的病例(0%的准确率和召回率)。

现在让我们考虑同样关心精确度和召回率的情况。我们希望模型既高度正确又完整(这在实践中可能相当困难)。我们可以引入另一个指标,称为F1-得分

F1 分数在精确度和召回率之间创造了一个平衡的分数。基本上,它通过在精确度和召回率之间寻找一个值来平衡精确度和召回率,总是更倾向于较低的值。比萨饼分类器的 F1 分数是 67%,接近 60%的精确度,而不是 75%的召回率。

在大多数情况下,F1 分数是可取的,以确保我们有良好的精度良好的回忆。在某些情况下,可能没有必要。获得高精度和高召回率需要花费更多的时间、资源和金钱。高精度或高召回率本身可能以较低的成本适用于商业模式。

结论

由设计业务模型的人来决定何时使用什么度量标准。

您不必成为数据科学家,也能理解使用哪种指标。它只涉及回答以下问题:

机器学习的结果会让我的生意兴隆吗?

度量提供驱动业务模型的可量化结果。精确度、召回率和 F1 分数为理解分类模型的结果奠定了坚实的基础。

我希望我向你展示了任何会数数的人都能理解机器学习指标。我也希望你能从这篇文章中学到一些东西:

  • 度量=商业模式的燃料
  • 精确度=正确性
  • 回忆=完整
  • f1-分数=平衡分数
  • 准确性=潜在误导
  • 披萨=美味

py spark:count vectorizer | HashingTF

原文:https://towardsdatascience.com/countvectorizer-hashingtf-e66f169e2d4e?source=collection_archive---------0-----------------------

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

我在将商业实体与其相应的品牌名称进行匹配时,偶然发现了这些术语。但是,让我用一些更简单的例子向您介绍一下。

在深入研究 CountVectorizer 和 HashingTF 之前,让我们先大致了解一下它们是做什么的。

计数矢量器和哈希函数估计器用于生成术语频率向量。它们基本上将文档转换为数字表示,可以直接输入或进一步处理为其他算法,如 LDA、Jaccard 距离的 MinHash、余弦距离等。

假设我们的数据库中只有 2 个文档,我们希望将它们转换成一个特征向量。

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

我们可以继续使用特征提取算法,例如术语频率-逆文档频率(TF-IDF)

TF-IDF

这是一种将文档转换成向量的方法,使得向量反映术语对于语料库中的文档的重要性。

如果我们用 t 表示术语,用 D 表示文档,用 D 表示语料库

术语频率(TF(t,d)) :术语 t 在文档 d 中出现的次数

这里,TF(PYTHON,Document 1)= 1;TF(HIVE,文档 1) = 2

必须注意的是,HashingTF 和 CountVectorizer 都可以用来生成术语频率向量

文档频率(DF(t,D)) :包含术语 t 的文档的数量

这里 DF(PYTHON,Document 1)= 1;DF(HIVE,文档 1) = 1

然而,像 a、an 等这样的停用词。在语料库中出现频率很高,但没有特殊含义。为了解决这个问题,我们使用了逆文档频率(IDF)。

IDF(t,D) :术语提供多少信息的数值度量

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

这里 IDF(PYTHON,Document 1)= log((2+1)/(1+1))~ 0.405

类似地,IDF(HIVE,文献 1) ~0.405

**TF-IDF:**TF 与 IDF 的乘积。

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

这里 TF-IDF(PYTHON,文档 1,语料库)~ 0.405

同样,TF-IDF(HIVE,文档 1,语料库)~0.81

因此,TF-IDF 确保了在文档中具有高频率的术语将具有高 TF,但是如果一个术语在语料库中具有高频率,则它的重要性被 IDF 降低。语料库中所有文档中出现的术语将具有等于 0 的 TF-IDF。

正如我们已经看到的,HashingTF 和 CountVectorizer 都可以用来生成术语频率向量。因此,现在让我们深入了解每一种方法,了解它们的优点和缺点。

计数矢量器

CountVectorizer 将文本文档转换为提供令牌计数信息的向量。

让我们继续讨论前面讨论过的具有 2 个文档的相同语料库。我们想把文档转换成词频向量

*# Input data: Each row is a bag of words with an ID*
df = hiveContext.createDataFrame([
    (0, "PYTHON HIVE HIVE".split(" ")),
    (1, "JAVA JAVA SQL".split(" "))
], ["id", "words"])df.show(truncate = False)

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

首先,CountVectorizer 将生成一个词汇表,以防没有先验词汇表。例如,在这个例子中,CountVectorizer 将创建一个大小为 4 的词汇表,其中包括 PYTHON、HIVE、JAVA 和 SQL 术语。接下来是计数矢量器模型的拟合。在拟合过程中,CountVectorizer 将选择按词频排序的顶级词汇。该模型将产生一个稀疏向量,可以馈入其他算法。

*# Fit a CountVectorizerModel from the corpus*
from pyspark.ml.feature import CountVectorizer
cv = CountVectorizer(inputCol="words", outputCol="features")model = cv.fit(df)result = model.transform(df)
result.show(truncate=False)

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

为了便于理解,特征向量可以分成 3 个部分

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

  • 开头的数字代表向量的大小。在这里,是 4。
  • 第一列数字代表矢量索引。

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

例如,与频率为 1 的术语“SQL”相比,“JAVA”术语的频率为 2。因此,“JAVA”的索引是 1,而“SQL”的索引是 2

  • 第二列数字代表与这些指数相对应的值。

在文档 2 中可以看出,索引为 1 的‘JAVA’的值为 2,索引为 2 的‘SQL’的值为 1

然而,应该注意的是,由于“HIVE”和“JAVA”的频率相同,所以索引是可以互换的。

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

Here, ’HIVE’ has index 0 and ‘JAVA’ has index 1

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

Here, ’HIVE’ has index 1 and ‘JAVA’ has index 0

类似的,其他具有相同频率的术语也是如此。

HashingTF

HashingTF 将文档转换为固定大小的矢量。默认特征尺寸为 262,144。使用散列函数将术语映射到索引。使用的哈希函数是 MurmurHash 3。相对于映射的索引来计算项频率。

*# Get term frequency vector through HashingTF*
from pyspark.ml.feature import HashingTFht = HashingTF(inputCol="words", outputCol="features")result = ht.transform(df)
result.show(truncate=False)

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

从上面的例子中可以看出,向量的维数被设置为默认值,即 262,144。此外,术语“PYTHON”通过散列函数被映射到索引 134160,并且具有等于 1 的频率。类似地,可以获得关于其他术语的见解。

对比与结论

我们已经看到,CountVectorizer 和 HashingTF 都可以被实现来生成频率向量。然而,这两种实现各有优缺点。让我们仔细看看它们之间的差异,以选择最适合我们要求的算法。-

  • 通过 CountVectorizer 生成的向量的大小取决于训练语料库和文档,而通过 HashingTF 生成的向量的大小是固定的。默认大小为 262,144
  • 在计数矢量器的情况下,每个原始特征被映射到一个索引。然而,HashingTF 遭受潜在的哈希冲突,即 2 个或更多的项可能被映射到相同的索引,从而在哈希之后变得相同。然而,为了避免哈希冲突,我们可以增加目标特征的维数
  • 由于全局项到索引的映射,CountVectorizer 与使用哈希技巧的 HashingTF 相比,计算开销更大。
  • 很难解释通过 HashingTF 创建的向量,因为散列是不可逆的,所以无法恢复原始输入。但是,在使用 CountVectorizer 的情况下,可以恢复输入

显然,这两种算法之间有一个权衡。但是,我们可以得出结论,在拥有大量数据集的情况下,使用比 HashingTF 稍低的精度会更合适,而在需要反向映射的情况下,CountVectorizer 会更合适。

希望有所帮助:)

面向规模的 R 语言中 Web 抓取与函数式编程的耦合

原文:https://towardsdatascience.com/coupling-web-scraping-with-functional-programming-in-r-for-scale-1bc4509eef29?source=collection_archive---------27-----------------------

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

https://unsplash.com/photos/-lp8sTmF9HA

在这篇文章中,我们将看到如何使用 R 进行 web 抓取,同时,我们将利用 R 中的函数式编程来扩展它。这篇文章的性质更像是一种食谱格式,而不是文档/教程类型,因为这里的目标是解释 web 抓取如何有效地与函数式编程相结合

R 中的网页抓取

数据爱好者无需介绍网络搜集。当数据本身不可用时,这是收集数据的最可行和最基本的方法之一。

当你缺少数据,或者需要宏观经济指标,或者某个项目没有可用的数据,比如带有自定义文本数据集的 Word2vec / Language 时,了解网络搜集会非常方便。

一个漂亮的(类似 Python 中的 BeautifulSoup 包,用于 web 抓取。它与tidyverse的宇宙和超级方便的%>%管道操作员也很好。

样本用例

顾客对 Etsy.com 感受的文本分析。为此,我们将从trustpilot.com中提取评论数据。

下面是从 Trustpilot 的 Etsy 页面第一页抓取评论的 R 代码。网址:https://www.trustpilot.com/review/www.etsy.com?page=1

library(tidyverse) #for data manipulation - here for pipe
library(rvest) - for web scraping#single-page scrapingurl <- "[https://www.trustpilot.com/review/www.etsy.com?page=1](https://www.trustpilot.com/review/www.etsy.com?page=1)"url %>% 
  read_html() %>% 
  html_nodes(".review-content__text") %>% 
  html_text() -> reviews

这是一段相当简单的代码,我们传递 URL 来读取 html 内容。一旦内容被读取,我们使用html_nodes函数根据它的css selector property获取评论文本,最后从它的html_text()中取出文本并将其分配给 R 对象reviews

下面是reviews的输出示例:

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

很好。我们已经成功地收集了我们分析所需的评论。

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

但问题是我们得到的评论数量只有 20 条——正如我们在截图中看到的,我们已经得到了一条非英语评论,我们可能不得不在数据清理过程中将其排除。

这使我们有机会收集更多的数据来弥补上述数据损失,并使分析更加有效。

规模需求

使用上面的代码,我们只从第一页(也是最近的一页)开始。因此,由于需要更多的数据,我们必须将搜索范围扩大到更多的页面,比如说 10 个其他页面,在数据处理之前,这些页面将为我们提供 200 条原始评论。

传统方式

非常传统的方法是使用一个循环——通常是使用for循环从 1 到 20 迭代 url,以基于一个基本 URL 创建 20 个不同的 URL(字符串连接)。众所周知,这需要更多的计算,代码也不紧凑。

函数式编程方式

在这里,我们将使用来自包purrr的 R 的函数式编程支持,在与上述代码相同的数据管道中,以 R 的tidy方式执行相同的迭代。我们将使用purrr中的两个函数,

  1. map()是来自函数式编程范式的典型映射,它接受一个函数并映射到一系列值上。
  2. map2_chr()是 map 的发展,它接受函数的附加参数,并将输出格式化为字符。

下面是我们的函数式编程代码

library(tidyverse)
library(rvest)
library(purrr)#multi-pageurl <- "[https://www.trustpilot.com/review/www.etsy.com?page=](https://www.trustpilot.com/review/www.etsy.com?page=)" #base URL without the page numberurl %>% 
  map2_chr(1:10,paste0) %>% #for building 20 URLs 
  map(. %>% 
    read_html() %>% 
      html_nodes(".review-content__text") %>% 
      html_text()
  ) %>% 
  unlist() -> more_reviews

正如您所看到的,这段代码与上面的单页代码非常相似,因此它使得任何理解前面代码的人都可以更容易地用最少的先验知识来通读这段代码。

这段代码中的额外操作是,我们构建 20 个新的 URL(通过更改 URL 的查询值)并逐个传递这 20 个 URL 以进行 web 抓取,最后,作为回报,我们将获得一个列表,我们使用unlist保存所有计数必须为 200 的评论(每页 20 条评论 x 10 页)。

让我们看看输出是什么样子的:

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

是的,200 条评论。这实现了我们的目标,即收集(相当)足够的数据来执行我们上面提到的文本分析用例。

但是本文的重点是向您介绍 R 中的函数式编程,并展示它如何容易地适应现有的数据管道/工作流,它是如何紧凑,毫无疑问,它是如何高效(比典型的 for 循环)。希望这篇文章达到了它的目的。

  • 如果你更感兴趣,可以看看这个关于函数式编程的 Datacamp 课程
  • 这里使用的完整代码可以在 github 上找到

谢谢:整篇文章和代码的灵感来自 Saurav Ghosh 在 Bengaluru R 用户组 meetup 中参加的会议

面向人工智能、机器学习和深度学习的 TensorFlow 简介

原文:https://towardsdatascience.com/course-review-introduction-to-tensorflow-for-artificial-intelligence-machine-learning-and-deep-5ef1a85042b2?source=collection_archive---------19-----------------------

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

本次审查的结构:

  • 本课程总结
  • 本课程涵盖的知识和技能
  • 本课程与深度学习专业化的关系
  • 这是你的课程吗?
  • 我对这门课的主观评价

总结:

本课程是 deeplearning.ai 提供的 TensorFlow 在实践专业化方面的第一门课程,顾名思义,是对 TensorFlow 的介绍。中级水平,并将带领你一头扎进深度学习/计算机视觉/人工智能。

本课程涵盖的知识和技能

  • 了解使用 TensorFlow 的最佳实践和计算机视觉的理论基础。
  • 建立一个基本的神经网络。
  • 使用卷积来改进神经网络,包括使用池层和密集层。
  • 如何使用 google colab?

本课程与深度学习专业化的关系

我认为深度学习专业化是这门课程的先决条件。如果学生不了解深度学习,那么理解代码真正在做什么就有点难了。因为本课程更多的是实践,而不是覆盖太多的理论基础,例如,它不会教你如何详细计算约定和池层的大小,但教师会提供一个特定课程的链接。让我举例说明:在第 2 周的视频中,当 Laurence Moroney 教授使用 TensorFlow 构建卷积神经网络时,他提供了一个链接,指向 DeepLearningSpecialization 第四期课程中的一个讲座。

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

这是你的课程吗?

这是一门中级课程。它要求学生具备 Python 编码和高中水平数学的经验。它说,“先前的机器学习或深度学习知识是有帮助的,但不是必需的。”然而,在我看来,如果你想理解代码真正在做什么,深度学习的知识也是必需的。如果你已经完成了 DeepLearningSpecialization 或者你已经知道了深度学习的基本理论,但是不熟悉 TensorFlow,我会向你推荐这门课程;如果你之前用过 PyTorch,又想用 TensorFlow 弄脏手,我推荐你这个;如果你像我一样是一个雄心勃勃的数据爱好者,我也一定会向你推荐这门课程!如果你对这门课程感兴趣,并且正在寻找关于这门课程的信息,那么不要犹豫,这门课程就是为你设计的。

我对这门课的主观评价

劳伦斯·莫罗尼(Laurence Moroney)的教学风格很迷人,跟你的教授或者大学提供的其他课程不一样。劳伦斯能让这门课变得如此有趣。此外,我喜欢劳伦斯和安德鲁在每周讲座开始时的谈话。编码任务并不具有挑战性,除了谦虚,它们对我来说还算简单(我已经完成了 Andrew 的深度学习专业)。Laurence 还在 google colab 中提供了代码,这使得学习过程更加易于管理,学生可以非常快速地在 colab 中训练和测试模型。

而且和往常一样,你可以在我的 GitHub repo 里找到这门课的所有资料。

也发表在我的个人博客

什么是协方差和相关系数及其意义?

原文:https://towardsdatascience.com/covariance-and-correlation-321fdacab168?source=collection_archive---------9-----------------------

协方差和相关性对于理解两个连续变量之间的关系非常有帮助。协方差说明两个变量是同向变化(正协方差)还是反向变化(负协方差)。协方差数值没有意义,只有符号是有用的。而相关性解释了一个变量的变化导致第二个变量的比例变化。相关性在-1 到+1 之间变化。如果相关值为 0,则意味着变量之间没有线性关系,但是可能存在其他函数关系。

让我们详细理解这些术语:

协方差:

在协方差的研究中,只有符号是重要的。正值表示两个变量的变化方向相同,负值表示它们的变化方向相反。

两个变量 x 和 y 之间的协方差可以计算如下:

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

其中:

  • x̄是 x 的样本均值
  • ȳ是 y 的样本均值
  • x_i 和 y_i 是样本中第 I 条记录的 x 和 y 值。
  • n 是样本中的记录数

公式的意义:

  • 分子:x 轴的差异量乘以 y 轴的差异量。
  • 协方差单位:x 的单位乘以 y 的单位
  • 因此,如果我们改变变量的单位,协方差将有新的值,但符号将保持不变。
  • 因此,协方差的数值没有任何意义,但是,如果它是正的,那么两个变量在相同的方向上变化,否则,如果它是负的,那么它们在相反的方向上变化。

相关性:

由于协方差只告诉方向,不足以完全理解关系,我们分别用 x 和 y 的标准偏差划分协方差,得到在-1 到+1 之间变化的相关系数。

  • -1 和+1 表明这两个变量具有完美的线性关系。
  • 负表示它们与相关系数值的因子成反比。
  • 正意味着它们彼此成正比,意味着与相关系数值的因子同方向变化。
  • 如果相关系数为 0,则意味着变量之间没有线性关系,但是可能存在其他函数关系。
  • 如果两个变量之间完全没有关系,那么相关系数肯定是 0,但是如果它是 0,那么我们只能说没有线性关系,但是可能存在其他函数关系。

x 和 y 之间的相关性可以计算如下:

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

其中:

  • S_xy 是 x 和 y 之间的协方差。
  • S_x 和 S_y 分别是 x 和 y 的标准差。
  • r_xy 是相关系数。
  • 相关系数是一个无量纲的量。因此,如果我们改变 x 和 y 的单位,那么系数值也将保持不变。

让我们借助下图来理解相关系数的意义:

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

请在下面的评论区分享你的想法/想法。如果你对这个话题有任何疑问,欢迎你用联系方式给我写信。我很乐意回答你的问题。

原载于 2019 年 1 月 15 日【http://ashutoshtripathi.com】

cov fefe & NLP——特朗普的推文会影响股市吗?

原文:https://towardsdatascience.com/covfefe-nlp-do-trumps-tweets-move-the-stock-market-42a83ab17fea?source=collection_archive---------20-----------------------

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

Source: John Cameron via Unsplash.

Twitter 是世界上最大的社交媒体服务之一,现在已经成为政治家、组织和公司向其追随者提供更新的平台。代表一家公司或一个政党的用户使用 Twitter 来表达对当前新闻的看法,推动他们的政治活动,甚至确认官方的政策决定。使用该网站向数百万粉丝传播想法的重要人物包括特斯拉创始人埃隆·马斯克、欧盟委员会主席唐纳德·图斯克和现任英国首相鲍里斯·约翰逊。社交网络的使用可能会产生巨大的财务/商业影响——例如,埃隆·马斯克(Elon Musk)在推特上发布消息称,他的电动汽车公司特斯拉(Tesla)私有化的“资金已有保障”,这引起了很多负面关注。特斯拉的股价上涨了 8.5% (1),这导致了证券交易委员会对马斯克的惩罚性调查。这导致马斯克被罢免了他创建的公司的董事长职务,并被罚款 2000 万美元——这一切都是因为一条推特。美国总统唐纳德·特朗普目前在推特上有 6680 万粉丝,账号为 “@realDonaldTrump” (2)。特朗普在他的推特账户上非常活跃,自 2016 年以来平均每天约 10 条推特(3)。特朗普在推特上直言不讳,经常发表针对他的批评者的“人身攻击”言论,特别是针对民主党。推特在此前的大选中发挥了巨大作用(2016 年举行),特朗普的言论最终促使对前竞争对手总统候选人希拉里·克林顿进行调查。

有效市场假说

从广义上来说,交易员和投资组合经理根据公司的基本面、管理层及其未来的预期价值来决定是购买、出售还是持有特定的股票(公司股票)。因此,跟上公司新闻是至关重要的,这可能涉及收益电话会议、新产品发布,以及最近通过推特发布的新闻。这与一个叫做*‘有效市场假说’*的观点相吻合。EMH 主张股票在证券交易所以其内在价值进行交易,也就是说,关于一家公司、其管理层和其估值的所有信息都持续体现在当前股价中。这意味着当特朗普发推文时,这些信息甚至会在成为头条新闻之前就反映在金融市场上。所以现在,让我们收集数据。

数据收集

为了分析特朗普的推文,我们通过 Python 模块 Tweepy 使用 Twitter API 收集了 2019 年 7 月 28 日至 2019 年 11 月 16 日的约 3000 条推文(包括转发)。为此,我们在 Twitter 上创建了一个开发人员帐户,然后使用 cursor 方法获取推文,并将它们放入数据帧中:

dtweets = tweepy.Cursor(api.user_timeline, id="realDonaldTrump", include_rts=True, count=200, tweet_mode="extended")df = pd.DataFrame(columns=["Date Created","RT Count", "Tweet"])

这些推文然后被预处理以“清洗”它们,删除超链接和表情符号。

def clean_tweet(tweet):
    return ' '.join(re.sub('(@[A-Za-z0-9]+)|([^0-9A-Za-z \t])|(\w+:\/\/\S+)', ' ', tweet).split())#The long string of what seems like nonsense essentially takes away any characters that aren’t normal english words/letters.df["Clean Tweet"] = df['Tweet'].apply(lambda x: clean_tweet(x))

接下来,我们应用了一种叫做自然语言处理的技术。在高层次上,NLP 使用计算技术来分析句子,以实现特定的结果。虽然听起来可能很复杂,但您可能每天都在使用 NLP。常见的例子包括手机键盘上的预测文本、网页上的语言翻译和搜索结果。我们使用的 NLP 工具被称为*【情绪分析】,它本质上决定了每条推文是正面的、中立的还是负面的。Python 模块“Textblob”旨在通过解析每个句子并给它一个介于-1 和 1 之间的分数来确定推文的情绪。例如,一条包含“错误”一词的推文通常会得到一个负分。此外,一条包含“谢谢”的推文通常会得到积极的评价。当然,有些情况下,一条推文可能并不总是被赋予正确的情绪,特别是对于经济变量。例如,当低*失业率实际上对经济更有利时,“高失业率”可能会被赋予积极的情绪。然而,对于这个任务,我们使用了默认的 Textblob 功能,因为它已经通过机器学习在大型数据集上进行了测试。下面是用于对推文进行情感分析的代码片段:

def analyze_sentiment(tweet):
    analysis = TextBlob(tweet)
    if analysis.sentiment.polarity > 0:
        return 'Positive'
    elif analysis.sentiment.polarity ==0:
        return 'Neutral'
    else:
        return 'Negative'

df["Sentiment"] = df['Clean Tweet'].apply(lambda x: analyze_sentiment(x))i=0
for tweet in dtweets.items(3000):
    analyze_sentiment(tweet.full_text)

    i+=1
    if i == 3000:
        break
    else:
        pass
#code stops at 3000 tweets subject to Tweepy's limits

本质上,这段代码定义了一个函数,该函数通过使用“if”和“else”语句,根据 tweet 的情感对其进行分类,并使用 Textblob 对其进行评分。然后,我们在 pandas dataframe 中为“干净的 tweet”创建一个新列,遍历每条 tweet。一旦我们运行了这段代码,数据帧应该看起来像这样(任何空的/无意义的干净的 tweets 都从我们的分析中删除了):

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

数据可视化

利用我们收集的数据,我们可以直观地解释它的分布。下面我们展示了唐纳德·特朗普每条推文的情绪分布。在分析的大约 3000 条推文中,662 条推文被给予负面情绪,798 条中立,1415 条正面情绪。

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

Source: Twitter, Python. Tweets collected using Twitter API & Tweepy.

下图显示,特朗普的推文频率从 2016 年的平均水平大幅增加(包括转发)。

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

Source: Twitter, Python. Tweets collected using Twitter API & Tweepy.

为了衡量这些推文对股市回报的影响,我们决定使用标准普尔 500 指数,这是在美国证券交易所交易的 500 家最大公司的加权平均值。重要的是我们使用回报率而不是原始价格,因为回报率使系列平稳 (可以使用 Dickey-Fuller 测试来证实这一点,但这里没有使用)

过滤数据

为了尽可能使用最具代表性的数据,我们根据特定的词过滤了与股市相关的推文,如“贸易”、“中国”、“鲍威尔”等,因为它们更有可能影响市场。单词和短语的完整列表如下:

“贸易”、“利率”、“通胀”、“经济”、“增长”、“操纵”、“货币”、“美元”、“中国”、“美联储”、“鲍威尔”、" Xi "、“关税”、“弹劾”。

这使得我们的推文总数减少到了 500 条左右。然后根据他们的情绪给这些推文打分。正面推文的得分为 1,负面推文为-1.2,中性推文为 0.1。这些分数后来被转换成一个序列,**将每天所有推文的情感分数总和乘以当天标准普尔指数的回报。**这意味着我们可以将这些系列放在一起进行比较,以找到相关性。当给出分数时,我们认为投资者是厌恶损失的——这意味着他们从损失中获得的悲伤大于他们获得的同等程度的快乐。这就是为什么负面推文比正面推文的量级高。此外,人们可能会认为一条中性的推文得分为 0——在这里,我们假设股市的稳态高于零,因为全球趋势增长率高于零。情绪得分的实际任意数字来自我自己的假设,并且仅被用作将情绪得分缩放到 S & P 回报的手段。

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

Source — My own calculations.

当我们将这两个系列结合在一起时,我们会得到下面的图表:

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

Source — Yahoo Finance (4), Twitter

解读

直观上,我们可以看到股市的走势和特朗普的推文似乎是一起动的。当在两个系列之间进行相关性分析时,0.68 的正相关性意味着特朗普的推文事实上确实随股市而动。然而,重要的是,相关性 并不意味着 因果关系。换句话说,我们不知道这种关系的走向。还有许多个体因素可能会影响股票回报,如利率、通胀预期和其他特殊因素。我们发现的对这种关系的解释更有可能是,推文与影响市场的事件相吻合,如令人惊讶的经济数据发布或市场对数据做出反应后的货币政策决定。此外,我们大约 500 条推文的样本量可能不足以得出最准确的结论。展望未来,也许控制某些因素的线性回归,如市场规模、动量和波动性,以及更大的样本量,可能会产生一些有趣的结果。因此,我们不能 100%肯定地说,特朗普的推文先发制人地影响了股市。然而,更有可能的是,推文的情绪与市场回报正相关。

感谢阅读! 如果你有什么见解,请不吝赐教。包含我用来做这个项目的源代码的完整 Jupyter 笔记本可以在我的 GitHub 仓库中找到。

参考资料:

[1]投资媒体。特斯拉股价如何在 80 天内跌了 100 美元。(2019).请访问:https://www . investopedia . com/investing/how-tes las-share-price-dropped-100-80-days/

[2]Twitter.com。唐纳德 j 特朗普(@realDonaldTrump)在推特上。(2019).可在:https://twitter.com/realDonaldTrump?购买 ref _ src = tw src % 5 egoogle % 7 ctw camp % 5 eserp % 7 ctw gr % 5 e author

[3] Newburger,E. JP 摩根创建了一个指数来跟踪特朗普的推文对金融市场的影响:“Volfefe 指数”。(2019)美国消费者新闻与商业频道。可查阅:https://www . CNBC . com/2019/09/08/Donald-trump-is-tweet-more-and-its-impact-the-bond-market . html

[4]雅虎财经历史数据。(2019).可在:https://finance.yahoo.com/

免责声明:本文表达的所有观点均为本人观点, 无任何关联,与先锋或其他任何金融实体无关。我不是一个交易者,也没有用本文中的方法赚钱。这不是财务建议。

卷积神经网络

原文:https://towardsdatascience.com/covolutional-neural-network-cb0883dd6529?source=collection_archive---------0-----------------------

从 basic 学习卷积神经网络及其在 Keras 中的实现

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

目录

  • CNN 是什么?
  • 为什么要用 CNN?
  • 几个定义
  • CNN 中的图层
  • Keras 实施

1.CNN 是什么?

计算机视觉每天都在快速发展。原因之一是深度学习。当我们谈论计算机视觉时,我们脑海中会出现一个术语卷积神经网络(缩写为 CNN),因为 CNN 在这里被大量使用。计算机视觉中 CNN 的例子有人脸识别、图像分类等。它类似于基本的神经网络。CNN 也有像神经网络一样的可学习参数,即权重、偏差等。

2.为什么要用 CNN?

前馈神经网络的问题

假设您正在处理 MNIST 数据集,您知道 MNIST 的每幅图像都是 28 x 28 x 1(黑白图像仅包含一个通道)。输入层的神经元总数将是 28×28 = 784,这是可以管理的。如果图像的大小是 1000 x 1000,这意味着你需要在输入层 10⁶神经元。哦!这似乎需要大量的神经元来运作。它在计算上是无效的。所以卷积神经网络或者 CNN 来了。简而言之,CNN 所做的就是提取图像的特征,并将其转换到低维,而不丢失其特征。在下面的例子中你可以看到初始图像的大小是 224 x 224 x 3。如果不进行卷积,那么在输入层中需要 224 x 224 x 3 = 100,352 个神经元,但是在应用卷积之后,输入张量维数减少到 1 x 1 x 1000。这意味着在前向神经网络的第一层只需要 1000 个神经元。

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

Fig. Downsampling

3.几个定义

在了解 CNN 之前,有几个你应该知道的定义

3.1 图像表示

想想图像,很容易理解它有高度和宽度,所以用二维结构(矩阵)来表示图像中包含的信息是有意义的,直到你记得图像有颜色,为了添加关于颜色的信息,我们需要另一个维度,这就是张量变得特别有用的时候。

图像被编码到颜色通道中,图像数据在给定点被表示为颜色通道中的每个颜色强度,最常见的是 RGB,这意味着红色、蓝色和绿色。包含在图像中的信息是每个通道颜色的强度到图像的宽度和高度,就像这样

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

Fig. RGB representation of a image

因此,红色通道在每个点上的强度以及宽度和高度可以表示为一个矩阵,蓝色和绿色通道也是如此,因此我们最终有三个矩阵,当这些矩阵组合在一起时,它们就形成了一个张量。

3.2 边缘检测

每个图像都有垂直和水平边缘,它们实际上组合在一起形成一个图像。卷积运算与一些用于检测边缘的滤波器一起使用。假设你有尺寸为 6×6 的灰度图像和尺寸为 3×3 的过滤器。当 6×6 灰度级图像与 3×3 滤波器卷积时,我们得到 4×4 图像。首先,将 3×3 滤波器矩阵乘以我们灰度图像的第一个 3×3 尺寸,然后我们将一列向右移动到末尾,之后我们移动一行,依此类推。

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

Convolution operation

卷积运算可以用下面的方式来表示。这里,我们的图像尺寸是 4 x 4,过滤器是 3 x 3,因此我们得到卷积后的输出是 2 x 2。

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

Visualization of convolution

如果我们有 N×N 的图像大小和 F×F 的滤波器大小,那么卷积后的结果将是

(N x N) * (F x F) = (N-F+1)x(N-F+1)(Apply this for above case)

3.3 步幅和衬垫

步幅表示在卷积的每一步中我们移动了多少步。默认情况下是一个。

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

Convolution with Stride 1

我们可以观察到输出的大小小于输入的大小。为了保持输入中输出的维数,我们使用填充。填充是将零对称地添加到输入矩阵的过程。在下面的示例中,额外的灰色块表示填充。它用于使输出的尺寸与输入的尺寸相同。

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

Stride 1 with Padding 1

假设“p”是填充

最初(无填充)

(N x N) * (F x F) = (N-F+1)x(N-F+1)---(1)

应用填充后

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

After applying padding

如果我们在带有填充的(N+2p) x (N+2p)输入矩阵中应用滤波器 F x F,那么我们将得到输出矩阵维数(N+2p-F+1) x (N+2p-F+1)。正如我们所知,应用填充后,我们将获得与原始输入尺寸相同的尺寸(N x N)。因此我们有,

(N+2p-F+1)x(N+2p-F+1) equivalent to NxN
 N+2p-F+1 = N ---(2)
 p = (F-1)/2 ---(3)

等式(3)清楚地表明,填充取决于滤波器的尺寸。

4.CNN 中的图层

CNN 有五个不同的层次

  • 输入层
  • 卷积层(卷积+ ReLU)
  • 汇集层
  • 全连接(FC)层
  • soft max/逻辑层
  • 输出层

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

Different layers of CNN

4.1 输入层

CNN 中的输入层应该包含图像数据。正如我们前面看到的,图像数据由三维矩阵表示。你需要把它改造成一列。假设您有一个尺寸为 28 x 28 =784 的图像,您需要在输入之前将其转换为 784 x 1。如果有“m”个训练示例,那么输入的维数将是(784,m)。

4.2.卷积层

卷积层有时被称为特征提取层,因为图像的特征是在该层中提取的。首先,将图像的一部分连接到卷积层,以执行我们前面看到的卷积运算,并计算感受野(它是输入图像的一个局部区域,与滤波器的大小相同)和滤波器之间的点积。运算结果是输出量的单个整数。然后,我们将过滤器在同一输入图像的下一个感受野上滑动一个步长,并再次进行相同的操作。我们将一次又一次地重复同样的过程,直到我们看完整个图像。输出将成为下一层的输入。

卷积层还包含 ReLU 激活,使所有负值为零。

4.3.汇集层

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

Source : CS231n Convolutional Neural Network

池层用于减少卷积后输入图像的空间体积。它用于两个卷积层之间。如果我们在卷积层之后应用 FC,而不应用池化或最大池化,那么它将是计算上昂贵的,我们不想要它。因此,最大池化是减少输入图像空间体积的唯一方法。在上面的示例中,我们在跨距为 2 的单个深度切片中应用了最大池。您可以观察到 4 x 4 维输入减少到 2 x 2 维。

池层中没有参数,但有两个超参数-过滤器(F)和步幅(S)。

一般来说,如果我们有输入维数 W1 x H1 x D1,那么

w2 =(W1 F)/S+1

H2 =(H1 F)/S+1

D2 = D1

其中 W2、H2 和 D2 是输出的宽度、高度和深度。

4.4.全连接层

全连接层包括权重、偏差和神经元。它将一层中的神经元连接到另一层中的神经元。它用于通过训练对不同类别的图像进行分类。

4.5.Softmax /逻辑层

Softmax 或逻辑层是 CNN 的最后一层。它位于光纤通道层的末端。Logistic 用于二分类,softmax 用于多分类。

4.6.输出层

输出层包含的标签是以一键编码的形式。

现在你对 CNN 有了很好的了解。让我们在 Keras 实现一个 CNN。

5.Keras 实施

我们将使用 CIFAR-10 数据集来构建 CNN 图像分类器。CIFAR-10 数据集有 10 个不同的标签

  • 飞机
  • 汽车
  • 伯德
  • 鹿
  • 青蛙
  • 卡车

它有 50000 个训练数据和 10000 个测试图像数据。CIFAR-10 中的图像大小为 32 x 32 x 3。它带有 Keras 库。

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

Fig. Model visualization

如果你用的是 google colaboratory,那么要确保你用的是 GPU。来检查你的 GPU 是否开着。尝试以下代码。

输出:

Found GPU at: /device:GPU:0

首先,导入所有必需的模块和库。

然后加载数据集,并将其分成训练集和测试集。

我们将打印 CIFAR-10 中的训练样本形状、测试样本形状和总类数。正如我们之前看到的,有 10 个类。为了举例,我们将打印来自训练集和测试集的两个示例图像。

输出:

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

找到输入图像的形状,然后将其整形为训练集和测试集的输入格式。之后,将所有数据类型转换成浮点数。

通过将训练数据和测试数据除以 255 来标准化 0-1 之间的数据,然后使用 to_catagorical() 函数将所有标签转换为一个热点向量。

使用一键编码显示类别标签的更改。

输出:

Original label 0 :  [6]
After conversion to categorical ( one-hot ) :  
[0\. 0\. 0\. 0\. 0\. 0\. 1\. 0\. 0\. 0.]

现在创建我们的模型。我们将添加卷积层,然后是池层。然后我们将连接密集(FC)层来预测类别。输入数据馈送到第一卷积层,该卷积层的输出充当下一卷积层的输入,依此类推。最后,数据被馈送到 FC 层,该层尝试预测正确的标签。

初始化所有参数并用 rmsprops 优化器编译我们的模型。有许多优化工具,例如 adam、SGD、GradientDescent、Adagrad、Adadelta 和 Adamax,请随意尝试。这里的批次是 256,包含 50 个纪元。

model.summary() 用于查看模型中各层的所有参数和形状。您可以看到,总参数为 276,138,总可训练参数为 276,138。不可训练参数为 0。

输出:

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

Model Summary

在编译我们的模型之后,我们将使用 fit() 方法训练我们的模型,然后对它进行评估。

输出:

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

经过训练,我们得到了 83.86%的准确率和 75.48%的验证准确率。其实一点也不差。

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

Loss vs Epochs graph

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

Accuracy vs Epochs graph

结论:

恭喜你!你通过了解卷积神经网络的基本概念,在 Keras 中制作了卷积神经网络。你可以随意改变它的超参数,并在评论区告诉我。

你可以在我的 Github 里找到所有代码

参考资料:

  1. CS231n 卷积神经网络
  2. Keras 文档
  3. 深度学习实验室
  4. 关于卷积神经网络的 deeplearning.ai 课程

使用蒙特卡罗模拟破解 82 岁的股票交易棋盘游戏

原文:https://towardsdatascience.com/cracking-an-82-year-old-stock-trading-board-game-using-monte-carlo-simulation-384c26eeff6c?source=collection_archive---------19-----------------------

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

棋盘游戏很有趣。股票交易很有趣。将它们放在一起,我们得到了 1937 年由 Copp-Clark 出版社出版的经典,股票代码。核心玩法很简单:在波动的市场中从经纪人那里买卖股票,并试图以比桌上所有人都多的总资产结束交易。

如果你从未听说过股票代码,那就去易贝、你当地的桌游咖啡馆,甚至你祖母的车库看看。看你能不能弄到一本,这是我个人的最爱。一边喝着啤酒,一边看着你朋友的孤注一掷投资组合策略破产,这是度过周五晚上的好方法。

游戏中的股票走势是由掷骰子触发的,这个公认简单的市场模型的不可预测性造就了一个令人兴奋和引人入胜的游戏。每个人都有自己独特的策略,他们的共同目标是积累最多的现金,看到这些策略成功(或破产)是很有趣的。

游戏规则

对于门外汉,我将简要地列出游戏规则。完整的规则可以在这里找到。

  • 有六种功能相同的股票:黄金、白银、债券、石油、工业和谷物
  • 股票以每股 1 美元开始,你有 5000 美元的启动资金
  • 每回合掷出三个骰子来决定股票走势;骰子 1 选择股票,骰子 2 决定上涨/下跌/分红,骰子 3 选择波动幅度
  • 股票价值变动 0.05 美元/0.10 美元/0.20 美元,股息按股票数量的 5%/10%/20%分配

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

  • 只有当一只股票达到 票面价值(1.00 美元)或以上时,才会支付股息
  • 如果一只股票跌到 0.00 美元,所有玩家都会立即失去他们在这只股票上的投资,股票会重新回到 1.00 美元
  • 如果一只股票涨到 2.00 美元,股票就会被分割,所有股东的股票都会翻倍,股票会重新回到 1.00 美元
  • 交易只发生在桌子周围七轮结束时的交易阶段;没有买卖限制,也没有交易费用
  • 游戏的时间限制是提前确定的,在一个交易阶段发生超过决定的结束时间后游戏结束(我们通常玩~90 分钟)

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

Photo credits: Scott Graham (Unsplash)

战略

这里有许多方法可以考虑。基本的风险管理本能告诉我们,将我们的资本分割成尽可能多的不同股票将使风险最小化,这一概念被称为投资组合多样化。

但是这些股票的进入点和退出点应该是什么呢?我们什么时候购买?我们什么时候卖?考虑股息因素后,哪些股票价值的预期回报最高?显然,票面价值或更高的股票更受青睐,因为获取分红将提高我们的回报,但我们应该在 1 美元以上多远的地方买入呢?$1.10?$1.40?

我对这个切入点的直觉是大约 1.20 美元

理想情况下,我想选择一个安全的高于票面价值的进入点,所以在一轮行情中不太可能跌破 1 美元。我想确保在股票滚动的情况下,不会牺牲股票分红的高概率。

但我也不希望起点太高。由骰子决定的股票价值时刻与股票价值不成比例——它们是常数。股价上涨+0.20 美元将产生 1.60 美元的股票 12.5%的投资回报率。但是,同样的+0.20 美元的涨幅会给 1 美元的股票带来 20%的投资回报率。价格越低,股票变动的潜在投资回报率就越高。

考虑到这些因素,我想在中间的某个地方实现平衡,我对这个切入点的直觉是 1.20 美元左右。该股即使遭遇 0.20 美元的价值冲击也能生存下来,并仍能支付股息,其投资回报率前景仍有很大的上升空间。

然而,作为一个好奇而迂腐的统计学家,我想测试一下我的直觉。我试着在谷歌上搜索是否有人已经做过类似的事情,但是没有效果。事实证明,为 20 世纪 30 年代的棋盘游戏进行随机建模并不是一个热门话题。我正在进入未知的水域。

不过,信封背面的数字处理还不够好。尽管这个市场模型是粗糙和基本的,但是有太多的随机因素在起作用,无法用手工计算出所有的统计数据。相反,我求助于蒙特卡罗模拟来计算不同策略的预期收益和方差。

仿真实现

这项调查是用 Python 进行的——完整的源代码可以在我的 GitHub 上找到在这里

这个想法是为了模拟一种商品在交易阶段开始时每一个股票价值的几十万个回合(0.05 美元,0.10 美元,…,1.90 美元,1.95 美元)。

然后,我们可以采用这些模拟结果,并将它们汇编成统计数据,以量化风险水平。这构成了蒙特卡罗模拟的基础。这里值得关注的统计是期望值样本标准差。这只股票能为我带来多少回报?风险有多大?

模拟的参数有:

  • 交易阶段开始时的资产总值
  • 同桌人数
  • 在下一个交易阶段开始前在牌桌上的回合数

然后,将为玩家 × 回合掷骰子模拟所有可能的初始值,假设玩家将所有资本投入股票。我们做这个假设是为了大大简化模拟的复杂性。这将为我们提供所需的所有重要信息,我们可以在以后应用多样化试探法将预期收益和方差调整到特定的风险容忍度。

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

Code Snippet From the Simulation

仿真被序列化为pickles并存储在本地,以方便 sim 的扩展。模拟可以分块完成,并且总是被保存。

所有的游戏规则都完全包含在模型中,包括股息支付、股票崩溃和股票分割。

这个随机过程的结果被记录下来以供分析。

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

Photo credits: Agence Olloweb (Unsplash)

结果呢

在大约 12,000,000 次模拟(三分钟的计算)之后,我们的好奇心可以得到休息了。现金被设定为 5000 美元(游戏开始时您拥有的金额)。玩家被设定为 4 人,回合数为 7。

最初的结果非常有趣。对此,我知道 0.05 美元的股票会有一个相当不错的预期收益。股票如此便宜,一点点资本就能走很长的路。只需简单地增加 0.20 美元,就能让你的初始投资翻五倍。然而,这种策略有很多包袱。一次失误,你就可以和整个投资说再见了。这种策略有很大的差异。

剧情是这样的。

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

随着初始股价的上升,方差急剧下降,这对于前面讨论的原因是有意义的。然而,在 1.65 美元以上的范围内,它又开始逐渐上升。同样,这也符合我们的预期。当股票接近 2.00 美元时,它分裂的可能性增加。拆分使股票回到票面价值,可以说是一个危险区域。

预期收益在 1.00 美元时大幅飙升,因为收取股息的概率在这里出现了跳跃。

让我们仔细看看在这个图的中心周围实际上发生了什么,便宜股票的高方差使我们的观点有点倾斜。

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

这告诉我们,如果我们把所有的 5000 美元投资到 1.20 美元的股票,我们的预期利润是 701.75 美元,标准差是 1241.51 美元。理想情况下,我们在期望值和标准差之间找到了一个最佳平衡点。1.15 美元到 1.40 美元范围内的任何股票都相当不错,但如果我必须选择一个理想的风险组合,我会选择 1.30 美元的股票。

这是这个模拟的完整数字转储。

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

S = initial price, n = simulations, D = dividend yield, H = final holdings, P = D + H + (-initial cash) = profit

那么最优策略是什么呢?

根据这项调查的结果,在每个交易阶段的开始,注意力应该集中在恰好在 1.15 美元到 1.40 美元范围内的任何股票上。如果你持有这个范围之外的股票,如果可能的话,最好将它全部变现,将资金投入到这些更好的选择中。请记住,每一轮都像这样花时间重组你的所有资产可能会激怒你的朋友,但嘿,只要能赢就好,对吗?

注意力应该集中在位于 1.15 美元到 1.40 美元区间的股票上

如果有多只股票处于这个最佳状态,应该采用分散投资来免费降低风险,而不会影响预期利润。例如,在游戏开始时,将 1000 美元投入四只股票,500 美元投入另外两只股票是一个好主意。这样你可能不会得到很多早期的线索,但是在第一个交易阶段开始时,你将处于一个很好的位置来利用董事会的状态。

如果你想以额外的方差为代价提高预期利润,将一小部分资金投入廉价股票是实现这一目标的好方法。例如,如果游戏快结束了,你觉得自己不是第一名,那就买一些 0.10 美元或 0.15 美元的股票,试试运气。然而,大量这样做是极不明智的。偶尔,你会成为餐桌上的沃伦·巴菲特,但大多数时候,你只会落得一个钱包空空,自怨自艾的下场。

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

Photo credits: Brian Suman (Unsplash)

最后

所有这些分析真的有必要吗?这些结果与坚实的数学本能所能提供的结果有很大不同吗?不尽然,但这不是重点。

统计学就是要检验假设和怀疑——以客观和不可否认的方式揭示真相。看到所有与这些模拟相关的随机性都崩溃成一个漂亮的模式,这是一件令人非常满意的事情。

快乐的棋盘游戏!

赢得一场精彩的产品经理面试

原文:https://towardsdatascience.com/cracking-an-awesome-product-manager-interview-2baa902791a1?source=collection_archive---------2-----------------------

面试了脸书和初创公司的 200 多名项目经理后,我为候选人准备了一份清单。对于一个有抱负的项目经理来说,在面试中采取结构化的方法展示了他们的思维方式,揭示了一个人对项目经理角色的理解,并使他们能够扮演那个角色。与所有人分享!!

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

我以联合创始人的身份经营过两家数据产品初创公司,为在新兴市场拥有 3.2 亿用户的脸书管理产品,在 AOL 还是“互联网”的时候,它是 AOL 数据产品不可或缺的一部分,现在,我是 Airtel 的首席数据科学家,Airtel 是全球最大的电信公司之一,拥有超过 3.5 亿用户。到目前为止,我已经采访了大约 200 名产品经理(PM ),还指导了十几家印度和美国的初创公司建立他们的 PM、数据 PM (DPM)和数据科学团队。

多年来,我为候选人创建了一份清单,可以帮助他们在 PM 面试中保持最佳状态。对于一个有抱负的项目经理来说,在面试中采取结构化的方法展示了他们的思维过程,揭示了一个人对项目经理角色的理解,并使他们能够扮演那个角色。这对面试者和面试官都是一样的。我会说,在大约一半的面试中,我学到了一些新东西,在其中大约 10-20%的面试中,我对自己说“啊哈,我根本没有那样考虑问题”。

模拟面试

实践项目经理面试的方法是让一个朋友(最好是项目经理)问你“你将如何为 Y(用户描述)打造 X(产品类型)?”从了解你在为谁构建开始,来解决什么(“用例”)和为什么用户应该关心。然后你应该通过用例来构建产品为用户做什么

虽然可能会有其他问题,例如对产品市场的估计,或者有时是一个技术问题,例如设计一个应用程序,但上面的问题是最重要的。

三条黄金法则

在与面试官一起解决问题的过程中,记住三条规则:(1)提问以澄清——范围、假设、可能的场景,任何事情都是公平的,(2)大声说出你的思考步骤,(3)在进行下一步之前寻求面试官的肯定,尤其是在结果可能是多种可能性之一的情况下。

一旦功能清晰,与潜在用户群的一致性明显(“产品市场适合”),你应该描述产品的视觉效果*(“设计思维”),以及*你将如何把它推向市场并成长(成长")。最重要的是,如果你能开发出一个收入模型并估算出损益,就考虑录用你吧。**

真正的面试

大多数人都有自己的面试方式,你应该选择自己的风格和舒适度。以下是我的建议:

  • 调查公司和产品:听起来很明显,但是我见过太多的应聘者没有做基本的调查就来面试:公司、产品、收入、最近的新闻发布等等。不知道这些是没有借口的——如果你不知道这些,你几乎肯定会被取消资格。
  • 展示你多功能、人性化的一面:以积极的态度去参加面试。面试官在寻找一个多功能的人——产品,一些数据和工程,更多的合作伙伴关系,法律,营销,财务和高管/利益相关者管理。要戴这么多帽子,你需要是一个忙碌的、见多识广的、好奇的、固执己见的、谦逊的和友好的混合体。展现你人性的一面!
  • 建立最初的融洽关系:调查面试官:LinkedIn、Twitter、Medium、他们的社交轨迹、在 YouTube 上的谈话、过去的角色和成就,甚至是他们上过的学校或玩过的游戏。人是群居动物,每个人都喜欢花时间去了解他们和他们的背景的人。

既然你已经花了前 7-10 分钟热身,并且和面试官相处融洽,那就准备好回答“你将如何为 Y[用户描述]构建 X[产品类型]”的问题。

  • 首先,是用户:作为项目经理,你的关键角色是识别特定人群今天面临的特定问题,感同身受,设想一个改善他们状况的新解决方案,以足够的细节说明它,考虑利弊,重复功能和改进,并通过工程使它成为一个可构建的解决方案。整体体验将需要考虑用户如何了解解决方案及其关键特性(“发现”),什么使其引人注目(“产品市场适合”),以及尽快获得至少相当数量的解决方案以“啊哈!”喜悦时刻(“新用户体验”)。你还需要考虑迫使他们吸引他人参与体验的动力和网络效应(“成长策略”)。

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

Figure 1: First, it’s the user

  • 现在,移动到白板前想象:我不记得在没有白板的房间里进行面试一个好的候选人没有在最初的 15-20 分钟内开始使用白板。原因很简单,一旦你有了用户故事,让面试官想象用户会看到什么。例如,如果它是一个分享视频的移动应用程序:勾画出主屏幕,显示用户将看到的信息,谈论屏幕之间的导航,以及如何让用户 在几分钟内发现关键功能,或者 10 个动作 。讲故事是面试这一部分的一个重要方面:谈论你将如何降低复杂性,并推动保持用户参与所需的行动。项目经理不需要成为设计大师,但 UX 感是必须的。
  • ***使用逻辑结构创建业务框架并进行现实检查:*从市场评估开始。比如:在印度分享短格式视频(目前围绕抖音的热潮,Vigo video 等等)是不是一个针对年轻人的新 app?在印度这样一个快速增长、竞争异常激烈的市场中,获得一个用户需要花费多少成本?在这个市场中,大量风投资金正在追逐相对较窄的一部分城市年轻人,他们拥有相对较高的富裕程度,因此可以花钱进行应用内购买,或者被定向展示/赞助。或者,你应该把重点放在数量更多但第一次接触智能手机的农村年轻人身上吗?这两类用户的获取成本是多少(提示:他们可能相差 5-10 倍印度)?你可能的终身客户价值(LTV)是多少,尤其是如果涉及多个用户群体(男性/女性、年轻人/老年人、功能手机/智能手机)?支持用户的成本是多少?

此时需要一个快速的经济模型:你需要知道你的想法是否可行。一个简单的“LTV > CAC + S”(终身价值大于客户获取成本加上支持)是讨论的合适起点。

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

Figure 2: LTV > CAC + S. For every $50 invested, you can acquire a customer and return a $150, net off churn and support cost

你还应该深入研究一两个现实生活中的话题,尤其是对于高级职位,比如:如何衡量获取渠道的组合以优化预算,或者如何设计新的用户体验(“NUX”)以最大限度地减少应用程序前 30 天的流失。

  • ***留意线索,随机应变,不断重复:*虽然你应该明确地“领导”讨论,但留意面试官的反馈也很重要。一个好的面试官经常会中途给你数据点来挑战你的假设;你应该能够很快地整合这些并修改你的答案。这是你实际面试中最关键的部分,面试官通常会根据你运用新信息和随机应变的能力来决定是否面试。

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

Figure 3: Relatively modest amount of new information from the interviewer can change the outcome of the problem significantly

  • 快速结束:典型的面试过程会持续一个小时,其中大约 7-10 分钟用于介绍,最后 5-10 分钟用于回答候选人可能提出的任何问题。这就给真正的面试留出了大约 40 分钟的时间,其中面试官可能会探索 3-4 个领域,也可能会深入一两个领域。不管这是一个“广度”还是“深度”的问题;你应该提供一个结束。闭包是一个快速、近似的正确答案;它可以让面试官知道他们是否想深入探讨,或者进入下一个问题。
  • 大胆想象:伟大的项目经理都是想象力的大师。我参加的每一次面试,都希望候选人能说一些让我眼花缭乱的话。例如,假设有人问你,你将如何为脸书开发一项功能,以提高其在新兴市场的使用率。除了给出通常的特定于功能的答案,例如国际语言支持、特定的本地内容等。如果一个候选人假设脸书增长的障碍是一个沉重的产品(> 50MB),在低内存和低存储的低端 Android 手机上不能很好地运行,因此,需要剥离许多功能,制成 5 MB 以下的轻量级产品,她将被记住。
  • 现实一点:为什么这听起来是显而易见的,我见过一些严肃的 PMs 轰炸采访,他们的回答都是不现实的。这种情况通常有以下几个原因:( I)你走了一条狭窄的道路,独自讲述了你的假设和解决方案,而没有从面试官那里寻找线索;( ii)你没有根据提供的新信息重复你的答案,或者(iii)(有点不太可能),面试官从一开始就因为缺乏适当的热身而走神,从未进入“头脑风暴模式”。

结局

虽然这可能不适用于你参加的每一次面试,尤其是如果你参加的是同一家公司的一系列面试,你应该从面试官那里了解以下几点:

  • 检查面试官对工作的期望。你可能认为你是产品负责人,所有人都向你汇报。但事实上没有人为你工作——你仍然要负责送货
  • 试着感受一下团队文化。是像谷歌和特斯拉那样的工程主导型公司,像脸书和优步那样的项目管理主导型公司,还是像苹果那样的设计主导型公司?这会让你对公司的“等级秩序”有一个概念,以及在实际工作中会有什么样的期待
  • 询问是什么使一个人在集团和公司中成为“不可替代”项目经理。这个问题通常比你可以问的任何其他问题都更能揭示关于该职位的文化、工作实践和现实,并且是一个很好的“去/不去”检查点

面试愉快!!留下你对这些建议的想法,并请添加你自己的观察或学习。我们可以一起学习和提高。

结语:我计划写一系列关于数据科学、机器学习、产品管理和职业成功故事的博客。你可以跟着我把这些放进你的培养基里。

下一个故事: 用“印度级”技术为世界供电

上一篇: 人工智能对 2020 年的预测

用 Google AutoML Tables & Tensorflow 破解比特币

原文:https://towardsdatascience.com/cracking-bitcoin-with-google-automl-tables-tensorflow-fbe3f16ce9b2?source=collection_archive---------4-----------------------

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

谷歌已经在其云平台上推出了几款旨在自动化和改善机器学习培训和供应的产品。其中最新的— AutoML Tables 旨在“在结构化数据上自动构建和部署最先进的机器学习模型”。

我曾经是机器学习和自动化一切事物的粉丝,我想我会尝试一下,用另一种自己成为头条新闻的技术来折磨它——比特币。

这个想法很简单——比特币“挖掘”是试图猜测字符串正确组合的过程,这些字符串一旦经过哈希处理,就会生成一个有效的块。副产品是交易的处理,回报是比特币的宝藏。

那么为什么要对其应用机器学习呢?嗯,目前的挖掘方法本质上是“蛮力”强化计算,试图猜测算法的正确输入。然而,比特币的一个关键特征是区块链——迄今为止挖掘的每个区块的完整记录,以及用于挖掘它的输入参数。

事实上,区块链包含 50 万个“问题”的例子,以及解决方案。在机器学习领域,他们称之为“训练数据集”😃

区块链——准备训练数据

AutoML Tables 允许用户上传排列在表格中的大型数据集——大表数据集或更简单的——一个. csv 文件。

如前所述,挖掘比特币区块是对一组输入参数应用哈希算法(两次)的过程。这些参数经过哈希处理后,构成了“块头”的一部分,块头必须以多个前导零开头,这由难度决定。一旦产生的哈希有效,它就会存储在区块链中,供所有人查看(和验证)。它是一个 80 字节的字符串,由以下内容组成(单击图片了解更多信息):

添加描述

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

除了版本、Bits (target)和 hashPrevBlock 是固定的之外,其他参数由挖掘器决定并在散列时递增。然而,当与其他人合作挖掘时——时间和 MerkleRoot 也由挖掘池决定,留给我们的只是增加和猜测 Nonce。因此,它将作为我们的目标和我们的机器学习模型的输出,这很好,因为 AutoML 表只能有一列设置为目标。

为了将数据保存到一个. csv 文件中,我启动了一个完整的比特币节点,在等待它与网络同步后(等了又等…)—运行“bitcoin-cli getblock ”,进行一些剪切并保存到文件中,然后以之前的 Hash 作为输入再次运行,如此向后迭代区块链。结果看起来像这样:

添加描述

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

为 AutoML 表添加标题行以获取列名是很重要的。

谷歌云自动表

第一步是将我们的训练数据导入到 AutoML 表中。完成后,我们将看到“Schema”屏幕,在这里我们选择 ML 模型的“目标”——它将输出的字段。

添加描述

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

AutoML 还可以帮助从数据中提取验证集,应用加权列,甚至处理时间序列数据。

但是等等!我们已经发现了一个问题——AutoML 自动检测列数据类型,并挑选了几个字段作为“分类的”。这很好,但是在我们的例子中,因为值是唯一的,所以有多少训练行就有多少类别,而实时数据永远不会匹配任何类别!

如果我们进入分析页面,我们可以看到选择了太多类别(蛋糕是第 1 页,共 4 页…)

添加描述

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

这实际上是 AutoML 表的一个很好的特性——它允许我们在开始训练之前就发现数据中的问题。我们可以看到我们有许多不同的值(没有重复的行),以及每个字段与我们的目标的相关性,这在我们的例子中是低的,并且将产生差的结果。

由于重要字段的相关性较低,当我们进入训练阶段时,我们选择忽略更静态的列,以便我们的模型可以专注于重要的列:

添加描述

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

我开始训练这个模型,结果和预期的一样——非常高的平均误差,意味着我们的模型不会产生任何有意义的结果。

第二次尝试—逐字节

鉴于上述情况,我尝试将训练数据修改为非分类值。这也将允许我们使用 Tensorflow + Keras 在本地训练一个模型进行比较。

Tensorflow 希望输入采用 Bytearray 的形式,取值范围为 0 到 255。我把区块链的字段一个字节一个字节的拆分,结果看起来是这样的:

添加描述

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

我们的数据现在有 76 个字段,每个字段代表块头的 1 个字节,最后 4 个字节是最后一个数字字段——我们的目标 Nonce。

再次将数据导入 AutoML 表,它将显示为数字:

添加描述

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

看起来很有希望,与目标的相关性均匀分布在所有列中。不幸的是,培训又一次产生了糟糕的结果:

添加描述

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

巨大的错误率,高平均平均百分比误差(越低越好)。

验证-使用张量流

糟糕的结果是 AutoML 表中的错误,还是只是人工智能无法学习的训练数据的复杂性?为了验证这一点,我求助于古老的 Tensorflow & Keras 进行一些本地培训。

Tensorflow 以 Bytearray 的形式期待数据,正如我们在第二次尝试中所做的那样。这是如何准备的-

添加描述

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

我们训练一个全连接的神经网络,输出 4 个字节,我们将连接这些字节以形成我们的随机数-

添加描述

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

仅仅几个时期的训练结果就已经说明了同样的问题:

添加描述

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

请注意,尽管平均绝对误差没有 AutoML 表中的高,但精度却“固定”在 0.2757。

这不是巧合。因为我们正好输出 4 个字节,这个准确度分数只能意味着神经网络不能正确地学习和预测。

原因?要么是网络不够大——这不太可能,因为我们至少会看到不同时代之间的一些改进,

或者数据在输入和目标之间不包含可检测的相关性。

我想就这样吧!看到一个简单的 SHA256 和足够的“盐”如何产生足够的熵来使区块链真正健壮和不可破解,真是令人惊讶!

至少在我们推出大枪之前…请继续关注第二轮——用富士通量子退火器破解比特币!

德罗·詹斯勒

crawlab——网络爬虫的终极实时仪表板

原文:https://towardsdatascience.com/crawlab-the-ultimate-live-dashboard-for-web-crawler-6c2d55c18509?source=collection_archive---------14-----------------------

来监控你所有的爬虫!

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

最近,我发现了一个非常有趣而又强大的项目。虽然这个项目才开始 6 个月,但是已经有大约 24k 个赞了。该项目于 2019 年 3 月刚刚启动,从以下几点来看,它似乎很有前途。

  1. 能够为网络爬虫监控不同种类的语言。比如 Python,NodeJS,Go,Java,PHP 以及各种网络爬虫框架包括 Scrapy,Puppeteer,Selenium。
  2. 包括一个漂亮的实时仪表板。
  3. 能够可视化的数据抓取,他们可以通过点击一个按钮下载。
  4. 你只需输入 XPath 和 URL 就可以创建一个爬虫,即所谓的“可配置爬虫”(不幸的是,最新版本 v0.3.0 已经暂时禁用了这个功能,参考可以在这里找到

Pyspider vs Crawlab

以前我分享过 Pyspider 是最棒的监控工具之一,如果你没有读过,你可以点击下面的链接来阅读。

[## 为什么 Pyspider 可能是初学者最好的刮擦仪表板之一

py spider——竞争对手监控指标的实际应用

towardsdatascience.com](/pyspider-a-practical-usage-on-competitor-monitoring-metrics-c934d55f9c9a)

嗯,它们确实有一些相似之处,例如,它们都是爬虫程序的伟大仪表板,它们可以被调度,有一个令人印象深刻的仪表板来可视化…但是,如果你想知道显著的区别,在这里你去:

  1. Pyspider 在可视化抓取网站的旅程方面更胜一筹。
  2. 如果你想集成不同的语言或网络爬虫框架,Crawlab 更好。
  3. Crawlab 是用 Golang 写的,一般效率更高,速度更快。

案例研究—将 Scrapy spider 集成到 Crawlab

第 1 部分—安装 Crawlab

先决条件—在您的笔记本电脑上安装 Docker。

version: '3.3'
services:
  master: 
    image: tikazyq/crawlab:latest
    container_name: master
    environment:
      CRAWLAB_API_ADDRESS: "localhost:8000"
      CRAWLAB_SERVER_MASTER: "Y"
      CRAWLAB_MONGO_HOST: "mongo"
      CRAWLAB_REDIS_ADDRESS: "redis"
    ports:    
      - "8080:8080" # frontend
      - "8000:8000" # backend
    depends_on:
      - mongo
      - redis
  mongo:
    image: mongo:latest
    restart: always
    ports:
      - "27017:27017"
  redis:
    image: redis:latest
    restart: always
    ports:
      - "6379:6379"

复制上面的代码,保存为docker-compose . yml。然后在同一个目录中,在您的终端中键入命令 docker-compose up 。docker 映像将被下载到您的本地。

第 2 部分—启动 Crawlab 并登录

在您的浏览器上导航到 localhost:8080,您将能够看到如下所示的登录页面。

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

默认用户名:admin

默认密码:admin

第 3 部分—上传 Scrapy 项目

转到这个 URL ,然后点击添加蜘蛛按钮,如下图所示。

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

我正在为 gadgets now 网站使用我的爬虫。

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

上面的快照是我的 scrapy spider 目录,向下一级到包含 scrapy.cfg 的目录(用红框突出显示),然后压缩这 3 个项目。最后,上传 zip 文件。

第 4 部分—获取 MongoDB 的 IP 地址

检索该 docker 图像的 docker ID:mongo:latest。您可以使用下面的命令查看 docker id。

docker ps

然后按照下面的命令输入 docker id:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <input your docker id here>

接下来,您将在 docker 容器中获得您的 MongoDB 的 IP 地址。在我的例子中,IP 地址是 172.18.0.2。

第 5 部分—输入 IP 地址并修改 pipelines.py

import osfrom pymongo import MongoClientMONGO_HOST ='172.18.0.2'
MONGO_PORT = 27017 
MONGO_DB = 'crawlab_test'class GadgetsnowPipeline(object):
    mongo = MongoClient(host=MONGO_HOST, port=MONGO_PORT)
    db = mongo[MONGO_DB]
    col_name = os.environ.get('CRAWLAB_COLLECTION') 
    if not col_name:
        col_name = 'test'
    col = db[col_name]def process_item(self, item, spider):
        item['task_id'] = os.environ.get('CRAWLAB_TASK_ID')
        self.col.save(item)
        return item

这是修改后的 pipelines.py 的 Python 脚本。我想强调以下几点:

  1. 输入我们之前获得的 MongoDB 的 IP 地址:MONGO_HOST = ’ 172.18.0.2 '。
  2. 复制上面的process_item函数,并将其替换到您原来的 pipelines.py 文件中。
  3. MONGO_DB 的值可以是 MongoDB 中您想要的任何数据库名称,对于我的例子,我将其设置为crawlab_test

第 6 部分—在 items.py 中添加两个新字段

task_id = scrapy.Field()
_id = scrapy.Field()

这两个字段需要添加到items.py中。

首先,task_id是您已经执行的每个任务的标识符,您可以在 spider - > spider_name - >任何任务- >概览选项卡中查看它。

其次,_id是 MongoDB 中每个对象的惟一标识符。

第 7 部分—运行您的蜘蛛

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

点击你新上传的蜘蛛,然后输入执行命令。因为我的 Scrapy 爬虫的名字是 gdgnow,所以我的命令应该是:

scrapy crawl gdgnow

然后,先点击保存按钮,再点击运行按钮开始刮削。

第 9 部分——可视化结果

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

以我的爬虫为例,上面的快照显示了我的爬虫的输出,最重要的是,您可以通过点击下载 CSV 按钮下载 CSV 格式的文件。

对于item_desc字段,它显示的是undefined,因为我的item_desc是 JSON 格式的,但是 Crawlab 还不支持输出 JSON 字段。如果您希望在输出数据中包含 JSON 字段,目前唯一的选择是登录包含 MongoDB 的 docker,crawlab 将数据传输到这个 docker 并从中提取数据。

展示相当惊人,向 Crawlab 的所有开发者致敬!

最后的想法

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

非常感谢你耐心阅读到最后。Crawlab 仍处于早期阶段,但它是一个非常有前途的爬虫框架,特别是在监视多个网络爬虫方面。

由于这只是对 Crawlab 的一个简单介绍,我还没有包括 Crawlab 的所有功能,例如,cron job,如何集成其他网络爬虫的框架等等。如果你真的想让我分享更多关于 Crawlab 的内容,请在下面的评论,我会为此再写一篇文章!

关于作者

低伟鸿是 Shopee 的数据科学家。他的经验更多地涉及抓取网站,创建数据管道,以及实施机器学习模型来解决业务问题。

他提供爬行服务,可以为你提供你需要的准确和干净的数据。你可以访问 这个网站 查看他的作品集,也可以联系他获取抓取服务

你可以在 LinkedInMedium 上和他联系。

使用 React 和 Flask 创建一个完整的机器学习 web 应用程序

原文:https://towardsdatascience.com/create-a-complete-machine-learning-web-application-using-react-and-flask-859340bddb33?source=collection_archive---------0-----------------------

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

Photo by Alvaro Reyes on Unsplash

我一直想开发一个完整的机器学习应用程序,其中我会有一个 UI 来提供一些输入和机器学习模型来预测这些值。上周,我就是这么做的。在这个过程中,我在 React 和 Flask 中创建了一个易于使用的模板,任何人都可以在几分钟内修改它来创建自己的应用程序。

项目亮点:

  1. 前端是在 React 中开发的,将包括一个表单提交输入值的单个页面
  2. 后端是在 Flask 中开发的,它公开预测端点,使用经过训练的分类器进行预测,并将结果发送回前端以便于使用

下面是 GitHub 回购。分叉项目并创建您自己的应用程序吧!

[## kb22/ML-反应-应用程序-模板

它是一个构建 React 应用程序并与 REST 端点进行交互以进行预测的模板。-kb22/ML-React-App-模板

github.com](https://github.com/kb22/ML-React-App-Template)

模板

反应

React 是一个 JavaScript 库,由脸书创建,旨在简化用户界面,使其易于开发和使用。它是前端开发的主要语言之一。你可以在这里读到它。学习 React 的最佳资源是它的文档本身,它非常全面且易于掌握。

烧瓶和烧瓶-RESTPlus

Flask 和 Flask-RESTPlus 允许我们在 Python 中定义一个服务,它将具有我们可以从 UI 调用的端点。你可以从我下面的文章中了解更多关于开发 Flask 应用程序的信息。

[## 使用 Flask、Flask RESTPlus 和 Swagger UI 处理 API

Flask 和 Flask-RESTPlus 简介

towardsdatascience.com](/working-with-apis-using-flask-flask-restplus-and-swagger-ui-7cf447deda7f)

描述

我用create-react-app创建了一个基本的 React 应用程序。接下来,我加载了bootstrap,它允许我们为每个屏幕尺寸创建响应性网站。我更新了App.js文件,添加了一个带有下拉菜单、PredictReset Prediction按钮的表单。我将每个表单属性添加到 state 中,并在按下Predict按钮时,将数据发送到 Flask 后端。我还更新了App.css文件,为页面添加了样式。

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

Template view

Flask 应用程序有一个 POST 端点/prediction。它接受 json 形式的输入值,将其转换为数组并返回到 UI。在实际应用中,我们将使用存储在classifier.joblib中的分类器使用相同的数据进行预测,并返回预测结果。

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

Prediction displayed on UI

Reset Prediction将从 UI 中删除预测。

启动模板

将回购克隆到你的电脑上,进入电脑,在这里打开两个终端。

准备用户界面

在第一个终端中,使用cd ui进入ui文件夹。确保您使用的是节点版本10.4.1。进入文件夹后,运行命令yarn install安装所有依赖项。

为了在服务器上运行 UI,我们将使用serve。我们将从全局安装serve开始,之后,我们将构建我们的应用程序,然后最后在端口 3000 上使用serve运行 UI。

npm install -g serve
npm run build
serve -s build -l 3000

您现在可以转到localhost:3000来查看 UI 已经启动并运行。但是它不会与仍未启动的 Flask 服务进行交互。所以,让我们开始吧。

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

UI

准备服务

在第二个端子上,使用cd service移动到service文件夹内。我们首先使用virtualenv和 Python 3 创建一个虚拟环境。你可以在这里阅读有关 virtualenv 的内容。激活环境后,我们将使用 pip 安装所有必需的依赖项。最后,我们将运行 Flask 应用程序。

virtualenv -p Python3 .
source bin/activate
pip install -r requirements.txt
FLASK_APP=app.py flask run

这将在127.0.0.1:5000启动服务。

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

Service

瞧啊。完整的应用程序现在可以正常工作了。耶!!

将模板用于自己的用例

为了理解为任何模型使用模板的过程,我将使用iris数据集并为其创建一个模型。该示例也可以在项目的example文件夹中找到。

创建模型

我在虹膜数据集上训练了一个DecisionTreeClassifier,它需要 4 个特征——萼片长度、萼片宽度、花瓣长度和花瓣宽度。然后,我使用joblib.dump()将模型保存到classifier.joblib。分类器现在可用于预测新数据。

更新服务

接下来,我在一个文本编辑器中打开了文件app.py(Sublime Text 就是其中之一)。我取消了对行classifier = joblib.load(‘classifier.joblib’)的注释,以便变量classifier现在保存训练好的模型。

在 post 方法中,我做了以下更新:

首先,我使用classifier.predict()得到预测。接下来,我为这些类创建了一个映射,0 表示Iris Setosa,1 表示Iris Versicolour,2 表示Iris Virginica。我终于返回了result键中的预言。

*更新:*正如马丁斯·恩塔尔斯指出的,我忘了说我们也需要更新模型,这样它才能正确工作,并且在 Swagger UI 中有更新的模型。

从要点中可以看出,我已经更新了字段名、它们的类型为Float、描述和帮助文本。同样的情况现在也将反映在 Swagger 中。

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

Updated model in Swagger UI

更新用户界面

该表单由行内的列组成。因此,由于我有 4 个特性,所以我在 2 行中添加了 2 列。第一行将有萼片长度和萼片宽度的下拉列表。第二行将有花瓣长度和花瓣宽度的下拉列表。

我首先为每个下拉列表创建了一个选项列表。

接下来,我定义了两行,每行两列。每个下拉选择看起来像下面的代码:

对于每个下拉菜单,我们必须更新<Form.Label></Form.Label>中的文本。我们还将命名每个选择组。假设名称是petalLength,那么我们设置值为{formData.petalLength},名称为“petalLength”。正如我们在上面的{petalLengths}中看到的,选项是使用我们在<Form.Control></Form.Control>中定义的名称添加的。一个<Form.Row></Form.Row>中的两个这样的组将构成我们的 UI。

状态也必须用formData中的相同名称更新,默认值为各个下拉列表中的最小值。构造函数如下所示。如您所见,状态已经更新为formData带有新的键。

添加新的背景图像和标题

在 app.css 中,将背景图片的链接改为自己的链接。我添加了一张 Unsplash 的花的图片。我还将标题更新为Iris Plant Classifier,并将页面标题也更新到了public文件夹中的index.html文件中。

结果

应用程序现在可以使用这个模型了。使用npm run build构建 UI 后,重启两个服务。该应用程序如下所示:

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

Main Page

对于某些特征值,按下Predict按钮,模型将其归类为Iris Setosa

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

有了新的特征值,模型预测植物为Iris Versicolour

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

结论

如您所见,在本文中,我讨论了一个 ML React 应用程序模板,它将使创建完整的 ML 应用程序变得简单快捷。

针对您自己的使用案例尝试该应用程序,并分享您的反馈。我很乐意收到你的来信。

为星际争霸 2 创建一个定制的健身房环境

原文:https://towardsdatascience.com/create-a-customized-gym-environment-for-star-craft-2-8558d301131f?source=collection_archive---------29-----------------------

在本帖中,你将能够学习什么是健身房环境,以及如何以地图 DefeatZerglingsAndBanelings 上的 PySC2 为例创建一个 OpenAI 定制的健身房环境。

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

OpenAI Gym x Star Craft 2

目前,有多种强化学习框架可用(例如,OpenAI 基线、稳定基线、TFAgent、多巴胺和 TensorForce 等。)各有利弊。然而,如果您想在各种应用程序环境下使用这些工具,最常见和最方便的方法是构建一个定制的健身房环境。

健身房环境

那么什么是健身房环境呢?

在我们开始回答之前,让我们回顾一下强化学习的过程。

强化学习基本上是一个马尔可夫决策过程(MDP ),在这个过程中,主体将根据对环境的观察采取一些行动,以换取反馈。根据反馈,无论是积极的还是消极的,代理人所使用的决策策略将相应地加强或削弱。

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

MDPs

MDP 需要两个关键组件,即行动和对环境的相应观察。由于不同的环境有不同的观察和行动空间,为了迎合环境不断变化的需求而重新发明各种算法是非常耗时和不切实际的。因此,提出一个可以表示各种设置并可以轻松插入多个框架的标准化环境似乎是一个可行的解决方案。

这就是健身房环境发挥作用的地方。健身房环境为强化学习过程提供了一个标准化的界面。

在健身房环境中,__init__函数是用于初始化环境。在训练过程中,动作通过一个step函数传递给环境,新的观察作为返回。动作观察空间都被编码到[gym.spaces](https://github.com/openai/gym/tree/master/gym/spaces)中,用标准化的数字表示。reset功能用于初始阶段或每集结束时重置环境。close学习过程结束时调用函数,正确终止环境。此外,您还可以定义一个render函数来在每一步之后渲染环境。

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

A gym environment structure

下面是一个健身房环境的框架代码:

建立一个定制的健身房环境

现在让我们用星际争霸 2 (SC2)建立一个定制的健身房环境。要了解更多关于 SC2 和 pysc2 的信息,请参考 deepmind git 资源库。

因为我们将使用来自 SC2 的原始观察和操作,所以我们需要安装 pysc2 的开发分支来完成这里的教程。

要安装 pysc2 的开发分支:

git clone [https://github.com/deepmind/pysc2.git](https://github.com/deepmind/pysc2.git)
git checkout -t origin/dev
pip install -e .

要启动一个定制的健身房环境,我们需要创建下面的文件结构,如 OpenAI 所述:

gym-foo/
  README.md
  setup.py
  gym_foo/
    __init__.py
    envs/
      __init__.py
      **foo_env1.py
      foo_env2.py**
      ...

配置 setup.py 文件和所有的 init。py 文件可以在这里查看。因为我们将主要关注于 foo_env.py 的实现,所以我包含了一个文件结构的框架,您可以直接下载。

envs 文件夹中,让我们创建一个名为*defeat _ zeglings _ banelings _ env . py 的环境文件。*这将是我们的健身房环境文件,我们将使用以下代码开始在这里创建我们的环境:

注意到kwargs被传递给了__init__函数。这用于使用特定设置初始化 pysc2 环境。

我们将使用观察和操作定义一个默认设置来初始化微型地图 DefeatZerglingsAndBanelings 的 pysc2 环境:

players由于设置需求,规范是需要的,虽然它在这里没有做任何事情。realtime如果用于训练,可以设置为假。

接下来,我们将开始初始化 gym 和 pysc2 环境:

env用于存储 pysc2 游戏环境的实例。marinesbanelingszerglings定义为保留对应的部队。我们为action_space定义了大小为 123 的离散动作,包括站位、上移、下移、侧移以及用不同的单位攻击不同的目标。对于observation_space,我们定义了一个 19x3 的 2D 矩阵,其下限和上限分别设置为 0 和 64。观察空间的每一行都将包含战场上每个单位的信息,包括坐标和 HP。

现在,我们需要从reset函数初始化环境,因为它将在最开始被调用:

如果self.env尚未设置,它将首先调用init_env函数,用特定设置初始化 pysc2 环境。然后一切都会恢复原状。原始观测值将由get_derived_obs函数处理,它将返回一个派生的 19x3 观测值矩阵。

接下来,我们将填充step功能。让我们看看完整的代码:

step函数中,take_action会消耗一个动作值(从 0 到 122),映射到一个游戏内动作并相应执行。之后,将计算导出的观测值。最后,返回四个值,包括导出的观察值、先前动作获得的奖励、用于重置环境的情节结束指示符和用于调试的诊断信息字典。

最后,我们即将在这里完成定制的健身房环境。由于我们不会触及render函数,剩下的唯一事情就是用close函数正确关闭 pysc2 游戏环境:

瞧啊。现在,我们为 SC2 定制了一个工作环境。完整的环境代码可以从这里下载。

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

如果您已经知道如何从这一点继续定制环境,那么您可以在这里停下来享受一下。否则,我会在下一节中包含一个简短的演示,演示如何使用我们创建的强化学习框架。

稳定基线

出于演示目的,我们将在这里使用稳定的基线。要安装稳定的基线,请遵循其官方文档页面中的说明。

除了安装稳定的基线,我们还需要设置我们自己刚刚创建的定制环境。为此,切换到 sc2env 根目录并输入以下内容:

pip install -e. 

一旦安装过程完成,我们就可以开始使用 PPO2(您选择的算法)轻松地在我们自己的环境中进行训练。

代码如下:

培训就像使用scikit-learn模型一样简单:

  1. 指定要使用的型号(本例中为 PPO2)。
  2. 使用.learn()开始学习。
  3. 使用.save()保存训练好的模型。

请注意,PySC2 环境需要absl包。

如果在 Windows 系统上运行,我们将能够在训练时看到渲染的游戏:

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

否则,如果它运行在 Linux 系统上,我们可以使用 headless 模式加快训练速度。

为了监控训练过程,tensorboard 得到了本机支持。我们需要做的就是在定义模型时指定日志目录。

摘要

现在你有了工具,但这并不意味着你将能够使用我们创造的环境直接获得智能人工智能。你还可以做更多的事情,让它变得有趣和聪明。你可以定义一些基本的动作,比如撤退或者攻击最近的。你可以提供更多的观察信息。你可以录制一些游戏,进行模仿学习或行为克隆。你也可以创建你自己的迷你地图来帮助你的 AI 建立一些课程来逐步学习技能。

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

Result from environment with predefined basic actions suggested above

最后,我们已经到了这篇文章的结尾。在这篇文章中,我包含了一个使用 pysc2 创建定制健身房环境的教程,并演示了如何使用具有稳定基线的定制健身房环境。

希望这些有帮助。敬请期待,再见~

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

使用 Google Data Studio 创建仪表板,并使用它制作自动报告

原文:https://towardsdatascience.com/create-a-dashboard-with-google-data-studio-and-make-automatic-reports-with-it-db42088ad879?source=collection_archive---------15-----------------------

Google Data studio 是一个免费的交互式仪表盘,可以帮助你创建报告。这是我刚刚创建的一个报告的例子。

我已经将仪表板连接到两个数据源:

  1. 谷歌分析(从客户网站获取数据)
  2. Youtube 频道

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

要使用 Google Data Studio,您只需要一个 gmail 帐户,接受条款和条件后,您就可以快速开始使用它。

创建新报告非常简单,您只需点击“空白报告”即可创建您自己的个性化报告,或者您可以使用现成的模板(您也可以在查看一些模板后创建您自己的个性化报告,以了解如何构建您自己的仪表板)。

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

Create your Blank Report or use a template

单击空白报告后,您将进入此页面,在此您可以为仪表板命名(左上角),还可以通过“创建新数据源”(右下角)连接到您的数据。如果您没有数据源可以使用,或者您只是想尝试一下,您可以使用 Google 提供的样本数据集。

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

Your Blank Report — Connect to the Data Source

谷歌已经为你的数据提供了便捷的接口,所以你应该很容易找到你想要的东西。以下是可用数据源连接器的示例:

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

Examples of some connectors

连接数据集后,您可以开始在报告中添加图表。请记住,您可以将同一个仪表板连接到多个数据源(一旦您添加了一个新图表,您就可以将它连接到您想要用于特定图表的特定数据源),因此您不需要为多个数据源创建多个仪表板。

要在报表中添加元素,真的很直观。只需点击您想要添加的图表,并将其放置在仪表板中您想要的位置,您还可以更改其大小,例如使其变大。还可以添加文本、图像和图形/线条。

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

Adding graphs

每个图表都可以在报告的右边部分进行个性化设置,在这里可以选择与哪个数据源相关、使用哪个指标以及个性化其风格。

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

Choose metrics and style for your graph

我们可以使用的一个很好的特性是数据范围。如果我们将此添加到报告中,将有可能更改我们要考虑用于分析的数据范围,并且它将自动更改基于此时间范围的所有图表,因此我们不需要为不同的时间间隔一次又一次地创建所有图表。

我们也可以使用记分卡,它有助于可视化某些特定的 KPI,不需要图表,如下例所示。

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

Scorecard

完成图表后,我们可以通过多种方式与他人分享:

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

Share the Report

按顺序,我们可以:

  1. 下载成 pdf 格式
  2. 创建自动邮件发送报告(您可以选择时间频率)
  3. 获取可共享的链接
  4. 有嵌入的代码把图表,例如在一些网页

希望这篇文章对您有用,并享受您的数据分析/报告!

如果你愿意支持我写其他类似的文章, 请我喝咖啡 😃

用 SQL 和 Javascript 创建一个漫威数据库,简单的方法

原文:https://towardsdatascience.com/create-a-marvel-database-with-sql-and-javascript-the-easy-way-573ccdf44673?source=collection_archive---------31-----------------------

维基百科是一个很好的数据来源,你可以在你的下一个项目中利用它

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

I know, this picture is mostly about DC, but this post is not only about Marvel and Lena Rose did a great job taking this picture.

在这篇文章中,我将解释如何使用维基百科、Javascript 和 SQL 创建一个漫威数据库(或 DC 数据库)。我们将制作一个灵活的工具,允许您创建不同的表格用于您的项目。这里解释的概念可以扩展到其他学科。这篇文章是写给那些没有时间学习维基数据系统中使用的修改的 sql 的复杂语法,但仍然想玩他们的数据的人的。

我拥有一个漫画数据库的最初原因是为了创建这种可视化效果,你将在本文结尾再次看到这一点:

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

Legend of Marvel & DC visualization: https://heberleh.github.io/comics-universe/

管道

这里的想法是通过以下步骤获得一个灵活的数据库:

  1. Wikidata 中查询表格并导出为 json 文件
  2. 创建一个 Alasql 数据库,并插入来自 json 文件的数据
  3. 使用创建的数据库执行 SQL 查询

1.从维基百科提取数据

维基百科背后有一个很棒的数据库和本体。点击此处进入查询系统:https://w.wiki/4iP

在上面的链接中,你会发现类似的内容(你会在那里找到更多相关信息):

在这段代码中,我选择的实体是漫画人物的实例,并且在虚构世界 漫威世界中。乍一看可能有点奇怪,但是这些代码都是维基百科本体的一部分。这就是他们如何处理冗余,并能组织和使一切工作!但是如何创建自己的查询呢?

首先,会帮助你。尝试键入wdt:<Ctrl+Space>。您注意到弹出了一个帮助工具提示。尝试键入的实例。您会看到’的’实例的代码是wdt:P31。使用同样的方法,现在对于一个,你将输入wdt:<Ctrl+Space>(这次没有“t ”!)和漫画人物*,回车,瞧,你得到了代码wd:Q1114461。*

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

<Ctrl+Space> opens the helper

O *好的,亨利,但是我不知道我们可以用什么,我没有时间学习维基百科的语言……*而且我理解你!因此,为了克服这一点,我们将在这里打开这一页巨头。这是维基百科条目代码 Q841372,庞然大物!现在看一看,看看有什么关于一个漫画人物的信息。将鼠标指针放在语句部分的项目上。例如,如果您将鼠标放在“实例”上,您将获得 P31 代码!因为它不是一个值,所以对这个值使用wdt

通过浏览该页面,您可以很好地了解可以使用哪些属性。暂停:如果你想创建一个数据库,但还不知道它会是什么,试试随机文章功能来获得见解。我们可以对任何维基百科页面做同样的事情。去官方维基百科网站搜索任何东西,比如说… 。现在检查左侧栏,寻找 Wikidata item 链接。

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

Wikidata link is in read on the left

单击,瞧,它显示了该项目的所有属性。我们看到我们通过使用wdt:P2067得到了质量,以及许多其他可能适用于其他类型金属的属性。

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

Each Wikidata entry has many properties. The tooltip tells you the property ID.

现在我们有了维基数据,我们将:

  1. 为感兴趣的属性创建查询
  2. 将结果下载为。json
  3. 始终跟踪 id(Wikidata 项目 URL)和标签

例如,我创建了一个性别查询。一个查询职业,以此类推。结果是一个文件夹有许多。我将把 json 文件加载到由许多表组成的数据库中。您可以对所有信息执行单个查询。在我的例子中,我希望它具有延展性,这样我就可以执行 JOIN、LEFT JOIN 和其他 SELECT 命令来获得不同的表。

事实上,我没有只获得漫威宇宙,而是丢弃了那个过滤器,获得了一个虚构角色实例的完整数据库(不仅仅是漫画角色——出于某种原因,这个不会查询美国队长)。所以,在我的 json 文件中,你可以找到漫威、DC 和其他人。生成的 jsons 在我的 GitHub 页面中找到。接下来,我将展示如何在 Javascript 中使用 json 文件和一个简单的 T21 SQL 数据库。

正如我在上一段中提到的,我的查询实际上是关于虚构角色类及其子类的。我还查询了伴侣和配偶,因此为此我使用命令|来定义两个 wdt:

注意,在上面的代码中,我不再过滤漫威了。对于更复杂的查询或处理列表,请参考 Wikidata 网站。另一个不错的选择是位于维基数据查询服务顶部的帮助按钮,在那里你可以找到例子和支持。

2.用 Javascript 创建 SQL 数据库

现在我们有了 json 文件,让我们将它们插入到 SQL 数据库中。为此,我们将使用一个名为 Alasql 的工具。使用 Alasql,您可以以不同的方式加载数据和创建表格(在这里阅读更多信息)。

这里,因为我们有来自 Wikidata 的 json,所以我们将对每个 JSON(文件)应用一个 SELECT 并插入到我们数据库的一个新表中,以便于访问。为了简化,我的代码将只包含两个表;你可以在这里找到完整的更新版本 。看起来是这样的:

我们准备好了。我们有一个数据库,可以通过调用let mydb = MarvelDB()来使用它,并像这样应用 SQL 命令:mydb.exec('SELECT DISTINCT abilityLabel from abilities')

3.最终代码和用法

我定义了一些测试来确保一切正常。它举例说明了我们数据库的用法。如果你不习惯测试,只考虑下面代码中的let result = this.db.exec(...)console.table(result),忽略其他部分。

上面的SELECT返回列charLabel,并重命名为name。它还连接了角色、性别和能力表,确保条目具有相同的角色 id ( char)。最后,它通过名为 agender 的特定性别进行过滤。关于这个数据库的更多例子,请到 GitHub 页面 -别忘了开始:)

本文描述了我为下面的可视化创建数据库的方式。你可以通过在台式机/笔记本电脑上访问这个网站与它互动(它可以在手机上打开,但互动是有限的)。

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

Marvel & DC visualization: https://heberleh.github.io/comics-universe/

这是我漫画人物系列的第一部分:

  1. 用 SQL 和 Javascript 创建漫威数据库,最简单的方法 [this]
  2. 可视化漫画人物的性别和超能力
  3. 用数据可视化比较漫威和 DC

欢迎添加私人注释和评论。谢谢你看我的文章!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值