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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

概率学习 VI:隐马尔可夫模型

原文:https://towardsdatascience.com/probability-learning-vi-hidden-markov-models-fab5c1f0a31d?source=collection_archive---------1-----------------------

马尔可夫链和马尔可夫模型变得简单

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

**朋友们,你们好!**这是我们概率学习系列的第六篇文章,列出来是为了防止你错过之前的文章:

我强烈建议你阅读它们,因为它们很有趣,充满了关于概率机器学习的有用信息。然而,如果你不想读它们,那绝对没问题,这篇文章不需要通过一点概率知识就能理解。

此外,不要担心,我不会在本文中包括任何复杂的数学:它的目的是奠定隐马尔可夫模型的理论背景,展示如何使用它们,并谈论它的一些应用。

我们已经见过 Bayes 牧师了,今天我们要去见另一个在博弈论和概率世界里非常有影响力的人。这不是别人,正是安德烈·马尔科夫,他把马尔可夫链放到隐马尔可夫模型中

隐马尔可夫模型是概率机器学习世界的一个分支,对于解决涉及处理序列的问题非常有用,如自然语言处理问题或时间序列。一会儿,我们会看到这是为什么,但首先,让我们了解一下马尔可夫。

最后,在我们开始之前,这里有一些额外的资源可以让你的机器学习事业突飞猛进:

*Awesome Machine Learning Resources:**- For* ***learning resources*** *go to* [***How to Learn Machine Learning***](https://howtolearnmachinelearning.com/books/machine-learning-books/)*! 
- For* ***professional******resources*** *(jobs, events, skill tests) go to* [***AIgents.co — A career community for Data Scientists & Machine Learning Engineers***](https://aigents.co/)***.***

这个安德烈·马尔科夫是谁?

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

Image of Andrei Markov

安德烈·马尔科夫(1856-1922)是一名俄罗斯数学家,在圣彼得堡大学教授概率论,同时也是一名非常活跃的政治人物。他研究了连续分数、中心极限定理和其他数学成果,然而,他最被人们铭记的是他在概率论方面的工作,特别是对随机过程的研究;我们一会儿将要讨论的马尔可夫链。

马尔可夫链:概率序列

让我们从马尔可夫提议的最基本元素开始:马尔可夫链。在概率论中,马尔可夫链或马尔可夫模型是一种特殊类型的离散随机过程,其中一个事件发生的概率仅取决于紧接在之前的事件。

潜在的假设是,给定现在,未来独立于过去。换句话说,如果我们知道系统或变量的当前状态或值,我们不需要任何过去的信息来尝试预测未来的状态或值。

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

Example of a two state Markov Chain

马尔可夫链通常由一组状态和每个状态之间的转移概率定义。在上面的例子中,显示了两个状态的马尔可夫链:我们有状态 A 和 B 以及四个转移概率:再次从 A 到 A,从 A 到 B,从 B 到 A,再次从 B 到 B。这些转移概率通常以矩阵的形式表示,称为转移矩阵,也称为马尔可夫矩阵。

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

One possible transition matrix for this chain

元素 ij 是从状态 j 过渡到状态 i 的概率。在某些情况下,会使用转置符号,因此元素 ij 代表从状态 I 到状态 j 的概率。因此,我添加了‘to’和‘from’只是为了澄清。总的来说,该系统看起来像这样:

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

Diagram of a Markov Chain with the transition probabilities

我们如何计算这些概率?这个答案你可能已经听过一百万次了:来自数据。

想象一下我们的马尔可夫链中的状态是晴天和雨天。为了计算从一个状态到另一个状态的转移概率,我们只需要收集一些代表我们想要解决的问题的数据,计算从一个状态到另一个状态的转移次数,并对测量结果进行归一化。下图显示了在我们的示例中如何实现这一点。

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

Calculations of transition probabilities from data

目前,马尔可夫链看起来就像任何其他的状态机,其中我们有状态和状态之间的转换。然而,在这篇文章的后面,我们将会看到它们是多么的特别。

好了,现在我们知道了什么是马尔可夫链,以及如何计算相关的转移概率,接下来我们继续学习隐马尔可夫模型。

隐马尔可夫模型:发现未知

隐马尔可夫模型是一种概率模型,它试图基于一些其他的 观察到的变量来找到具有某个值的某个 隐藏变量的值或概率。这些变量通常被称为隐藏状态和观察状态。

一个系统的状态可能只是部分可观测的,或者根本不可观测,我们可能不得不根据另一个完全可观测的系统或变量来推断其特征。

使用前面的示例,想象我们添加了以下信息。每天,我们都有可能接到住在不同大陆的最好的朋友约翰的电话,这种可能性取决于当天的天气情况。利用后一种信息(如果我们接到电话或没有接到电话- 观察变量 ) 我们想推断前一种信息(约翰生活的大陆的天气-隐藏变量)

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

Hidden and observed variables for our problem

这里显示的概率定义了约翰在某一天给我们打电话的可能性,这取决于该天的天气,这些概率被称为 发射概率 。他们定义了在给定隐藏变量的某个值的情况下,看到某个被观察变量的概率。

知道了这些概率,加上我们之前计算的转移概率,以及隐变量的先验概率(有多可能是晴天或雨天),我们就可以试着找出某段时间的天气,知道约翰在哪一天给我们打了电话。

让我们用简单的统计数据来看看如何解决这个问题:假设约翰连续两天没有给我们打电话。最有可能的天气情况是什么?为此,我们首先需要计算先验概率(即,在任何实际观测之前晴天或雨天的概率),这是我们从与转移概率相同的观测中获得的。

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

Calculations of prior probabilities

现在,我们准备解决我们的问题:连续两天,我们没有得到一个迹象表明约翰还活着。那么最有可能的天气情况是什么?正如我们在下图中看到的,我们有 4 种可能的情况要考虑:晴天接着晴天,晴天接着下雨,下雨接着晴天,最后下雨接着下雨。

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

Diagram of the process of calculating the probability for one weather scenario

在上图中,我们选择了第二个选项(晴天,然后下雨),并使用先验概率(第一天在没有任何观测的情况下是晴天的概率),从晴天到雨天的转换概率,以及在两种情况下没有接到电话的发射概率,我们通过简单地乘以所有上述概率计算出了整个事件发生的概率。

我们将不得不为每一个可能的天气场景(我们的例子中还剩 3 个)这样做,最后我们将选择一个产生最高概率的场景。(这叫做最大似然估计,在我之前的一篇文章中有完整的描述)。

连续两天,我们必须计算四种可能的情况。三天之内,我们会有八个场景。一共四天十六天。如果我们想计算一整周的天气,我们将有 128 种不同的情况。随着可能情况的数量呈指数级增长,很容易看到这种情况会如何失控,从而促使我们使用更实用、更智能的技术。

这不仅是因为我们有更多的情景,而且在每一个情景中,我们都有更多的计算,因为在链条中有更多的转变和更多的排放概率。

这就是马尔可夫链派上用场的地方。

让我们刷新一下马尔可夫链的基本假设:给定现在,未来独立于过去”。

知道了这一点,隐马尔可夫模型的操作原理是,它逐渐地存储从长度 1 到 n-1 的场景链的概率,n 是我们想要推断隐藏状态的链的长度,而不是计算许多不同场景的概率。

这是什么意思?假设我们想在知道约翰给我们打电话的日子的情况下计算一整周的天气情况。为了计算最后一天的天气状况,我们将计算出那天是晴天的概率,给出通向晴天的最佳路径,对下雨的星期天做同样的事情,并只选择最高的一个。

这大大简化了前面的问题

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

Intuition behind a Hidden Markov Model

递归地,为了计算周六晴天和雨天的概率,我们会做同样的事情,考虑减少一天的最佳路径。这意味着,在任何给定的一天,为了计算第二天可能的天气情况的概率,我们将只考虑在那一天达到的最好的概率——没有先前的信息

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

At each given day we only use the BEST probabilities up to that day

在实践中,这是通过从第一时间步开始,计算观察隐藏状态的概率并选择最佳状态来完成的。然后,用那个最好的,我们在第二天做同样的事情,以此类推。让我们看看在我们的例子中是如何做到这一点的。

利用先验概率和排放概率,我们计算出第一天 T2 是晴天还是雨天的可能性。

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

Calculations of the probabilities of Monday being sunny and rainy

让我们看看第二天我们将如何继续:使用先前计算的晴天和雨天的最佳概率,我们将为第二天计算同样的概率,但是不使用我们上次使用的先验,我们将使用晴天和雨天的最佳计算概率。

为了做到这一点,我们首先来看看实际的观察结果是什么:假设星期一是晴天。那发生的概率是 0.375。现在,让我们来看看星期二是晴天:我们必须将星期一是晴天的概率乘以从晴天到晴天的转换概率,乘以晴天没有被约翰打电话的排放概率。这给了我们一个概率值 0,1575。

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

Calculations of probabilities of sunny and rainy for Tuesday

现在,假设星期一下雨。星期二是晴天的可能性有多大?为此,我们将周一下雨的最高概率(0.075)乘以从下雨到晴天的转换概率(0.4)乘以晴天且没有接到电话的排放概率,就像上次一样。这导致概率为 0.018,并且因为我们计算的前一个(周一晴和周二晴)更高(它是 0.1575),我们将保留前一个。

我们现在必须为一个多雨的星期二做同样的事情,保持两个计算概率中的最高值。如果我们继续这个链条,现在计算周三的概率:

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

Calculations of probabilities for Wednesday

如果我们对整个星期都这样做,我们会得到七天中最可能的天气情况,如下图所示:

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

Weather conditions for the whole week

通过这个过程,我们可以推断出任何时间段最可能的天气情况,只需知道 John 是否给我们打过电话,以及来自历史数据的一些先验信息。

就是它!现在你已经知道了隐马尔可夫模型背后的基本原理,让我们看看它的一些实际应用。

隐马尔可夫模型:应用

如前所述,hmm在处理序列时非常出色。正因为如此,它们在自然语言处理中被广泛使用,在这里短语可以被认为是单词序列。

hmm 用于许多 NLP 应用程序,但是让我们举几个具体的例子来巩固您头脑中的想法。

论文使用统计方法的实时在线无约束手写识别 讲述了使用 HMMs 将手写文档翻译成数字文本的**。**

我手机上有一个名为“钢笔打印”的应用程序,就是做这个的。它将手写文本作为输入,将其分解成不同的行,然后将整个内容转换成数字格式。下图显示了这样一个例子。

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

Pipeline of the Pen to Print app

有很多这样的应用程序,大多数时候它们使用一些概率方法,比如我们看到的隐马尔可夫模型。

另一篇论文, 为基于 HMM 的语音合成考虑全局方差的语音参数序列建模 做了类似的事情,但是用语音代替文本。

我认为,我们所有的虚拟助手,如 Siri、Alexa、Cortana 等,都是在以下过程中工作的:你用某种行动号召短语唤醒他们,他们开始积极倾听(或者他们是这么说的)。在这之后,你说的任何话,比如对某种音乐的请求,都会被麦克风拾取并从语音翻译成文本。然后这些文本被处理,我们得到想要的输出。

hmm 的其他用途包括从计算生物学到在线营销或为在线商店发现购买因果关系。

结论

我们已经看到了什么是隐马尔可夫模型,以及它们被用来解决实际问题的各种应用。未来会有更多概率学习的帖子,请关注我的,敬请关注!

就这些,我希望你喜欢这个帖子。请随时在 LinkedIn 上与我联系,或者在 Twitter 上关注我,地址是:jaimezorno。还有,你可以看看我其他关于数据科学和机器学习的帖子这里 。好好读!

额外资源

如果你想了解更多一点,从这篇文章中澄清你的学习,或者深入 HMMs 的数学,我在这里留下了一些我认为可能会很有用的信息。

有关机器学习和数据科学的更多资源,请查看以下资源库: 如何学习机器学习 !有关职业资源(工作、事件、技能测试),请访问AIgents.co——数据科学家职业社区&机器学习工程师

请尽情享受,如有任何疑问,请随时联系我!

人工智能冬天来临的概率

原文:https://towardsdatascience.com/probability-of-an-approaching-ai-winter-c2d818fb338a?source=collection_archive---------12-----------------------

这篇文章讨论了人工智能领域是否正在走向另一个人工智能冬天的问题。

动机

行业和政府都在人工智能领域投入了大量资金,在过去 5 年里,许多人工智能相关的初创公司成立了。如果另一个人工智能冬天即将到来,许多人可能会失业,许多创业公司可能不得不关闭,就像以前发生的那样。此外,根据麦肯锡公司的数据,到 2025 年,即将到来的冬季和持续的成功之间的经济差异估计至少有数百亿美元。

本文的目的不是讨论人工智能的进步是否值得期待。相反,本文讨论和结果的目的是告诉读者人工智能研究有多大可能取得进展。

分析:是什么导致了人工智能冬天?

关于这两个 AI winters 的详细概述,请查看我关于这个主题的第一篇第一篇和第二篇第三篇中型文章。

在这一节中,AI 冬天的主要原因是从以上对以前冬天的讨论中提取出来的。

首先,可以观察到的一个重复模式是,最初点燃兴奋情绪,但后来证明是膨胀的承诺是人工智能冬天的主要原因。例如,在对结果进行诚实的评估后,政府资金在两次 AI 冬季都被削减了。这一进展被高估了,因为人工智能最初导致了各个领域的重大改进,非常快。这表明大部分工作已经完成,只有一些小问题需要解决。然而,后来的事实证明,这些问题一开始就不是那么小。莱特希尔报告,第一次人工智能冬季的主要贡献者说:“到目前为止,该领域的任何发现都没有产生当时承诺的重大影响。”同样,1984 年 AAAI 小组表示:“这种不安是由于担心对人工智能的期望可能过高[……]”

第二,经费的削减对两个人工智能领域的研究都产生了重大影响。在第一个人工智能冬天,Lighthill 报告导致英国除了两所大学之外的所有大学都被削减了资金,并进一步导致欧洲和美国的削减。在第二个人工智能冬天,DARPA 的资金减少了。此外,20 世纪 80 年代末许多人工智能相关创业公司的商业失败标志着第二次人工智能冬天。

第三,技术限制,如 20 世纪 60 年代经历的感知机,抑制了进步。感知器最初被认为很快就会“意识到自己的存在”,但当时它无法解决异或问题。同样,专家系统在 1980 年代也面临着局限性。他们不能解决像视觉或语言这样的基本问题,并且缺乏常识。

因此,在评估另一个人工智能冬季的可能性时,应仔细检查以下方面:

  1. 与实际结果相比的期望和承诺;
  2. 来自政府和行业的资金;
  3. 技术限制。

许多技术表现出与上述类似的模式。为了进一步缩小关注范围,有必要弄清楚 AI 是如何偏离其他技术的。尽管在某些方面相似,人工智能似乎很容易受到夸大的估计和技术限制的影响。人工智能不同于其他技术的一些原因是:

1.智力是高度多维的:

在某种程度上,人工智能研究人员认为,通过解决象棋,智力之谜将得到解决。这被证明是错误的,因为智力不仅仅包括有意识的、战略性的思考。象棋只是智能宇宙中的一个微小粒子。研究人员把它放在如此重要的位置是因为它对人类来说很难,这导致了第二个原因。

2.莫拉维克悖论

国际象棋需要更高层次的思维,在我们的进化史上是一种非常新的技能,这可能是为什么它对人类来说相对困难并因此与智力相关联的原因。另一方面,视觉是古老的,主要是潜意识的,这导致人们认为它很容易,但没有理由认为它没有更高层次的思考难,甚至更难。这是莫拉维克悖论,人们可以说人工智能研究人员已经成为这种说法的牺牲品,因为他们低估了我们下意识的过程,如感觉运动技能或常识。

3.与达到人类水平的智力相关的炒作和恐惧

正如 I. Jordan 指出的,对能够实现智能的机器的大肆宣传和恐惧很容易导致夸大其词,并引起媒体的关注,这在其他领域不太常见。

考虑到这些原因,可以用适当的框架来分析即将到来的人工智能冬天的可能性。

人工智能冬天来临的概率

随后,评估了即将到来的人工智能冬天的可能性。研究了人工智能及其公众接受的现状。此外,对于预先提取的关键区域,比较当前和历史的冬前时间。概括来说,这些领域是:

  1. 与实际结果相比的期望和承诺;
  2. 来自政府和行业的资金;
  3. 技术限制。

期望和承诺

许多公众人物表达的观点让人想起 20 世纪 50 年代早期人工智能研究人员的观点。通过这样做,前一组为未来的进步创造了兴奋,或炒作。例如,库兹韦尔不仅以预测奇点而闻名,人工超级智能将在 2045 年无处不在,而且人工智能将在 2029 年超过人类智能。以类似的方式,斯科特预测“到 2035 年,人类的思维没有理由也不可能跟上人工智能机器。”此外,Ng 将人工智能视为新的电力。

这种说法为人工智能设定了很高的期望,并引发了炒作。因此,炒作的现象和它如何与人工智能的当前状态相关被调查。

炒作和炒作周期

Gartner 的炒作周期是一个常用的工具。它有实际应用,让我们很容易做出预测,但它的有效性没有科学依据。首先,它不是为科学方法开发的工具。这是为商业决策制作的程式化图表。也就是说,已经有人尝试从经验上验证不同技术的炒作周期。可以得出结论,炒作周期是存在的,但其具体模式变化很大。

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

Figure 1: Gartner’s Hype Cycle

周期的关键阶段是高峰期和低谷期,在高峰期,人们的兴趣和兴奋程度最高,而在低谷期,最初的期望无法实现。在这里,人们对这个领域的兴趣是最低的。然后,油田慢慢恢复,并达到产量的稳定期。

正如门泽斯所证明的,炒作周期在 20 世纪 80 年代 AAAI 会议的与会人数中得到了很好的体现。首先,会议开始时,门票销售迅速增加,达到高峰,然后这些数字迅速下降。目前,NIPS 等会议的与会者人数达到甚至超过了 20 世纪 80 年代 AAAI 的峰值,而且他们的规模正在迅速扩大。

在人工智能初创公司的风险投资基金、职位空缺和收入电话提及中,也可以观察到对该领域兴趣的类似模式。炒作研究人员指出,覆盖的数量很重要,但它必须得到定性情绪的支持。媒体文章中的情感分析显示,从 2016 年到 2018 年,人工智能相关的文章变得积极 1.5 倍。尤其是 2016 年 1 月到 2016 年 7 月期间,情绪发生了转移。这一进步可能与 2016 年 1 月 Alpha Go 的公开发布以及 3 月战胜世界冠军 Lee Sedol 有关。

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

随着炒作周期的趋势,这可能导致另一个票房收入、资金和工作机会迅速暴跌的幻灭低谷。然而,AI 是一个描述许多技术的非常宽泛的术语。这使问题变得更加复杂,因为在人工智能这个大术语下的每项技术都有自己的炒作周期,而炒作周期之间以及与人工智能之间的相互作用,总的来说,仍然不清楚。

更进一步,对这些说法进行了更深入的研究,评估人工智能兴趣的快速上升是否只是夸大承诺的结果,或者这些说法是否有坚实的基础。

与专家意见的比较

现在,公众人物做出的声明和承诺被与领先的人工智能研究人员的调查相比较。2017 年,对 352 名机器学习研究人员进行了一项调查,这些研究人员在领先的会议上发表了论文。这项调查预测,高级机器智能在 45 年内出现的几率为 50%,在未来 9 年内出现的几率为 10%。然而,劳动力的完全自动化被预测要晚得多,有 50%的可能性在未来 122 年内发生。

这项研究呈现的结果与库兹韦尔等未来学家的预测相去甚远。此外,一项关于人工智能预测的元研究发现了一些证据,表明无论何时做出预测,高级机器智能的大多数预测都是在未来 20 年左右。本质上,这指向了人工智能未来预测的不可靠性。此外,对高级机器智能的每一个预测都必须持保留态度。

总之,在当前的人工智能格局中存在一个炒作周期模式,导致人们的兴趣很快可能会下降。此外,乐观的预测是由公众人物做出的,但经验证据质疑它们的有效性。

然而,像 Ng 这样将人工智能视为新的电力的言论,更多地是指该行业的现状。因此,接下来就要考察企业和政府的资助。

投资和融资

资金在人工智能研究中一直扮演着重要的角色。正如亨德勒指出的,由于现有的研究项目仍在继续,政府资金的削减只能在几年后才能感觉到。因此,随着时间的推移,新研究项目的缺乏变得明显起来。这意味着目前需要减少资金,才能在未来几年被察觉。

2018 年 4 月,欧盟成员同意就人工智能研究进行合作。发布了一份关于人工智能的通讯,在 2018 年至 2020 年期间为人工智能研究投入了 17 亿美元的资金。随后,2018 年 6 月,欧盟委员会提出创建数字欧洲资助计划,重点关注五个关键领域,总资助额为 92 亿欧元,其中 25 亿专门用于人工智能研究。

2018 年 3 月,美国政府提出了确保美国“仍然是人工智能的全球领导者”的目标。后来,在 2018 年 9 月,DARPA 宣布了一项 20 亿美元的活动,为下一波人工智能技术提供资金。作为直接反对,中国宣布了到 2030 年在人工智能方面领先世界的目标。因此,中国已经启动了几项人工智能计划。这些相互矛盾的说法促使许多人采用“人工智能竞赛”这个术语来指代美国和中国之间在人工智能领域的领导权之战。这类似于 20 世纪美国和苏联之间的太空竞赛,两国争夺太空旅行的主导权。当时,这场比赛引发了大量的资金和研究。同样,“人工智能竞赛”的心态可能会使未来几年的资金减少不太可能。这是对即将到来的人工智能冬天的一个有力支持,因为以前的冬天伴随着政府资金的减少。

另一个关键点是不断增长的人工智能产业。过去的人工智能研究人员一直非常依赖政府资助,但根据麦肯锡公司的数据,2016 年非科技公司在人工智能上花费了 260 亿至 390 亿美元,科技公司在人工智能上花费了 200 亿至 300 亿美元。

另一方面,2025 年的市场预测差异巨大,从 6.44 亿美元到 1260 亿美元不等。这种差异展示了即将到来的人工智能冬天和另一个繁荣时期之间的经济差异。

综上所述,政府资助非常扎实,“AI 竞赛”的心态使得这种情况很可能会持续下去。此外,该行业目前正在蓬勃发展。然而,市场预测却大相径庭。

为了确定哪个预测更有说服力,人工智能在过去几年取得的进展与对当前方法的批评有关。

评估进展

为了在适当的框架下查看对当前人工智能技术的批评,评估了从 2012 年到今天(2019 年 4 月)取得的进展。

正如我们之前看到的那样,人工智能和机器学习在许多方面都变得越来越受欢迎。一些关键事件在景观的形成中脱颖而出。2012 年,一个卷积神经网络以较大优势赢得了 ImageNet 竞赛。这与物体检测的进展相结合,彻底改变了计算机视觉的领域,从手工制作的特征工程到学习表示,从而使自动驾驶汽车在可预见的未来变得可行。在自然语言理解领域也取得了同样令人印象深刻的成果。深度学习已经启用了所有流行的语音助手,从 Alexa 和 Siri 到 Cortana。

深度神经网络的强化学习在游戏中取得了令人印象深刻的结果。2014 年,DeepMind 使用深度 q 学习器解决了 50 个不同的 Atari 游戏,而没有改变模型的架构或超参数。这种任务的灵活性是前所未有的,这导致他们很快被谷歌收购,并随后凭借 AlphaGo 和 AlphaStar 等成就领先于强化学习领域。

最后,在过去几年中,生成对抗网络(GAN)在生成例如人脸的图像方面已经取得了令人印象深刻的结果。
本质上,深度学习已经在许多行业取得了突破性的成果。

对深度学习的批评

在这一章中,讨论了对深度学习的批评。正如所证明的那样,深度学习处于人工智能领域进步的最前沿,这就是为什么对深度学习潜力的怀疑态度也是对人工智能前景的批评。这与 20 世纪 80 年代的情况类似,当时专家系统主宰了这个领域,它们的崩溃导致了一个冬天。如果深度学习方法面临与它们的历史对手类似的技术障碍,可以预期类似的结果。

对深度学习的批评主要集中在几个方面:深度学习的局限性、脆弱性和缺乏无监督学习。

深度学习的局限性

“如今,从事深度学习的人比以往任何时候都多——比 2014 年多了大约两个数量级。在我看来,这是 5 年来最慢的进展速度。是时候来点新鲜的了。”

Francois Chollet,Twitter 上 Keras 的创建者

由于这句话摘自 Twitter,其有效性值得怀疑,但它似乎与他提出的类似论点一致,并且很好地抓住了普遍的感觉。在他的书《用 Python 进行深度学习》(Deep Learning with Python)中,Chollet 有一章专门讨论了深度学习的局限性,他在书中写道:“它(深度学习)不会解决更基本的问题,即深度学习模型在它们所能表示的方面非常有限,并且人们可能希望学习的大多数程序都无法表达为数据流形的连续几何变形。”作为一个思想实验,他提出了一个巨大的数据集,其中包含标有程序描述的源代码。他认为,深度学习系统永远无法以这种方式学习编程,即使有无限的数据,因为像这样的任务需要推理,并且没有从描述到源代码的可学习映射。他进一步阐述说,增加更多的层和数据使这些限制看起来正在消失,但只是表面上的。

他认为,从业者很容易陷入一个陷阱,认为模型理解他们承担的任务。但是,当模型呈现的数据与训练数据中遇到的数据不同时,它们可能会以意想不到的方式失败。他认为这些模型没有对现实的体验,因此它们不能理解它们的输入。这类似于德雷福斯在 20 世纪 80 年代提出的论点,他认为人工智能需要体现。不幸的是,对体现在人工智能中的作用还没有一个清晰的理解。以类似的方式,这指向了深度学习方法尚未解决的基本问题,即推理和常识。

简而言之,Chollet 警告深度学习实践者不要夸大深度学习的能力,因为基本问题仍然存在。

深度学习是脆弱的

用于描述深度学习模型的通用术语是脆弱的。有几个例子可以说明为什么这样的描述是准确的,包括对抗性攻击、缺乏概括能力和缺乏数据。对这些缺陷和最终的预防机制进行了详细的讨论。

1.对抗性攻击:已经证明深度学习算法容易受到通过对抗性例子的攻击。对手使用以人类不可识别的方式修改的数据来彻底影响深度学习模型的行为。有多种方法可以创造对立的例子。在一种技术中,通过另一种学习算法将噪声添加到图像中,以便影响分类,而不可见。

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

Figure 3: A demonstration of fast adversarial example generation applied to GoogLeNet on ImageNet.

通过这种技术,可以以这样的方式改变图像,即可以实现指定的分类,即使它与原始分类非常不同(如人类可以容易地区分的“熊猫”和“长臂猿”)。当对抗攻击的方法已知时,可以通过用对抗的例子增加训练集来防御它。澄清一下,防御特定的对抗性攻击是可能的,但是一般来说,防御对抗性攻击是困难的。尽管如此,最近开发的一些成功的方法在这个问题上显示出了希望。通过限制模型的输出空间,已经使用了防御一般对抗的正式方法。像区间边界传播这样的技术在不同的流行图像集中具有最先进的准确性。

Alcorn 等人指出,当熟悉的物体以奇怪的姿势出现时,也会发生极端的错误分类。诸如此类的例子表明,深度学习模型对物体的理解可能相当幼稚。

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

Figure 4: The Google Inception-v3 classifier fails to recognize familiar objects in strange poses.

此外,对抗性攻击表明了一个更深刻的潜在问题——缺乏可解释性。由于深度学习模型的黑盒性质,预测网络正在做什么是很难的。这些对抗性攻击表明,模型可能已经找到了在训练数据中对对象进行分类的最佳方法,但它可能仍然无法捕捉到真实世界的浩瀚。

也就是说,在提高模型的可解释性方面已经做了很多工作,主要是在视觉空间中通过语义词典、显著性图和激活地图集等方法。这些作品代表了对深度学习模型隐藏层的深入了解。

2.缺乏归纳能力:此外,深度学习模型在归纳所提供的训练数据之外存在问题。Kansky 等人证明了在 Atari 游戏 Breakout 上训练的模型在环境发生微小变化时会失败。例如,稍微改变桨的高度会导致药剂的性能非常差。类似的批评可以应用于任何强化学习系统。

Cobbe 比较了强化学习代理和监督学习的评估,并得出结论,在代理接受培训的环境中评估代理就像用测试集评估监督学习者的表现一样。不同的是,第一种情况被很好地接受和实践,第二种情况在任何意义上都是不被容忍的。

为了解决这个问题,Cobbe 作为 OpenAI 的一部分,设计了一个通用化的基准,以促进该领域的工作。此外,强化学习领域的迁移学习最近在 OpenAI 的 Dota 代理中看到了令人印象深刻的结果。他们宣布,通过使用迁移学习技术,尽管规则和模型大小发生了重大变化,他们仍然能够继续对代理进行训练。使用类似的方法,可以改善代理中缺乏通用性的问题。

3.缺乏数据:正如《数据的不合理有效性》所展示的,数据在深度学习中是必不可少的。此外,可用数据的增加是深度学习革命的主要贡献者之一。同时,并不是每个领域都能接触到海量数据。

也就是说,有两种方法可以解决这个问题:创建更多的数据或者创建需要更少数据的算法。Lake 等人的研究表明,人类能够从几个例子中学习视觉概念。

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

Figure 5: Test yourself on one shot learning. From the example boxed in red, can you find the others in the array? On the left is a Segway and on the right is the first character of the Bengali alphabet.

单次或少次学习中的最近方法已经取得了实质性的改进,在这些方法中,仅用一个或几个数据点(例如,给定类别的一个图像)来呈现算法。与此同时,迁移学习方法也有了很大的改进。通过使用在大型数据集上预先训练的模型作为基础,可以显著减少在新数据集上的训练时间。

总而言之,深度学习模型被恰当地描述为脆弱的。也就是说,研究人员正在研究解决这个问题的有希望的方法。

监督学习的优势

深度学习实现的大多数成就都是通过监督或强化学习实现的。然而,正如 LeCun 指出的那样,人类大多是通过观察环境以无监督的方式进行学习。此外,据粗略估计,大约 95%的数据是非结构化的。此外,标注是一个耗时且昂贵的过程,但标签仅包含关于每个数据点的非常少的信息。这就是为什么 LeCun 认为该领域必须更多地转向无监督学习。

一种特殊类型的无监督学习,有时称为自我监督学习,在过去几年中获得了关注。自监督学习过程利用训练数据的某些属性来创建监督信号。例如,在一个视频剪辑中,所有帧都是连续的,研究人员利用这一特性,让模型预测剪辑的下一帧,这很容易评估,因为事实是数据固有的。类似的方法可以用于文本或音频信号。此外,可以使用数据的不同特征,例如旋转图像和预测正确的角度。直觉告诉我们,为了将旋转后的图像恢复到其原始形式,模型需要了解世界的属性,这在不同的任务中也是有用的,如物体识别。这被证明是正确的,因为该模型可以通过迁移学习在分类任务中取得很好的结果。当观察网络的第一层时,过滤器非常类似于监督模型,甚至更多样。

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

Figure 6: First layer filters learned by a AlexNet model trained on (a) the supervised object recognition task and (b) the self-supervised task of recognizing rotated images.

如果研究人员不予理会,这种批评可能会对深度学习和人工智能产生不利影响,但似乎并非如此。OpenAI 已经展示了一些有希望的结果,这些结果是通过今年早些时候使用 GPT-2 transformer 语言模型的无监督学习实现的。这个模型可以通过使用一个非常大的模型和来自 Reddit 的大量数据来生成非常像人类的文本。他们使用一种自我监督的学习方法,利用文本的顺序性,让模型预测下一个单词。使用相同的架构,MuseNet,一个作曲的模型,最近已经被创建。

无监督学习有可能解决深度学习中的重大障碍。目前的研究证据表明,对这种学习技术的进展持乐观态度。

结论

人工智能研究人员、公司、技术和对人工智能的认知在许多不同层面上存在复杂的相互作用。因此,很难做出任何预测。然而,我们可以观察到一些与历史上的冬前时期不同的关键现象。

在过去,对政府资金的依赖非常强烈,而这个行业很弱。今天的情况远非如此;许多大公司,如谷歌、脸书和阿里巴巴,仅在人工智能技术上的投资就超过了人工智能行业在 20 世纪 80 年代繁荣时期的价值。更重要的是,这些公司不仅在人工智能上投入巨资,还将它大量融入到产品中。这为该领域提供了坚实的基础,即使公众情绪开始转变。类似地,“人工智能竞赛”心态提供了稳定性,这降低了政府资助下降的风险。

同样重要的是对深度学习及其局限性的批评。尽管其中大部分是有效的,但证据表明研究人员已经在研究解决方案,或者已经意识到这项技术的先天局限性。

此外,无监督学习,特别是自我监督学习,通过允许使用大量的未标记数据和节省大量的繁琐劳动,提供了有希望的机会。

也就是说,这个领域的期望太高了。关于机器达到人类智能的预测是不可靠的。此外,随着该领域在许多规模上快速增长,炒作周期模式可以在当前的会议与会者人数中表现出来。随着炒作周期模式的变化,无法做出任何特定的陈述或预测。

最后,历史视角展示了该领域的波浪式本质。每天都在创造新技术;它们中的大量灭绝了;有些正在复苏。从这个角度来看,为当前方法的消亡做好准备,以及寻找一些值得复兴的被遗忘的技术,似乎已经足够了。

总结一下:对进一步人工智能研究的资助目前看起来很稳定。然而,有一些技术限制,加上非常高的期望,可能会导致另一个人工智能的冬天。

“人们担心计算机会变得太聪明并接管世界,但真正的问题是它们太笨了,它们已经接管了世界。”

佩德罗·多明戈斯

感谢阅读!

留下一个👏如果你喜欢!

对来源感兴趣?查看我的 论文 关于本文出处的话题。

用概率论寻找 2019 年的最佳约会策略

原文:https://towardsdatascience.com/probability-theory-and-the-optimal-dating-strategy-for-2018-2b75b26fb0b?source=collection_archive---------10-----------------------

了解一些统计理论如何让找到如意郎君变得稍微容易一点?

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

Image from Pixabay.com

这是探索爱情和约会的第一部分。点击查看第 2 部分

让我从大多数人都会同意的事情开始:约会很难!!!

(如果你不同意,那太棒了!!!你可能不会像我一样花那么多时间阅读和撰写中型帖子

如今,我们每周花无数时间在 Tinder 或微妙的亚洲约会上点击个人资料,给我们觉得有吸引力的人发信息。

当你最终“明白”时,你知道如何为你的 Tinder 的个人资料拍摄完美的自拍照,你可以毫不费力地邀请你韩语班的那个可爱女孩吃饭,你会认为找到完美先生/夫人并不难。没有。!!我们很多人就是找不到合适的匹配。

约会对凡人来说太复杂、太可怕、太困难了!!!

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

Do social media and online dating apps make it easier to find The One? Image by amrothman from Pixabay

我们的期望太高了吗?我们是不是太自私了?还是我们注定不会遇见那个人?放心吧!这不是你的错。你只是没有做数学计算。

在你开始满足于更严肃的事情之前,你应该和多少人约会?

这是一个棘手的问题,所以我们必须求助于数学和统计学家。而他们有一个答案: 37%

那是什么意思?

这意味着在你可能约会的所有人中,假设你预见自己在未来 10 年内会和 100 人约会(对我来说更像是 10 人,但那是另一个讨论),你应该先约前 37%或 37 人,然后满足于第一个人之后的第一个人比你在之前见过的人更好(或者如果这样的人没有出现,就等到最后一个)

他们是怎么找到这个号码的?让我们挖掘一些数学知识。

天真(或绝望)的方法:

比方说,我们预见到 N 个潜在的人将依次进入我们的生活,他们根据一些“匹配/最佳伴侣统计”进行排序。当然,你希望最终与排名第一的人在一起——姑且称此人为 X

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

If you can rank these N people. How can you find X?

在我们探索最佳约会策略之前,让我们从一个简单的方法开始。如果你不顾一切地想在 Tinder 上找到伴侣或约会对象,以至于决定和第一个出现的人结婚,那该怎么办?这个人是 X 的几率有多大?

嗯!是 1/N

随着我们考虑的时间范围越大,n 越大,这个概率将趋向于 T2 为零。好吧,你可能不会在 20 年内和 10,000 个人约会,但即使是 1/100 的几率也足以让我觉得这不是一个好的约会政策。

那么我们该怎么办呢?

我们做人们约会时会做的事。也就是说,我们不是承诺第一个选项,而是想认识几个潜在的伴侣,探索我们约会领域的质量,并开始安顿下来。所以这个约会游戏有探索和安定两个部分。

但是我们应该探索和等待多久呢?

把这个策略公式化:你从 N 个人中约会 M ,拒绝所有人,然后立刻和下一个比你目前所见的所有人都好的人定下来。我们的任务是找到 M 的最优值。前面说过,M 的最优规则值是 M = 0.37N 。但是我们如何得到这个数字呢?

一个小模拟:

我决定在 R 中运行一个小模拟,看看是否存在 m 的最优值。

设置很简单,代码如下:

我们可以为基本的可视化绘制模拟结果:

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

因此,似乎在 N = 100 的情况下,图表确实显示了 M 的值,该值将最大化我们使用我们的策略找到最佳伙伴的概率。值是概率 39.4% 的 M = 35,相当接近我前面说的魔值,也就是 M = 37

这个模拟实验还表明,我们考虑的 N 的值越大,就越接近幻数。下图显示了随着我们考虑的候选人数量的增加,M/N 的最佳比率。

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

这里有一些有趣的观察:随着我们考虑的候选人 N 数量的增加,不仅最佳概率降低并趋向收敛,最佳比率 M/N 也是如此。稍后,我们将严格证明这两个最优实体收敛到大约 0.37 的相同值。

你可能会想:“等一下,我不会以很小的 N 值达到找到最佳人选的最高概率吗?”那是部分正确的。基于模拟,在 N = 3 时,我们只要每次选择第三个人,就可以达到高达 66%的成功概率。那么这是不是意味着我们应该总是以和最多三个人约会为目标,然后选择第三个人呢?

你可以。问题是,这种策略只会最大化在这 3 个人中找到最佳者的机会,在某些情况下,这就足够了。但是,我们大多数人可能想考虑比进入我们生活的前三个可行选项更广泛的选项。这本质上与我们年轻时被鼓励去多次约会的原因是一样的:找出我们吸引和被吸引的人的类型,对约会和与伴侣一起生活有一些很好的理解,并在这个过程中更多地了解自己。

你可能会发现更多乐观的事实,随着我们与 N 约会生活范围的扩大,找到完美先生/夫人的最佳概率不会衰减为零。只要我们坚持我们的策略,我们可以证明存在一个阈值,最优概率不会低于这个阈值。我们的下一个任务是证明我们策略的最优性,并找到最小阈值。

能否严谨地证明 37%最优法则?

实际的数学:

O_best 为最佳候选人的到达顺序(完美先生/夫人,The One, **X,**排名为 1 的候选人,以此类推。)我们不知道这个人什么时候会出现在我们的生活中,但我们可以肯定地知道,在下一个预定的 N 个我们将会见到的人中, X 将会出现。

S(n,k) 成为在 N 个候选人中成功选择 X 的事件,采用我们的 M = k 策略,即探索并断然拒绝第一个 k-1 候选人,然后与第一个排名比你目前所见的所有人都好的人和解。我们可以看到:

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

为什么会这样呢?显而易见,如果 X 是进入我们生活的第一批 k-1 人之一,那么无论我们后来选择谁,我们都不可能选择 X (因为我们把 X 包括在我们断然拒绝的人之内)。否则,在第二种情况下,我们注意到,只有当第 k-1 个人中有一个是第 i-1 个人中最好的,我们的策略才能成功。

下面的视觉线条将有助于澄清上述两种情况:

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

然后,我们可以用全概率定律求成功的边际概率 P(S(n,k))

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

总之,我们得出成功概率的一般公式如下:

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

我们可以插入 n = 100 并将这条线覆盖在我们的模拟结果之上进行比较:

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

Our theoretical results align perfectly well with the simulated experiment. The theoretical result yields a maximum probability of 37.1% at M = 37

我不想用更多的数学来烦你,但是基本上,当 n 变得非常大时,我们可以把对 P(S(n,k)) 的表达式写成黎曼和,并简化如下:

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

最后一步是找到使这个表达式最大化的 x 的值。下面是一些高中微积分:

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

我们刚刚严格证明了 37%最佳约会策略。

最后一句话:

那么最后的笑点是什么?你应该用这种策略来寻找你的终身伴侣吗?这是不是意味着你应该在 Tinder 上向左滑动前 37 个有吸引力的个人资料,或者把 37 个滑入你 DMs 的人放在“seen”上?

好吧,由你决定。

该模型提供了最佳解决方案假设你为自己设定了严格的约会规则:你必须设定特定数量的候选人 **N,**你必须想出一个排名系统,保证没有平局(给人排名的想法并不适合很多人),一旦你拒绝了某人,你就再也不会认为他们是可行的约会选择。

显然,现实生活中的约会要混乱得多。

可悲的是,不是每个人都在那里等着你去接受或拒绝——当你遇到他们时,他们可能真的会拒绝你!在现实生活中,人们有时会回到以前拒绝过的人身边,这是我们的模型所不允许的。很难在日期的基础上比较人们,更不用说拿出一个统计数据来有效地预测一个人会成为多么好的潜在配偶,并据此对他们进行排名。我们还没有解决其中最大的问题:估计可行的约会选择的总数是不可能的。如果我想象自己在 20 年后把大部分时间花在编码和写关于约会的中型文章上,我的社交生活会有多活跃?我会和 10 个人、50 个人或 100 个人约会吗?

是的,孤注一掷的方法可能会给你更高的赔率,团!!!

另一个有趣的副产品是,如果你认为最佳选择永远不会出现,在这种情况下,你试图最大化机会至少以第二好、第三好等结束。这些考虑属于一个被称为“博士后问题”的一般问题,它与我们的约会问题有类似的设置,并假设最好的学生将去哈佛(耶鲁,咄!!!) [1]

你可以在我的 Github 链接找到我文章的所有代码。

[1]罗伯特·范德贝伊(1980 年)。“人口子集的最佳选择”。运筹学的数学5(4):481–486

[2]希尔,t . p .知道何时停止美国科学家,第 97 卷,126–133 页(2009 年)

概率论继续:用 Kolmogorov 的联合概率定义注入全概率定律

原文:https://towardsdatascience.com/probability-theory-continued-infusing-law-of-total-probability-4abfca6e65bb?source=collection_archive---------15-----------------------

通过扩展贝叶斯统计揭开概率论的一个方面

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

Source

在我之前的博客中,我简化了贝叶斯定理。在这篇博客中,我将翻译全概率定律,它指出:

对于一组可数的 x 个事件B₁、B₂、…、Bₓ,且事件 a 仅在事件 b 发生时发生,则事件 a 的概率为 P(A) = ∑P(A∩Bₓ

同样,就像贝叶斯定理一样,乍一看,这似乎非常令人费解和难以理解。但是当把它分解成更小的步骤时,它并不太复杂(实际上相当直观)。当 A 发生的每一个可能条件都发生时,A 发生的概率等于 A 唯一发生的概率之和。或者想象一下:

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

source

注意,在上面的图像中,a 只出现在 B₂、B₃、B₄和 B₅,所以 P(A∩B₁)和 P(A∩B₆)都是 0,所以在这个例子中我们有:

p(a)=∑p(a∩bₓ)= 0+p(a∩b₂)+p(a∩b₃)+p(a∩b₄)+p(a∩b₅)+0

当这样想的时候,这个等式可能看起来令人困惑,因为它听起来太简单或者太明显了;听起来应该是微不足道的一点。该定律最有用的扩展可能是当我们应用联合概率的 Kolmogorov 定义时,该定义指出

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

当我们把这个应用到全概率定律时,我们看到

P(A) = ∑P(A∩Bₓ) = ∑ P(A|Bₓ)*P(Bₓ)

理解我们为什么需要这个公式(以及如何使用它)的最好方法是看一个例子(这个例子是我直接从由大会主办的 DSI 项目的实验室作业中获得的):

假设你和你的朋友在玩游戏。你的朋友在你面前放了四枚硬币。如果你抛头,你会从你的朋友那里赢得一美元。如果你抛尾巴,你欠你朋友一美元。然而,你面前的硬币并不公平。

  • 一枚硬币有 80%的几率会翻转正面。(称这枚硬币为 a)
  • 一枚硬币有 60%的几率翻转头像。(称这个硬币为 B.)
  • 一枚硬币有 40%的几率翻转头像。(称这个硬币为 C.)
  • 一枚硬币有 10%的几率翻头。(称这个硬币为 D.)

假设你随机选择一枚硬币。也就是说,你不知道你选择的是硬币 A、B、C 还是 d。你会翻转头部。给定这些数据,你选择硬币 A、硬币 B、硬币 C 和硬币 D 的概率是多少?

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

source

首先,让我们试着把我们刚刚被告知的内容转换成一种可以被读入概率公式的格式:我们被告知,给定硬币 A,有 80%的机会翻转头部,这可以被解释为

P(H|A) = 0.8

我们被告知,给定硬币 B,有 60%的机会翻转头部,这是可以解释的

当 P(H|B) = 0.6 时,

我们被告知,给定硬币 C,有 40%的机会翻转头部,这可以被解释为

P(H|C) = 0.4,

我们被告知,给定硬币 D,有 80%的机会翻转头部,这可以被解释为

P(H|D) = 0.1

因为有 4 个硬币,并且没有理由认为捡起一个硬币的概率与捡起另一个硬币的概率没有任何差异,所以我们可以推断,捡起每个硬币的概率是相等的,也就是四分之一(1/4)的概率。因此:

P(A) = P(B) = P© = P(D) = 0.25

为了求解抛头的概率,你可以将所有这些代入全概率定律的公式:

P(H)= P(H | A)* P(A)+P(H | B)* P(B)+P(H | C)* P©+P(H | D)* P(D)

= (.8 * .25) + (. 6* .25) + (.4 * .25) + (.1 * .25)

= 0.475

从这里,我们可以使用贝叶斯定理来解决问题的其余部分:

P(A | H)=(P(H | A)* P(A))/P(H)=(. 8 * . 25)/. 475 = 0.42105263
P(B | H)=(P(H | B)* P(B)/P(H)=(. 6 * . 25)/. 475 = 0.31578947
P(C | H)=(P(H | C)* P©)/P(H)=(. 4 * . 25)/。

因此,如果你抛 A 头,你有 42.1%的机会选择硬币 A,31.6%的机会选择硬币 B,21.1%的机会选择硬币 C,5.3%的机会选择硬币 d。

通过这个例子,你可以看到(一旦应用了 Kolmogorov 对联合概率的定义)全概率定律远不是微不足道的,当一步步解释时并不那么难以理解。看到这三个不同的规则(全概率定律、科尔莫戈罗夫定义和贝叶斯定理)一起使用来寻找更多的关系和相关性也是很好的(至少我认为是这样),你可以开始看到数学领域中创造性思维的潜力。

机器/深度学习的概率论

原文:https://towardsdatascience.com/probability-theory-for-deep-learning-9551b9255cf0?source=collection_archive---------8-----------------------

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

Probability and Statistics!

简介

为什么我们需要概率论的基础才能理解机器/深度学习算法?

对上述问题的回答是这篇文章背后的主要动机。机器/深度学习经常处理 随机 或随机量,这些量可以被认为是非确定性的(无法预先预测或表现出随机行为的东西)。对这些量的研究与在一系列计算机科学领域中出现的确定性量截然不同。有了这些重要的信息,在不确定的环境中进行推理是很有必要的,概率论就是帮助我们这样做的工具。

因为我不想一开始就用数学术语来混淆你的思想,所以我在文章的最后增加了一节关于所有这些东西的应用。T 这应该是你理解这个东西的主要动机 。那我们开始吧

那么,是什么使得任何系统都容易出现这些不确定性呢?

让我们建立一些数学文献,作为我们进一步讨论的基础。首先,一个确定性系统可以被认为是在未来状态的发展中绝对没有随机性的东西。以牛顿第二运动定律为例。人们可以决定一个加速系统的未来状态。结果不是随机的。

另一方面,非确定性系统是非确定性的(或者在未来状态中包含相当多的随机性)。例如,抛硬币是一个不确定的过程,因为结果中包含随机性(不是正面就是反面,没有办法确定会出现哪种结果)。

回到问题。系统中引入随机行为的方式多种多样。

一个系统可能是固有随机的,就像量子力学模型一样。在这种情况下,我们无法对系统的状态做出确定性的论证。或者可能有一个系统是确定性的,因为我们对这个系统的变量有完全的了解。如果我们失去了一些关于这些变量的知识,我们就失去了决定系统未来发展状态的能力。因此,确定性系统变成了非确定性系统。

先决条件

阅读这篇文章需要对概率的概念有一个基本的理解,对频率主义和贝叶斯概率有一些了解,对条件概率有一些基本的了解,对(不)相关事件有一些了解。如果你想更新这些概念,我推荐你看看这篇由基里尔·杜波维科夫撰写的关于 TDS 的文章

那我们开始吧…

随机变量

如上所述,非确定性系统可能有不止一种可能的结果。例如,抛硬币可能有两种不同的、同样可能的结果——正面或反面。

一个随机变量(或随机变量)可以被认为是一个变量,它的可能值是被模拟的非确定性系统的结果。例如,我们可以定义一个随机变量 X 来表示抛硬币的结果。因此,当结果是正面时,X 取值 1,当结果是反面时,X = 0。所以说随机变量 X 取{0,1}中的一个值。

从形式上来说,如果 S 是具有概率测度的事件结果的样本空间,X 是定义在 S 的元素上的实值函数,那么 X 是随机变量(或者是对实验结果的系统可能状态的描述)。

随机变量可以是离散的(如果它覆盖了有限的可数无限的个状态)或连续的(如果它覆盖了不可数无限的个状态)。

:可数无穷和不可数无穷的概念值得一整篇文章来解释,这里就省略了。然而,你可以在网上查看关于 set 统治的想法。我在这里附上一个非常简短的讨论。

考虑两个集合——X 和 N(自然数的集合)以及映射和双射的通常定义。如果存在从 N 到 X 的子集的映射(而不是到整个 X 的映射),则称集合 X 为严格支配N。换句话说,在 X 中至少存在一个元素在 N 中没有预像。你可以为严格支配集合 X 的集合 N 构造类似的条件。此外,当两者之间存在双射时,称集合 X 与集合 N 的等价。****

当 N 严格支配 X 时,X 是有限的。当 X 等价于 N 时,X 是可数无穷的。当 X 严格支配 N 时,X 是不可数无穷的。

概率分布函数

简而言之,PDF 告诉你一个随机变量取一个特定值的可能性有多大。例如,在我们抛硬币的例子中,X =正面的概率分布是 0.5(或者当事件发生时,硬币出来是正面的概率是 0.5)。正式声明,

P (X = x) = f(x)用 x ~ f(x)表示

或者 PDF 可以被认为是从一个状态的值到它出现的概率的映射。

概率质量函数(PMF)

这是一个离散随机变量的概率分布函数。考虑投掷两个骰子的实验,设 X 是一个随机变量,描述单个骰子的数量之和。然后,

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

Source: http://www.henry.k12.ga.us/ugh/apstat/chapternotes/7supplement.html

你可以在这里看到 X 的值状态是如何映射到上面定义的表中它们各自的概率的。你可以在这里找到更多关于如何计算这个的信息。

概率密度函数

这是连续变量的概率分布函数。与关联 X 取某一值的概率的概率质量函数相反,密度函数将 X 落在具有测量值 dx 的*无穷小区域的概率与 X 相关联(其中测量值=长度(对于单变量分布)、面积(对于双变量分布)、体积(对于三变量分布)等等)。*相关的概率可以由 f(x)给出。dx

显然,我们可以应用积分计算 X 落在任意两个极限(比如 a 和 b,使得 a ≤ b)之间的测量中的概率,方法是重复累加由 f(x)给出的无穷小区域的概率。dx

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

即 X 取值于 a 和 b 之间的概率是 a 和 b 之间无穷小概率的积分。

你可能还想了解二元分布函数(联合概率分布函数(离散和连续))和边际分布函数

期待值

随机变量的期望值可以认为是根据概率分布 *f(x)绘制的变量的平均值。*计算过程如下:

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

Fig 1: Calculating expectation value of a discrete random variable

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

Fig 2: Calculating expectation value of a continuous random variable

同样,随机变量的方差可以看作是当 X 从概率分布 *f(x)中抽取时,随机变量的函数值变化多少的度量。*方差是(X —均值)的平方的期望值。

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

Fig 3: Variance as the expectation value of the square of the difference of the value of X and mean ( calculated by E(X))

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

Fig 4: Expanding the equation in Fig 3 using the equation in Fig 1

关于期望值的非常详细的理论和实践可以在这里找到。

协方差

协方差是变量之间有多少相互关联的一种感觉。以这个协方差矩阵为例:

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

http://methods.sagepub.com/reference/the-sage-encyclopedia-of-communication-research-methods/i3546.xml

在这个矩阵的第一行,150 是 A 的方差,-90 是 A 和 B 的协方差,100 是 A 和 C 的协方差等等。

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

Fig 5: Calculation of covariance using expectation function

图 5 显示了上表中描述的协方差的计算,其中 f(x,Y)是随机变量 X 和 Y 的联合概率分布。可以求解上述方程,得到 **cov(X,Y) = E(XY) — E(X)。e(Y)

从表中可以得出某些推论。负协方差意味着当一个变量的值增加时,另一个变量倾向于取较低的值。反之亦然,对于正协方差(两个变量倾向于同时取高值或低值)。独立变量的协方差为 0(因为它们不相互依赖,所以一个变量的值不会影响另一个变量的值)。然而,0 协方差不一定意味着变量的独立性。

预定义的概率分布

有几个预定义的概率质量和概率密度函数。我在这里解释其中的一些。

二项分布

这是二进制、单个、离散随机变量或离散随机变量 X(只能取 2 个值)的分布函数。举例来说,我有一枚硬币,当扔的时候,正面朝上的概率是𝑝.所以它落在反面的概率是 1−𝑝(抛硬币没有其他可能的结果)。

形式上,伯努利分布由表示成功概率的单个参数来参数化(或者其值等于 p ,如果你考虑上一段中的例子的话):

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

Bernoulli distribution parameter

现在考虑以下情况:

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

Fig 6: Probabilities of the outcomes {0, 1} in terms of the Bernoulli parameter

这里,X 取值为 1 的概率(或者在我们的例子中头部被抛出)由参数 phi (取 0 和 1 之间的某个值)给出。同样,另一个事件发生的几率(抛尾)是(1 — phi )。我们可以将这两种概率组合成一个由下式给出的概括陈述:

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

Fig 7: You can try to place values of x = 1 and x = 0 to see how this generalised statement returns the individual probabilities

利用上面讨论的期望值和方差的概念,可以得到该分布的均值和方差,如下所示:

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

Fig 8: Mean and variance of Bernoulli distribution in terms of Bernoulli parameter

二项分布

二项式分布可以认为是 n 个独立同分布的伯努利随机变量之和,其中每个伯努利随机变量取两个值{0,1}中的一个。

n 个独立同分布伯努利变量之和的非正式含义是,我们将同一个实验重复 n 次*,每个实验的结果独立于其他实验的结果。我们还定义了一个参数 p (与伯努利分布中的参数φ相同),该参数表示在 n 个实验实例中的该实验实例中随机变量取值 1 的概率。二项式分布是这样的:*

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

Fig 9: Binomial Distribution. n and p are parameters controlling the distribution for k

例如,投掷 5 次公平且平衡的硬币。现在定义一个随机变量 X,它表示获得的头数。因此,x 可以取{0,1,2,3,4,5}中的任何值。这里 n = 5(实验重复的次数)。从形式上来说,如果我们将伯努利变量 X[i]定义为第 i 次抛硬币的结果,我们需要将 X[1],X[2],…,X[5]相加,以获得我们想要的 X 值。还要注意 X[1],X[2],…,X[5]是成对独立的,或者一次抛硬币不依赖于另一次抛硬币。

浓缩上一段的信息,我们可以直接计算 Pr(k = 2;n = 5,p = 0.5),将这些变量置于图 9 所示的分布中。假设我们投掷 5 次平衡的(平均值 p = 0.5)硬币,这将输出找到 2 个头的概率。

高斯分布(正态分布)

这是连续随机变量最基本的分布函数。这由分布的均值和方差(用标准符号表示)参数化,如下所示:

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

Fig 10: The Gaussian distribution function

该函数如下图所示:

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

Fig 11: The Gaussian Distribution Function

在我们对随机变量的分布一无所知的情况下,高斯分布是明智的选择。因此,假设值将遵循正态分布,平均值上下的测量次数相等,平均值为分布的峰值。例如,我们的任务是模拟一个连续的随机变量,而我们对它的分布一无所知。在这种情况下,明智的做法是对变量的分布做出最少的假设,并选择高斯分布函数(在所有具有有限方差的分布中,高斯分布函数在 X 的分布上引入了最大不确定性)。

把上面的一段话浓缩成一个陈述,你的连续随机变量 X 很有可能遵循一个带有一些噪声的高斯分布(由中心极限定理提出)。那么,为什么不事先做出这样的假设呢?

如果我们希望对多元分布进行建模,我们可以将高斯分布表示为:

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

Fig 12: Gaussian distribution in case of multivariate scenarios

这里,均值现在是一个向量,而不是方差,我们使用一个协方差矩阵,用大写 sigma 表示(已经在上面的部分讨论过)。

在下面讨论的高斯混合模型中,查找有关多变量设置中的高斯分布的更多信息。

指数和拉普拉斯分布

在深度学习中,我们需要调整神经网络的参数,以防止过度拟合。从贝叶斯的角度来看,拟合正则化模型可以被解释为计算最大后验概率估计值。这里不再赘述更多细节(你显然可以在这里读到更多关于那个的内容),我们需要在 x = 0 或 X = X 分布的均值处有一个非常尖锐的点,以帮助正则化。因此,我们使用以下内容:

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

Fig 13: Exponential distribution introducing a spike at x = 0

在哪里,

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

Fig 14: The indicator function in Fig 13

指示函数用于将 0 概率分配给 x 的所有负值。您可以查看图表:

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

Fig 15: The exponential distribution function graph

指数分布描述了 泊松点 过程中事件之间的时间,即事件以恒定的平均速率连续独立发生的过程。

类似地,如果我们希望在 X 分布的平均值处模拟尖峰,我们可以使用拉普拉斯分布函数,

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

Fig 16: The Laplacian Distribution

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

Fig 17: The Laplacian Distribution graph. Here b in the figure is the same as gamma in the equation in fig 16

这个拉普拉斯分布可以被视为两个背靠背拼接在一起的指数分布,从而我们在分布的平均值处获得一个尖峰(注意我们如何在上图中获得绿色曲线的偏移,这可以通过拉普拉斯分布中的参数平均值来管理)。

狄拉克δ分布

Dirac Delta 函数用于聚集单个点周围的所有分布,并中和连续随机变量 x 的所有其他值上的分布。

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

Fig 18: The Dirac Delta function

上述等式倾向于收集平均值周围的所有质量。更具体的例子是下面的函数:

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

Figure 19: Dirac Delta function to concentrate mass about the origin

这里, a 是一个参数,其值用于定义峰值与原点的接近程度(或原点周围的质量浓度)。随着 a 接近 0,峰值变得无限窄和无限高。

您可以用平均值参数化图 19 中的等式。然后,该函数将类似于图 18 中的等式,并将在所需点处产生一个峰值(0°以外)。

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

Fig 20: Growth of the Dirac Delta functions as value of the parameter changes

狄拉克δ函数在下一个分布中发现了它们的重要性:

经验分布

经验分布是连续随机变量的多元分布。

经验分布用于将(1/m)质量(而不是狄拉克δ分布中的全部质量)集中在样本空间中的 m 个点上,利用狄拉克δ分布在这些点上的能力。请考虑以下情况:

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

Fig 21: Empirical Distribution

很明显,这个分布以 x(1),x(2),…,x(m)上的(1/m)质量为中心。在下一节中可以找到更多的解释…

分配混合物

如果你已经走了这么远,恭喜你!我们现在开始理解上述分布的集合。您可以组合这些发行版来创建更复杂的发行版。我们举一个你已经见过的分布混合的例子——经验分布。

经验分布如图 21 所示。它是我们所瞄准的 m 个点上描述的狄拉克δ函数的混合。考虑以下等式:

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

Fig 22: Distribution Mixture equation

让我解释一下。这里, c 代表定义的不同分量分布。在我们的例子中,我们有 m 个点,每个点上有一个狄拉克δ函数。因此,您可以将经验分布视为一个混合的 m 狄拉克δ分布,其中每个分布都由 x(i)点参数化,它需要将质量集中在 x(I)点上。

图 22 中的等式。意味着最终分布 P(x) 是单个分布分量 *c、*上的多努利分布,通过找到从我们拥有的 m 狄拉克德尔塔分布中选择第 i 狄拉克德尔塔分布的先验概率 ( 或观察 x 之前的概率),然后从第 i 狄拉克德尔塔分布中采样 x 来计算。

简单地说,你有 m 个狄拉克δ分布,你选择其中一个,然后在其上集中(1/m)质量。然后你选择另一个狄拉克δ分布,并在其上集中(1/m)质量。继续这样做,直到所有狄拉克德尔塔函数用尽。最后,将它们相加得到你的经验分布。

我们来讨论一个最终分布混合,*高斯混合模型。你可以再一次把这个混合物想象成有 m 个独立的成分,其中每个成分是一个高斯分布,有独立的参数:均值向量和协方差矩阵。*现在请看下图:

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

Fig 23: A Gaussian Mixture model

这是一个高斯混合分布。你可以清楚地观察到三个不同的集群。每一个都是高斯分布。请注意这些参数化的不同(我将从协方差矩阵的角度进行解释,如果您需要复习这个参数,请参考图 12)。

  1. 左下分布有一个各向同性协方差矩阵。因此,它在所有方向上都有相同的方差
  2. 中间分布有一个对角协方差矩阵。这意味着只有对角线元素是非零的,或者两个变量的协方差都是 0,意味着它们是独立的。
  3. 右上分布有一个满秩协方差矩阵。

我希望这有助于理解如何将具有不同参数的相同分布组合成一个混合模型。

最后!!!

所有这些的应用

指数分布有助于调整神经网络的参数,以防止过度拟合。这是一项非常需要完成的任务,因为过度拟合会导致性能不佳,需要不惜一切代价予以消除。

前几天,我试图在 Kaggle 上解决桑坦德银行客户交易预测,在探索数据时,我试图查看所有 200 个变量(匿名)的分布,以查看是否有可以立即看到的明显关系。变量的分布可以给出关于您试图处理的数据的性质的重要信息。我附上了我获得的一部分图表:

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

Can you find anything ???

或许,你可以。我的一个初步想法是,顶行中的前三个图表示相同变量在不同组中的不同分布(用 1 和 0 表示)。另一方面,顶行的第四个图表看起来是完美的重叠。因此,第四个变量可能不会影响由 1 和 0 表示的组的分布,而第一、第二和第三个变量可能会影响。

以上推断是初步的。但它可能会给进一步的探索指明方向。

还有很多其他的例子,比如不同算法背后的数学原理,如果你有一些相关的背景知识,现在可以更好地理解。

最后,也是更重要的,你将能够开始以更好的方式理解机器/深度学习文献,因为大多数事情都有这些概念的基础。

另外,你可能想看看这些帖子:

[## 如何自学数据科学统计学

学习系列!!!

medium.com](https://medium.com/ml-research-lab/how-to-self-learn-statistics-of-data-science-c05db1f7cfc3) [## 大多数 ML 模型都假设了一个底层的数据分布,以便它们能够很好地运行。在哪里可以学到…

回答(第 1 题,共 8 题):问题是: >>大多数 ML 模型都假设了一个底层数据分布,以便它们能够很好地运行…

www.quora.com](https://www.quora.com/Most-ML-models-assume-an-underlying-data-distribution-for-them-to-function-well-Where-can-I-learn-about-the-probability-distributions-that-each-ML-model-assumes)

我希望你在这篇文章中学到了一些新东西。请在下面的评论中告诉我你对这篇文章的看法。

祝你今天开心!玩的开心!

概率与统计

原文:https://towardsdatascience.com/probability-vs-statistics-95f221cc74f7?source=collection_archive---------7-----------------------

基本问题 4 毫升

概率与统计的区别以及统计方法的分析。

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

我们经常看到“概率”和“统计”这两个词放在一起,但是它们指的是同一个东西吗?这是 Essential probNstats 4 ML 项目的后续文章,在这篇文章中,我将解释这两个术语之间的区别,为什么它们被链接在一起,以及现有的统计方法。

概率与统计

概率论是与概率有关的数学分支。概率是一个事件发生可能性的数字描述。很多时候说概率,我们指的是概率论而不仅仅是数字。从句子的上下文来看,这是可以理解的。

统计学是数学的一个分支,涉及数据的收集、组织、显示、分析、解释和呈现。

这两者的关系是,在统计学中,我们应用概率(概率论)从数据中得出结论。

为了使定义更清楚,这里举两个例子:

概率示例:

你有一枚公平的硬币(正面或反面的概率相等)。你会扔 100 次。60 头以上的概率有多大?由于标准的计算策略,我们只能得到一个答案。

统计示例:

你有一枚来历不明的硬币。为了调查它是否公平,你把它扔 100 次,然后数人头的数量。假设你数了 60 个头。作为统计学家,你的工作就是从这些数据中得出结论(推论)。在这种情况下,不同的统计学家可能得出不同的结论,因为他们可能使用不同的结论形式或可能使用不同的方法来预测概率(例如着陆头)。

概率的基本术语

在我们继续之前,让我们定义一些必要的概率基本术语:

实验(或试验)是可以无限重复的任何程序,并且具有一组明确定义的可能结果。

样本空间是实验中所有可能结果的集合。

一个事件是一组实验结果。

事件可以是:

  • 独立,表示不受其他事件影响。例如,如果你掷一枚公平的硬币,无论如何,它落在正面的机会是 1/2。
  • 也就是说,他们受到其他事件的影响。例如,随着我们从一副牌中取出牌,我们选择国王的概率变得越来越高。
  • 互斥也就是说它们不能同时发生。你不能同时向左转和向右转。

但是不同的统计学家如何根据概率得出不同的结果呢?

*有两种统计解释用于解决一个问题:* 贝叶斯

频率主义者认为概率是实验中各种结果出现频率的量度。例如,如果我们有一个公平的硬币(50%的概率正面落地),我们预计一半的实验将正面落地。

贝叶斯主义者认为概率是一个抽象的概念,用来衡量一个给定命题的知识状态或信任程度。这意味着概率有一个可能为真的值的范围,而不是单一的一个。这种方法将被我们作为数据科学家或 ML 工程师采用,用于语音或人脸识别等系统。

集合的基本定义

在我们继续之前,我们需要对集合有一些基本的了解:

集合是元素的集合。

一个空集被表示为 ,它不包含任何元素。

集合(S)的子集 (A)是存在于该集合中的一组元素。它被描绘成 A⊂S.

s 中 a 的补码是 s 中不是 a 中的元素的集合,用 Aᶜ或 s A 表示

A 和 B 的并集是 A 或 B(或两者)中所有元素的集合。它表示为 A ∪ B。

A 和 B 的交集是 A 和 B 中所有元素的集合,表示为 A ∩ B。

如果两个或多个子集没有公共元素并且它们的交集等于 ,则它们是不相交的

两个或更多子集(如 A 和 B)的是 A 中不在 B 中的元素的集合。我们将其记为 A-B。

最后,有两个重要的法则结合了交集、并集和补集。它们被称为德摩根定律,如下所示:

  • (一∪b)ᶜ=aᶜ∪bᶜ
  • (一∩ B)ᶜ= Aᶜ ∪ Bᶜ

概率计算示例

在我们跳入问题之前,我们需要学习一些重要的概率概念:

  • 积法则:如果有 a 做某事的方式和 b 做另一件事的方式,那么就有ab 两种动作的执行方式。例如,如果在一项奥林匹克运动中有 7 名参赛者,则有 765 = 210 种方法来授予奖牌(7 人授予金牌,6 人授予银牌,5 人授予铜牌)。
  • 排列***集合中元素放置的顺序。例如,集合{a,b,c}有六种排列:abc,acb,bac,bca,cab,cba。该集合的排列数也可以通过乘积法则找到:321 = 6 个排列。通常,集合的排列数是其长度的阶乘(在我们的例子中是 3!).*****
  • ****一个集合的组合是从该集合中选择项目,使得不同顺序的元素没有重复。所以上一个集合中所有可能的 2 个元素组合是:{a,b},{b,c},{c,a}

我们也可以计算一个集合中 k 个元素的排列和组合。在任一情况下,计算这两者的通用公式为:

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

ₙPₖ =一组大小为 n 的元素中 k 个不同元素的排列(列表)数

ₙCₖ =大小为 n 的集合中 k 个元素的组合(子集)数量

最后,在那个阶段,我们准备着手解决问题!

假设我们有一枚公平的硬币,在 10 次投掷中正好有 3 个正面着地的概率是多少?

首先,我们必须计算在 10 次翻转中得到 3 个头的方法。这可以通过“组合”公式来实现:

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

10 次翻转中的每一次都有 2 种可能的结果,所以根据乘积法则,我们有 222…=2 个 10 次翻转的⁰=1024 序列。现在我们可以用组合数除以序列总数来计算 10 次翻转中落地 3 头的概率:120/1024 ≈ 0.117

结论

我们了解了概率和统计的区别。我们还了解到,统计学家可能会根据结论的形式或概率计算方法得出不同的结果。最后,我们学习了如何计算一个具有同等可能性结果的问题的概率。

参考

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

皮尔斯罗德。(2017 年 10 月 6 日)。“概率:事件的类型”。数学很有趣。2019 年 12 月 14 日检索自http://www . maths isfun . com/data/probability-events-types . html

维基百科贡献者。(2019 年 11 月 2 日)。实验(概率论)。在维基百科,免费百科。检索到 2019 年 12 月 14 日 20:24,来自 https://en.wikipedia.org/w/index.php?title=Experiment_(概率论)& oldid=924254710

维基百科贡献者。(2019 年 12 月 13 日)。概率论。在维基百科,免费百科。检索到 2019 年 12 月 15 日 10:59,来自https://en.wikipedia.org/w/index.php?title =概率论& oldid=930545712

史蒂文·斯基娜。(2001 年 4 月 6 日)。概率与统计。2019 年 12 月 15 日检索自https://www3 . cs . stony brook . edu/~ skiena/jaialai/excepts/node 12 . html

维基百科贡献者。(2019 年 12 月 4 日)。统计学。在维基百科,免费百科。检索于 2019 年 12 月 15 日 11:04,来自https://en.wikipedia.org/w/index.php?title=Statistics&oldid = 929190255

维基百科贡献者。(2019 年 10 月 5 日)。乘积法则。在维基百科,免费百科。检索 2019 年 12 月 15 日 18:20,来自https://en.wikipedia.org/w/index.php?title=Rule_of_product&oldid = 919664907

工具面前的问题:全栈数据科学通才的另一种视角

原文:https://towardsdatascience.com/problems-before-tools-an-alternative-perspective-to-the-full-stack-data-science-generalist-403dd3658089?source=collection_archive---------13-----------------------

现实世界中的数据科学

我们是否已经不再关注数据科学到底是什么?

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

我最近读了一篇来自 Stitch Fix 首席算法官 Eric Colson 的文章,他谈到我们应该如何避免建立像制造工厂一样的数据科学团队,由高度专业化的个人组成,操作制造流程的不同部分。相反,数据科学团队应该采用全栈方法来构建,在这种方法中,数据科学家被视为多面手。多面手指的是执行从概念到建模到实施到测量的各种功能的能力。我不会在这里对这篇文章进行详细的总结,但是你应该在继续之前阅读 Eric 的文章。

这篇文章的目的是为埃里克的哲学提供一个补充的观点。在他的文章中,他采用了非常自上而下的方法来描述为什么数据科学团队应该由多面手组成。我相信,从数据科学从业者的角度以及数据科学的真正含义来看,通过自下而上的方法也可以得出相同的结论。

让我们从定义数据科学开始讨论。数据科学到底是什么,或者说数据科学家是做什么的?向我们友好的邻居 Interweb 先生寻求帮助,这里是我找到的一些定义。

先生,请告诉我,您所指的数据科学是什么?

“数据科学是一个多学科领域,它使用科学的方法、流程、算法和系统,从各种形式的结构化和非结构化数据中提取知识和见解,类似于数据挖掘。”维基百科

“数据科学是“统一统计学、数据分析、机器学习及其相关方法的概念”,以便用数据“理解和分析实际现象”。它采用了从数学、统计学、信息科学和计算机科学等许多领域汲取的技术和理论——维基百科

数据科学是一个跨学科领域,使用科学方法、流程、算法和系统从数据中提取价值。数据科学家结合一系列技能(包括统计学、计算机科学和商业知识)来分析从网络、智能手机、客户、传感器和其他来源收集的数据。——神谕

“数据科学是一个结合领域专业知识、编程技能以及数学和统计知识的研究领域,旨在从数据中提取有意义的见解。数据科学从业者将机器学习算法应用于数字、文本、图像、视频、音频等,以产生人工智能(AI)系统,该系统执行通常需要人类智能的任务。反过来,这些系统会生成分析人员和业务用户转化为切实商业价值的见解。”数据机器人

这些是一些精心制作的定义(比我能够表达的更好),但这些定义(以及互联网上的许多其他定义)的一个可观察到的一致模式是,数据科学往往是通过执行一组特定任务或使用一组特定工具来定义的。如果你做 X,Y,Z 并使用 A,B,C,那么这被认为是数据科学。因果链应该是这样的:

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

数据科学——21 世纪最不性感的领域

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

实践数据科学将引导您使用数学和统计学,应用机器学习算法,学习编程,增加领域专业知识。为什么?首先,我认为通过包装和营销数据科学成为这个性感领域的过程,我们错误地定义了数据科学。我不认为上面提到的定义是不正确的,但我认为这样的定义更可信:

“数据科学,就其最基本的术语而言,可以定义为从数据中获得洞察力和信息,实际上是任何有价值的东西。像任何新领域一样,试图给其定义设定具体界限往往很有诱惑力,但却适得其反。深思熟虑

要让定义更不性感,我相信数据科学应该简单一点:*“只是用数据解决问题”。*数据科学家应该是“数据女孩或数据男孩”。不再性感了。

虽然我们在两个因果链中仍然有所有相同的元素,但因果关系逆转的微妙差异实际上导致了数据科学在现实中的实践方式的巨大差异。这和把一杯水看成半满还是半空是一个概念。尽管这两种观点都是正确的,但是认为事物半满的人和认为事物半空的人在行为方式上有很大的不同。

在第一个因果链中,我们看到许多数据科学从业者只对数据科学的特定任务感兴趣。你遇到过明确表示他们只对构建模型感兴趣,而不关心分析或与利益相关者合作的人吗?你很有可能。在通过第二个因果链的世界中,特定的数据科学任务被执行*,因为*它有助于解决手头的问题。

这与成为多面手有什么关系?

那么,经过这么多弯路,这些东西和成为多面手有什么关系呢?我相信,如果我们以正确的方式看待数据科学,真正优化数据科学的唯一方法是成为一名多面手(再次,欢迎在下面的评论中听到您的想法和意见)。为什么?如果我们总是以问题为主要焦点,我们会意识到,如果我们想以尽可能最好的方式解决问题,我们不能只做数据科学的一部分,而不做另一部分。回应 Eric 在他的文章中的观点,多面手角色提供了驱动工作满意度的所有东西:自主性、掌控力和目标。特别是在掌握方面,如果我们总是从问题开始,我们可以确定我们当前的工具包是否能够充分回答问题,或者我们需要更深入地分支并应用新的数据科学技巧或技术来帮助解决问题。

原载于 2019 年 3 月 29 日artofmarketingscience . github . io

机器学习模型中的问题?先检查你的数据

原文:https://towardsdatascience.com/problems-in-machine-learning-models-check-your-data-first-f6c2c88c5ec2?source=collection_archive---------10-----------------------

在将清洗数据输入机器学习算法之前对其进行简要分析

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

Photo by Eleonora Patricola on Unsplash

许多人经常说数据预处理是机器学习算法中最重要的部分。人们常说,如果不清理数据并对其进行预处理,机器学习算法将会爆发。但是你有没有想过什么是不干净的数据,你如何区分干净的数据和不干净的数据,以及干净的数据有哪些不同的方面,然后我们可以在其上建立我们的模型?

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

Photo by Joshua Sortino on Unsplash

好吧,这里是对机器学习中存在的主要挑战的一个小介绍。正如奥雷连·杰龙(Aurelien Geron)在他的书动手机器学习中所说,数据中可能存在两种类型的问题,正如他所说的,“糟糕的算法”和“糟糕的数据”。

数据不足

用来建立机器学习模型的数据仓库应该包含大量的数据,这通常是明智的。虽然这通常是正确的,但是一个简单的机器学习模型可以建立在少到只有几百条记录的基础上。然而,更复杂的系统确实需要大型数据集和模型,例如图像识别甚至可能需要数百万条记录。
数据不足的真正问题在于,数据越少,方差越大。方差,可以很容易地定义为给定数据点或告诉我们数据如何分布的值的模型预测的可变性。模型中的高可变性意味着模型将完美地适合训练数据,但是一旦新数据被输入其中,模型将停止工作。

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

Photo by Suhyeon Choi on Unsplash

非代表性训练数据

为了很好地概括模型,训练数据准确地表示总体是至关重要的。换句话说,每次从总体中得出一个新样本时,样本必须准确地描绘总体的情况是至关重要的。训练数据集必须能够代表您想要归纳的案例。然而,这比听起来要难。如果样本太小,将会有采样噪声,这是由于偶然产生的不具有代表性的数据,但是如果采样方法有缺陷,即使是大样本也可能不具有代表性。这被称为采样偏差。
这里需要注意的是,如果必须减少采样偏差,方差就会上升,而如果方差要减少,偏差就会上升。这种现象也被称为 偏差-方差权衡 ,是找到一个最佳平衡点的过程,该平衡点使数据集中的方差和偏差都保持较低。

在处理偏见时,还有两个同样重要的概念,它们是:

  • 样本可能倾向于选择部分人群,因此可能无法准确代表真实人群。这也就是俗称的数据中存在偏斜,数据可以是右偏的,也可以是左偏的。
  • 第二,也可能有这样的情况(特别是在调查中),有足够多的人可能没有回答问题,并且没有在数据中得到体现。这也称为数据中存在 无响应偏差

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

Presence of outliers in data

质量差的数据

很明显,如果输入的数据已经是脏的,那么模型将不能很好地运行。脏数据是倾向于存在错误、异常值和噪声的数据。如果数据中有缺失的观察值,数据也可能是脏的。

  • 为了处理异常值,如果我们可以丢弃这些观察值,这将减少数据集的大小,或者我们可以 winsorize 它们,这可能会更好。Winsorized 观察值是那些最初是异常值的观察值,但是附加的条件已经传递给它们,以便将它们限制在特定的边界内。
  • 数据集中的空白可以是缺失值,也可以是不存在的值。不存在的值通常在调查中更普遍,在调查中,一些特定的问题没有得到回答,我们没有它们的任何数据,而缺失的值更普遍地存在于数据中存在的值,但没有记录下来,因此可以不使用特殊的 标准化 方法进行处理。

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

Photo by Sofia Kuniakina on Unsplash

无关紧要的特征

我在俄克拉荷马州立大学的项目主任 Goutam Chakraborty 博士总是说,机器学习在很大程度上取决于 GIGO(垃圾进,垃圾出)。这意味着,如果你把含有大量特征、大量噪声的坏数据放入模型,它最终会把垃圾还给你。ML 算法的一个重要方面是 特征工程 方面。这包括:

  • 特征选择:在现有特征中选择最有用的特征进行训练。这可以通过使用套索回归等方法来实现。
  • 特征提取:结合现有特征,创建一个新的、更有用的特征,在模型中具有更高的重要性。
  • 通过收集新数据创建新特征

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

Various types of fits that can be present in the model

过度拟合数据

正如上面的图像试图解释的那样,过度拟合数据是指模型已经尝试完全拟合训练数据。这通常是通过强制安装来实现的,而且通常好得令人难以置信。它也被称为傻瓜的黄金。这是因为每当这样的模型看到新数据时,该模型将给出令人难以置信的差性能。这种问题的可能解决方案是:

  • 正则化:通过减少训练数据中的属性数量或约束模型,选择一个参数较少的模型,从而简化模型的过程。学习期间应用的正则化量可由超参数控制。**
  • 收集更多训练数据
  • 减少训练数据中的噪声

数据拟合不足

欠拟合与过拟合相反:当模型过于简单而无法了解数据的底层结构时,就会发生欠拟合。这通常会导致无法解释的高度差异,因为模型无法解释这种差异。这个问题的解决方案可以是:

  • 选择具有更多参数的更好(更强大)的模型
  • 向学习算法提供更好的特征(特征工程)
  • 减少对模型的约束(减少应用的正则化或减少超参数)

因此,上述问题可能存在于数据中,这可能使数据存在问题,并且为了机器学习模型有效地工作,这些问题应该被消除。要了解如何解决这些问题,应该使用并遵循此处的教程:

** [## 数据清理和预处理完全初学者指南

如何在几分钟内为机器学习模型成功准备数据

towardsdatascience.com](/the-complete-beginners-guide-to-data-cleaning-and-preprocessing-2070b7d4c6d)**

用 R 进行过程能力分析

原文:https://towardsdatascience.com/process-capability-analysis-with-r-1a4ccc2d4270?source=collection_archive---------10-----------------------

r 代表工业工程师

探索“六西格玛”R 包

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

Image by Lenny Kuhne available at Unsplash

过程能力分析

过程能力分析是六适马项目中 DMAIC(定义、测量、分析、改进、控制)周期的测量阶段的重要组成部分。这种分析衡量过程性能如何符合客户的要求,并转化为要制造或生产的产品的有趣特性的规格限制。这种分析的结果可以帮助工业工程师识别过程中的变化,并制定进一步的行动计划,以提高产量、降低变化和减少缺陷数量。

规格

规格是客户的心声。每一个过程都应该能够满足顾客的要求,这些要求必须量化才能达到。规格极限是客户要求的数字表达。由于过程中的自然变化,规格通常是一个有上限和下限的范围。(规格上限)是工艺性能不可接受的值,而 LSL (规格下限)是工艺性能不可接受的值。

规格必须切合实际。为了评估它们的有效性,使用了来自六个适马场的伦巴方法,其中 R 代表合理, U 代表可理解, M 代表可测量, B 代表可信, A 代表可实现。

过程性能

流程绩效是流程的声音。当一个过程接近目标*,且变化尽可能小时,该过程可以被认为是正确的。在六适马方法中,最常见的过程绩效测量是:*

  • 产量( Y ):流程生产出的好产品或物品的数量。流程完成后,可以对其进行评估,计算符合规格的项目:

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

  • 一次成品率( FTY ):考虑了工序中间的返工。因此,不管流程结束时有多少正确的项目,都会将正确的项目计为“第一次”正确的项目:

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

  • 滚动产量( RTY ):当一个过程由几个相互联系的过程组成时使用。它是通过乘以每个链接进程的 FTY 计算出来的:

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

  • 每机会缺陷( DPU ):每单位不符合项数量。缺陷是产量的补充:

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

  • 每百万次机会中的缺陷( DPMO ):每百万次机会中的不符合项数量。它主要用作流程的长期性能测量:

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

来自 SixSigma R 软件包的 ss.ca.yield 函数计算所有之前的过程性能测量。对于下面的例子,让我们考虑一个过程由三个过程链接。我们来看看 R 代码!

流程与规格

流程(Z)的西格玛得分是一个简单的数字,它表达了流程如何符合客户的规格。达到 6 的 sigma 水平的工艺可以被认为是“几乎完美”(即几乎没有缺陷)的设计工艺。6 的 sigma 值意味着将获得少于 3.4 的 DPMO(每百万个机会中的缺陷)。 sigma 是符合规格极限和过程平均值之间的标准偏差数。它是使用以下公式计算的:

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

DPMO through sigma scores

能力指数

能力指数直接比较客户规格和过程的性能。它们基于以下事实:过程的自然极限有效极限介于平均值和+/- 3 标准偏差之间(即包含 99.7%的数据)。流程的能力(C p )通过以下公式计算:

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

然而,该公式不允许验证过程是否在平均值的中心(这是期望的)。为了解决这个问题,调整后的能力指数(C pk )通过以下公式计算:

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

像 sigma 分数一样,能力指数有助于确定过程满足客户规范的程度。一般来说,1.33 的 C pk 是可以接受的,但是它的值越大越好。

six sigmaRR包包含几个函数,用于获取对工业工程师和过程工程师有用的过程能力度量。我们来看看 R 代码!**

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

Six Sigma Capability Analysis Study

从上面的六适马能力分析研究来看,上面的图表代表了样本数据的直方图,包括目标和规范。绘制了经验和理论密度函数的密度线。底部的图表表示分位数-分位数图(Q-Q 图),用于验证数据点是否呈正态分布。以同样的方式,两个常见的统计测试包括验证正态性假设:夏皮罗-维尔克测试和 Lilliefors (K-S)测试。在图的右边,包括了分析的事实:规格极限是在函数中输入的那些;计算过程性能和指数,并计算能力指数的置信区间(CI)。

总结想法

过程能力分析为工业和过程工程师提供了一个很好的工具,用于识别过程中的变化,以提高其产量和效率。six sigma R 包只需要几行代码就可以获得关于过程能力的重要信息。非常鼓励工业、过程和质量工程师利用这一工具,以高质量和高效率的标准满足客户的要求。

— —

如果你觉得这篇文章有用,欢迎在 GitHub 上下载我的个人代码。你也可以直接在 rsalaza4@binghamton.edu 给我发邮件,在LinkedIn上找到我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的媒体 个人资料 来浏览我以前的文章。感谢阅读。

——罗伯特

用 R 绘制流程图

原文:https://towardsdatascience.com/process-mapping-with-r-3682a8e2f77e?source=collection_archive---------20-----------------------

r 代表工业工程师

使用 R 包创建流程图

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

Image by Matteson Ellis available at FCPAmericas

说得好的问题是解决了一半的问题。

——查尔斯·富兰克林·凯特林

流程图是在 DMAIC(定义、测量、分析、改进、控制)周期的定义阶段检索流程信息的一个很好的工具。作为项目章程,流程图是其构建的来源,流程图包括描述流程所需的步骤,并确定其输入、输出、参数和特征;它描述了流程的当前状况,是确定根本原因的基础。流程图令人大开眼界,它们有助于识别流程的利益相关方(例如所有者、客户、供应商)、瓶颈、浪费和改善事件和精益改进的机会领域。

然而,构建流程图并不是一件容易的事情;收集关于进程的信息不是小事。顶级流程图的分解(即,将流程分解为简单的步骤)和信息检索流程可能包括许多必须克服的障碍。激励员工获取关于流程的更精确的信息是流程工程师必须克服的最重要的挑战之一,这可以通过选择最佳策略使他们参与项目并使他们相信其成功实施可以给整个组织带来的潜在好处来实现。

一旦过程被分解成更小的步骤,过程工程师必须独立地关注每一个步骤。必须充分识别和测量参数(对过程输出的产品特性有影响的所有因素或变量)和特性(定义质量的特性),以便对它们进行绘图和分析,从而设计实验、测试假设,并获得未来改进的重要结果。

来自 R 的 SixSigmagrid 包包含几个用于开发逐步流程图的函数。对于下面的例子,我们将考虑 Cano,Moguerza 和 Redchuk (2012)的教科书 Six 适马与 R 中的披萨餐厅案例,其中一家餐厅的经理对研究制作和提供披萨的过程感兴趣。我们来看看 R 代码!

  • 步骤 1: 加载网格SixSigma R 包

  • 步骤 2: 声明过程输入和输出

  • **第三步:**申报项目的步骤

  • **第四步:**声明每一步的输出

  • **第五步:**对每一步的参数进行声明和分类

— — — — — — — — — — — — — — — — — — — — — — — — —

参数组:

  • 噪声:不可控制的因素
  • C =可控因素:可能在过程中发生变化
  • P =程序:通过标准程序的可控因素
  • Cr =关键:对流程影响较大的因素

— — — — — — — — — — — — — — — — — — — — — — — — —

  • **第六步:**声明每一步的特点

  • 步骤 7:SixSigma 包绘制流程图

  • 最终结果:

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

Six Sigma Process Map Final Outcome

总结想法

six sigma R 包包含了很棒的特性,只需要几行代码就可以开发出顶级的流程图。用 R 开发它们的主要优势是它们的可再现性(即每次生成它们时,它们都有相同的方面),这代表了在项目中使用可再现研究技术时的一个有用特性。通过将代码存储在您自己的库中,您将只需修改输入,流程图将再次自动呈现,这将节省您的时间,因为您不必打开新的绘图图、修改它、检查方面并从其他所谓的用户友好程序中导出图像。虽然这个用于开发流程图的 SixSigma 特性并不打算取代其他程序,但它提供了一种以更快和可重复的方式开发它们的新方法。

— —

如果你觉得这篇文章有用,欢迎在GitHub上下载我的个人代码。你也可以直接在 rsalaza4@binghamton.edu 给我发邮件,在LinkedIn上找到我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的媒体 简介 来探索我以前的文章。感谢阅读。

——罗伯特

使用 Apache Spark 处理维基百科,创建热点数据集

原文:https://towardsdatascience.com/process-wikipedia-using-apache-spark-to-create-spicy-hot-datasets-1a59720e6e25?source=collection_archive---------22-----------------------

从维基百科:名人数据集创建一个你选择的数据集

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

Wikipedia, The Free Encyclopedia

我们大多数人肯定都遇到过这样的情况,每当我们想了解某个国家的历史、纪念碑、电视剧和电影、名人的生活和职业生涯、过去的事件或当前的事件时,我们的首选是维基百科。聪明的人用它来获取各种各样的知识,听起来甚至更聪明。但是,你有没有想过它有多大?它有多少文件/文章?

维基百科目前有大约 598 万篇文章,并且每天都在增加。有各种各样来自各个领域的文章。我们可以使用这些数据来创建许多有趣的应用程序。如果您可以访问这些数据,您的下一个有趣的应用是什么?你如何得到整个数据集?即使你得到了它,处理它需要多少计算量?

所有这些问题都将得到解答。

在本文中,我想创建一个名人数据集。过去或现在所有在维基百科上有页面的受欢迎的人,像维拉特·科利、萨钦·坦杜尔卡尔、板球界的瑞奇·庞廷、布拉德·皮特、莱昂纳多·迪卡普里奥、电影界的阿米特巴·巴强、物理学家阿尔伯特·爱因斯坦、伊萨克·牛顿等等。我将使用 Apache Spark (PySpark)来处理这个庞大的数据集。

1.获取维基百科转储

为了开始这项任务,首先,我们需要 Wikipedia 转储。维基百科转储可以从这里以 XML 格式下载。它不断刷新,包含最新的维基百科数据。

解析维基百科 XML 的脚本

接下来,可以使用免费提供的 Python 包非常容易地解析这个下载的 XML。关于如何使用该软件包的更多细节可以在这里找到。

一旦解析完成,这就是解析后的目录结构的外观。

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

Parsed Directory Structure

每个目录由多个纯文本文件组成。文件内容的快照

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

Snapshot of File Content

每个文件包含多个维基百科文章。每篇文章都以标签开始,以结束。接下来就是把这些档案都翻一遍,筛选出名人对应的文章。 如果我们使用一台机器来完成,可能需要几天时间,因为这是一项计算密集型任务。 我们将利用分布式系统框架 Apache Spark (PySpark)来执行这项任务,这项任务只需要 10 到 15 分钟的时间,并配备合理数量的执行者。

2.通过 Apache Spark (PySpark)处理维基百科解析数据

阿帕奇火花

Apache Spark 是一种快如闪电的集群计算技术,专为快速计算而设计。它基于 Hadoop MapReduce 并扩展了 MapReduce 模型,以有效地将其用于更多类型的计算,包括交互式查询和流处理。Spark 的主要特点是它的内存集群计算提高了应用程序的处理速度。

一些 Apache Spark 术语和转换函数(可选)

此部分是可选的。这一节是为 Spark 初学者或那些想在继续之前快速掌握一些 Spark 变换函数的人准备的。要了解关于这些功能的更多信息,请浏览此链接

  • RDD : RDD(弹性分布式数据集)是 Apache Spark 的基本数据结构,它是在集群的不同节点上计算的不可变对象集合。RDD 是分布在集群中许多机器上的数据元素的分布式集合。
  • 数据帧:数据帧是组织成指定列的数据的分布式集合。它在概念上相当于关系数据库中的一个表。
  • map():map 函数遍历 RDD 的每一条线,分割成新 RDD。使用 map()变换,我们接受任何函数,并将该函数应用于 RDD 的每个元素。

Usage of map() transformation function

  • flatMap() :借助 flatMap()函数,对于每个输入元素,我们在一个输出 RDD 中有很多元素。flatMap()最简单的用法是将每个输入字符串拆分成单词。

Usage of flatMap() transformation function

  • filter() : Spark RDD 过滤器()函数返回一个新的 RDD,只包含满足谓词的元素。

Usage of filter() transformation function

  • **whole text files()😗*whole text files 返回一个 PairRDD,其键是文件路径,值是文件内容。

开始执行任务

首先,我们将获取 HDFS 中传输的所有数据,并使用 wholeTextFiles 读取数据。

data = sc.wholeTextFiles(“hdfs:///Data_w/*/*”)

输出将具有键-值配对的 RDD,其中键是文件路径,内容是值。我们可以去掉文件路径,只处理内容。每个文件内容包含由标签分隔的多个维基百科文章。我们需要把所有这些文章作为单独的记录拿出来。为此,我们将使用一个 flatMap()函数。

pages = data.flatMap(lambda x :(x[1].split('</doc>')))

一旦我们有了所有的文章,我们需要找到文章是关于什么的。每篇文章的第一行是标题,其余部分是内容。我们可以使用这些信息将每篇文章转换成一个键-值对,其中键是标题,值是内容。

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

Snapshot of each article

Function to extract the title

Function to extract the content

pages = data.flatMap(lambda x :(x[1].split(‘</doc>’))).map(lambda x : (get_title(x),get_content(x)))

接下来,就是只过滤掉人物(名人)对应的文章。之前,写一些逻辑,让我们看看一些名人网页看起来如何。

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

Wiki Page of Sir Isaac Newton

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

Wiki Page of Virat Kohli

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

Wiki Page of Brad Pitt

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

Wiki Page of Michael Jackson

让我们也看看一些非名人的网页。

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

Wiki Page of the United States

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

Wiki Page of Taj Mahal, India

名人页面和非名人页面有什么不同?所有名人页面的共同点是什么?

大多数名人的页面在第一句话就包含了出生日期。在维基百科数据中,这个出生日期是以下两种格式之一:

  1. 年月日:如 1993 年 8 月 12 日
  2. 年月日:如 1993 年 8 月 12 日

我们可以利用这个事实来快速过滤掉所有的名人页面。我将使用 Regex 来查找这种格式。

Code to check if the Wiki page is a Celebrity Page or not

最后,我们可以将输出保存为表格。完整的代码如下所示:

Entire Code for the project

3.验证创建的名人数据集

维基百科总共有大约 598 万篇文章。我们的名人数据集有 138 万篇文章。所有名人的名单和获得的数据可以在这里找到。

该数据集包含了关于迈克尔·杰克逊、阿米特巴·巴强、布拉德·皮特、萨钦·坦杜尔卡尔、多尼女士以及所有我们能想到并核实的其他名人的文章。

4.结论

维基百科是互联网上所有可能信息的最佳去处之一。我们可以用它来创建许多有趣的应用程序,你的下一个大而有趣的 NLP 项目。随着 Apache Spark 的使用,处理这些海量数据变得很容易。用不到 20-25 行代码,我们就可以从中创建大多数有趣的数据集。

写一篇清晰易懂的好文章需要很多努力。我会继续努力做好我的工作。在 关注我,查看我以前的帖子。我欢迎反馈和建设性的批评。所有名人和数据集的列表以及代码可以在这里找到。

我的 Youtube 频道获取更多内容:

[## 阿布舍克·蒙戈利

嗨,伙计们,欢迎来到频道。该频道旨在涵盖各种主题,从机器学习,数据科学…

www.youtube.com](https://www.youtube.com/channel/UCg0PxC9ThQrbD9nM_FU1vWA)

5.参考

  1. https://www . tutorialspoint . com/Apache _ spark/Apache _ spark _ introduction . htm
  2. https://spark.apache.org/
  3. 【https://en.wikipedia.org/wiki/Apache_Spark
  4. https://en.wikipedia.org/wiki/MapReduce
  5. https://data-flair . training/blogs/spark-rdd-operations-transformations-actions/
  6. https://data-flair.training/blogs/spark-rdd-tutorial/
    https://data-flair . training/博客/Apache-spark-rdd-vs-data frame-vs-dataset/
  7. https://www . analyticsvidhya . com/blog/2019/10/py spark-for-初学者-第一步-大数据-分析/
  8. https://blog.softhints.com/python-regex-match-date/

在 AWS 中使用 PySpark 处理渐变维度类型 2

原文:https://towardsdatascience.com/processing-a-slowly-changing-dimension-type-2-using-pyspark-in-aws-9f5013a36902?source=collection_archive---------1-----------------------

随着新技术的出现,使得数据处理变得像闪电一样快,云生态系统允许灵活性、成本节约、安全性和便利性,似乎有一些数据建模哲学不太经常使用。其中一种方法是星型模式数据架构。

简而言之(我假设阅读本文的人熟悉概念),星型模式以多维方式存储数据,以便通过提供更快更简单的查询性能来提供更好的用户体验。在维度模型中,数据驻留在事实表或维度表中。事实表保存动作的度量和相关维度的键,维度包含所述动作的属性。维度可以是静态的(例如时间维度),也可以保存历史(也称为渐变维度类型 2,也称为 SCD2)。值得注意的是,星型模式是分析系统,这意味着它们不通常直接从用户应用程序中消费数据。相反,数据存储在高度规范化的事务系统中,星型模式利用一些提取过程从该系统中获取数据。

下面是一个销售计划的基本星型模式的示例,它有一个事实表和三个维度(dim_customer_scd 是一个 SCD2)。

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

星型模式通常在 RDBMS 层处理,这里允许更新和删除(这里不讨论),但是当事实和 SCD2 表包含数百万或数十亿行时,处理时间可能是个问题。在这个时代,我们经常会想到 Spark 或 Hadoop 这样的分布式集群框架。人们可以整天开玩笑和假设哪个是首选框架,但这不是本次讨论的主题,我将解释如何在 AWS 环境中使用 Spark 作为框架和 PySpark 作为脚本语言来处理 SCD2,并使用大量 SparkSQL。

最基本的,SCD2 的目的是保存变更的历史。如果客户更改了他们的姓氏或地址,SCD2 将允许用户将订单链接回客户及其在订单时所处状态的属性。如果我不保留那段历史,就很难做到。本质上,我可以找到客户在任何时间点的真实状态。

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

dim_customer_scd (SCD2)

数据集非常窄,由 12 列组成。我可以把这些列分成 3 个小组。

  • 按键 : customer_dim_key
  • 非维度属性:名,姓,中间名,地址,城市,州,邮政编码,客户号
  • 行元数据:生效开始日期,生效结束日期,当前日期

key通常是自动创建的,没有商业价值。它们只是用作其他表的外键,并为行提供唯一性。有时可以使用自然键,但是在星型模式中非常少见。

非维度属性描述了数据集主题的不同方面,在所用的例子中是一个客户。这些属性可能具有业务意义,并在报告和分析中被进一步用于下游。我将把这些简单地称为“属性”。

行元数据列特定于 SCD2s,描述记录的状态。eff_start_date 存储记录生效的日期。eff_end_date 存储记录到期的日期(注意:未到期的记录通常有一个遥远的日期,如‘9999–12–31’);is_current 表示记录是否是最新的。is_current 对于生效日期来说是多余的,但是有些人喜欢这个标志,以避免在他们的查询或脚本中使用日期逻辑。

我在这个数据集中有四行。如果我查看 customer_number ,我可以看到所有的行都由三个不同的客户组成:John、Susan 和 William。John 和 William(分别在第 1 行和第 4 行)在表中只有一个条目,这意味着他们的数据在插入后没有更改过。

另一方面,Susan 有两条记录(第 2 行和第 3 行)。第 2 行是历史记录,用 is_current = false 表示,而第 3 行是 Susan 自 is_current = true 以来的最新信息。第 2 行“姓氏”列中的值为“Jones ”,第 3 行包含“Harris ”,而所有其他属性字段保持不变。

当 Susan 的姓是 Jones 时,表中只有三行,当她的姓改变时,会添加第四行。在表格中实现这一点的实际逻辑是什么?在高层次上:

  1. 发现源系统中的姓氏发生了变化。
  2. 记录已过期;eff_end_date 更新为昨天的日期,is_current 设置为 false。
  3. 将插入一条新记录,其中包含新的姓氏、今天的生效开始日期和将来的生效结束日期,并且 is_current 设置为 true。

注意:对于 eff_start_date 和/或 eff_end_date 字段,使用逻辑业务日期通常更好,但是为了讨论的目的,让它保持简单

在 RDBMS 中,很容易实现这一点。然而,由于 Spark 中更新功能的各种限制,我不得不采用不同的方式。

是时候讨论细节了。

步骤 1:创建 Spark 会话

我可以开始我们的 Spark 会议,并为我们在 S3 的目标路径创建一个变量:

from pyspark.sql import SparkSessionspark = SparkSession.builder.appName("scd2_demo").getOrCreate()v_s3_path = "s3://mybucket/dim_customer_scd"

步骤 2:创建 SCD2 数据集(用于演示目的)

您可以使用下面的脚本来生成当前的 SCD2,将其写入 Parquet,创建一个临时表,并查看结果(我将始终使用这个模式来帮助描述):

# ############## generate current_scd2 dataset ############## #hd_current_scd2 = """
 SELECT   BIGINT(1) AS customer_dim_key,
          STRING('John') AS first_name,
          STRING('Smith') AS last_name,
          STRING('G') AS middle_initial,
          STRING('123 Main Street') AS address,
          STRING('Springville') AS city,
          STRING('VT') AS state,
          STRING('01234-5678') AS zip_code,
          BIGINT(289374) AS customer_number,
          DATE('2014-01-01') AS eff_start_date,
          DATE('9999-12-31') AS eff_end_date,
          BOOLEAN(1) AS is_current
 UNION
 SELECT   BIGINT(2) AS customer_dim_key,
          STRING('Susan') AS first_name,
          STRING('Jones') AS last_name,
          STRING('L') AS middle_initial,
          STRING('987 Central Avenue') AS address,
          STRING('Central City') AS city,
          STRING('MO') AS state,
          STRING('49257-2657') AS zip_code,
          BIGINT(862447) AS customer_number,
          DATE('2015-03-23') AS eff_start_date,
          DATE('2018-11-17') AS eff_end_date,
          BOOLEAN(0) AS is_current
 UNION
 SELECT   BIGINT(3) AS customer_dim_key,
          STRING('Susan') AS first_name,
          STRING('Harris') AS last_name,
          STRING('L') AS middle_initial,
          STRING('987 Central Avenue') AS address,
          STRING('Central City') AS city,
          STRING('MO') AS state,
          STRING('49257-2657') AS zip_code,
          BIGINT(862447) AS customer_number,
          DATE('2018-11-18') AS eff_start_date,
          DATE('9999-12-31') AS eff_end_date,
          BOOLEAN(1) AS is_current
 UNION
 SELECT   BIGINT(4) AS customer_dim_key,
          STRING('William') AS first_name,
          STRING('Chase') AS last_name,
          STRING('X') AS middle_initial,
          STRING('57895 Sharp Way') AS address,
          STRING('Oldtown') AS city,
          STRING('CA') AS state,
          STRING('98554-1285') AS zip_code,
          BIGINT(31568) AS customer_number,
          DATE('2018-12-07') AS eff_start_date,
          DATE('9999-12-31') AS eff_end_date,
          BOOLEAN(1) AS is_current
"""df_current_scd2 = spark.sql(hd_current_scd2)df_current_scd2.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/current_scd2/")df_current_scd2.createOrReplaceTempView("current_scd2")# ############## review dataset ############## #df_current_scd2 = spark.read.parquet(v_s3_path + "/current_scd2/*").orderBy("customer_dim_key")df_current_scd2.show(10, False)

步骤 3:从源系统创建客户数据集(用于演示目的)

您可以使用下面的脚本来生成您的源数据,我将用它来修改我们的 SCD2:

# ############## generate customer_data dataset ############## #hd_customer_data = """
 SELECT   BIGINT(289374) AS customer_number,
          STRING('John') AS first_name,
          STRING('Smith') AS last_name,
          STRING('G') AS middle_initial,
          STRING('456 Derry Court') AS address,
          STRING('Springville') AS city,
          STRING('VT') AS state,
          STRING('01234-5678') AS zip_code
 UNION
 SELECT   BIGINT(932574) AS customer_number,
          STRING('Lisa') AS first_name,
          STRING('Cohen') AS last_name,
          STRING('S') AS middle_initial,
          STRING('69846 Mason Road') AS address,
          STRING('Atlanta') AS city,
          STRING('GA') AS state,
          STRING('26584-3591') AS zip_code
 UNION
 SELECT   BIGINT(862447) AS customer_number,
          STRING('Susan') AS first_name,
          STRING('Harris') AS last_name,
          STRING('L') AS middle_initial,
          STRING('987 Central Avenue') AS address,
          STRING('Central City') AS city,
          STRING('MO') AS state,
          STRING('49257-2657') AS zip_code
 UNION
 SELECT   BIGINT(31568) AS customer_number,
          STRING('William') AS first_name,
          STRING('Chase') AS last_name,
          STRING('X') AS middle_initial,
          STRING('57895 Sharp Way') AS address,
          STRING('Oldtown') AS city,
          STRING('CA') AS state,
          STRING('98554-1285') AS zip_code
"""df_customer_data= spark.sql(hd_customer_data)df_customer_data.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/customer_data/")df_customer_data.createOrReplaceTempView("customer_data")# ############## review dataset ############## #df_customer_data= spark.read.parquet(v_s3_path + "/customer_data/*").orderBy("customer_number")df_customer_data.show(10, False)

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

Current State of the SCD2

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

Customer_Data from Source System

第四步:手动查找变更(只是为了主题)

请记住,来自源系统的数据馈入到我们的 SCD2 中,因此我需要比较这两个数据集,以确定是否有任何差异。经过我们的手动调查,我看到:

  • 约翰·史密斯改变了他们的地址
  • 丽莎·科恩是一位新顾客
  • 威廉·蔡斯和苏珊·哈里斯的属性保持不变

现在,我需要编写一些逻辑来完成以下所有任务:

  • 为 John Smith 创建新条目
  • 使约翰·史密斯的当前条目过期
  • 保持威廉·蔡斯和苏珊·哈里斯的记录不变
  • 为我们的新客户 Lisa Cohen 添加一个条目

步骤 5:为现有客户创建新的当前记录

为了从逻辑上捕捉这种地址变化,我需要比较当前的 SCD2 和源数据(,就像我在上面手动做的那样)以及标志变化。我还需要注意我们的行元数据字段,以确保我使用适当的日期终止和开始记录。

幸运的是,我可以在一个 SQL 块中完成这项工作,并将结果写到 S3 的一个文件中:

  • 将 customer_data 数据集连接到 customer_number 上的当前 SCD2 数据集和当前记录
  • 检查 WHERE 子句中的差异
  • 从源数据集中选择所有属性
  • 从当前 SCD2 数据集中选择 customer _ dim _ key(用于步骤 6 )
  • 将生效日期设置为今天
  • 将生效日期设置为将来
  • 将 is_current 设置为 1
# ############## create new current recs dataaset ############## #hd_new_curr_recs = """
 SELECT   t.customer_dim_key,
          s.customer_number,
          s.first_name,
          s.last_name,
          s.middle_initial,
          s.address,
          s.city,
          s.state,
          s.zip_code,
          DATE(FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP, 'PDT'))
              AS eff_start_date,
          DATE('9999-12-31') AS eff_end_date,
          BOOLEAN(1) AS is_current
 FROM     customer_data s
          INNER JOIN current_scd2 t
              ON t.customer_number = s.customer_number
              AND t.is_current = True
 WHERE    NVL(s.first_name, '') <> NVL(t.first_name, '')
          OR NVL(s.last_name, '') <> NVL(t.last_name, '')
          OR NVL(s.middle_initial, '') <> NVL(t.middle_initial, '')
          OR NVL(s.address, '') <> NVL(t.address, '')
          OR NVL(s.city, '') <> NVL(t.city, '')
          OR NVL(s.state, '') <> NVL(t.state, '')
          OR NVL(s.zip_code, '') <> NVL(t.zip_code, '')
"""df_new_curr_recs = spark.sql(hd_new_curr_recs)df_new_curr_recs.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/new_curr_recs/")df_new_curr_recs.createOrReplaceTempView("new_curr_recs")# ############## review dataset ############## #df_new_curr_recs = spark.read.parquet(v_s3_path + "/new_curr_recs/*").orderBy("customer_number")df_new_curr_recs.show(10, False)

上面的逻辑遍历所有记录,找到我手动观察到的一个变化。正如您在下面看到的,为 John Smith 用他的新地址创建了一个新记录,行元数据显示这个记录今天生效,将来过期。

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

New Record for John Smith

步骤 6:查找要过期的以前的当前记录

现在我有了一个已经存在的客户的新的当前记录,我需要终止以前的当前记录。我在之前的数据集中包含了之前的当前记录的 customer_dim_key,所以我将其分离出来供将来使用。

# ########### isolate keys of records to be modified ########### #df_modfied_keys = df_new_curr_recs.select("customer_dim_key")df_modfied_keys.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/modfied_keys/")df_modfied_keys.createOrReplaceTempView("modfied_keys")

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

Records to be Modified

步骤 7:终止以前的当前记录

现在我可以让之前的记录过期,同时再次注意我们的行元数据字段并正确地修改它们。回想一下,我不能更新记录,所以我必须创建它的一个新实例。

在这段代码中,我将:

  • 将当前 SCD2 数据集连接到 customer_dim_key 上的 modified_keys 数据集
  • 通过仔细检查 is_current = 1,确保当前记录即将到期
  • 从当前 SCD2 数据集中选择所有属性和 eff_start_date
  • 将生效日期设置为昨天
  • 将 is_current 设置为 0
# ############## create new hist recs dataaset ############## #hd_new_hist_recs = """
 SELECT   t.customer_dim_key,
          t.customer_number,
          t.first_name,
          t.last_name,
          t.middle_initial,
          t.address,
          t.city,
          t.state,
          t.zip_code,
          t.eff_start_date,
          DATE_SUB(
              DATE(FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP, 'PDT')), 1
          ) AS eff_end_date,
          BOOLEAN(0) AS is_current
 FROM     current_scd2 t
          INNER JOIN modfied_keys k
              ON k.customer_dim_key = t.customer_dim_key
 WHERE    t.is_current = True
"""df_new_hist_recs = spark.sql(hd_new_hist_recs)df_new_hist_recs.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/new_hist_recs/")df_new_hist_recs.createOrReplaceTempView("new_hist_recs")# ############## review dataset ############## #df_new_hist_recs = spark.read.parquet(v_s3_path + "/new_hist_recs/*").orderBy("customer_number")df_new_hist_recs.show(10, False)

上述逻辑使记录正确过期,并写入其自己的数据集:

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

Expired Record for John Smith

步骤 8:隔离未受影响的记录

威廉·蔡斯和苏珊·哈里斯的记录没有变化,它们需要保留在目标数据集中,所以下一步是将它们放入自己的数据集中。

该逻辑将:

  • 将 modified_keys 数据集左连接到 customer_dim_key 上的当前 SC2 数据集
  • 查看不在 modified_keys 数据集中的记录
  • 保持所有属性和行元数据不变
# ############## create unaffected recs dataset ############## #hd_unaffected_recs = """
 SELECT   s.customer_dim_key,
          s.customer_number,
          s.first_name,
          s.last_name,
          s.middle_initial,
          s.address,
          s.city,
          s.state,
          s.zip_code,
          s.eff_start_date,
          s.eff_end_date,
          s.is_current
 FROM     current_scd2 s
          LEFT OUTER JOIN modfied_keys k
              ON k.customer_dim_key = s.customer_dim_key
 WHERE    k.customer_dim_key IS NULL
"""df_unaffected_recs = spark.sql(hd_unaffected_recs)df_unaffected_recs.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/unaffected_recs/")df_unaffected_recs.createOrReplaceTempView("unaffected_recs")# ############## review dataset ############## #df_unaffected_recs = spark.read.parquet(v_s3_path + "/unaffected_recs/*").orderBy("customer_number")df_unaffected_recs.show(10, False)

未受影响的记录实际上是孤立的:

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

Unaffected Recs

步骤 9:为新客户创建记录

Lisa Cohen 是一位新客户,因此还不存在于我们的 SCD2 中。

以下逻辑:

  • Left 将当前 SCD2 数据集连接到 customer_number 上的 customer_data 数据集
  • 查看不在当前 SCD2 数据集中的记录
  • 使用源中的所有属性
  • 将生效日期设置为今天
  • 将生效结束日期设置为将来
  • 将 is_current 设置为 1
# ############## create new recs dataset ############## #hd_new_cust = """
 SELECT   s.customer_number,
          s.first_name,
          s.last_name,
          s.middle_initial,
          s.address,
          s.city,
          s.state,
          s.zip_code,
          DATE(FROM_UTC_TIMESTAMP(CURRENT_TIMESTAMP, 'PDT')) 
              AS eff_start_date,
          DATE('9999-12-31') AS eff_end_date,
          BOOLEAN(1) AS is_current
 FROM     customer_data s
          LEFT OUTER JOIN current_scd2 t
              ON t.customer_number = s.customer_number
 WHERE    t.customer_number IS NULL
"""df_new_cust = spark.sql(hd_new_cust)df_new_cust.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/new_cust/")df_new_cust.createOrReplaceTempView("new_cust")# ############## review dataset ############## #df_new_cust = spark.read.parquet(v_s3_path + "/new_cust/*").orderBy("customer_number")df_new_cust.show(10, False)

这是结果。新客户的预期格式是:

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

New Customer Record

步骤 10:合并新 SCD2 的数据集

我已经创建了创建新的 SCD2 迭代所需的四个数据集:

  • 现有客户的新当前记录的数据集(" new_curr_recs ")
  • 现有客户的过期前当前记录的数据集(" new_hist_recs ")
  • 未被修改的记录数据集(“未受影响 _ 记录”)
  • 以前未见过的新客户的数据集(" new_cust ")

剩下的就是将它们融合在一起,形成最终产品。在最后这段代码中,我将:

  • 找出最大客户尺寸关键值
  • 联合两个没有 customer_dim_key 的数据集:new_cust 和 new_curr_recs
  • 要创建新的 customer_dim_key,请使用 ROW_NUMBER()函数并添加最大 customer_dim_key 值(以保持连续性和唯一性)
  • 将先前联合的数据集联合到 unaffected _ recs 和 new_hist_recs
# ############## create new scd2 dataset ############## #v_max_key = spark.sql(
    "SELECT STRING(MAX(customer_dim_key)) FROM current_scd2"
).collect()[0][0]hd_new_scd2 = """
 WITH a_cte
 AS   (
        SELECT     x.first_name, x.last_name,
                   x.middle_initial, x.address,
                   x.city, x.state, x.zip_code,
                   x.customer_number, x.eff_start_date,
                   x.eff_end_date, x.is_current
        FROM       new_cust x
        UNION ALL
        SELECT     y.first_name, y.last_name,
                   y.middle_initial, y.address,
                   y.city, y.state, y.zip_code,
                   y.customer_number, y.eff_start_date,
                   y.eff_end_date, y.is_current
        FROM       new_curr_recs y
      )
  ,   b_cte
  AS  (
        SELECT  ROW_NUMBER() OVER(ORDER BY a.eff_start_date)
                    + BIGINT('{v_max_key}') AS customer_dim_key,
                a.first_name, a.last_name,
                a.middle_initial, a.address,
                a.city, a.state, a.zip_code,
                a.customer_number, a.eff_start_date,
                a.eff_end_date, a.is_current
        FROM    a_cte a
      )
  SELECT  customer_dim_key, first_name, last_name,
          middle_initial, address,
          city, state, zip_code,
          customer_number, eff_start_date,
          eff_end_date, is_current
  FROM    b_cte
  UNION ALL
  SELECT  customer_dim_key, first_name,  last_name,
          middle_initial, address,
          city, state, zip_code,
          customer_number, eff_start_date,
          eff_end_date, is_current
  FROM    unaffected_recs
  UNION ALL
  SELECT  customer_dim_key, first_name,  last_name,
          middle_initial, address,
          city, state, zip_code,
          customer_number, eff_start_date,
          eff_end_date, is_current
  FROM    new_hist_recs
"""df_new_scd2 = spark.sql(hd_new_scd2.replace("{v_max_key}", v_max_key))# ############## review dataset ############## #df_new_scd2.coalesce(1).write.mode("overwrite").parquet(v_s3_path + "/new_scd2/")df_new_scd2 = spark.read.parquet(v_s3_path + "/new_scd2/*").orderBy("customer_dim_key")df_new_scd2.show(10, False)

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

New SCD2

在新版本的 SCD2 中,一切都如预期的那样:

  • 威廉·蔡斯和苏珊·哈里斯的记录没有改变
  • 约翰·史密斯有一个旧地址在 2019 年 4 月 14 日到期的记录
  • 约翰·史密斯有一个新记录,新地址于 2019 年 4 月 15 日生效
  • 丽莎·科恩的新纪录于 2019 年 4 月 15 日生效
  • 数据集上一次迭代中存在的记录保留了它们的 customer_dim_keys,因此星型模式中的事实表不需要重新映射

新的 SCD2 存放在 S3,可以随心所欲地使用。

一些注意事项:

  1. 表演很精彩。在我的生产环境中,源表有 382 列和大约 700 万条记录,SCD2 有 81 列和大约 1 . 1 亿条记录。处理这些数据平均需要大约 10 分钟。在标准 RDBMS 中,大约 180 分钟即可完成。处理时间缩短了 94%。
  2. 我在这次讨论中使用的 S3 路径并不真正适用于现实生活中的商业场景,但在这个教学场景中非常适用。

我很难在网上找到任何关于使用 Spark 处理 SCD2s 和 star 图式的信息。坦白地说,这很令人沮丧,我很高兴自己弄明白了这一点。此外,我惊喜地发现,不需要火箭科学学位就能做到这一点。我希望您可能遇到的任何挫折都是短暂的,并且这个讨论可以帮助您进行大数据、星型模式脚本工作。

正在处理 MongoDB 操作日志

原文:https://towardsdatascience.com/processing-mongodb-oplog-4884f702ec5?source=collection_archive---------17-----------------------

数据处理

从操作日志重建 MongoDB 文档

在之前的帖子中,我介绍了什么是 MongoDB 操作日志及其语义。在这篇文章中,我将研究如何处理它以获得文档的新状态。

概述

首先,让我们提醒一下数据操作:插入、更新和删除。对于插入和删除,整个文档中只有o字段存在,或者只有_id被删除。对于更新,o字段包含作为$set$unset命令的更新,o2记录正在更新的文档的_id

我们可以忽略c (DB 命令)和n (NOOP)操作,因为它们不会修改数据。

问题

让我们考虑一个包含超过 1TB 数据的大型 MongoDB 集合,它每天都需要传输到一个仓库或湖泊或另一个存储系统。一种方法是每天使用mongoexport实用程序执行一次完全导出。然而,我们很快发现,这可能需要很长时间,这使得日常出口不可行。我们还必须考虑对集群本身的性能影响。

另一种方法是导出一次,获取 1 天的更新(操作日志),并将这些更新应用于现有对象。这需要 MongoDB 集群上更少的资源来读取操作日志,但也允许以任何所需的频率应用更改。

解决办法

请记住,操作日志是 MongoDB 集群变化的绝对有序列表。这意味着需要对每个文档顺序应用操作日志。这导致通过文档收集所有操作,排序和更新文档。从逻辑上讲,这听起来很简单。

我选择用 Apache Spark 和 Python 来解决这个问题,因为数据量需要分布式处理,而且我熟悉 Python。

读取操作日志

首先是阅读所有现有的导出文档和操作日志。

objs = sc.textFile(self.input()['objects'].path) \
         .map(json.loads)ops = sc.textFile(self.input()['oplog'].path) \
        .map(json.loads) \
        .map(lambda x: x['message']) \ #my tailing app writes the oplog as string in this `message` field.
        .map(json.loads)

清理和过滤操作日志

在此步骤中,我们将对象转换为元组,第一个元素作为对象 ID,第二个元素是操作日志条目本身。这将帮助我们基于密钥加入。

操作日志条目被类似地转换,但是因为每个对象 ID 可以有多个条目,所以我们使用一个groupBy。如果您记得操作日志也有在碎片之间迁移数据的系统操作,我们需要排除这些操作。这发生在现有的fromMigrate字段上的一个简单过滤器上。

objs = objs.map(lambda x: (str(x['_id']), x))ops = ops.filter(lambda x: "fromMigrate" not in x) \
         .map(prepare_op) \
         .groupBy(lambda x: str(x['id']))

此时,我们的对象和操作日志条目都已准备好进行处理和合并。

操作日志合并

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

为了应用操作,我们使用一个定制的映射函数应用于一个完全外部连接的结果。我们需要完全外部连接的原因是为了在操作日志中包含不存在的新对象,以及没有任何操作日志条目的未修改文档。完全连接为我们提供了完整的数据集,而不仅仅是修改过的文档。

final = objs.fullOuterJoin(ops) \
            .map(merge_object) \
            .filter(lambda x: x[1][0] is not None) \
            .map(lambda x: x[1][0]) \
            .map(remove_extra)

合并 _ 对象

这个映射函数负责应用操作。对于插入,它创建一个新记录。对于更新,它遍历$set$unset来操作被改变的字段。对于删除,它会从 RDD 中移除文档。

滤镜&贴图

然后,过滤器和地图改变形状,返回一个 RDD,其中仅包含处于最终状态的合并文档。remove_extra功能通过删除merge_object期间添加的元数据字段来清理文档。

final RDD 现在包含在应用操作日志条目结束时所有文档处于一致状态的结果数据集。在我们的例子中,这是第二天的数据集。这种在 Spark 集群上运行的处理可以加快处理速度,并且不需要每次都完全导出数据。

流式传输

现在流媒体是一件大事,所以这里有一些关于它的话。这个管道可以变成流式管道。如果你照现在这样做,就有可能在小批量上运行它;但是,处理时间可能会比批处理间隔长。一种替代方式是以规则的间隔处理操作日志条目,以将这些条目折叠/合并成最终操作,该最终操作可以以更长的间隔应用于对象。我没有玩过这个,但是根据收藏的大小,它可能会工作得很好。对于流,返回修改过的文档并忽略任何删除或未修改的文档可能是有意义的。这将使连接更快,处理的集合更小。

如果你以相似或不同的方式处理 MongoDB 操作日志,我很乐意听听你对这个过程的想法。我希望在另一篇文章中讨论变更流,但是如果你用它来代替,请让我知道。

r 代表产品分析

原文:https://towardsdatascience.com/product-analytics-65812e82b2c2?source=collection_archive---------11-----------------------

用 R 从用户行为中获得洞察力

如何从用户行为中获得洞察力

该分析基于 Alistair Croll 和 Benjamin Yoskovitz 所著的《精益分析:使用数据分析更快地建立更好的创业公司》一书的概念。根据这本书,它旨在对产品生命周期的三个关键阶段——获取、活动和保留进行简单的数据探索。

关于数据

该示例基于一个真正的软件即服务、基于订阅的产品。有两个数据集可用:

  • registrations.csv :拥有基本人口统计数据的唯一用户
  • activity.csv :哪些用户在哪个月活跃过

关于数据集的更多信息可以在项目的 GitHub 库上获得。

获得物ˌ获得

习得是一个阶段,在这个阶段,你应该通过各种方式,包括有机的和无机的,来引起别人的注意。评估获取的相关指标包括流量、提及次数、每次点击成本、搜索结果、获取成本、打开率等。

作为分析的第一步,让我们看看每个月的注册数量:

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

Figure 1: number of registrations per month

我们可以看到,第二年的注册数量总体较低(21831 对 18295)。第一年,大多数登记发生在秋季/初冬期间(9 月至 11 月)。我们不知道该产品何时投放市场,第一年上半年的低谷期可能类似于早期适应者,第二年下半年的高峰可能是一次成功的营销活动。在圣诞节假期经历了一些低谷之后,在第二年的五月出现了第二个高峰,然后注册人数突然下降了 36.87%。这可能是产品更新失败、市场覆盖范围缩小或其他情况。

为了更深入地挖掘数据,我们可以看到注册的逐年增长:

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

Table 1: Year on Year growth of registrations

下一个图显示了每个月的增长率,以及第 22 个月(第二年的 10 月)的简单预测:

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

Figure 2: Year-on-year growth & Naive Forecast

同比数据似乎在下降,但第二年的注册数量一直保持在较高水平,直到 9 月份。10 月份的天真预测是 0.976。

我们可以根据地理区域调查注册号是否有任何差异:

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

Figure 3: Region differences in year-on-year growth

比较地区,似乎有区别。除了第一年年初,美洲的表现不如 T2、EMEA 和世界其他地区。所有城市的注册人数都呈下降趋势,但区域的增长速度似乎最快。这可能会推动未来注册量的增长,而 EMEA、尤其是美洲可能对该产品有不同的兴趣,或者他们受营销活动的影响较小。

活动

激活是将由此产生的路过访客转化为以某种方式注册的用户。这可以通过跟踪特定的活动里程碑来完成,如注册、签约、完成入职流程、至少使用一次服务、订阅等。

下图显示了每月活跃用户的数量:

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

Figure 4: number of active users per month

用户数增加到第一年夏天,然后下降,9 月份才回到 5 月份的水平。它在 11 月达到高峰,在圣诞节和冬季下降。第二年的活跃用户数量在 3 月至 5 月间达到最高,夏季再次下降,显示出季节性特征。

正如我们所看到的,美国地区正在努力应对新注册。让我们看看 America 在每月活跃用户中所占的百分比:

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

Figure 5: number of active users per month

我们可以看到,来自美国的用户数量平均在 17-22%之间。该公司必须考虑投资于其他方式来推动市场,或者专注于他们的其他客户,这些客户似乎有更好的注册率和活动率。

看看用户的活动模式是值得的。用户可分为(当月注册)保留(前一个月也活跃)或复活(前一个月不活跃且不是)。

为了说明这一点,看一下随机选择的用户的活动历史:

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

Table 2: User activity history

这个在 7 月注册的用户在 8 月继续使用该服务,然后在 9 月没有进行任何活动。他 11 月回来,12 月也很活跃。第二年就没有用过了。

现在让我们来看看每个月保留的活跃用户的数量:

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

Figure 6: number of Retained users per month

保留

留存阶段的主要任务是 说服用户反复回来,展现粘性行为。它可以通过参与度、自上次访问以来的时间、每日和每月的活跃使用、搅动等指标来跟踪。

在我们的例子中,我们可以计算第二个月的保留率(第一个月的注册用户在第二个月是活跃的)。

第二个月的保留率为 46.33%。可以认为相当不错,通常在 20%到 60%之间。

让我们看看第二年(第 13 个月和第 14 个月之间)的相同指标。

二年级一月注册的用户,二月活跃的占 36.84%。这仍是一个可以接受的数值,但自去年以来下降 10%的原因是什么呢?这可能是因为对该产品感兴趣的大多数用户已经注册了,所以新注册的潜在感兴趣的用户变得更少了。通过这种方式,第二年加入的用户并没有参与到产品中,并在接下来的一个月中以更高的比例决定退出。

我们还可以根据用户的操作系统来计算第二个月的保留率:

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

Table 3: Second-month retention rate by Operating System

对于未知的操作系统,留存率(38%)远低于 Mac 用户(61.5%)。一项措施是调查数据收集过程,并确定这些用户实际使用的操作系统。在 MacLinux 用户之间也有 20%的显著差异。这可能意味着该产品并没有像在 Mac 上那样针对 Linux 进行优化。

结论

通过对不同产品分析实践的基本介绍,我们可以看到,只需很少的努力和一些编程知识就可以得出关于用户行为的有趣假设。A/B 测试等方法可以用来测试这些假设,例如:优化产品的 Linux 版本将如何影响保留率,特定的广告活动应该针对哪些地区,等等。

这个项目是作为匈牙利中欧大学“掌握产品分析”课程的要求而完成的。R 代码和数据集可以在 GitHub 上我的 ceu_product-analytics 存储库中找到。

基于 ARIMA 的时间序列产品类别预测

原文:https://towardsdatascience.com/product-category-prediction-with-time-series-using-arima-58dc4d3a7ae2?source=collection_archive---------27-----------------------

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

假设我们手头有现有数据,可以告诉我们某一特定产品类别的市场现状。现在,我们能够看到趋势和运动,以及每个时期的重大事件,这些事件对事件的积极或消极转变产生了影响。

下面的图表显示了美国销售的新车总数。从 2002 年到 2019 年。从这张简单的图表中,我们可以看到,由于 2008 年 3 月开始的金融危机,这一趋势从 2008 年开始逐渐下降,并在 2009 年达到最低点。

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

of new cars sold in the U.S. from 2002–2019

如果我们想进一步分析汽车类别,预测消费者是否会像过去一样继续购买新车,该怎么办?这就是我们可以用 ARIMA 来回答这类问题的地方。

自回归综合移动平均线或 ARIMA,最简单的说法是使用自己的历史数据告知未来结果的方法,条件是数据是稳定的,即不受趋势、周期性、季节性或不规则性的影响。为什么?因为 ARIMA 研究的时间序列的性质并不依赖于观察时间。预测是困难的,因为时间序列本质上是不确定的。在我们上面的例子中,2008 年的金融危机影响了新车销售总量,这可以被视为一种不规则的变化,不会在一段时间内以特定的模式重复出现——这不是静态的。如果时间序列是平稳的,我们可以通过预测其统计特性,如均值、方差、自相关,使我们的问题变得简单一点。

ARIMA 由建模中的三个部分组成:

AR( p )模型(自回归) =作为预测因子的自身滞后值或

I(d)(积分) =平稳性所需的非季节性差异数,也称为 差异度

MA( q )模型(移动平均) =过去预测误差的类回归模型,顺序称为 顺序的移动平均

如果时间序列是平稳的,那么预测某个时间 𝑡 的𝑦值的 ARIMA 方程为 AR + I + MA 表示为:

预测为 𝑦𝘵 = 常数 +加权求和的最后一个𝑝𝑦值+加权求和的最后一个 q 预测误差。

相同的等式用希腊字母正式表示为:

***ŷ_𝑡= 𝑢+*𝜑_₁𝑦_𝑡-₁+…+𝜑_𝑝𝑦_𝑡-𝑝-𝜃₁𝑒𝑡-̿-…-_

其中𝑢为常数, 𝜑_𝑘 为滞后 𝑘时的 AR 系数, 𝜃_ 𝑘 为滞后 𝑘 时的 MA 系数,而 𝑒_ 𝑡- 是在时间段- 时产生的预测误差

*在应用程序中,首先,我们必须确定数据是否稳定,这可以通过使用 增强的 Dickey-Fuller 测试 **来实现。*在测试中,我们想看看我们是否能拒绝陈述时间序列不是平稳的零假设(𝐻₀)。第二,可以用滚动均值和滚动标准差进行数学变换,直观地检验时间序列是否平稳。我们可以创建一个函数供将来使用。请注意,我们使用 12 年(或 1 年)作为数据评估的窗口期。

我们通过调用新创建的函数test _ stationary()来查看原始时间序列

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

A Dickey-Fuller Test on the original time-series

不出所料,p 值高于 5%,表明我们不能拒绝零假设,ADF 检验统计高于所有临界值,因此,结果不显著。请注意,所有临界值都会导致负数,这意味着更强烈地拒绝零假设。

另一种方法是绘制自相关图来可视化时间序列的平稳性——如果时间是非平稳的,我们将看到非常缓慢的衰减。

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

ACF of original non-stationary time series shows slow decay

数据转换实现静止

由于大多数统计预测方法都是基于这样一个假设,即时间序列在经过数学变换后可以近似平稳,因此我们将尝试几种类型的变换,然后用 ADF 测试来检验时间序列是否已经平稳。

我们可以使用 numpy 包中的对数标度变换,将时间序列变换成对数标度。

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

A Dickey-Fuller Test on the logarithmic scale of ts.

从对数标度变换中,我们可以观察到滚动平均值和滚动标准差的更平滑趋势,这表明时间序列正在接近平稳性。然而,p 值仍然大于 5%,测试统计仍然大于所有临界值,因此我们将继续进一步区分转换后的数据。

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

A Dickey-Fuller Test on the differenced logarithmic scale of ts.

现在我们可以看到 ADF 检验统计量小于 10%和 5%的临界值,表明时间序列是平稳的,分别有 90%和 95%的置信度。为了获得更好的 ADF 检验统计,我们可以尝试其他类型的数学变换。但为了简单起见,我们将继续以对数标度为例。

选择型号规格

这里,当选择 pq 时,最常见的方法是通过自相关函数(ACF)偏自相关函数(PACF) 将其可视化。ACF 测量时间序列和其自身滞后版本之间的相似性。请注意,系数也捕捉二手影响。这意味着 t 捕捉滞后系列的直接和间接方式; t-1t-2 影响原。如果我们只想知道时间序列和它的滞后版本之间的直接关系,那么我们使用 PACF 来确定这种影响。

我们现在将使用 ACF 和 PACF 图来查看模型规格。

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

从 ACF 测试中,我们注意到在 h = 12,24,36 处有多个重复出现的峰值,这是由于每年的循环效应。但是我们不会考虑季节性因素。对于 PACF 检验,我们将尝试用 AR(1),MA(0)和 ARIMA(1,1,0)来拟合模型,以解释滞后数,从而解释时间序列中的自相关模式。

请注意,理论上,实际情况是两个(p,q)中的一个应该是非零的,并且对于业务应用程序,两者之和通常小于 3。还建议避免使用既有 AR 系数又有 MA 系数的混合模型,除非您正在处理来自物理或工程应用程序的数据。最后但同样重要的是,经验法则是你应该总是得到一个更简单的模型。有关于规格选择的指南,其中 AR 和 MA 参数考虑单位根。

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

AR(1) Model

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

MA(0)

最后,我们使用 ARIMA(1,1,0)将 AR + I + MA 与 d = 1 组合起来。

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

ARIMA(1,1,0)

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

Summary of ARIMA(1,1,0)

我们还可以参考赤池信息准则 (AIC)来衡量我们比较不同模型时的拟合优度——AIC 数越小,模型拟合越好。最后,我们使用 plot_predict() 方法,根据实际时间序列来绘制我们的预测。

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

ARIMA forecast vs actual

概括起来

  1. 在本例中,我们只尝试了对数标度的时间序列转换。在实际应用中,可以使用指数衰减或时移等其他算术运算来平稳化时间序列,这可能会产生更好的 ADF 测试统计。
  2. 其次,我们肯定应该尝试使用不同的参数来降低每个模型的 RSS 分数——这可以通过拟合不同的 p 和 q 值来实现。
  3. 最后,我们所做的测试没有考虑季节性,在我们的时间序列中,我们看到每年有 12 个月的周期性影响,这可以通过季节性 ARIMA 来解决。

参考资料:

  1. http://people . cs . Pitt . edu/~ Milos/courses/cs 3750/lections/class 16 . pdf
  2. https://otexts.com/fpp2/arima.html
  3. http://people . duke . edu/% 7 ernau/Notes _ on _ non seasonal _ ARIMA _ models-Robert _ nau . pdf
  4. https://people.duke.edu/~rnau/411arim3.htm#unitroot

使用机器学习的产品分类-第一部分

原文:https://towardsdatascience.com/product-classification-using-machine-learning-part-i-5a1cd0c2caf2?source=collection_archive---------7-----------------------

根据文本信息将产品分为最相关的类别。

机器学习中从“M”到“L”

如果你考虑一下英语字母表,字母 M 和 L 是连续的,从一个字母移动到另一个字母似乎是小菜一碟。然而,机器学习(ML)可能并非如此。我们对后者的了解可能是不断扩张的沙漠中逐渐消退的海市蜃楼。在这里,我将探索分类问题,以弥补“M”和“L”之间的差距。

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

我的问题,我的方式

有一点经常被重申,那就是彻底理解你的问题陈述的重要性。眼前的问题是将产品分类到最合适的类别或桶中。 Indiamart ,一个在线市场,总是需要相似的产品( 此处阅读 关于 Indiamart 上的产品)在它的平台上被列在一个标题下,这应该代表它们的特征,任何新产品都应该被分配到最合适的标题下。(,其将被进一步称为‘类别’)。

例如,棕色皮革安全手套应列在皮革安全手套(微观类别)和安全手套(宏观类别)下。这些宏观和微观类别列在一个产品组下。我们永远不会希望用户访问我们的皮手套页面,发现羊毛手套。我们只是想确保产品映射的正确性。

宏观和微观分类

这个问题需要在两个层面上进行分类——确定宏观和微观类别。对我们来说,每个微观范畴都与某个宏观范畴相关。为了理解我们如何定义宏观和微观类别,让我们以手机为例。在这里,三星、苹果、Lava 和索尼手机形成了一个宏观类别手机的微观类别。所以如果,我拿到一个像三星 Note 这样的 4 GB RAM,64 GB 内存的产品,必须分配给三星手机(微单类)和手机(微单类)。

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

A Product At Indiamart. The Product Title, Specifications, and Description have been used to train the model. Also, note the product’s mapping in macro and micro categories.

产品组就像是相关宏类别的保护伞。我们当前的架构正确地认识到这一更广泛的产品范围,因此我们在这里的主要关注点将是产品组内宏观和微观类别的识别。

当瀑布激发你解决问题的方法时

我是一个狂热的自然爱好者,水让我有了许多发现,但正如人们所说的那样,“你不能仅仅站着凝视就穿越海洋”。谢谢,维克拉姆·瓦什尼帮助我渡过难关。在我们的瀑布方法中,有两个独立的模型——一个用于宏观类别,另一个用于微观类别;两者都是按顺序调用的。我们试图通过两步预测结果来降低树:首先,预测一个宏类别,然后预测一个微类别(仅在预测的宏类别内)。

这就是说,对于一个产品,一旦你知道它是一个空调(宏观类别),那么我们将微观类别(分体式空调、窗式空调、盒式空调等)的预测限制在宏观类别内。所以,我不会在其他电器下寻找结果。

解码分类器

我们使用 FastText 来训练我们的模型。F astText 是来自脸书的开源库,用于高效学习单词表示和句子分类。

如果你是 FastText 的新手,在运行它时遇到问题,请参考这个 视频教程

我们使用的是一个基于监督文本的分类器,它是使用以前标记的产品训练的。培训文件包含产品,每个产品在单独的文件中都有宏观和微观类别的适当标签。

宏类别的培训文件:

label 平地机平地机推土机卡特彼勒 140k2

label 挖掘机 jcb js140 挖掘机

培训文件为微类别:

_ _ label _ _ JCB _ 挖掘机 jcb js140 挖掘机

label 卡特彼勒 _ 平地机平地机推土机卡特彼勒 140k2

训练命令

imart@DESKTOP-CFGCP74 ~                                                                                                                                                 
$ fastText/fasttext.exe supervised -input ~/Training_File.txt -output ~/model.bin -lr 0.8 -minn 3 -wordNgrams 1 -thread 4 -loss hs;

针对每个宏观和微观类别标签,对数千种产品进行机器训练,以便建立关系。下次我们向它提供产品的文本信息时,它应该能够解释产品的宏观和微观类别。

测试宏类别的模型

imart@DESKTOP-CFGCP74 ~                                                                                                                                                 
$ fastText/fasttext.exe predict- prob ~/model.bin - 1 ;
**used mahindra earthmaster**
__label__**Backhoe_Loader** 0.9862

测试微观类别的模型

$ fastText/fasttext.exe predict-prob /cygdrive/c/Users/imart/Desktop/Bin\ Files/Backh.bin - 2                                                                           
**used mahindra earthmaster**                                                                                                                                               
__label__**Mahindra_Backhoe_Loader** 0.910756 __label__**Used_Backhoe_Loaders** 0.0892926

精度和召回

$ fastText/fasttext.exe -test ~/model.bin ~/Testing_File.txt ;@p : 0.952
@r : 0.952

注意:对于产品“二手 Mahindra Earthmaster ”,我们得到的宏观类别预测为“反铲装载机”,微观类别预测为“Mahindra 反铲装载机”和“二手反铲装载机”,这是正确的。 目前,当结果与对相同产品进行分类的主题专家进行比较时,该模型运行的准确率为 93.70%。

数据清理

这是非常必要的,这里我们将整个数据转换成小写,删除 xml,html 标签,如

等。、特殊符号和一些与用例相关的停用词。

超参数调谐

只有当弦被微调时,你才能得到完美的音乐,同样,机器的输出取决于用于训练模型的超参数。我们对 320 多个模型进行了训练和测试,以达到学习率、纪元、单词 n 元语法的最佳组合。这将在另一篇文章中详细介绍。

越多越开心

建议的一件事是获取尽可能多的训练数据。更大数量的标签将提高结果的准确性。为了避免预测偏差,我们还求助于标签加载。

这不是结束

正如丘吉尔所说——“这不是终点。这甚至不是结束的开始。但这也许是开始的结束。”到目前为止,我只探索了产品的一个方面——它包含的文本。图像、价格和位置呢?视觉可能会给这个分类问题增加另一个维度。

我们正从基于单词的向量转向句子嵌入,从文本挖掘转向图像分类——谷歌的 BERT,GUSE 脸书的《InferSent》和《ResNeXt》可能会成为一线希望。

我将在后续文章中介绍如何应用基于图像的分类器来解决同样的问题。此外,我将分享我们如何尝试将宏观和微观类别的独立模型整合成一个单一模型。

维克拉姆·瓦什尼 阿尤什·古普塔 阿苏托什·辛格——感谢你对这个项目的持续贡献,感谢你鼓励我写这篇文章。

感谢整个品类团队一直以来的支持。

电子商务中的图像分类第一部分

原文:https://towardsdatascience.com/product-image-classification-with-deep-learning-part-i-5bc4e8dccf41?source=collection_archive---------11-----------------------

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

This eye-catching image becomes all the more enchanting when you get to know that our brain processes visuals 60,000 times faster than text and retains 80 percent of what we see versus just 20 percent of what we read.

当图像成为故事讲述者

图像通常承担着讲述故事和表达强大思想的角色,就像他们说的那样“一张图片胜过千言万语”。图像讲述思想的能力吸引了人类,由于人类大脑的一半直接或间接用于视觉,视觉成为我们理解周围世界的主要感觉。

在本文中,我将解释我们如何使用图像来解决最流行的商业问题之一,即产品分类。

圣杯

Indiamart 这样的大型在线市场有数以千计的宏类别,用于列出各种产品。产品必须被映射到平台上最合适的微观类别下。【关于 宏观范畴 微观范畴 的定义请参考这篇值得称道的 帖子 的一节:“我的问题,我的方式”]

这篇文章的目标是建立直觉和理解,如何训练神经网络来使用产品的图像识别产品的微观类别。

例如,在宏观类别*‘皮革安全手套’,中可以有各种微观类别,如工业皮革手套、皮革焊接手套、铬革手套等。我们打算对我们的产品进行分类,使工业* 皮革 安全手套图片始终归入工业 皮革 安全手套微型类别*。同样,一个工作靴的图像总是预测一个微观类别安全工作靴*,其中其宏观类别是“安全靴”。

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

For an Industrial Leather Glove product, ‘Leather Safety Gloves’ is a macrocategory for which the microcategory is ‘Industrial Leather Gloves’

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

For a Work Boot product, ‘Safety Boots’ is the macro category and the micro categoryhereis ‘Safety Work Boot’

现在让我们看看图像分类背后使用的概念。如果您想直接跳到实现,请随意跳过’ **引擎盖下有什么?--**部分技术基础知识。

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

Predicting the number written inside the image would have become comically trivial to dauntingly difficult for a machine using only its pixel information, without the concept of Machine Learning and Neural Network!

引擎盖下是什么?-技术基础

我们将使用卷积神经网络(CNN) 使用监督学习对产品图像进行分类,并在 PyTorch( 这是一个由脸书开发的人工智能框架)上运行。为此,我们采用了脸书的 ResNet 模型,该模型根据来自 ImageNet 数据库的 100 多万张图像进行了预训练。

什么是预训练模型?

预先训练的模型先前已经在数据集上训练过,并且包含代表它被训练的数据集的特征的权重。学习到的特征通常可以转移到不同的数据中。

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

什么是深度学习?

深度学习是机器学习的一个子集,它通常有不止一个隐藏层。深度学习最重要的一点是,它可以在有大量(通常是有标签的)数据的地方取得非常好的结果。

在数学中,卷积是对两个函数进行数学运算以产生第三个函数,该函数表示一个函数的形状如何被另一个函数修改。

卷积神经网络 (CNN )是受构成动物大脑的生物神经网络启发的计算系统。这类系统 学习 *(逐步提高自己的能力)*通过考虑实例来做任务,一般不需要针对任务的编程。例如,他们可能会学习识别包含猫的图像,分析已被手动标记为“猫”或“没有猫”的示例图像,并使用分析结果来识别其他图像中的猫。标记通常采用一组未标记的数据,并用有意义的信息性标记来增加每一段未标记的数据。

残差学习试图解决更深层次的神经网络训练的复杂性及其随深度的饱和精度的问题

什么是剩余学习?

在一般的 CNN 中,几个层被堆叠起来,并被训练来完成手头的任务。网络在其层的末端学习几个低/中/高级特征。在残差学习中,我们不是试图学习一些特征,而是试图学习一些残差。

残差可以简单理解为学习到的特征减去该层的输入的减法。

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

Residual Learning: A building block

ResNet 通过将第 n 层的输入直接连接到某个第(n+x)层来实现这一点。使用 ReLU (ReLU 代表整流线性单元,是一种激活功能)。

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

A ‘Rectified’ Linear Unit substitutes everything dissimilar (negative value) with zero. So by the end, we are left with only a similar looking image.

如果您不确定在您的网络中使用什么激活功能,ReLU 通常是一个不错的首选。为什么?请阅读这篇了解更多 ReLU。

ResNet34 是一个 34 层深度剩余网络。其他型号如 ResNet50、ResNet101 和 ResNet152 也有售。

系统需求

从脸书的 Github 链接下载或克隆 ResNet 模型。

Ubuntu 14.04+ 上安装 Torch ResNet 依赖项:

参见安装说明获取分步指南。

我们开始吧!

**先决条件:**假设对 Python & Linux 命令有一个基本的了解,以便继续学习。

我们如何为自定义数据集采用 RESNET?

数据收集-

了解数据的第一步可以让你达到前所未有的高度,达到预期的预测结果的准确性。我们确定了自定义标签所需的属性,以便与训练好的模型一起使用,并将微类别 ID产品 ID、产品图片的 URL 提取为 tsv(制表符分隔值)格式。

我们把图片从网址下载到一个文件夹结构里,组织成-

标签名称被保存为单独的文件夹名称,每个名称都有其相关的图像。这整个结构被封装到另一个文件夹中,该文件夹应该被命名为’ train '。同样,另一个名为“ val ”的文件夹(即包含产品图像的标签名称文件夹)应保存在与“列车”相同的位置。【该文件夹组织标准由脸书给出,是其模型工作所必需的】

在我们的场景中,该结构应该类似于:

train/<Micro_category_ID1>/<Product_ID1.jpg>
train/<Micro_category_ID2>/<Product_ID1.jpg>
val/<Micro_category_ID1>/<Product_ID1.jpg>
val/<Micro_category_ID2>/<Product_ID1.jpg>

为了实现这一点,我们使用了下面的 Linux 命令,该命令应该在终端中的路径“train”处触发:

while read -r mcat_id product_id url; do if [ ! -d "${mcat_id}" ]; then mkdir -p ${mcat_id}; fi; cd $mcat_id; wget -O $product_id $url; cd ..; done < tsvfilename

该命令从 tsv 文件中读取微类别 id、产品 id 和图像 URL,并在相应的微类别文件夹路径中迭代地从 URL 中下载图像,将其重命名为产品 ID(以便于以后识别)。

瞧!我们已经准备好了训练数据。等等……什么?不,它仍然不在那里!

下面是获得想要的结果的最重要的步骤之一。

数据清理-

我们希望准备一个同质的输入数据集,以避免模型在训练时偏向某些微类别 id 的图像,从而总是预测这些微类别。

我们设计了一个 shell 脚本,将所有图像转换成。jpeg(无论是名称还是格式,不包括。png,。gif 等。),删除下载的错误文件,删除重复文件,并将所有图像的尺寸缩小到 224 X 224 px(如果宽度或高度大于 224 px)。

我们选择图像尺寸大小为 224 X 224 px,因为观察到此设置的顶部 1顶部 5 误差较小。欲了解更多详情,请查看

top1 score 中,您检查预测的顶级类别(具有最高概率的类别)是否与目标标签相同。

top5 得分的情况下,您检查目标标签是否是您的前 5 个预测之一(具有最高概率的 5 个预测)。

标签加载-

顾名思义,这是一个处理标签上的数据负载的过程,使得每个标签的图像计数达到一个可比较的水平。

为了向模型提供涵盖每天从用户处收到的各种产品图像的数据,我们对现有数据集执行了图像增强

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

Here, the input image has been augmented in various forms (by introducing noise and inclination) to increase scarcely available training data set.

下面的 python 脚本用于镜像每张图像,顺时针、逆时针旋转它们,还为每张图像创建了粒状图像。

我们还必须确保一些微类别 id 最终不会比其他微类别 id 具有更大的权重,从而使模型产生偏差,预测不正确的结果。这可能是这样的情况,一些微类别比另一个有更多的列出的产品(有图片)。

例如,在宏观类别“充气家具”中,微观类别“充气沙发”比微观类别“充气沙发”具有更多带有图像的产品。

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

我们使用了一个 Python 脚本,它将文件夹 train 的微观类别 ID 文件夹中的图像相乘。目前,我们已将倍增系数定为 98 个百分点(即所有单个文件夹的图像计数中的一个图像计数,其中涵盖了总计数的 98%的图像)。

终于可以去训练了!

训练模型-

使用从 Github 下载的文件夹下的 main.lua 文件,即 fb.resnet.torch,用我们自己的数据集训练模型的各层。

th ~/fb.resnet.torch/main.lua -nClasses 122 -nEpochs 100 -data ~/imageclassification/train/ -save ~/Desktop/imageclassification_c122e100b30t4g1 -batchSize 30 -nThreads 4 -nGPU 1
  • -nClasses 是我们的标签数量(即微类别 id)
  • -数据是列车文件夹的路径
  • -save 是保存所有模型(即. t7 文件)的文件夹路径(在指定的新文件夹(即~ ~/Desktop/image classification _ c 122 e 100 b 10t 4g 1)中的每个时期结束时会生成一个模型,其中每个模型都在其之前的模型数据之上进行训练。)
  • -batchSize 是每个历元中用于训练的图像数量
    • nEpochs 是我们希望我们的模型运行的迭代次数(我们还在每个时期的末尾获得 top1 和 top5 误差,用于最佳模型的分析)
  • -nThreads 是 GPU 使用的线程数
    • nGPU 是我们将用于培训的 GPU 数量

另一个参数是**-深度**(此处未使用),因此,默认情况下,我们有一个 ResNet-34 模型。如果它是 50,我们将有一个 ResNet-50 模型。

根据您的便利和资源可用性,在培训时可以使用各种其他参数。可以通过以下方式探索它们:

th main.lua --help

好的!让我们发出命令!

搞定!

根据您的训练数据集大小和系统速度,您应该有耐心并为您的学生提供充足的 时间来学好:)

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

Training…Training……Training!!!

main.lua 自动在-save 文件夹中并行生成两个额外的模型,即 model_best.t7latest.t7

model_best.t7 是在具有最少 top1 和 top5 错误的纪元上创建的模型的副本。

latest.t7 是完全训练的模型,即由最后一个时期创建的模型。

这两种模式并不总是相同的。在我们的例子中,观察到最好的模型是在纪元 99 生成的,但是最新的模型是来自纪元 100 的模型。所以,我们使用了 model_best.t7 进行测试。

测试模型-

classify.lua (在 fb.resnet.torch/pretrained/文件夹中)用于从 model_best.t7 获取所有测试图像的前 5 个预测。

这里需要注意的重要一点是, classify.lua 从 imagenet.lua (在同一个文件夹中,即“pretrained”)中导出预测标签。

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

所以,我们替换 imagenet.lua 中的旧标签(鸟类、动物等的名称。来自 ImageNet 数据库)与我们自己的标签值,即微类别 id。

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

The left image shows the original labels in the imagenet.lua file. The micro category ID’s which are used as our labels are being substituted in the same file as shown in the right picture.

现在,让我们测试我们的最佳模型!

我们从“train”中挑选了一些标签,并将其复制到“val”中,以测试我们训练的模型在相同数据上的准确性。

下面的测试命令输出“val”中每个图像的前 5 个预测结果及其预测概率:

for f in ~/imageclassification/val/* ;do ( [ -d $f ] && cd "$f" && echo Entering into $f && th ~/fb.resnet.torch/pretrained/classify_new.lua ~/Desktop/imageclassification_c122e100b30t4g1/model_best.t7 $f/*  >> ~/Desktop/imageclassification_c122e100b30t4g1.txt); done

余波

通过将创建的文本文件转换成 excel 文件进行分析。

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

The testing file created by running classify.lua

excel 文件将上述预测分成列(使用 R 脚本)用于原始微类别 ID产品 ID (来自图像的本地路径)以及预测微类别 1、预测微类别 1 的概率

通过对预测的和原始的微类别进行匹配检查,我们观察到在 99.28% 的情况下预测为真。这些是训练模型的案例。

后来,我们为添加的 70 个新产品重复了测试活动(因此,被训练的模型没有更早地学习它们)。

在这种情况下,*高于覆盖 80%数据的 50%模型置信度(概率)阈值,*我们观察到精度为 95.38%。

该模型的精度观察为 1.00 ,灵敏度/召回率观察为 0.95 。该结果的混淆矩阵如下所示:

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

The matrix shows results for 65/70 cases excluding 5 cases where the user uploaded product image was not clear or was irrelevant for this macro category.

接下来会发生什么…

  • 我们也正在分析宏类别级别的预测准确性。
  • 我们打算利用特征提取在不同的微观类别中找到相似的图像。为此,fb.resnet.torch/pretained 文件夹中提供了一个有用的脚本,即 exract-features.lua
  • 我们希望利用图像分类来识别平台上被禁止的内容。

本系列的后续文章将会重点介绍上述目标的实现。

我希望这篇文章能帮助您扩展关于使用 Resnet 进行定制业务案例的知识,如果您有任何问题或意见,我很乐意听取您的意见。你可以打jain.prachi@indiamart.com找到我

感谢 维克拉姆阿尤什【古普塔】阿苏托什穆凯什 的大力支持。**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值