了不起的女人
关于漫威妇女的机器学习案例研究
权力是个有趣的东西。当考虑谁是特定漫画世界中最强大的时候,我们通常会想到原始力量、神秘能力或宇宙能量。大多数时候,我们在这些对话中也会想到男人。但是,正如我们都逐渐认识到的那样,有许多不同种类的权力和许多不同形式的赋权。
漫威宇宙一直是一个让不可能成为可能的地方,在这里,力量以无数种形式出现,并被用于无数不同的目的。但是我们不要忘记,在一个充满无敌铁人和幻想先生的世界里,616 中一些最强大的生物是女性。
当漫威在 20 世纪 70 年代迅速扩张时,女性超级英雄往往是事后诸葛亮,被冷嘲热讽地创造为品牌延伸:蜘蛛侠诞生了蜘蛛侠,绿巨人诞生了女巨人,等等。
畅销书漫威漫画:不为人知的故事的作者肖恩·豪说:“这是亚当的肋骨效应。“这不仅仅是因为这些角色没有男性角色考虑周全;他们实际上是从他们受欢迎的财产中获得的。”
事实上,一场地震剧变正在发生。新的 Thor(是的,你必须叫她 Thor)比她的前任多卖了 30%——她的公司也不错。三年前,作家凯莉·苏·德康尼克将前漫威女士卡罗尔·丹弗斯提升为惊奇队长,她的冒险经历吸引了一批忠实的粉丝,他们被称为卡罗尔军团。查尔斯·索尔在一个机智的系列中重塑了她,探索了她作为律师的日常工作。最重要的是,有 G Willow Wilson 的新漫威女士,一个叫 Kamala Khan 的 16 岁巴基斯坦裔美国穆斯林。这本书已经成为一种文化现象,被 CNN、《纽约时报》和《科尔伯特报告》报道,并受到旧金山反伊斯兰恐惧症运动者的欢迎,他们在反穆斯林的公交车广告上贴满了卡玛拉贴纸。威尔逊目前正在与玛格丽特·贝内特(Marguerite Bennett)合写一本全女性的《复仇者联盟》(A-Force)。
The A-Force. Courtesy of Marvel.
Ms. Marvel Issue #1. Courtesy of Marvel.
与此同时,漫威的竞争对手 DC Comics 更新了老女性角色,如蝙蝠女侠、蝙蝠女侠、猫女、神奇女侠和有争议的反英雄哈利·奎因。在传统上更加进步的独立漫画世界中,有各种各样的热门系列,如《传奇》、《老鼠皇后》、《伐木工人》和《恶人+神》。
现在超级英雄接管了夏季票房,漫画中发生的事情对主流文化产生了重大影响。这些都是孩子成长过程中的特征。最近几部电影的大男子主义阵容(自 10 年前《猫女》和《埃莱克特拉》失败以来,没有女性主演过漫画电影)使这种类型的电影看起来永远是男性的,但华纳兄弟制作了 DC 原创的女权主义犯罪斗士神奇女侠的精彩展示(如此精彩,我已经看过六遍),而漫威已经计划在 2018 年上映一部惊奇队长电影。也有新的电视节目致力于美国队长的战时同事佩吉·卡特,超能力私人侦探杰西卡·琼斯和超女。
变化的速度甚至让编剧们感到惊讶。Wilson 是一名穆斯林皈依者,他记得当《漫威》的编辑 Sana Amanat 和 Stephen Wacker 找到她要写《漫威女士》时。“[他们说:‘我们想创造一个新的青少年女性美国穆斯林超级英雄,让她出现在自己的书里。’]我想,‘你疯了。你需要雇一个实习生来打开恐吓信。所以当突然之间,每个人都在谈论它的时候,我惊呆了。我相信,如果我们在五年前尝试做完全相同的书,反应会非常不同。它出现在美国漫画史上一个非常特殊的时期。"
惊人的数据
我被迫使用我的编码能力来分解漫威宇宙中的英雄形象,看看这个宇宙是否反映了美国漫画的这种变化。我不仅想按性别,还想按种族、教育程度等来划分代表性。我从漫威的 API 中收集了所有漫威角色的数据。他们的数据库包括 1402 个角色,包括英雄、反派和团队!在把所有的东西汇编成一个数据框架后,我了解到这个数据集包括了 89 个不同的栏目,包括他们的国籍、教育程度、头发颜色、眼睛颜色等等。
像在任何数据集中一样,在某个地方总会有空数据,所以我不得不做更多的清理工作。重新整理数据后,我只剩下 1332 个字符。
为了避免进一步的问题,我去掉了那些没有信息的字符。科学家喜欢拥有大量的数据,这样他们就可以做大量的实验,并得到尽可能准确的结论。但是,经验告诉我们,大多数时候我们无法通过大数据来进行机器学习。我从数据中选择了以下几列:id、姓名、描述、教育、体重、身高、简历、头发颜色、眼睛颜色、国籍和出生地。我只剩下 762 个字符。
'wiki.hair', 'wiki.weight', 'wiki.height', 'wiki.eyes', 'wiki.place_of_birth', 'wiki.education', 'wiki.citizenship', 'wiki.occupation', 'wiki.bio', 'wiki.bio_text', 'wiki.categories', 'name', 'comics.available'
它们可能会提供有用信息,而且它们似乎比我试图使用的其他工具拥有更多的可用数据。
以下是新数据框的一些照片:
First 5 entries of physical data and cultural data
Summaries of physical data and cultural data
基于此,漫威超级英雄的原型是一个来自美国的黑头发、蓝眼睛的冒险家。
有一些有趣的信息。我决定检查一下,看看是否能找到任何女性或非白人的角色——像奈克拉、漫威女士等。原来他们确实有性别分类,也有从属分类(英雄或恶棍),团队分类,等等,但是没有肤色分类。我认为在 API 中性别不是它自己的属性很有趣,但是这是一个开始。为了更好地理解这些信息,我用数据创建了两个新列。
- 女人:如果角色是女人,则为真,否则为假
- 恶棍:如果角色是恶棍,则为真,否则为假
经过更多的整形后,我了解到有 199 名女性和 563 名男性识别为男性或女性(我确实用最初的 1402 名进行了复查)。这些女性角色占数据框的 26%(类似于我学校的比例)
如果我们把他们分成英雄和恶棍,有 362 个男英雄,201 个男恶棍,169 个女英雄,30 个女恶棍。
Created with matplotlib
奇妙的机器学习
由于新的女性角色正在崛起,我创建了一个 knn 模型来预测漫威世界的趋势,重点是身体属性和教育。我关注的是身高和体重,因为这两个类别的 NaN 最少。
物理性质
有成群的男人和女人表明他们保持了现实的比例。然而,男性的体重在 150 到 500 磅之间,而女性的最高体重在 250 磅左右。男性角色有更多的身高和体重异常值,而大多数女性角色坚持更现实的比例。
Scatterplot of height (in.) and weight (lbs) between male and female characters
根据训练模型及其数据,下面的散点图预测漫威女性将坚持现实比例。它甚至开始消除男性和女性角色中的异常值,因为有些人重达 1000 磅:
ML vis of height (in.) and weight (lbs) between male and female characters
公民权和教育
那里有很多不同的教育背景,但看到我从我最喜欢的漫威角色中认出的那些是很有趣的!每种教育背景都有,从像 She-Hulk 一样获得 Berkely 的通信学位,到像 Loa 和新的漫威女士这样的高中水平课程,从像螳螂这样的帕马牧师的培训,到像 Meggan 这样通过电视自学,我将他们分为 9 个不同的类别:大学,基础(小学到中学),辅导,高级(研究生学位),军事,特殊(非传统学校环境),未完成,和自学。
第一张图表显示了基于国籍的人物教育水平。标记越不透明,越多的字符接受这种形式的教育。纵观国际角色,很少有角色完成了大学学业,接受了特殊教育,也没有自学成才。然而,在美国,很少有女性完成本科学业,然而更多的女性获得了博士后学位。
Chart showing the education levels of the characters
根据培训模型及其数据,更多的非美国公民漫威女性更有可能获得本科学位、参军、持有高中文凭或接受某种形式的特殊教育。然而,美国公民更有可能拥有高中文凭或接受过某种形式的基础教育。
Chart showing the trends in education based on citizenship
结论
输入两个模型的角色和故事池预测,非美国女性角色更有可能获得高等教育学位,或更有可能获得小学和中学以外的任何其他形式的教育,所有女性角色都可能保持现实的比例。这些预测的结果反映了我们所认为的漫画故事的行业模式:关于富有冒险精神的黑头发、蓝眼睛、受过良好教育的美国男人的故事。
女性角色有潜力创造动态的故事,而不需要 gimickey 的表现。像漫威女士和惊奇队长这样的漫威人物的成功与身份政治没有什么关系,一切都与伟大的故事讲述有关。然而,新的漫威女士是一个普通的青少年,正在与父母和学校以及超级大国的责任进行斗争,这本身仍然很有共鸣。
威尔逊说:“我们不想要一本模范的少数民族书籍,它的全部目的是四处走动,展示在美国的南亚穆斯林是什么样子的。”。“卡玛拉的旅程与任何曾经是青少年的人都有关联。”
这些漫画远非说教,而是以脱离黑发蓝眼冒险家模式的英雄女主角为特色,体现了漫威的一些基本原则。在 20 世纪 60 年代,像蜘蛛侠这样的超级英雄拥有丰富的、不受束缚的生活,有金钱的烦恼和浪漫的焦虑,这让 DC 的超人和蝙蝠侠相形见绌。当神秘的 x 战警在 80 年代初成为一种现象时,克里斯·克雷蒙用反变异的偏执来比喻种族主义和同性恋恐惧症。这些英雄都有不同的感受。几十年后,引入更多的 LGBT 角色和有色人种的超级英雄才有叙事意义。因为超级英雄漫画行业很大程度上依赖于不断重塑几十年前创造的人物,所以它在反映社会变化方面处于独特的有利地位。
“有一点追赶正在进行中,”豪说。“然而,当你看到像《漫威女士》这样的作品时,你会发现漫画也能提升人们超越现状的态度。我很高兴漫威电影没有在漫威漫画充斥着丰胸缩臀的时代找到自己最大的成功。”
“人们在寻找新的故事,”威尔逊说。“像漫威女士这样的书已经改变了工业数学。他们已经改变了女性角色不卖,少数民族角色不卖,新角色不卖的行业教条。我认为这将改变所有层面的思维。我真的很想知道接下来会发生什么。”
上面的结果可能表明,但从绿巨人到漫威女士和新的女性雷神,新一代的英雄正在彻底改变漫画世界,并将性别化的刻板印象历史化。就像威尔逊一样,我很期待接下来会发生什么。
该项目的代码和数据可以在 这里 找到。
掌握文本分析技巧并取得成功
介绍
如果您像我们一样在分析或数据科学领域工作,您会熟悉这样一个事实,即数据以令人难以置信的速度到达,数据科学家和分析师接受过处理最具数值性和分类性的表格数据的培训。但是今天,大部分可用的业务数据是非结构化的,并且是大量文本,例如书籍、文章、网站文本、博客帖子、社交媒体帖子等。公司高管制定重要的业务规则,主要是基于潜在客户、客户和合作伙伴提供的自由格式文本字段中的关键字和短语的使用,以及它们的使用频率和彼此之间的接近度。这是我们的梦想和噩梦:可能有太多的数据要处理。
这就是为什么我们写了这篇关于文本分析的文章,来帮助你跟上将文本转化为数字的速度,并实现一些常见的文本挖掘技术。最终,我们希望您能够将强大的算法应用到您组织的大型文档文本数据库中。
Hacker News 是我们最喜欢的网站之一,用来了解技术和创业新闻,但是浏览这个简约的网站有时会很乏味。因此,我在这篇文章中的计划是尽可能以非技术性的方式向您介绍如何分析这个社交新闻网站,并展示一些初步结果,以及一些关于我们下一步将如何发展的想法。
我下载的黑客新闻数据集包含了从 2013 年 9 月到 2017 年 6 月的一百万篇黑客新闻文章标题。
首先,让我们看看黑客新闻标题中最常见的词的可视化。
一些初步的简单探索
Figure 1
图 1 显示了 2013 年 9 月至 2017 年 6 月黑客新闻标题上出现频率最高的词。
在很大程度上,我们认为这是黑客新闻标题中一个相当标准的常用词列表。最上面的词是“hn”,因为“问 hn”、“秀 hn”是社交新闻网站结构的一部分。“google”、“data”、“app”、“web”、“startup”等等出现频率第二高的词,对于一个像黑客新闻这样的社交新闻网站来说,都在我们的预期之内。
如何将这种方法应用到您的业务中?如果您正在对客户故障单进行故障诊断,而不必通读成千上万的故障单,您希望能够搜索故障单特定字段中有计数的常用单词或短语。
简单的情感分析
让我们来谈谈情感分析这个话题。情感分析根据积极或消极来检测文本主体的情感。当使用时,特别是在大规模使用时,它可以向你展示人们对你重要的话题的感受——特别是你的品牌和产品。
我们可以分析对每种情绪有贡献的字数。从黑客新闻文章中,我们发现每个单词对每个情绪有多大的贡献。
Figure 2
马上,我们在这里发现了一些问题,“cloud”和“slack”被我使用的词典归类为否定词。实际上,“云”是“云计算”的意思,“slack”是黑客新闻上下文中的软件公司。因此,我们的领域知识开始发挥作用,并有助于在这种情况下做出最终判断。
Word cloud 是识别趋势和模式的好主意,否则这些趋势和模式在表格格式中是不清楚或难以看到的。我们还可以比较词云中最常见的正面词和负面词。
Figure 3
如何将这种方法应用到您的业务中?客户支持工作的核心是客户的幸福。自然,你希望他们喜欢你的产品或服务。无论您是在分析反馈表格、聊天记录、电子邮件还是社交媒体,情绪分析都将帮助您听到客户的真实声音,以及他们对您的产品或服务的感受。
词语之间的关系
我们经常想了解文档中单词之间的关系。文本中有哪些常见的单词序列?给定一个单词序列,接下来最有可能是哪个单词?哪些词之间的关系最强?因此,许多有趣的文本分析都是基于这些关系。当我们检查两个连续单词对时,它通常被称为“二元模型”。
Figure 4
从图 4 中我们可以看到,黑客新闻数据中最常见的 bigram 的赢家去了“机器学习”,第二名是“硅谷”。
如何申请到你的企业?分析文本数据的挑战在于理解单词的意思。如果与“水”和“学习”相对,那么“深”就有不同的含义。因此,文本数据中单词计数的简单汇总可能会令人困惑,除非在没有假设独立的单词选择过程的情况下,分析将它与同样出现的其他单词相关联。
词汇网络
单词网络分析是一种对文本中单词之间的关系进行编码并构建链接单词网络的方法。这种技术基于这样一种假设,即语言和知识可以被建模为单词的网络以及它们之间的关系。
Figure 5
对于黑客新闻数据,如图 5 所示,我们可以可视化文本结构的一些细节。例如,我们可以看到组成常见短语的成对或三元组(“社交媒体网络”或“神经网络”)。
如何将这种方法应用到您的业务中?这种类型的网络分析主要是向我们展示文本中的重要名词,以及它们之间的关系。由此产生的图表可以用来获得文本的快速视觉摘要,阅读最相关的摘录。
我们认为文本分析是从客户关系管理中诞生的工具和方法。deepPiXEL 已经在将文本分析应用于组织的服务请求内容方面做了一些有益的研究。我们了解到文本分析是一个旅程,我们看到越来越多的组织转向文本分析,以便更长久地留住更多的客户。没有结构化调查数据能更好地预测客户行为以及客户文本评论和消息的实际声音!
我们希望这篇短文对您有所帮助。一旦组织有能力从文本分析中自动获得见解,他们就可以将见解转化为行动。
你在文本分析方面最著名的技巧是什么?请在下面的评论中与我们分享。
使用 OpenAI 的新“在深度 RL 中旋转”包掌握深度强化学习
OpenAI Five
强化学习 是一种机器学习方法,用于教会智能体如何通过试错来解决任务。 深度 强化学习 是指强化学习与深度学习的结合。
open ai于 2018 年 11 月 8 日在 Deep RL 发布了他们的深度强化学习教育包 。他们的发布声明似乎对我很有吸引力,其中写道:
“在open AI上,我们相信深度学习总体上——特别是深度强化学习——将在强大的人工智能技术的发展中发挥核心作用。虽然有许多资源可以让人们快速进入深度学习,但深度强化学习更具挑战性。我们设计了 Spinning Up 来帮助人们学习使用这些技术,并发展对它们的直觉。我们还看到,在 RL 中胜任可以帮助人们参与跨学科的研究领域,如【AI 安全 ,这涉及强化学习和其他技能的混合。很多人向我们寻求从头开始学习 RL 的指导,因此我们决定将我们提供的非正式建议正式化。”
Release tweet by OpenAI.
因此,我决定快速浏览整个包,这里有一个简短的游览和对那些希望浏览完整包的人的一点建议。
到底什么是’在深 RL 中向上旋转’?
“我们观察到,如果为他们提供正确的指导和资源,对机器学习经验很少或没有经验的人来说,快速成为实践者是可能的。Deep RL 中的 Spinning Up 正是基于这一需求而构建的。”
在深 RL 包装中旋转的整体包括:
RL 简介:
用短视频和适度详细的短笔记简单介绍强化学习。涵盖的主题有 RL 、 RL 算法 和 中的概念【策略优化简介* 。***
我发现对于初学者来说,整个学习材料有点难以理解。关于强化学习基础知识有什么疑问,可以随时参考大卫·西尔弗的 RL 课程 和讲座系列。
Deep-RL 研究论文:
这一领域的一些顶级研究论文是按主题排列的,进一步分为子主题。论文的整体安排是按照一个非常合适的顺序进行的,任何初学者都可以一篇接一篇地轻松阅读。
算法:
一些顶级算法,如普通策略梯度和深度确定性策略梯度,已经在这个包中实现并准备使用。它们都是用 MLP(非递归)演员-评论家实现的,使它们适合于完全观察的、非基于图像的 RL 环境。这些算法的完整文档可以在 这里 找到。
实验和环境:
各种实验和 OpenAI 环境都包含在这个包中。还为超参数调谐提供了一个实验网格。整个实验和环境的交互大部分可以通过命令行(Shell)来控制。
练习:
一旦你完成了教材中面向学习的内容,最后会有几个问题集来测试你的技能。值得注意的是,还有一个为 OpenAI 的长期研究请求做贡献的选项。**
其他实用程序:
像记录器和绘图仪这样的实用程序随软件包提供,以便更好地监控和研究实验的输出和结果。**
参考资料:
这里的 可以参考官方文档 。
这个包的 GitHub 库可以在 这里 找到。
建议:
这个包展示了高质量的学习内容,对你成为一个活跃的 RL 社区成员来说是绰绰有余的,主要是应用方面。但是对于强化学习和深度学习领域的初学者来说,其学习内容的许多部分(如研究论文和算法的实现)可能有点难以理解。在开始使用 OpenAI 的 Deep RL 包中的这个之前,最好至少对这些领域的一些基本概念有一点了解。**
我希望你能从 OpenAI 的这个惊人的资源中开始你的深度强化学习之旅。如果你想为 Deep RL 推荐任何其他同样好或更好的学习资源,欢迎在下面的评论中提出来。
强化学习背后的数学,简单的方法
Photo by JESHOOTS.COM on Unsplash
更新:学习和练习强化学习的最佳方式是去http://rl-lab.com
看看这个等式:
Value function of Reinforcement Learning
如果它没有吓倒你,那么你是一个数学通,阅读这篇文章是没有意义的:)
这篇文章不是关于教授强化学习(RL)的,而是关于解释它背后的数学原理。因此,它假设你已经知道什么是 RL,但在理解数学方程时有一些困难。
如果你不知道 RL,你最好在回到本文之前阅读一下。
我们将一步一步地探究上述等式是如何以及为什么会出现的。
状态和奖励
让我们考虑一系列的国家 S1,S2,…,Sn 每个国家都有某种奖励 R1,R2,…,Rn。我们知道一个代理人(例如:机器人)的工作是最大化其总报酬。这意味着它将经过提供最大奖励的州。
假设代理人在 S1 州立大学,应该有办法让它知道什么是最大化其回报的最佳途径。考虑到代理人没有看到其紧邻国家以外的地方。
为此,除了每个状态 s 的奖励之外,我们还将存储另一个值 V,它代表每个状态所连接的其他状态的奖励。
例如,V1 代表与 S1 相连的所有州的总奖励。奖励 R1 不是 V1 的一部分。但是 S2 的 R2 是 S1 的 V1 的一部分。
这样,通过简单地查看下一个状态,代理将知道后面是什么。
存储在状态 s 的值 V(s)是从一个称为“值函数”的函数中计算出来的。价值函数计算未来的回报。
注意,最终状态(也称为终端状态)没有值 V (V = 0 ),因为没有未来状态和未来奖励。
价值函数在计算未来奖励时也使用折旧。
这与金融业的情况类似,你两年后获得的 1000 美元不如你今天获得的 1000 美元有价值。为了表达这个想法,我们将 1000 美元乘以某个折扣因子𝛄 (0≤𝛄 ≤1)的幂 t 其中 t 是收到付款之前的时间步数。
例如,如果您预计两年后有 1000 美元,贴现因子为 0.9,那么这 1000 美元的今天价值就是 1000 * 0.9 = 810 美元
为什么这在 RL 中很重要?
假设最终状态 S(n)具有 R(n) = 1,并且所有中间状态 S(i)具有 R(i)= 0,将每个状态上的 R(n)乘以𝛄的幂 t 将给出比前一状态更低的 v。这将创建一个从起点到终点递增 V 的序列,这构成了对代理的一个提示,即哪个方向的回报最大化。
因此,到目前为止,我们已经确定每个状态都有一个奖励 R(可能为零)和一个代表未来奖励的值 V。换句话说,V(s)是来自其他州的未来回报的函数。
数学上它被写成
其中 St 是所有与 s 直接或间接相连的状态。
然而,用下一个状态来表示 V(s)比仅用回报 R 来表示更容易,这具有当我们知道下一个状态的 V 时计算当前状态的 V 的优点,而不是对所有未来状态的所有回报求和。
公式变成v(s)= r+𝛄 v(s’)*
到目前为止,我们已经假设所有的状态都是按顺序连接的,但是很少出现这种情况,每个状态都可以连接到代理可能移动到的多个其他状态。
假设 S1 连接到 S2、S3、S4 和 S5,S1 的 V 值应该反映这种情况。
v(S1)=(R2+R3+R4+r5+𝛄(v2+v3+v4+V5))/4。*
我们这里说的是 V(S1)是它所连接的状态的所有值的平均值。请记住,每个 V 都包含未来回报的值,因此通过对邻居进行平均,我们还可以了解他们之后会发生什么。
这个公式表明,我们可以从 S1 到 S2、S3、S4 和 S5,而没有任何对任何特定州的偏好,然而这是不准确的,因为我们知道有一定的概率去每个相邻州,并且这些概率可能不相同。例如,可能有 50%的机会去 S2,30%的机会去 S3,10%的机会去 S4 和 S5。
让我们分别称这些概率为 p2,p3,p4,p5。
于是 V(S1)就变成了v(S1)= p2 * R2+P3 * R3+P4 * R4+P5 * r5+𝛄(p2 * v2+P3 * v3+P4 * v4+P5 * V5)*。不出所料,这些概率被称为转移概率,因为它们表示从一种状态转移到另一种状态的可能性。
我们也可以把它们表示为一个矩阵 P 其中 Pij 是从一个状态 i 到一个状态 j 的跃迁概率。当没有可能的转换时, Pij 将为零。
让我们把公式安排得更有感染力一点:
v(S1)= p2 (R2+𝛄v2)+p3(r3+𝛄v3)+p4(r4+𝛄v4)+P5 (r5+𝛄v5).*
或者采用以下形式:
其中 P(Sk|S) 是到达状态 Sk 已知我们处于 S1 的概率。
在一般形式下,我们可以把它写成:
注意 k 经过所有状态,这意味着我们在对所有状态求和!如果你感到惊讶,不要。正如我们之前所说,转移概率是一个矩阵,它给出了从一个状态转移到另一个状态的概率。因为不是所有的状态都与其他状态相连,所以这个矩阵是稀疏的,包含许多零。
示例让我们考虑前面的示例,其中 s 1 连接到 S2、S3、S4 和 S5,还让我们假设州的总数是 100,所以我们有 S1 到 s 100。做*∑(p(sk | s)(r(k)+𝛄 v(sk))***其中 k 从 2 到 100,与做 sum 从 k = 2 到 5 是一样的,因为对于所有的 k ≥ 6 P(Sk|S)=0。
随机奖励
现在深呼吸,因为我们将增加一层新的复杂性!
奖励本身是不确定的,这意味着你不能假设 R 在每个状态下都是精确已知的。事实上,它是概率性的,可以取不同的值。
为了说明这一事实,假设你是一名射手,你正在瞄准一个目标,我们将假设只有三种状态,S1(瞄准)、S2(击中)、S3(未中)。你肯定知道目标是一串同心圆,你击中的内圈越多,你得到的奖励就越多。
假设你是一个相当好的弓箭手,你有 80%的机会击中目标,所以你有 20%的风险错过它。击中中心的奖励是 100,外圈是 50,最外圈奖励是 10。击中中心的概率是 10%,击中外圈的概率是 30%,击中最外侧的概率是 60%。最后,我们还将假设完全错过目标将导致-50。
所以状态 S1 的值将是:
*v(S1)= . 8 (0.1 * 100+. 3 * 50+. 6 * 10+𝛄 v(S2))+. 2 (1 -50+𝛄 v(S3))
由于 S2 和 S3 是终态,那么 V(S1)和 V(S2)都是零,但上面提到它们是为了不断提醒一般公式。
你可以清楚地看到,每个状态下的奖励都乘以各自的概率,然后求和,例如:(. 1 * 100+. 3 * 50+. 6 * 10)和 (1-50) ,每个状态都乘以导致它的转移概率例如:. 8 (1 * 100+. 3 * 50+. 6 * 10+𝛄 v(S2))*
从上面我们可以推导出通式:
值得澄清的是,表达式 ***p(si,rj | s)***读作从状态 s 过渡到 si 并带有奖励 rj 的概率。
例如 p(S2,100|S1) 读作假设我们在 S1 状态,奖励 100(击中中心)去 S2(击中状态)的概率。答案是. 8 * .1 = .08 (8%)。
如果你还没有注意到,这构成了初始公式的第二部分(在页面的顶部)。
只需将 S 中的 si、rj 替换为S’,将 R 中的 r 替换为R即可得到:
S 是所有状态的集合 R 是所有奖励的集合。
我们接下来将讨论行动和政策 𝜋 。
行动和政策
到目前为止,我们已经说过,我们是随机地在状态之间转换的。例如,我们有 80%的机会从 S1 转移到 S2,20%的机会从 S1 转移到 S3。但是我们没有说这是怎么做到的!是什么引发了这种转变?答案很简单,就是代理在某个状态下做的某个动作。这个动作可能不是唯一的,在给定的状态下可能有几个可用的动作。到目前为止,我们假设有一个被称为“前进”或“做某事”的隐含动作,它以一定的概率将我们从一个状态带到另一个状态。
似乎随机的奖励是不够的,而且行动是不确定的!你无法保证如果你执行一项行动,你会 100%成功。
我们以弓箭手为例,你的目标是击中正中,得到 100 分,那么你瞄准正中,射出这一箭。然而,有很多因素可能会导致你错过。可能是你不够专注,或者是你放箭的时候手在抖,或者是风太大了。所有这些因素都会影响箭的轨迹。所以你可能会击中中心,或者其中一个外圈,或者你可能会完全错过目标!
让我们考虑另一个例子,你在网格上控制一个机器人。假设你用遥控器命令机器人前进。
动作是“向前移动”,预期状态是机器人前面的方块。然而,遥控器可能坏了,或者可能有一些干扰,或者机器人轮子的位置不正确,机器人不是向前移动,而是向右、向左或向后移动。
底线,在执行动作后,从状态 s 到状态s’并获得奖励 r 的概率不是 100%。这就是为什么我们写 p(s ',r|s,a) 这是在给定一个状态sa** 和一个动作的情况下,跃迁到状态 s’ 的概率。
如前所述,每个状态都有几种可用的操作。例如,机器人可能在每个状态(或方块)中都有“向前”、“向左”、“向右”、“向后”。一个猎人在狩猎一个猎物时可能会有不同的动作,比如“开枪”、“射箭”或“投掷长矛”,这些动作中的每一个都会有不同的奖励。指示在特定状态下使用哪个动作的策略被称为策略𝜋。
你猜怎么着!
也是概率性的!我知道生活很艰难:)
所以一个猎人有一些概率使用他的枪,另一个概率使用他的弓,第三个概率使用他的矛。对于一个机器人来说也是一样,它有一定的概率去“前进”,“向左”,“向右”,“向后”。
像往常一样,我们通过对所有这些可能性进行平均,在 V(s)中对此进行量化。
给出以下内容:
【𝜋(a|s】是使用动作 a 遵循策略 𝜋 假设我们处于状态 s.
V𝜋 (s) 是应用t22】策略 𝜋.时状态 s 的值
f(a,s,r) 在这里是我们在随机回报部分建立的价值函数 V(s)的简写,另外使用 p(s ',r|s,a) 以反映对动作的依赖。
使用 f(a,s,r) 只是为了减轻复杂性,强调*【𝜋(a|s】的作用。***
所以最后在展开 f(a,s,r) 之后,我们得到了这篇冗长文章的主题的初始公式:
Value function of Reinforcement Learning
结论
希望这篇文章能够揭开强化学习中价值函数背后的数学之谜。
作为本文的一个收获,您可以将状态 s 的价值函数 V(s)理解为在该状态 s (由于某种策略*【𝜋***)下可用的动作所提供的平均奖励,其中每个动作都有一定的概率将代理转换到状态****
相关文章
- 理解强化学习数学,面向开发者
- 面向开发人员的强化学习政策
- Q vs V 在强化学习中,最简单的方法
- 数学背后的强化学习,最简单的方法
- 动态编程在强化学习中的简便方法
- 蒙特卡洛强化学习中的简单方法
- TD 在强化学习中,最简单的方法
Python 中从头开始的神经网络
制作自己的机器学习库。
Photo by Mathew Schwartz on Unsplash
在这篇文章中,我们将从头开始学习机器学习的数学和代码,用 Python,一个小型库来构建具有各种层(全连接、卷积等)的神经网络。).最终,我们将能够以模块化的方式创建网络:
3-layer neural network
我假设你已经有了一些关于神经网络的知识。这里的目的不是解释我们为什么制作这些模型,而是向展示如何进行适当的实现。
一层层地
我们需要记住这里的大局:
- 我们将输入的数据输入神经网络。
- 数据从层流向层,直到我们有了输出。
- 一旦我们有了输出,我们就可以计算误差,它是一个标量。
- 最后,我们可以通过减去相对于参数本身的误差的导数来调整给定的参数(权重或偏差)。
- 我们重复这个过程。
最重要的一步是第四步。我们希望能够拥有任意多的层,并且是任意类型的。但是,如果我们修改/添加/删除网络中的一层,网络的输出将会改变,这将改变误差,这将改变误差相对于参数的导数。我们需要能够计算导数,不管网络结构如何,不管激活函数如何,不管我们使用的损耗如何。
为了实现这一点,我们必须分别实现每一层。
每一层应该实现什么
我们可能创建的每一层(全连接、卷积、最大池、丢弃等。)至少有 2 个共同点:输入和输出数据。
正向传播
我们已经可以强调一个要点,那就是:一层的输出是下一层的输入。
这被称为正向传播。本质上,我们给第一层输入数据,然后每一层的输出成为下一层的输入,直到我们到达网络的末端。通过比较网络的结果(Y)和期望的输出(假设 Y*),我们可以计算 en 误差 E 。目标是通过改变网络中的参数来最小化该误差。也就是反向传播(backpropagation)。
梯度下降
这是一个快速的提醒,如果你需要学习更多关于梯度下降的知识,互联网上有大量的资源。
基本上,我们想要改变网络中的某个参数(称之为 w ,以便总误差 E 减小。有一个聪明的方法可以做到这一点(不是随机的),如下所示:
其中 α 是我们设置的范围【0,1】内的参数,称为学习率。无论如何,这里重要的是∂e/∂w(e 相对于 w 的导数)。我们需要能够为网络的任何参数找到该表达式的值,而不管其架构如何。
反向传播
假设我们给一个层误差相对于其输出 (∂E/∂Y)的导数,那么它必须能够提供误差相对于其输入 (∂E/∂X).)的导数
记住E
是一个标量(一个数)T22X
和Y
是矩阵**。**
让我们暂时忘掉∂E/∂X 吧。这里的诀窍是,如果我们可以访问∂E/∂Y,我们可以非常容易地计算∂E/∂W(如果该层有任何可训练的参数)**而无需了解任何网络架构!**我们简单地使用链式法则:
未知的是 ∂y_j/∂w ,这完全取决于该层如何计算其输出。因此,如果每一层都可以访问∂E/∂Y,其中 y 是它自己的输出,那么我们可以更新我们的参数!
但是为什么是∂E/∂X 呢?
别忘了,一层的输出是下一层的输入。这意味着一层的∂E/∂X 是前一层的∂E/∂Y!就是这样!这只是传播错误的一种巧妙方式!同样,我们可以使用链式法则:
这非常重要,是理解反向传播的关键!在那之后,我们马上就能从头开始编写一个深度卷积神经网络了!
用于理解反向传播的图表
这就是我之前描述的。第 3 层将使用∂E/∂Y 更新其参数,然后将∂E/∂H2 传递给上一层,即它自己的“∂E/∂Y".”第二层也会这样做,以此类推。
这在这里可能看起来很抽象,但是当我们将它应用到一个特定类型的层时,它会变得非常清晰。说到摘要,现在是写我们第一个 python 类的好时机。
抽象基类:层
所有其他层将继承的抽象类层处理简单的属性,即一个输入,一个输出,以及一个向前和向后方法。
3-layer neural network
如你所见,backward_propagation
中还有一个我没有提到的额外参数,那就是learning_rate
。这个参数应该类似于更新策略,或者像 Keras 中所说的优化器,但是为了简单起见,我们将简单地传递一个学习率,并使用梯度下降来更新我们的参数。
全连接层
现在让我们定义和实现第一种类型的层:全连接层或 FC 层。FC 层是最基本的层,因为每个输入神经元都连接到每个输出神经元。
正向传播
每个输出神经元的值可以计算如下:
使用矩阵,我们可以使用点积一次性计算每个输出神经元的公式:
我们完成了向前传球。现在我们来做 FC 层的后向传递。
请注意,我还没有使用任何激活函数,因为我们将在一个单独的层中实现它!
反向传播
如前所述,假设我们有一个矩阵,其中包含误差相对于该层输出的导数(∂E/∂Y).)我们需要:
- 误差相对于参数的导数(∂E/∂W,∂E/∂B)
- 误差相对于输入的导数(∂E/∂X)
我们来计算∂E/∂W.这个矩阵的大小应该和 w 本身一样:ixj
其中i
是输入神经元的数量j
是输出神经元的数量。我们需要一个梯度对应一个重量:
使用前面陈述的链式法则,我们可以写出:
因此,
就这样,我们有了更新权重的第一个公式!现在让我们来计算∂E/∂B.
同样,∂E/∂B 需要和 b 本身一样大,每个偏差一个梯度。我们可以再次使用链式法则:
并得出结论,
现在我们已经有了 ∂E/∂W 和 ∂E/∂B 、我们只剩下 ∂E/∂X 这是非常重要的,因为它将“充当”前一层的∂E/∂Y。
再次使用链式法则,
最后,我们可以写出整个矩阵:
就是这样!我们已经有了 FC 层所需的三个公式!
对全连接层进行编码
我们现在可以编写一些 python 代码来实现这种数学!
活化层
到目前为止,我们所做的所有计算都是完全线性的。用那种模式学东西是没希望的。我们需要通过将非线性函数应用于某些层的输出来将非线性添加到模型中。
现在我们需要为这个新类型的层重做整个过程!
别担心,这会快得多,因为没有可学习的参数。我们只需要计算 ∂E/∂X 。
我们将分别称f
和f'
为激活函数及其导数。
正向传播
正如您将看到的,这非常简单。对于给定的输入X
,输出只是应用于X
的每个元素的激活函数。也就是说输入和输出具有相同的尺寸。
反向传播
给定 ∂E/∂Y ,我们要计算 ∂E/∂X 。
注意,这里我们使用了两个矩阵之间的元素乘法(而在上面的公式中,它是点积)。
激活层编码
激活层的代码非常简单。
你也可以在一个单独的文件中写一些激活函数和它们的导数。这些将被用来创建一个ActivationLayer
。
损失函数
直到现在,对于一个给定的层,我们假设 ∂E/∂Y 是给定的(由下一层给出)。但是最后一层会发生什么呢?它是如何得到 ∂E/∂Y 的?我们简单地手动给出,这取决于我们如何定义误差。
网络的误差由 you 定义,它衡量网络对于给定输入数据的好坏。定义误差的方法有很多种,其中最广为人知的一种叫做MSE——均方误差。
Mean Squared Error
其中y*
和y
分别表示期望输出和实际输出。你可以把这种损失想象成最后一层,它把所有的输出神经元挤压成一个神经元。我们现在需要的是,像其他层一样,定义∂E/∂Y。除了现在,我们终于到了E
!
这只是两个 python 函数,可以放在一个单独的文件中。创建网络时会用到它们。
网络类
快好了!我们将制作一个Network
类来创建神经网络,就像第一张图片一样简单!
我几乎注释了代码的每一部分,如果你掌握了前面的步骤,理解起来应该不会太复杂。不过,如果你有任何问题,请留下评论,我会很乐意回答!
构建神经网络
终于!我们可以使用我们的类来创建一个神经网络,我们想要多少层就有多少层!我们将构建两个神经网络:一个简单的异或和一个 MNIST 解算器。
求解异或
从 XOR 开始总是很重要的,因为这是一种简单的方法来判断网络是否正在学习任何东西。
很多东西我觉得不需要强调。只是要小心训练数据,你应该总是有样本维度第一个。例如这里,输入形状是 (4,1,2) 。
结果
**$ python xor.py**
epoch 1/1000 error=0.322980
epoch 2/1000 error=0.311174
epoch 3/1000 error=0.307195
...
epoch 998/1000 error=0.000243
epoch 999/1000 error=0.000242
epoch 1000/1000 error=0.000242[
array([[ 0.00077435]]),
array([[ 0.97760742]]),
array([[ 0.97847793]]),
array([[-0.00131305]])
]
很明显这是有效的,太好了!我们现在可以解决更有趣的事情了,让我们解决 MNIST 吧!
解决 MNIST
我们没有实现卷积层,但这不是问题。我们需要做的只是重塑我们的数据,以便它可以适合一个完全连接的层。
MNIST 数据集由从 0 到 9 的数字图像组成,形状为 28x28x1。目标是预测图片上画的是什么数字。
结果
**$** **python example_mnist_fc.py**
epoch 1/30 error=0.238658
epoch 2/30 error=0.093187
epoch 3/30 error=0.073039
...
epoch 28/30 error=0.011636
epoch 29/30 error=0.011306
epoch 30/30 error=0.010901**predicted values :**
[
array([[ 0.119, 0.084 , -0.081, 0.084, -0.068, 0.011, 0.057, **0.976**, -0.042, -0.0462]]),
array([[ 0.071, 0.211, **0.501** , 0.058, -0.020, 0.175, 0.057 , 0.037, 0.020, 0.107]]),
array([[ 1.197e-01, **8.794e-01**, -4.410e-04, 4.407e-02, -4.213e-02, 5.300e-02, 5.581e-02, 8.255e-02, -1.182e-01, 9.888e-02]])
]
**true values :**
[[0\. 0\. 0\. 0\. 0\. 0\. 0\. 1\. 0\. 0.]
[0\. 0\. 1\. 0\. 0\. 0\. 0\. 0\. 0\. 0.]
[0\. 1\. 0\. 0\. 0\. 0\. 0\. 0\. 0\. 0.]]
这是完美的工作!太神奇了:)
GitHub 知识库和 Google Colab
您可以在下面的 GitHub 资源库和 Google Colab 文件中找到本文使用的全部工作代码。它还包含其他层的代码,如卷积或展平。
[## OmarAflak/Medium-Python-神经网络
通过在 GitHub 上创建一个帐户,为 OmarAflak/Medium-Python-Neural-Network 开发做出贡献。
github.com](https://github.com/OmarAflak/Medium-Python-Neural-Network) [## Python 中从头开始的神经网络
请随时联系我
colab.research.google.com](https://colab.research.google.com/drive/10y6glU28-sa-OtkeL8BtAtRlOITGMnMw)
我最近把那篇文章的内容放到了一个精美的动画视频里。你可以在 YouTube 上看看。
Neural Network from Scratch | Mathematics & Python Code — The Independent Code
Convolutional Neural Network from Scratch | Mathematics & Python Code — The Independent Code
如果你喜欢这篇文章——如果你按下鼓掌按钮,我会非常感激👏这对我帮助很大。和平!😎
Q 学习的数学——Python
理解贝尔曼方程的由来
Photo by Brett Jordan on Unsplash
q 学习
Q-Learning 是一种 强化学习 是一种机器学习。强化学习最近(通常)被用来教一个 AI 玩游戏(谷歌 DeepMind Atari 等)。我们的目标是理解称为 Q-Learning 的强化学习的简单版本,并编写一个将学习如何玩简单“游戏”的程序。让我们开始吧!
马尔可夫链
马尔可夫链是一种数学模型,它经历具有概率规则的状态转换。
Markov chain — Wikipedia
这里我们有两个状态 E 和 A ,以及从一个状态到另一个状态的概率(例如,从状态 E 开始,有 70%的机会到达状态 A)。
马尔可夫决策过程
马尔可夫决策过程(MDP)是马尔可夫链的扩展,用于模拟更复杂的环境。在这个扩展中,我们增加了在每个状态下做出选择的可能性,这被称为动作。我们还添加了一个奖励,这是从一个状态到另一个状态采取一个行动的环境反馈。
Image by Author
在上图中,我们处于初始状态 不懂 ,在这里我们有两种可能的行动, 学习 和 不学习 。对于研究动作,根据一个概率规则,我们可能以不同的状态结束。这就是我们所说的随机环境(random),也就是说,对于在同一状态下采取的同一动作,我们可能会有不同的结果( 理解 而 不理解 )。
在强化学习中,这是我们如何模拟一个游戏或环境,我们的目标将是最大化我们从那个环境中获得的 奖励 。
报酬
回报是来自环境的反馈,它告诉我们做得有多好。例如,它可以是你在游戏中获得的硬币数量。我们的目标是最大化总回报。因此,我们需要把它写下来。
这是我们在某个时间点开始可以得到的总奖励。
例如,如果我们使用上面提到的 MDP。我们最初处于 不了解的状态,我们采取了学习 的行动,从而把我们随机带到了**不了解的状态。因此我们经历了报酬 r(t+1)=-1。现在我们可以决定采取另一个行动,这个行动将给出 r(t+2)等等。总回报是我们在环境中采取行动所获得的所有直接回报的总和。****
以这种方式定义奖励会导致两个主要问题:
- 这个和有可能达到无穷大,这没有意义,因为我们想最大化它。
- 我们对未来回报的考虑和对眼前回报的考虑一样多。
解决这些问题的一个方法是对未来的奖励使用递减因子。
设置 γ=1 让我们回到第一个表达式,这里每个奖励都是同等重要的。设置 γ=0 导致只寻找直接的回报(总是为最佳的下一步行动)。将 γ 设置在 0 和 1 之间是一种折衷,更多地寻求眼前的回报,但仍然考虑未来的回报。
我们可以用递归的方式重写这个表达式,这在以后会很方便。
政策
策略是一种功能,它告诉在特定状态下采取什么操作。该函数通常表示为 π(s,a) ,并产生在状态 s 下采取行动 a 的概率。我们要找到最大化奖励函数的政策。**
如果我们回到以前的 MDP 为例,政策可以告诉你采取行动的概率当你处于不懂* 的状态时。*****
此外,因为这是一个概率分布,所有可能行动的总和必须等于 1。
记号
我们将开始摆弄一些方程,为此我们需要引入新的符号。
这是通过动作 a 从状态 s 到状态s’的预期即时回报**。**
这是通过动作 a 从状态 s 到状态s’的转移概率**。**
Image by Author
在本例中:
- 从状态不懂** 到状态 不懂 通过行动 不学习 等于 0 。**
- 从状态 不懂 到状态 懂 通过行动 学习 的概率等于 80% 。
价值函数
存在两种所谓的“价值函数”。状态值功能,以及动作值功能。这些功能是分别测量“值”或某个状态有多好或某个动作有多好的一种方式。
状态值
一个状态的值是我们从那个状态开始可以得到的预期总报酬。这取决于告诉我们如何做决定的政策。
价值函数
在某个状态下采取行动的值是我们从那个状态开始并采取行动所能得到的预期总回报。也要看政策。
Q 学习的贝尔曼方程
既然我们已经解决了符号问题,我们终于可以开始玩数学了!在计算过程中查看下图可以帮助您理解。
Image by Author
我们将从扩展状态值函数开始。 预期 操作符是 线性 。
接下来,我们可以扩展动作值函数。
这种形式的 Q 值非常普遍。它处理随机环境,但是我们可以用确定性的来写。也就是说,无论何时你采取行动,你总是在相同的下一个状态结束,并获得相同的奖励。在这种情况下,我们不需要对概率进行加权求和,等式变为:****
其中s’是您在状态 s 中采取行动 a 的最终状态。更正式地说,这是:
贪婪的政策
你可能已经在网上读到过贪婪政策。贪婪策略是指你总是选择最优下一步的策略。
Greedy Algorithm — Wikipedia
在贪婪策略上下文中,我们可以写出状态值和动作值函数之间的关系。
因此,将这个代入前面的等式,我们得到在确定性环境中遵循贪婪策略的(状态,动作)对的 Q 值。
或者简单地说,
而这就是 Q-Learning 上下文中的贝尔曼方程**!它告诉我们,在某个状态 s 下,一个动作 a 的值是你采取那个动作得到的即时回报,加上你在下一个状态下可以得到的最大预期回报。**
当你想到它的时候,它实际上是有意义的。
left or right ? — Image by Author
在这里,如果你只看即时奖励**,你肯定会选择向左。不幸的是,游戏结束后,你不能得到更多的积分。**
如果你加上下一个状态的最大期望报酬**,那么你很可能会向右走,因为的最大期望报酬等于零,而的最大期望报酬很可能高于 10–5 = 5***。*******
你也可以调整 γ 来指定对下一个奖励有多重要。
Python 代码
这是一个简单的环境,由一个 5 乘 5 的网格组成。一个宝藏(T)放在格子的右下角。代理(O)从网格的左上角开始。
**O....
.....
.....
.....
....T**
代理需要使用 4 个可用的动作到达宝藏:右上下 。
如果代理采取了一个直接引导他到 T 的行动,他就得到 1 的奖励,否则得到 0 的奖励。
代码被很好地注释了,这就是我们刚刚讨论的内容。现在有趣的部分,Q 学习算法!
我几乎注释了这段代码的每一行,所以希望它容易理解!
运行代码
将上述两个文件放在同一个目录中,并运行:
**python3 medium_qlearning_rl.py**
在纪元编号 40 左右,代理应该已经学会使用最短路径之一(8 步)到达宝藏。
结论
我们已经看到了如何推导统计公式来找到贝尔曼方程,并使用它来教人工智能如何玩一个简单的游戏。请注意,在这个游戏中,可能状态的数量是有限的,这就是为什么构建 Q 表(离散值接近 Q 函数真实值的表)仍然是可管理的。图形游戏怎么样,比如 Flappy Bird,Mario Bros,或者 Call Of Duty?游戏显示的每一帧都可以认为是不同的状态。在这种情况下,不可能建立 Q 表,我们所做的是使用神经网络,其目标是学习 Q 函数。该神经网络通常将游戏的当前状态作为输入,并输出在该状态下可能采取的最佳行动。这被称为深度 Q 学习**,也正是深蓝或阿尔法围棋这样的人工智能成功击败国际象棋或围棋世界冠军的原因。**
我希望你喜欢这篇文章!多待一会儿吧!😎
数学基础:支持向量机+优化
本周我们将看到拉格朗日乘数将如何帮助我们解决 SVM 最优化问题。因此,让我们提醒自己到目前为止已经涵盖了什么。
在第 1 周中,我们定义了学习模型参数的支持向量机 w 和 b ,它们最大化了从决策边界到特征空间中最近点的间隔。此外,我们假设我们的数据点是线性可分的,并且是正确分类的(约束)。
Week 1 optimisation equation and constraints.
然后在第 2 周的中,我们揭示了拉格朗日乘子的原理,用于解决一个受不等式约束的优化问题。让我们回顾一下。
Week 2 Lagrange function.
偏导数 wrt 对 x 恢复平行法线约束,偏导数 wrt λ 恢复约束条件,g(x)= 0。还记得 KKT 条件吗?
KKT conditions.
拉格朗日函数可以扩展到不止一个约束。
使用拉格朗日乘子的 SVM 优化
我们的优化函数是由|| w ||^-1.最大化的这反过来相当于最小化|| w ||。我们的约束条件保持不变。这是二次规划的一个实例;最小化受线性约束的二次函数。我们可以将拉格朗日函数表述如下
Lagrange Function
对 w 和 b 进行偏导数,我们得到
我们现在将优化拉格朗日对偶表示。
The Lagrangian Dual Problem from R. Berwick slides.
这来自于对偶原理,该原理指出优化问题可以被视为原始的(在这种情况下,最小化超过 w 和 b) 或者对偶的(在这种情况下,最大化超过 a )。对于凸优化问题,原始和对偶有相同的最优解。
拉格朗日对偶表示(通过替换偏导数得到)是:
Dual Representation of the Lagrange function of SVM optimisation, [Bishop — MLPR].
我们现在有一个关于 和 的优化问题。要求核函数是正定的,这导致了凸优化问题,给出了与原始原始问题相同的解。
我们内核的内积起着非常重要的作用。为了深入了解,回想一下两个向量的点积返回它们之间角度的余弦值。可以算是一种相似度。现在,在两个向量完全不同的情况下,内积为 0,拉格朗日量没有增加任何东西。在两个向量相似且具有相同输出值的情况下,内积为 1,拉格朗日中的第二项将保持为正。这导致拉格朗日量减少,因此该算法降低了做出相同预测的相似向量的等级。在两个向量相似的情况下,预测不同的结果类别,第二项增加了拉格朗日,这些是我们感兴趣的点。区分两个阶级的要点。
稍后,核还将允许我们通过定义非线性核来对非线性可分的点进行分类。
在优化我们的拉格朗日乘数 a 之后,我们可以对新的数据点进行如下分类
回想一下现在关于我们的 SVM 优化问题的 KKT 条件。
因此,我们要么让拉格朗日乘数等于零,要么不等于零。对于所有的零乘数,它们对y()x*)*的总和没有贡献,因此在新点分类中不起作用。剩余的向量是支持向量,使得
并且它们对应于位于最大边缘超平面上的向量,如下所示。
Support vectors shown in blue, [Bishop — MLPR].
数学家,用数字记录历史
2017 年 9 月中旬,我所在社区的一位成员( datascience.or.id )分享了一个有趣的数据表。它包含了 8000 多名出生或生活在 1980 年之前的数学家的信息,包括性别、国籍、领域等等。这是数据表的完整列,
Table Columns
我们只有有限的栏目,包含 8595 名数学家的出生日期、死亡日期、学位、雇主、博士生导师或学生等信息。让我们看看,我们如何从这个表中进行数据分析,我们可以从中获得什么样的历史。
目标和假设
数据只是以特定方式格式化的一组信息。如果不提出正确的问题并进行分析,这些数据不可能给出我们正在寻找的有价值的见解。假设和熟悉如何收集数据对于限制期望值、获得无偏见的见解以及从目标中得出有意义的答案或故事也很重要。
Define the objective
数据分析的目的或目标在许多情况下是不同的,它可以在获得数据后创建(有时使用另一个支持的附加数据)或收集与目标对应的数据。在数学家数据案例中,我们确实有数据,并试图从数据中获得洞察力,目标如下:
- 一段时间内的性别构成
- 数学家的期望年龄
- 拥有最多数学家的国家公民
- 数学家最多的数学领域
- 博士生导师学生社交网络
这个目标是通过检查列生成的,您可以使用整体方法来获得不同的目标。同样,对于“数学家”的分析,假设是:
- 数据获得得很好
- 95%的出生于 20 世纪 80 年代之前的有影响力的数学家都被记录在案(基于检查我的著名数学家名单的名字)
- 其他假设根据每个目标进行调整
- (读者理解数学-统计-数据-工程术语)
清理数据
有人说过,80%的数据分析工作都是清理,包括检查数据、指标定义、数据类型检查、匹配数据、缺失值、数据验证、过滤、切片、分组,甚至旋转。清理的难度取决于数据表甚至数据集的“脏”程度。
我不会在这里解释我所做的所有清洁过程,但有几点需要注意。(你可以在这里找到完整的分析
a .唯一性 调查数据的唯一性对于确定表的主键或理解数据是如何读取的很重要。在我们的数据中,我假设“数学家”列是主键。我用 python 来看独特性,我得到了这个
Uniqueness Checking
有两个相同的名字,经过我的调查,他们是父子关系。虽然,在写“Jr”的“职业”上可以看出来。知道这一点后(他们是不同的人),我改变数据如下。
Preprocessing Result
然而,我不是只改变一行,因为我发现事实上有很多行的“职业”都填有“小”(见下一个解释)
b . Value Every columns validation 每列必须为每行提供相同类型的信息,可以是日期、数字、字符串或布尔值。对于我们的情况,就像我上面说的,我发现了这个
Not True Columns
正如您所看到的,表值正在移动,这就是为什么有一个名为“未命名:_29”的列。桌子正在移动,大约像这样,
Shifting Table Column
你必须分割数据,然后移动列名,而不是移动行,然后再连接。这里可以看到详情。
结果
数据分析是为了回答我们制定的目标,并创建另一个目标以获得更深入的见解。
- 一段时间内的性别构成
为了得到这个,表格应该按照“性别”列分组,并计算“数学家”的数量。
Gender Grouping
正因为如此,只有当单词包含在实体上时,我们才应该将’ sex_or_gender '上的实体改为男或女。如果实体不是字符串,我们将其更改为 not_clear_2 (并根据数学家的名字将“[‘h”更改为 male,)。
Gender Grouping After Editing
上面的结果给了我们这样的答案:在 20 世纪 70 年代以前,女数学家只占所有男数学家的 1/10。这可能是由许多因素造成的,尤其是女性在那些年所扮演的角色。你可以越来越深入地了解真正的原因,比如开始创建一个时间表,看看性别加班之间的比例,等等。我不会那样做,因为我们需要更多的数据和信息。无论如何,这只是一个触发的“问题和答案”来开始更广泛地关注问题。
Mathematician Gender Ratio
- 数学家的期望年龄
另一个让我感兴趣的方面是数学家的年龄预期,因为表中有关于出生和死亡年份的信息。很容易得到这些数学家的年龄,但是表格上的一些“年份”是用字符串写的,比如“1980 年代”。在我清理数据后,我开始查看年龄,并决定过滤年龄超过 20 岁且出生于公元 500 年以上的数学家的数据。这个过滤器将表切割成 4663 个数学家。
Mathematician Age Ditribution
上面的年龄分布给出了数学家的预期年龄在 70-80 岁之间的信息。它的年龄为 72.42 岁,精确的方差根为 14.86 年(你可以做 T-test 来获得置信度,但是对于如此大量的样本,我认为没有必要)。
从那以后,我对男女之间不同的年龄期望感到好奇。由于女数学家的局限性,我将再次过滤数据以进行比较。从表中可以得出结论,女数学家从 19 世纪 50 年代开始被认为是有影响的数学家。
Number of Female Mathematicians over year of birth and age expectation who born that year
这一数字不同于自 17 世纪以来做出贡献并得到认可的男性数学家,也不同于 1900 年至 1950 年间达到顶峰的数学家人数(无论是女性还是男性)。这一现象可能会让我们做出一个假设,即数学是 1900-1950 年世界上最热门或最性感的话题。可以进一步研究或者问历史学家。
Number of Male Mathematicians over year of birth and age expectation who born that year
在我过滤了 1850 年至 1940 年间出生的数学家的数据后,我计算了性别间的平均值和方差。
1850 to 1940 Mathematician Age Calculation
通过 T 检验,我得到男女数学家年龄差异的置信区间为 2.42 岁到 6.14 岁,置信水平为 95%。女数学家似乎比男数学家年龄大,最少有 2.5 年的空闲时间。预计这一条件将适用于 1940 年以后出生的下一位数学家。
- 国籍和数学领域拥有最多数学家的国家
想象一下,你在一个大行业,你的大老板想知道什么是最有价值的产品或最赚钱的地区,这个部分就像那些问题一样。它很容易生产。
Mathematician Citizenship
此外,你不需要花太多时间来获取数据和创建可视化(尤其是如果你在技术行业)。可以用 python 或者 tableau 做可视化。在我们的例子中,结果会像我上面和下面呈现的那样。
Mathematician Field
可视化使理解数据和回答问题变得更加容易。然而,如果你只是像那样给出可视化会不会很无聊?。有些老板可能会问“从这里我们能看出什么?”尽管对他来说要求很明确。
例如,在我们的例子中,由于上面的可视化,我们目标的答案很容易。美国拥有大多数出生于 1840-1950 年间的数学家,这些数学家大多专注于数学分析。然而,我们可以扩大我们的分析的答案,使更有趣的故事,如果我们告诉“假设”的原因,为什么我们和数学分析将是最。还要解释其他国家或领域之间的显著差异。
- 博士-导师-学生社交网络
在桌子上,有一个专栏是关于这位数学家和另一位博士导师学生之间的关系。因此,我们可以创建具有直接边缘的社会网络作为指导者和学生之间的连接。
Edge Meaning on The Network
在我们创建了网络之后,我们选择一个数学家或者具有最大出度数的节点,这意味着该数学家已经建议了许多数学家。此外,我们假设以他为根的 bfs 树将给出网络上最大的树。
Top 10 of Outdegree Number
从计算来看,安德雷·柯尔莫哥洛夫和戴维·希尔伯特谁的领先度最大。这个拾取应该已经完成了,因为我想从这个复杂的网络中呈现足够清晰的可视化。它几乎有 3314 个节点(我过滤了表格,只选择了有导师或学生的数学家)和 2838 个连接,这意味着它不是一个连通图。因为复杂性,我想通过网络上最大的 bfs 树来可视化。(可视化中的节点大小取决于其输出度数)
Andrey Kolmogorov bfs-tree
这是一棵相当大的树。同时,这是一棵希尔伯特树。
David Hilbert bfs-tree
从上面的图表中可以构建出许多其他的故事。然而,这里不做解释。
PS:用有限的技巧创造敏锐的网络并不容易。
结论
对于我们的数据,可以很容易地说,数学家有很大的性别差异范基础。假设最低工作年龄为 15 年,那么 1855 年和 1965 年是这一伟大课题最多产的时期。此外,他们中的大多数人拥有美国和欧洲国籍(显然,由于他们对科学的支持),数学分析是主要领域,其次是数论和几何。最后,在这些数学家之间,直到 20 世纪 80 年代末,戴维·希尔伯特和安德雷·柯尔莫哥洛夫是他们那个时代勤奋地给许多数学家出谋划策的人。
这并不难,对吗?不对。
数据分析是一种通过数据获取信息的方法,在我们的例子中,数据是在一张表上形成的。它从目标、假设开始,然后创建假设或直接深入数据。错误的目标和松散的假设会让你得到有偏见的结果,在做这件事的时候要小心谨慎。有许多技术可以用来操作数据或表格以达到目标。我已经在上面演示过了,从简单的社交网络表示的比例问题开始。为了提高你对这个问题的直觉,你必须对多种形式的数据进行大量的练习。它很有用,但需要努力。
人工智能数学:你需要的所有基本数学主题
机器学习和深度学习的数学主题基本列表。
If AI is the secret sauce to make Pepper smarter! Then math is the air for all the essential ingredients to make that sauce! Photo by Alex Knight on Unsplash
AI 和数学的关系可以总结为:
一个在 AI 领域工作的不懂数学的人,就像一个不知道如何说服的政客。两者都有一个不可逃避的工作领域!
我不会在学习数学对人工智能的重要性上花费更多的时间,而是直接进入这篇文章的主要目标。
学习人工智能数学的一个流行建议是这样的:
- 学习线性代数,概率,多元微积分,最优化和其他一些话题
- 然后有一个课程和讲座的列表,你可以跟着去完成同样的任务
虽然上面的方法非常好,但我个人觉得还有另一种方法更好,特别是对于那些 1)没有扎实的定量背景,2)没有时间完成所有数学课程的人。那就是:
不要按主题走,而是按主题走。
例如,在学习多元微积分的时候,你会遇到著名的斯托克斯定理,但事实证明,它很有可能在实践中,甚至在阅读研究论文时,对你没有任何直接的用处。所以,按科目(课程)走可能很耗时,你可能会迷失在浩瀚的数学海洋中。
我建议您:
- 一个话题接一个话题,先学习基本概念,巩固它们
- 只有这样,当你在实际实施和阅读文献中遇到其他概念时,你才能去理解它们
以下是每个科目的基本主题列表:
线性代数
- 向量
定义、标量、加法、标量乘、内积(点积)、向量投影、余弦相似性、正交向量、正交向量、向量范数、向量空间、线性组合、线性跨度、线性独立性、基向量 - 矩阵
定义、加法、转置、标量乘法、矩阵乘法、矩阵乘法性质、hadamard 积、函数、线性变换、行列式、单位矩阵、可逆矩阵、逆矩阵、秩、迹、常见的矩阵类型——对称、对角、正交、正交、正定矩阵 - 特征值和特征向量
概念、直觉、意义、如何寻找 - 主成分分析
概念、性质、应用 - 奇异值分解
概念、性质、应用
结石
- 功能
- 标量导数
定义、直觉、常见的微分法则、链式法则、偏导数 - 梯度
概念、直觉、性质、方向导数 - 向量与矩阵演算
如何求{标量值,向量值}函数对{标量,向量} - >四种组合的导数-雅可比 - 梯度算法
局部/全局最大值和最小值,鞍点,凸函数,梯度下降算法-批处理,小批处理,随机,它们的性能比较
概率
- 基本规则和公理
事件、样本空间、频率主义方法、相关和独立事件、条件概率 - 随机变量-连续和离散,期望,方差,分布-联合和条件
- 贝叶斯定理,映射,极大似然估计
- 流行的分布-二项式,伯努利,泊松,指数,高斯
- 共轭先验
多方面的
- 信息论-熵,交叉熵,KL 散度,互信息
- 马尔可夫链-定义,转移矩阵,平稳性
有什么消息来源可循? 任何适合你的资源,无论是 YouTube 视频还是古典教材。
如果你不确定,对每个主题进行简单的谷歌搜索[ <主题名称> +“机器学习”],并阅读顶部链接,以获得广泛的理解。
这个清单可能看起来很长,但它可以节省你很多时间。阅读以上主题会让你有信心潜入 AI 的深层世界,自己探索更多。
如果你喜欢这篇文章,请关注我 Abhishek Parbhakar 获取更多与人工智能、哲学和经济学相关的文章。
机器学习的数学:线性回归和最小二乘回归
Mathematics for Machine Learning
机器学习完全是关于数学的,虽然现在有很多库可以通过函数调用来应用复杂的公式,但无论如何都需要学习至少关于它的基础知识,以便更好地理解它。
让我们试着用简单的方法来理解线性回归和最小二乘回归。
什么是线性回归?
线性回归是一种预测算法,它提供了 预测 (称之为***【Y’)和输入*(称之为***【X’***)之间的线性关系。
正如我们从基础数学中所知,如果我们绘制一个**‘X’,‘Y’**图形,线性关系总会出现一条直线。例如,如果我们画出这些值的图表
(Input) X = 1,2,3,4,5
(Prediction) Y = 1,2,3,4,5
这将是一条完美的直线
Linear Straight Line graph
在进一步深入之前,让我们了解一个事实,即在现实生活中,我们不会在输入和预测之间获得如此完美的关系,这就是为什么我们需要机器学习算法
两点间的直线方程
使用y = mx + b
写出直线方程,其中m
是斜率(梯度)b
是 Y 轴截距(直线与 Y 轴相交的地方)。
一旦我们以y = mx + b
格式从空间中的 2 个点得到一条直线的方程,我们可以使用相同的方程来预测产生一条直线的x
的不同值的点。
在这个公式中,m
是斜率,b
是 y 截距。
线性回归是一种预测未知输入值
'X'
的'Y'
值的方法,如1.5, 0.4, 3.6, 5.7
甚至-1, -5, 10
等。
让我们以一个真实世界的例子来演示线性回归的用法和最小二乘法的用法来减少误差
线性回归与现实世界的例子
让我们举一个真实世界的例子来说明农产品的价格,以及它是如何随着销售地点的不同而变化的。直接从农民手里买的价格会很低,从市区带来的价格会很高。
给定这个数据集,我们可以预测中间位置的产品价格
当数据集用于预测时,它也称为训练数据集
Agricultural Product and its price at point of sale
在本例中,如果我们将输入'X — Axis'
视为销售地点,将'Y — Axis'
视为价格(想想你熟悉的任何货币),我们可以将图表绘制为
Graph: Agricultural Product and its price at point of sale
问题陈述
给定此数据集,预测农产品的价格,如果它是在农户住宅和市中心之间的中间位置销售的
训练数据集
上面提供的数据集可以被视为上述问题陈述的训练数据集,如果我们将这些输入视为模型的训练数据,我们可以使用该模型来预测以下位置的价格
- 农民之家——村庄
- 村庄-城镇
- 城镇—城市
- 城市—市中心
我们的目标是,当我们使用直线方程绘制直线时,得到一条直线,使训练数据和预测模型之间的误差最小化。
直线方程(y = mx + b)
数学允许我们在二维图形中的任意两点之间得到一条直线。对于这个例子,让我们把农民的家和价格作为起点,把城市中心作为终点。
起点和终点的坐标将是
(x1,y1) = (1, 4)
(x2,y2) = (5, 80)
其中
x
代表位置,y
代表价格。
第一步是以y = mx + b
的形式提出一个公式,其中x
是一个已知值,y
是预测值。
为了计算任何输入值x
的预测值y
,我们有两个未知数m = slope(Gradient)
和b = y-intercept(also called bias)
斜率(m =的变化/x 的变化)
线的斜率计算为y
的变化除以x,
的变化,因此计算结果如下
Calculating m = Change in Y / Change in X
应使用公式y-y1 = m(x-x1)
计算 y 轴截距/偏差
Finding y = mx + b
一旦我们得到了我们的公式,我们可以通过用x
代替用于计算公式的起点和终点来验证它,因为它应该提供相同的y
值。
Verifying y = mx + b
现在我们知道我们的公式是正确的,因为我们通过替换x
值得到了相同的y
值,但是在中间的x
的其他值如何呢,也就是2,3,4
,让我们找出答案
Predicting Y values for unknown X values
这些值与训练集中实际存在的值不同(可以理解为原始图形不是直线),如果我们对照原始图形绘制此(x,y)
图形,则直线将远离x=2,3, and 4
图形中的原始点。
Graph: Actual Line Vs Projected Straight Line
然而,第一步是成功的,因为我们成功地预测了未知值
X
的Y
最小化误差
误差被定义为实际点和直线上的点之间的差值)。理想情况下。我们希望有一条直线,在这条直线上所有点的误差最小。
有许多数学方法可以做到这一点,其中一种方法叫做最小二乘回归
最小平方回归
最小平方回归是一种最小化误差的方法,其方式是最小化所有平方误差的总和。以下是计算最小二乘回归的步骤。
首先,计算m = slope
的公式是
Calculating slope(m) for least squre
**注:2 表示正方形,一个 python 语法
所以让我们计算得出斜率(m)所需的所有值,首先从用x
计算值开始
Calculating x — xmean for all X values
现在让我们用y
来计算数值
Calculating y— ymean for all Yvalues
这些值的可用性允许我们计算所有
(x — xmean)*(y — ymean)
Calculating Sum of All (x — xmean)*(y — ymean)
现在让我们来计算等式的分母部分,即
Sum of (x — xmean)**2
Calculating Sum Of (x — xmean) square
所以总的计算结果是
Calculating the slope
y 轴截距的计算
使用公式b = ymean — m * xmean
计算 y 轴截距
Getting the y-intercept value
总体公式现在可以用y = mx + b
的形式写成
Getting y = mx + b
对 X,Y 值使用最小二乘回归
让我们看看当我们对所有 x 值应用y = 19.2x + (-22.4)
时,预测y
如何变化。
Predicting Y for all X using Least Square
让我们对照标准值绘制这个特殊的直线图。
Graph: Comparing Actual Vs Least Square
我们可以看到,与起点和终点之间的直线值相比,这些值更接近实际的直线。如果我们将它与直线图进行比较,我们就能看到不同之处
Graph: Comparing Actual Vs Least Square Vs Straight Line
为什么这种方法叫最小二乘回归?
该方法旨在减少所有误差值的平方和。误差越小,与原点的整体偏差就越小。我们可以将其与直线产生的误差以及最小二乘回归进行比较
Calculating Sum Square Error of Straight line
Calculating Sum square error of least square
正如我们所看到的,最小二乘法提供了比两点之间的直线计算更好的结果。
最小二乘法并不是机器学习中改进模型的唯一方法,还有其他方法,我会在后面的文章中谈到
感谢阅读…!!!
达克什
matplotlib——让数据可视化变得有趣
Photo by Alex Litvin on Unsplash
数据可视化是理解数据集并从中进行推断的关键步骤。虽然人们总是可以一行一行、一个单元一个单元地仔细检查数据,但这通常是一项单调乏味的任务,并且不能突出显示全局。另一方面,视觉效果以一种只需看一眼就能理解的形式定义数据,并保持观众的参与。
Matplotlib 是一个 Python 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版物质量数字。—matplotlib.org
Matplotlib 是一个基本的库,它为各种绘图提供了选项,并以标签、标题、字体大小等形式提供了广泛的定制。我观看了大量的视频,并在网上阅读了可视化的文章。为了更好地理解 Matplotlib,我从 Kaggle 获取了人口密度数据集,并开始创建自己的可视化效果。本文重点介绍了我绘制的图表,包括我从数据中得出的定制和推论。
完整的工作以 GitHub 知识库的形式呈现,作为使用 Matplotlib 的可视化,以便快速参考。我们开始吧!
导入库
和往常一样,我们首先需要导入所有必需的库。我们导入Numpy
和Pandas
库进行数据处理。然后我们导入matplotlib
,用它的模块pyplot
绘制数据,用cm
绘制调色板。语句%matplotlib inline
确保所有图形在笔记本中内嵌显示。
导入数据集
不需要文件dataset.csv
的前四行,所以我们可以跳过前四行,将数据导入变量dataset
。然后我们使用head(5)
来检查数据。
我们会立即看到一些与我们无关的栏目。首先,我们可以保留Country Name
,但可以删除Country Code
。因为我们知道我们正在处理人口密度,我们可以删除列Indicator Name
和Indicator Code
。接下来,年份1960
和2016
的列具有NaN
值。NaN
代表的不是数字,我们应该删除这些列,因为它们不提供任何信息。最后,有一个未命名的列也有NaN
值,所以我们也可以删除Unnamed: 61
。
我们使用dropna
方法删除所有可能有空值或 null 值的行,并使用dataset.isnull().sum()
检查是否所有列都没有 null 值。我们看到所有都显示空值。
我们现在准备可视化我们的数据。
(英)可视化(= visualization)
现在,我们将使用 Matplotlib 来创建我们的图,并使用可视化来得出有意义的结论。
线形图
我们首先用线图分析Aruba
这些年的人口密度。我们沿 x 轴取年份,沿 y 轴取人口密度。
我们选择 x 值为dataset.columns[1:]
,这将选择除第一列之外的所有列,因为我们只需要年份,而不需要Country Name
列。接下来,我们选择 y 值作为选择第一列的dataset.iloc[0][1:]
,即国家Aruba
和除第一列之外的所有列。可以使用dataset[0][0]
获得国家名称。为了绘制图表,我们只需使用plot
函数,并将 x 轴和 y 轴的参数分别定义为 x 和 y。
恭喜你!!我们的第一个情节准备好了!!
First Plot
是的,它起了作用,但是很难理解。没有标签,轴值重叠。这就是 matplotlib 的定制能力派上用场的地方。让我们把它变得更容易理解一点。
rcParams
允许我们修改图形大小、字体大小等等。然后我们添加一个标题,xlabel 和 ylabel。xticks
允许我们定义文本的旋转角度,我们将其设置为 90 度。然后我们再次绘图,并将线的宽度定义为4
。
Updated Plot
我们现在可以看到,该图更具描述性,只是做了一些修改。
从上面的图中,我们可以看到人口密度在 20 世纪 80 年代之前一直在稳步上升。从 20 世纪 90 年代开始,密度急剧上升,并继续保持同样的增长,直到 2000 年代中期趋于稳定。
我们也可以使用折线图来观察不同国家的趋势。我们选取前 5 个国家,比较它们的人口密度增长。由于我们现在要处理单个图表上的多条线,我们应该为每个国家使用不同的颜色,并且还要定义一个图例,为每个国家分配一种独特的颜色。
这里,我们遍历数据集的前 5 行,并将这些值绘制成线图。我们使用matplotlib
的cm
包及其rainbow
方法来选择颜色。在绘图方法中,我们必须指定label
参数,因为它确保当图例被启用时,图例名称被显示。使用方法legend()
启用图例,其中我指定了一个属性,即24
的大小。
Comparing 5 countries based on their Population Density
我们可以看到,阿鲁巴、安道尔、阿富汗、安哥拉和阿尔巴尼亚这五个国家的人口密度都有所上升。
现在,我们已经在一个单独的地块上绘制了所有的线图,很容易看出,与其他 4 个国家相比,阿鲁巴的人口密度一直较高。
条形图
使用带有相关参数的方法bar()
可以轻松创建条形图。我们从绘制 2015 年所有国家的人口密度开始。
Bar Plot for Population Density of all countries for 2015
虽然情节确实试图在同一时间提供大量信息,但出于同样的原因,它缺乏提供任何有用的信息。x 轴标签中有太多的重叠,以至于整个绘图变得毫无用处。我们不仅需要可视化我们的数据集,还需要巧妙地可视化数据集的重要部分。如果把密度最大的前 10 个国家排序一下,看一看就更好了。
我们首先使用sort_values
方法,根据2015
年的人口密度,按照descending
的顺序对国家进行排序。然后,我们使用head(10)
方法选择前 10 名。然后,我们用这些新数据绘制柱状图。
Top 10 most densely populated countries for 2015
现在信息非常清楚了。数据是等间距的,并用不同的颜色清楚地表示出来。
在 2015 年的数据集中,澳门特区和摩纳哥的人口密度在所有其他可用国家中最高。
散点图
散点图是将数据显示为开放空间中的点的图。散点图非常有用,因为我们可以根据某个值指定每个数据点的大小,并且数据本身可以表示它与其他点的区别。
我们现在分析所有年份平均人口密度低于每平方公里土地面积 10 人的国家。
首先,我使用dataset.sum(axis = 1)
对每一行的所有数据求和,然后使用lambda
方法对每个最终值除以列数得到平均值。然后,我将这个值与小于或等于 10 的值进行比较,并将其用作数据集的索引。结果是平均人口密度小于或等于 10 的所有国家。我现在再次计算这个值,这次将它存储在变量consolidated_data
中。绘制散点图的方法与其他图相似,但有一点小小的变化。我们现在可以使用参数s
定义每个数据点的大小。我一直保持大小相当于人口密度。由于值很小,我将每个值乘以 20,这样差异就更明显了。
Countries with average Population Density less than equal to 10
您可以看到,每个数据点都根据其密度值以自己的大小显示在图表上。
在数据集中的所有国家中,格陵兰的平均人口密度似乎最小。
深入分析
现在,我们将更深入地研究数据集,看看能否得出更多结论。
描述性分析
我们可以看到全世界的最大和最小密度值是否有任何变化。因此,我们需要计算值的范围。
我们使用min()
和max()
方法来计算除Country Name
之外的每一列的最小值和最大值。然后我们在变量diff
中找到范围。然后,我们计算每列最大值的最小值,并将其保存到minOfMax
。当我们绘制条形图时,我们将从所有范围中减去该值,这将确保我们将所有范围与最小范围年份进行比较。这是通过在柱状图中使用apply(lambda x: x-minOfMax)
方法来确保的。
Range of Population Density
我们看到,2001 年,人口密度最大的国家和人口密度最小的国家之间的差距最大,然后在 2002 年急剧下降。
人口与人口密度
探索人口密度是否确实是一个好的衡量标准,以及它是否也反映了一个国家的人口数量,这将是令人惊讶的。由于这个数据集没有人口或面积,我们需要从其他来源获取它。在这里,我们将使用 BeautifulSoup 从维基百科页面中提取土地面积,并使用它来计算人口。然后我们会比较人口和人口密度。你可以参考我关于网络抓取的文章来快速启动。
最后一组包括 170 个国家,我们有完整的可用信息,包括以公里为单位的土地面积。但是由于一次理解和解释这么多国家是很困难的,我们先来看看前 20 个国家。
我们现在通过并排绘制柱状图来比较 20 个国家的人口和人口密度。我们通过将 2015 年的人口密度乘以area
得到Population
。我们可以把画布分成多个支线剧情。方法subplot(rows, columns, index)
用于定义一个支线剧情。这里,我们创建了一个由 2 行 2 列标识的 4 个图组成的画布。第三个参数告诉我们这里指的是哪个图。我们将 20 个国家的数据绘制在索引为 1 和 2 的两个图表中。
Population vs Population Density
我们可以看到Population Density
并不总是描述一个国家Population
的正确尺度,比如国家Bahrain
。
尽管人口密度很高,但孟加拉国的人口比巴林高得多。
结论
在这里,我们使用matplotlib
包来设计和创建图,这有助于我们更好地理解我们的数据集。
希望你喜欢我的作品。请分享你的想法和建议。
Seaborn 实际上非常适合数据可视化
Seaborn 是一个基于 matplotlib 的 Python 数据可视化库(它是 Python 中绘图的常用库)。Seaborn 提供了一个高级界面,用于绘制有吸引力和信息丰富的统计图形。
1.导入
%matplotlib inlineimport matplotlib.pyplot as plt
import seaborn as sns
2.应用默认的 seaborn 主题、缩放和调色板。
sns.set()
您还可以自定义 seaborn 主题或使用默认主题的六种变体之一。它们被称为深色、浅色、浅色、亮色、深色和色盲。
# Plot color palette
def plot_color_palette(palette: str):
figure = sns.palplot(sns.color_palette())
plt.xlabel("Color palette: " + palette)
plt.show(figure)
palettes = ["deep", "muted", "pastel", "bright", "dark", "colorblind"]
for palette in palettes:
sns.set(palette=palette)
plot_color_palette(palette)
使用这个 colab 文件 可以按照自己的步调学习下面的例子。谷歌的合作实验室是一个免费的 Jupyter 笔记本环境,不需要设置,完全在云中运行。
3.加载数据集
我们将在这里使用 tips 数据集,它将帮助我们浏览一些真实的示例。
tips = sns.load_dataset("tips")
tips.head()
4.绘图数据
让我们从使用多个语义变量的散点图开始,来可视化我们正在处理的数据集。
sns.relplot(x="total_bill", y="tip",
col="time", # Categorical variables that will determine the faceting of the grid.
hue="smoker", # Grouping variable that will produce elements with different colors.
style="smoker", # Grouping variable that will produce elements with different styles.
size="size", # Grouping variable that will produce elements with different sizes.
data=tips)
seaborn 中有几种专门的绘图类型,它们针对不同变量(数值和分类)之间的可视化关系进行了优化。可以通过[relplot](https://seaborn.pydata.org/generated/seaborn.relplot.html)
访问它们。
我们还可以使用lmplot
绘制线性回归模型。
sns.lmplot(x="total_bill", y="tip",
col="time", # Categorical variables that will determine the faceting of the grid.
hue="smoker", # Grouping variable that will produce elements with different colors.
data=tips)
或者简单地说:
sns.lmplot(x="total_bill", y="tip", data=tips)
sns.lmplot(x="size", y="tip", data=tips)
sns.lmplot(x="size", y="tip", data=tips, x_estimator=np.mean)
tips["big_tip"] = (tips.tip / tips.total_bill) > .15
sns.lmplot(x="total_bill", y="big_tip",
y_jitter=.03,
logistic=True,
data=tips)
seaborn 中还有其他几种专门的绘图类型,它们针对可视化分类变量进行了优化。他们可以通过catplot
访问。
sns.catplot(x="day", y="total_bill",
hue="smoker", # Grouping variable that will produce elements with different colors.
kind="swarm", # Options are: "point", "bar", "strip", "swarm", "box", "violin", or "boxen"
data=tips)
或者,我们可以使用核密度估计来表示采样点的基本分布。
sns.catplot(x="day", y="total_bill",
hue="smoker", # Grouping variable that will produce elements with different colors.
kind="violin", # Options are: "point", "bar", "strip", "swarm", "box", "violin", or "boxen"
split=True,
data=tips)
或者您可以显示每个嵌套类别中的唯一平均值及其置信区间。
sns.catplot(x="day", y="total_bill",
hue="smoker", # Grouping variable that will produce elements with different colors.
kind="bar", # Options are: "point", "bar", "strip", "swarm", "box", "violin", or "boxen"
data=tips)
jointplot
和pairplot
使多情节可视化成为可能。jointplot
关注单个关系,而pairplot
从更广的角度来看,显示所有成对关系和边际分布,可选地以分类变量为条件。
sns.jointplot(x="total_bill", y="tip",
kind="reg", # Options are "scatter", "reg", "resid", "kde", "hex"
data=tips)
sns.pairplot(hue="smoker", # Grouping variable that will produce elements with different colors.
data=tips)
并排绘制两幅图像
figure = plt.figure()
figure.add_subplot(1, 2, 1)
plt.imshow(image_grey, cmap='gray'), plt.axis("off")
figure.add_subplot(1, 2, 2)
plt.imshow(image_binarized, cmap='gray'), plt.axis("off")
plt.show()
您甚至可以绘制更复杂的网格,例如:
Subplots. Credit: labri.fr
参考资料:
看看这个故事 colab 文件 ,做些修改,如果觉得有帮助就分享吧。
最后,我创建了一个 3 分钟的调查,以帮助收集您在机器学习项目中最常用的工具和技术的数据。一旦收集到数据(如果您选择与我分享您的电子邮件),我们会与您分享这些数据,目的是确定趋势和最佳实践。
这项调查有助于确定现有工作流程中的改进领域和难点。
请花点时间填写这份调查【http://bit.ly/ml-survey-2019 T4
使用强化学习优化多交易场景中的广告收益
正如我之前的帖子所暗示的,这篇帖子是关于工作中可以使用 RL 的一些东西。设置如下:
假设你开发了某种网站或者 app。幸运的是,你已经吸引了一个坚实的用户群,现在费用变得足够高,你需要使用广告来赚钱的产品。你会发现有很多广告交易所,谷歌、脸书、Appnexus 等等。,你可以连接到。你如何最大化你的收益?一种方法是使用中介,目前大多数中介都是静态的。中介经常从各种网络中抓取数据来安排订单。另一种方法是使用标题竞价,这种方法不适用于应用程序。最后,我们可以使用服务器端的交叉交换竞价,这需要一个特殊的平台,如 DFP(交换竞价)。我在这里尝试的方法只是使用强化学习来预测您应该向哪个广告交易所发送广告请求。而且稍微有趣一点,应该用什么底价。
因为大多数广告交易不会提供每次请求的获胜价格;这意味着我们不能轻易获得奖励信号。虽然我们可以用每日收入作为信号,但我认为这太稀疏了,因为任何像样的出版商每天都会有数百万的广告请求。我们要使用的解决方法是:设置一组 adunitss,比如说 100 个,每个 adunit 都有一个单独的底价,比如说 1-100。如果一个特定广告单元的广告请求被满足,我们认为报酬是“底价+0.5”(0.5 只是一个使报酬不为 0 的小把戏;实际上,CPM 通常略高于底价)。这显然没有为我们建立完美的环境,但我认为这是一个合理的近似值(记住:DQN 也有过冲)。原因如下:
我用正态分布来模拟中标价格。这里是当分布为 norm(14,1)时的预期收益率分布。最大预期收益率 11.72 美元是在 12 美元的底价下,这意味着如果我们只连接到这一个交易所,我们应该始终使用将底价设置为 12 美元的 adunit。
现在,如果我使用 TensorForce 的 VPG 在相同的设置上运行 RL,我会得到以下结果:
如您所见,它非常接近 11,12 范围(尽管我们必须减去 0.5,因为它是一个人工项)。行动围绕着 12 美元的底价展开。
增加更多的交流让学习变得更难,但没什么好怕的。下面是我们有 5 个交换[[18,5],[4,5],[18,2],[50,5],[6,0]]的场景。每个子列表的第一个数字是正态分布的平均值,第二个是方差。
最后的行动不仅选择最有希望的广告交换,而且选择以 41,42 为中心的底价。假设我们实际上知道模型动态,它几乎与下面的分析结果完全一致。
在这个设置中,我做了一些重要的假设:
- (最大的一个)分布是平稳的。虽然我认为具体的分布并不重要(RL 所做的只是最大化平均值,根据 DeepMind 的最新论文,这可能不是最好的方法),但环境绝对必须是静止的。我不相信主流 RL 研究已经破解了非平稳 RL,尽管我知道一些公司如阿里巴巴使用在线 RL 来解决这个问题。一个简单但不完美的解决方法是每天晚上训练模型,这提供了一个相对最新的模型。在这方面,为了节省计算,切尔西·芬恩关于元学习的工作可能会派上用场,这显然是前沿研究(更新:OpenAI 的新论文试图解决非平稳性问题)。
- 在实际应用中,对应用程序来说更难,因为客户端应用程序保存数据,不像 web 服务器。通常我们能做的是将数据上传到服务器进行训练,并将学习到的模型发送回客户端执行。这很复杂,但肯定是可行的(因为每个设备上的广告数据不应该那么大)。但是我相信谷歌的联合学习更有前途。
- 我已经将环境大大简化为本质上的强盗问题。现实世界肯定有某种连锁效应,例如,用 adunit Y 选择 exchange X 会影响后面选择的性能(想想在 Go 中你的第一步如何影响后面的游戏)。我不知道目前如何最好地模拟这种环境(奖励函数有点难以指定——这是 RL 中的一个大挑战,也是为什么我们需要反向 RL;我可能会在未来更多地探讨这一点),但我认为任何中型/大型出版商都应该有大量的数据作为环境。因此,研究真实数据将是一个更好的方法。顺便说一句,腾讯有人一直在这个问题上挑战我——他认为连锁效应不存在。我可以举的一个例子是:假设有 2 个鞋类广告,一个来自耐克,另一个来自非品牌,首先显示耐克的广告肯定会影响非品牌的点击率。
- 此外,我还忽略了“直销”广告。这是故意的。预订购买通常具有更高的优先级,甚至可以在进入这种情况之前处理。
总之,我构建了一个利用 RL 的广告收益最大化的简化模拟(总的来说,我对数据效率不太满意)。我听说一些公司正在做类似的事情,但这肯定不是一种广泛采用的做法。我希望这是一个开始。
这里的代码是。其实超级简单。
深度学习云提供商的最佳交易
AWS、谷歌、Paperspace、vast.ai 等等
我想知道我应该在哪里以最低的成本和最少的麻烦在线训练我的深度学习模型。我没能找到一个比较好的 GPU 云服务提供商,所以我决定自己做一个。
如果你对 GPU 和 TPU 了如指掌,只想要结果,请随意跳到漂亮的图表。
在本文中,我没有考虑服务模型,但是将来我可能会考虑。跟着我,确保你不会错过。
深度学习芯片选项
我们简单看一下可用于深度学习的芯片类型。我将通过与福特汽车进行比较来简化主要产品。
光靠 CPU 做深度学习真的很慢。你不想用它们。它们对许多机器学习任务都很好,只是不适合深度学习。CPU 是深度学习的马车。
Horse and Buggy
对于大多数深度学习计算,GPU 比 CPU 快得多。NVDIA 制造了市场上的大多数 GPU。接下来我们要讨论的几款芯片是 NVDIA GPUs。
一个 NVIDIA K80 大约是你开始深度学习所需的最低要求,并且不会有极其缓慢的训练时间。K80 就像福特 A 型车——一种全新的出行方式。
Ford Model A
英伟达 P4s 比 K80s 快。它们就像福特嘉年华。绝对是对 a 型车的改进。它们并不常见。
Ford Fiesta. Credit; By Rudolf Stricker CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/), from Wikimedia Commons
P100 是嘉年华的升级版。这是一个相当快的芯片。对于大多数深度学习应用程序来说完全没问题。
Ford Taurus. Credit: ford.com
NVDIA 还制造了许多消费级 GPU,经常用于游戏或加密货币挖掘。这些 GPU 通常工作正常,但在云服务提供商中并不常见。
目前市场上最快的 NVDIA GPU 是特斯拉 V100——与特斯拉汽车公司无关。V100 大约比 P100 快 3 倍。
https://www.nvidia.com/en-us/data-center/tesla-v100/
V100 就像福特野马:速度很快。如果你现在正在使用 PyTorch,这是你最好的选择。
Ford Mustang. Credit: Ford.com
如果你在谷歌云上使用 TensorFlow/Keras,你也可以使用张量处理单元——TPUs。Google Cloud、Google Colab 和 PaperSpace(使用 Google Cloud 的机器)都有 TPU v2。它们就像矩阵计算中的福特 GT 赛车。
Ford GT. Credit: Ford.com
TPU 的 v3 仅在谷歌云上对公众开放。TPU v3 是你今天能找到的最快的深度学习芯片。它们非常适合训练 Keras/TensorFlow 深度学习模型。它们就像一辆喷气式汽车。
Jet car. Credit: By Gt diesel — Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=30853801
如果想加快训练速度,可以增加多个 GPU 或者 TPU。然而,当你增加数量的时候,你将支付更多。
结构
深度学习框架有几种选择。我在这里写了一篇关于哪些最受欢迎和最受欢迎的文章:
谁在使用、兴趣和受欢迎程度上领先?
towardsdatascience.com](/deep-learning-framework-power-scores-2018-23607ddf297a)
TensorFlow 的市场份额最大。Keras 是由 Google 开发的高级 API,运行在 TensorFlow 和其他几个框架上。PyTorch 是 pythonic,脸书支持的酷小子。FastAI 是 PyTorch 的高级 API,它使得用几行代码训练世界级的模型变得很容易。
使用 PyTorch v1.0 预览版和 FastAI 1.0 对模型进行训练。PyTorch v1.0 Preview 和 FastAI v1.0 是最前沿的,但允许你非常快速地做真正酷的事情。
参赛者们
我测试了配备 GPU 的云提供商,他们对大量深度学习实践者有很强的价值主张。纳入要求:
- 按小时或更小的增量付费。
- 安装配置不能差。尽管如此,我还是将 AWS 包括在内,因为它们拥有如此大的市场份额。
事不宜迟,如果你开始深度学习,这里是你需要知道的云提供商。
Google Colab
Google Colab 免费。这是一个带有漂亮 UX 的 Jupyter 笔记本系统。它集成了 GitHub 和 Google Drive。Colab 还允许合作者在笔记本上留下评论。
对于 Keras 或 TensorFlow 来说,Colab 上手速度非常快,这并不奇怪,因为这些开源库都是谷歌自己开发的。Pytorch v1.0 预览版需要进行一些配置,并且有些问题。当使用 Resnet50 和适当大小的分辨率图像时,我不得不关闭 FastAI v1 的并行性以节省内存。
2019 年 1 月 15 日更新。PyTorch 位于 V1,Google Colab 增加了 Docker 容器的共享内存。您现在可以并行运行这个测试了。
Colab 既有 GPU 也有 TPU。在撰写本文时,您不能将 TPUs 与 PyTorch 一起使用。然而,TPU 对 PyTorch(以及 FastAI) 的支持正在进行中——谷歌工程师正在制作原型——截至 2018 年 10 月 25 日。
谷歌云
谷歌云计算引擎是比 Colab 更强大、更可定制的云选项。像 AWS 一样,它需要一些配置,令人沮丧的配额增加,总账单有点难以估计。与 AWS 不同,Google Cloud 接口更容易使用,更容易配置,TPU 可用于 TensorFlow/Keras 项目。
Pricing changes as you change Google Cloud instance settings
可抢占的实例节省了很多钱,但是有被打断的风险——它们对大多数学习任务来说都很好。
如果你有资格获得 $300 初始信用并且不介意一些配置,谷歌云是一个进行深度学习的好地方。如果您进行扩展,他们的价格、安全性、服务器选项和易用性使他们成为领先者。
AWS
AWS EC2 并不是最容易配置的东西,但它太受欢迎了,每个深度学习从业者都应该在某个时候经历配置的阵痛。在我的文章《寻找数据科学家工作列表中最受欢迎的工具》中,AWS 位列前十。
雇主在寻找什么?
towardsdatascience.com](/the-most-in-demand-skills-for-data-scientists-4a4a8db896db)
AWS 的入门级 GPU 产品是 p2 . x large——AWS 称之为具有 4 个 CPU 和 61 个 RAM 的 NVDIA Tesla K80。截至 2018 年 10 月下旬,您可以通过每小时 0.28 美元的现货定价节省资金。尽管存在没有实例可用的风险。几乎每次我尝试以略高于最近的价格购买现货时,都会收到一个。
AWS instance configuration fun
AWS 是可伸缩的、安全的和可靠的。它运行着互联网的大部分。不幸的是,这也是一个痛苦的设置。我建议你不要用 AWS 开始你的深度学习之旅,除非你已经熟悉这项服务,或者是一名经验丰富的程序员。
图纸空间
让 Jupyter 笔记本在纸张空间渐变上运行非常快。用 FastAI v1.0 版设置 PyTorch v1.0 版预览版也很容易。
Paperspace 有谷歌的 TPUv2s,这是除了谷歌之外唯一一家有能力租用它们的公司。这里有一篇关于这个功能的好文章。与谷歌云相比,TPU 的价格有点贵,为 6.50 美元——在谷歌云上,你可以用不到一半的价格买到可抢占的 TPUs。
Paperspace 的网站表明他们非常重视安全性。他们有 SLA。总部位于纽约的 Y-combinator alum 公司最近筹集了 1300 万美元。Paperspace 有自己的服务器,也使用其他人的服务器。他们是合法的。
vast.ai
vast.ai 是 GPU 共享经济选项。这是一个为需要 GPU 的人和在 vast.ai 上列出他们机器的第三方个人匹配的市场。它有一个非常好的仪表板和非常好的价格。
理论上,你使用的第三方机器可以获取你的数据,尽管实际上这并不容易。这里见讨论。
此外,正常运行时间可能会低于云基础架构公司。例如,电源或互联网可能会在源头中断,这可能是某个人的房子。对猫狗分类没问题,对病人病历没问题。
Vast.ai 在仪表盘上显示的机器技术规格信息比我从其他任何云提供商那里看到的都多。我用了一台 GTX 1070 Ti,每小时收费 0.065 美元,预计正常运行时间约为 99.5%。那就是每小时 6.5 美分!安装最新的 PyTorch 版本很快。我不建议以更低的价格竞标,只要以当前价格租赁,否则你很可能会失去你的机器。
vast.ai Options
除了 Kaggle 和 Google Colab 有限的免费选项,vast.ai 是获得体面性能的最低成本选项。
其他选项
我看了很多其他的 GPU 选项。我没有测试我的已知 GPU 云提供商列表上的每一项服务——因为其中许多服务要么不容易快速设置,要么在成本上没有竞争力。
如果你正在学习机器学习,那么你应该花些时间在 Kaggle 上。它有一个很棒的学习社区,有教程、竞赛和大量数据集。Kaggle 提供免费的 K80 GPUs,12GB VRAM,2 个 CPU 内核,6GB RAM,最长 12 小时。我发现这个网站很落后,他们的笔记本没有 Jupyter 笔记本通常有的快捷方式。
此外,在 Kaggle 上上传定制包和处理文件也很困难。我建议你不要用 Kaggle 进行深度学习训练,但要用它做很多其他机器学习的事情。
我试着用了 IBM Watson 和微软 Azure。他们都悲惨地没有通过简单设置测试。我花了 30 分钟和他们每个人在一起,然后决定这已经足够了。当有更好的选择时,生命太短暂了,不必要的复杂。他们也是
许多快速部署的服务有良好的客户服务和良好的 UX,但甚至不提数据安全或数据隐私。VectorDash 和蝾螈都可以快速部署,而且相当划算。 Crestle 部署迅速,但价格较高。FloydHub 要贵得多,K80 每小时的成本超过 1 美元。基本机器的价格不到 0.10 美元,但我在启动时不断出错,聊天帮助在两天后没有回应(尽管他们很快回应了之前的一个问题)。
Amazon SageMaker 比 AWS EC2 更加用户友好,但与列表中的其他选项相比没有成本竞争力。像 p2.xlarge 这样的基本 K80 GPU 设置需要花费 1.26 美元!我发现,它还需要增加配额才能使用,这可能需要几天时间。
每个云公司都应该突出讨论安全性、SLA 和数据隐私。谷歌、AWS 和 PaperSpace 做到了这一点,但许多较小的新公司却没有。
实验
我在 Jupyter 笔记本上使用 FastAI v1.0 在流行的猫与狗图像分类任务上训练了一个深度学习模型。该测试提供了云提供商实例之间有意义的时间差异。我使用 FastAI 是因为它能够用很少的代码快速训练模型达到非常好的验证集精度(一般约 99.5%)。
我使用 %%time 魔法命令来测量时间。比较 Wall time 是因为那是 Google Colab 会输出的时间。对三种操作的壁时间求和:用 fit_one_cycle 训练,用 fit_one_cycle 解冻并再次拟合,以及用测试时间增加预测。 ResNet50 用于迁移学习。请注意,初始训练的时间是在第二次运行时进行的,因此下载 ResNet50 的时间不会包括在时间计算中。我用来训练模型的代码改编自 FastAI 的文档,可在这里获得。
结果
这里有一个图表,显示了机器规格的实例结果。
数据和图表可以在 Kaggle 的这个 Jupyter 笔记本中找到。以下是以图形方式显示的培训成本结果。GCP 是谷歌云平台的简称。
Google Colab 是免费的,但是很慢。那些需要花钱训练的人。vast.ai 是迄今为止性价比最高的。
我花了几天时间查看了 vast.ai 的定价,类似规格的机器一般都能买到。有一天,我测试了一台类似的机器,第一台机器的培训成本为 0.01 美元,而第二台机器的培训成本为 0.008 美元,所以结果非常相似。如果 vast.ai 看到用户需求大幅增长,而用户主机没有类似的大幅增长,价格预计会上涨。
让我们画出每小时的花费和训练时间的关系图。
左下角是您想要的位置—优化成本和培训时间。vast.ai、谷歌云的单一 P100 和谷歌云的单一 V100 是强有力的选择。
如果你真的想要速度,AWS 的 V100 x4 是最快的选择。它的培训成本也是最高的。
如果你真的不想花钱,谷歌 Colab 的 K80 可以完成这项工作,但速度很慢。同样,并行化对于 Colab 来说是不可能的。据推测,这将得到解决,其性能将接近 20 分钟,其中谷歌云的 K80 和 AWS 的 K80 进来。Colab 将是一个更好的选择,但仍然很慢。一旦 TPUs 与 PyTorch Colab 配合使用,对 PyTorch 用户来说应该会更好。
在效率方面,Paperspace 比其他选择稍贵,但它减少了许多设置上的麻烦。Paperspace 也有一个非常非常基本的标准 GPU ,起价每小时 0.07 美元,但规格如此之低(即 512 MB GPU RAM),以至于它不太适合深度学习。Google Colab 有一个更好的免费选择。
远离有效边界的期权被排除在最终图表之外。例如,AWS 的 p2.8xlarge 将位于每小时成本与训练时间图表的中上部分,训练时间超过 16 分钟,spot 实例为每小时 4.05 美元。这不是一个好的值。
如果映像上没有最新的软件包版本,则本实验中报告的时间并不反映 SSH 和安装这些版本的时间。AWS 花了一段时间——至少 10 分钟才能得到一个运行中的 Jupyter 笔记本,即使在我为这个项目做了很多次之后。
Google Cloud 的运行速度要快得多,部分原因是 PyTorch v1.0 预览版和 FastAI V1.0 版的图像是可用的。
vast.ai 需要几分钟的时间来旋转,但随后只需点击一下,你就可以进入一个 vast.ai 在线 Jupyter 笔记本,这非常容易使用。
这项研究的一个限制是,图像分类任务只是一个使用。然而,其他深度学习训练可能会显示类似的结果。
推荐
如果你是这整个领域的新手,想学习深度学习,我建议你先学习 Python,Numpy,Pandas,和 Scikit-learn。我对学习工具的建议在这篇文章中。
如果你已经是一个熟练的程序员,知道如何处理新代码中的 bug,我建议你用 FastAI v1.0 开始深度学习。可运行的文档现已发布。
如果你正在学习 Keras/TensorFlow,Google Colab 是一个很好的起点。它是免费的。如果 Colab 开始提供更好的 PyTorch v1.0 支持,如果您正在学习 FastAI 或 PyTorch,它也可能是一个很好的起点。
2019 年 1 月 15 日更新。PyTorch 位于 V1,Google Colab 增加了 Docker 容器的共享内存。根据 FastAI 的内置时钟,用 FastAI 1.0.40.dev0 训练和测试模型用了 20:10。这将节省超过 1/3 的时间。
如果你正在用 FastAI 或 PyTorch v1.0 构建,并且不需要数据隐私,并且你不是使用 Google Cloud 或 AWS 的专业人士,我建议你从 vast.ai 开始。它的性能很好,非常便宜,而且相对容易设置。我在这里写了一篇用 FastAI 使用 vast.ai 的指南。
如果你在扩展,使用谷歌云。这是一个价格合理、安全可靠的完整产品包。UX 和配置复杂度优于 AWS。GPU、CPU 和 TPU 的定价很容易估算,不会随需求而变化。然而,存储和辅助费用可能很难破译。此外,如果您计划运行更强大的 GPU 或 TPU,您将需要请求增加配额。
法律免责声明:如果你忘记关闭你的实例,不保存你的进度,或者被黑客攻击,我不负任何责任😦。
我希望这篇文章能为您节省一些时间🕐还有钱💵当你建立深度学习模型的时候。
如果你觉得这很有趣,请通过分享来帮助其他人找到这篇文章。
如果你喜欢数据科学、机器学习和深度学习,请关注我。
最大似然估计:工作原理及在 Python 中的实现
之前,我写了一篇关于使用非参数估计量来估计分布的文章,其中我讨论了估计从未知分布生成的数据的统计属性的各种方法。本文介绍了一种在给定数据的情况下估计概率分布参数的非常有效的方法,称为最大似然估计。
这篇文章是研究投资组合优化的数学框架的系列文章的一部分,并解释了在 OptimalPortfolio 中看到的它的实现。
极大似然估计量
我们首先了解什么是最大似然估计量(MLE ),以及如何用它来估计数据的分布。当特定的分布被指定时,极大似然估计量被认为是参数估计量。
本质上,MLE 的目标是在给定一组概率分布参数的情况下,最大化每个数据点出现的概率。换句话说,找到使数据点的概率(可能性)最大化的概率分布的一组参数。形式上,这可以表示为
优化这个概率和的问题是,它通常涉及参数的非常讨厌的指数,这使得找到最优值更加困难。因此,引入了对数似然的概念。对数似然基本上是数据点出现的概率的对数。形式上,
使用对数似然的好处有两方面:
- 概率密度函数中的指数变得更易于管理和优化。
- 概率的乘积变成一个和,这使得单个分量最大化,而不是使用 n 个概率密度函数的乘积。
MLE 的概念出奇的简单。困难在于如何有效地应用这种方法来估计给定数据的概率分布参数。在我们讨论实现之前,我们应该开发一些数学基础,看看 MLE 是否在所有情况下都有效。为此,请考虑以下因素:
让
该函数将被最大化以找到参数。1/n 的附加因子显然不影响最大值,但对我们的证明是必要的。考虑:
这是真实参数下对数似然的期望值。换句话说,在某种意义上这是我们的目标对数可能性。大数定律(LLN)指出,当数据点的数量趋于无穷大时,同独立(iid)随机变量的算术平均值收敛于随机变量的期望值。因此,我们可以证明:
这意味着在给定足够数据的情况下,MLE 是一致的,并且收敛于参数的真值。
学生的最大似然估计
由于最大似然估计的通常介绍性例子总是高斯分布,我想用一个稍微复杂一点的分布来解释,即 Student-t 分布。这也是我的 OptimalPortfolio 实现中使用的发行版。使用高斯分布和 Student-t 分布的区别在于,Student-t 分布不会产生 MLE 的解析解。因此,我们需要研究某种形式的优化算法来解决它。它为我们提供了一个学习期望最大化算法的机会。
EM 算法
EM 算法本质上是在给定数据和参数的先验分布的情况下计算对数似然的期望值,然后在给定这些参数的情况下计算对数似然函数的该期望值的最大值。一般来说,第一步是:
然后:
重复这一过程,直到参数值收敛或达到给定的精度阈值。该算法可以相对容易地应用于 Student-t 分布。重要的事实是注意到 Student-t 分布的参数来自 Gamma 分布,因此,在第一步中计算的期望值如下:
其中 d 为随机变量的维数,M 为马氏距离,定义如下:
一旦计算出来,我们就可以计算 Student-t 分布的对数似然的最大值,它有一个解析解,即:
这个估计和期望值的计算可以迭代直到收敛。在 python 中,它看起来像这样:
import pandas as pd
import numpy as np
def expectation_max(data, max_iter=1000):
data = pd.DataFrame(data)
mu0 = data.mean()
c0 = data.cov()
for j in range(max_iter):
w = []
# perform the E part of algorithm
for i in data:
wk = (5 + len(data))/(5 + np.dot(np.dot(np.transpose(i - mu0), np.linalg.inv(c0)), (i - mu0)))
w.append(wk)
w = np.array(w)
# perform the M part of the algorithm
mu = (np.dot(w, data))/(np.sum(w))
c = 0
for i in range(len(data)):
c += w[i] * np.dot((data[i] - mu0), (np.transpose(data[i] - mu0)))
cov = c/len(data)
mu0 = mu
c0 = cov
return mu0, c0
结论
分布参数的估计是数据统计建模的核心。这是任何数据科学家和定量分析师的必备技能。对于那些感兴趣的人来说, OptimalPortfolio 是对这些方法如何结合起来优化投资组合的阐述。
五月版:数据可视化
9 篇文章帮助你创造美丽的视觉效果
富有创意和吸引力的可视化效果是将注意力吸引到数据中的关键信息和趋势的最佳方式之一,有助于直观地理解这些信息和趋势。现在有许多不同的工具和资源可以用来创建这些数据可视化。
最近关于数据科学,有几篇很棒的文章强调了可视化数据的有趣方法。对于 5 月份,我们精心挑选了一些热门文章来帮助您了解如何可视化您的数据。
与艾伦·唐尼关于数据科学的坦诚对话
Ryan Louie 的坦诚对话系列的一部分,在这次对话中,Ryan 与 Allen Downey——奥林学院计算机科学教授、作家和博客作者——讨论了对非技术受众的态度如何影响数据科学家的工作,以及如何定义算法偏差。 (8 分钟读取)
捍卫简单,数据可视化之旅
一篇关于数据可视化的重要性以及作者 Irene Ross 在该领域的道路和哲学的介绍性文章。 (7 分钟读取)
十年推特数据可视化
Tanyoung Kim 的这篇文章向你展示了如何可视化 Twitter 数据,以揭示朋友之间的联系、Twitter 的长期使用以及其他行为模式。 (5 分钟读完)
可视化警察杀人
Olagunju Abdul-Hammid 的这篇文章展示了如何使用可视化技术对美国关于警察杀人的数据集进行探索性数据分析。 (4 分钟读取)
市级项目
作为长期项目aitecture.com、罗曼·库丘科夫的一部分,展示了人工智能如何被用于特定的任务,比如以俄罗斯城市为例识别城市模式。 (5 分钟读取)
人工智能帮助医学研究人员发现严重哮喘的基因特征
Devi Ramanan 指导我们通过研究发现了一个 1693 年的基因签名,使用人工智能有意义地区分严重哮喘和非哮喘以及轻中度哮喘。 (6 分钟读取)
最后,我们还推荐阅读汉娜·韩嫣的文章,她目前正在参加关于数据科学和视觉故事的 100 天项目挑战。以下是一些亮点:
20 种安慰食品大学生在有压力、无聊、悲伤或高兴时消耗最多
根据不同的心情,有趣地呈现大学生对食物的偏好。 (2 分钟读完)
哪些航空公司最危险
对 1908 年至 2009 年间记录的 5000 起坠机事件进行分析,试图获得关于承运人选择的明智决策的见解。 (2 分钟读取)
十年全球恐怖主义地理空间可视化
对过去 10 年全球恐怖主义的概述,分析攻击的地理位置以及攻击的类型及其演变。 (3 分钟读取)
我们也感谢最近加入我们的所有伟大的新作家埃里克·勒、尼古拉·贝尼尼、杰森·I·卡特、迪帕克·阿米尔塔·拉杰、克里夫·埃维斯迪克、阿希什·萨马尔、瑞安·路易、卢卡斯·科鲁奇、瑞典人怀特、耶蒂·桑蒂我们邀请你看看他们的简介,看看他们的工作。
Cherie & Inês
五月版:在数据科学领域找到一份工作
9 篇必读文章
这就是这么多数据科学家离职的原因
由 Jonny Brooks-Bartlett — 8 分钟阅读
是的,我是一名数据科学家,是的,你确实没看错标题,但总得有人说出来。我们读到了很多关于数据科学是 21 世纪最性感的工作,以及作为数据科学家可以赚到诱人的钱的故事,这似乎是绝对的梦想工作。
Booking.com 一位数据科学家的日记
由西康大乘 — 6 分钟读完
大约两年半前,我作为一名数据科学家加入了Booking.com,此前我在迪拜从事了 3 年的咨询工作。从咨询转向纯粹的数据科学角色是我职业生涯中的一个重大转变,事后看来,我很高兴自己做出了这个选择。
最好的数据科学家没有被发现
由杰瑞米·哈里斯 — 5 分钟阅读
这里有一个有趣的事实:在现实中,并没有很多情况下,一个 ML 工程师的工作实际上需要他们有一个博士学位。那么要一个的真正意义是什么呢?
在 Scout24 担任数据科学家
由扬·扎瓦日基 — 6 分钟阅读
我和 Scout24 数据科学团队正在撰写我的硕士论文,并在这里学到了很多关于实践和组织结构的知识。
激活您的数据科学职业生涯的 45 种方法
由基里尔·叶列缅科 — 8 分钟阅读
我们询问了 LinkedIn 小组成员,他们在成为成熟的数据科学家时面临的最大挑战是什么。一些最常见的挫折是:不知道从哪里开始,缺乏经验,无法形成网络,难以联系到合适的人。
数据科学面试指南
由赛义德·萨达特·纳兹鲁尔 — 12 分钟阅读
数据科学是一个相当大且多样化的领域。因此,做一个万事通真的很难。传统上,数据科学将专注于数学、计算机科学和领域专业知识。
在数据科学领域找份工作会是什么样子
克里斯汀·凯尔勒(Kristen ke hrer)—9 分钟阅读
备选标题:我的人生故事:)我读过一些文章,这些文章指出进入分析和数据科学有多难。这不是我的经历,所以我想分享一下。
获得数据科学家工作的两面性
通过法维奥·巴斯克斯 — 16 分钟阅读
你好!这是一篇我等了很久才写的博客。主要是因为我需要做研究,听听其他人对此的看法。
如何王牌数据科学面试( R & Python 、 SQL 、统计)
卡森·福特 — 27 分钟阅读
对于从事或试图从事数据科学工作的人来说,统计学可能是你需要发展的最大和最令人生畏的知识领域。这篇文章的目标是把你需要知道的东西减少到有限数量的具体想法、技术和方程式。
我们也感谢最近加入我们的所有伟大的新作家,克里斯汀·凯尔赫勒,劳伦·奥尔德加,阿拉娜·鲁德尔,沙拉思·斯里尼,斯科特·伦德伯格,塔尔·佩雷茨,埃尔维斯,阿德蒙德·李,伊利亚·瓦尔查诺夫,瑞安·戈特斯曼 赛义德·萨达特·纳兹鲁尔,谢尔盖·马尔切夫斯基,萨姆·格拉西,本杰明·霍夫曼,雅各布·茨威格,因巴尔·诺尔,布莱恩·约翰逊等等很多人。 我们邀请你看看他们的简介,看看他们的工作。
也许杯子终究是半满的…
科学家发现,大脑天生就会关注好消息,忽略坏消息。
我们天生乐观吗?
当你思考你的未来时,你相信会发生什么?总的来说,你认为事情会怎样发展?自古以来,青少年杂志、小报和网上性格测试就充斥着测试你是“半杯水”还是“半杯水”的测试。虽然这可能是一个有趣的话题,但乍一看,它似乎不是科学研究中最自然的领域。
然而,无数的研究已经开始研究这个问题:我们天生倾向于乐观还是悲观?30 多年的研究结果如此压倒性地支持一方的论点,以至于出现了被称为“不切实际的乐观主义”的现象。一次又一次,在各种背景下,人们高估了发生在自己身上的积极事件的可能性,同时低估了消极事件的可能性。重度吸烟者低估了他们早死的几率;女性低估了她们患乳腺癌的风险;普通人认为他们比其他人更有可能变得富有。
然而,到目前为止,这一领域的研究在很大程度上涉及到对其中一个结果的某种程度的先验吸引力——即,对我来说,患癌症的可能性越低,结果就越好。这造成了一个复杂的混淆,不清楚是潜在的强化学习偏向于好消息,还是复杂的信念形成和更新过程倾向于那些乐观的个人结果。巴黎认知神经科学实验室最近的一项研究试图解开这个困惑。
最新研究
由 Germain Lefebvre 领导的研究小组探索了这一主题,要求参与者在成对的中性选项中进行选择。以这种方式,在选择之间不可能存在现有的推断的合意性的差异。50 名参与者被展示成对的抽象视觉符号,并被要求选择一个。某些符号与正的、零的或负的金钱回报的高或低的概率相关联,在每个选择后都有反馈。在 24 次试验中,由参与者从经验中学习,哪个符号对应于哪个结果。抽象符号看起来像这样:
Abstract cues were used in the study to avoid participants having any affective association with them before choosing.
参与者被要求按下一个按钮,在左边和右边的符号之间做出选择。一旦做出选择,立即给出反馈,告诉他们是收到了€0.50,没有收到€0.50 还是失去了€0.50。
行为实验中所做选择产生的数据符合两种不同的强化学习(RL)模型。第一个是标准的 RL 模型,它平等地考虑了所有的结果,不管它们是积极的还是消极的。这被称为 Rescorla-Wagner 模型(RW ),可追溯到 20 世纪 70 年代早期。简单地说,该模型计算预测误差—* ,即预期结果与实际结果之间的差异。然后,这个预测误差的某一部分被用于更新下一组期望。用于后续更新的预测误差部分被称为“学习率”,用希腊字母 alpha (α)表示。学习率的界限如下,0 > α > 1,α值越高,表示从以前的经验中学习得越多。第二个模型也被用来拟合数据。这一个,RW 模型,允许正面结果(α+)和负面结果(α-)有不同的α值。该实验旨在观察哪种模型更准确地拟合数据;标准 RW 模型或 RW 模型。*
一些有趣的结果
通过统计分析,Lefebvre 和他的同事发现 RW 模型比 RW 模型更好地解释了数据。假设积极和消极结果的学习率不同,可以改进我们如何从抽象符号中选择的预测。他们发现,积极结果α+的不同学习率明显高于消极结果α-的学习率。在最基本的层面上,我们从产生比预期更好结果的环境中获取的信息比从产生比预期更差结果的环境中获取的信息更多。在 50 名参与者中,发现 21 名具有对称的学习率(α+ = α-),即他们是无偏见的学习者;另外 29 个被发现有不对称的学习率,其中 25 个是“乐观”的学习者(α+ > α-),4 个是“悲观”的学习者(α+ < α-)。
但是等等,还有更多…
尽管这项行为实验的发现很有用,但作者的研究还有一个更有趣的转折。参与者在这些抽象符号之间做出的所有 24 个决定都是在他们躺在核磁共振成像仪里的时候做出的!通过这种方式,研究人员可以看到在做出每个选择和接收反馈时,大脑的哪些确切部分是活跃的。通过将行为数据与 fMRI 时间编码扫描配对,有可能区分出那些乐观的参与者和那些学习速度无偏见的参与者中显示活动增加的精确大脑位置。他们发现,对于乐观的学习者来说,在给予反馈时,纹状体和腹内侧前额叶皮层(vmPFC)的活动明显更多(在神经科学中,这被称为“奖励预测误差编码”)。
Areas of the brain that are activated during choice (left) and outcome (right) for optimistic reinforcement learning, α+.
那么这一切到底意味着什么呢?
这项研究认为,在基本层面上,我们的大脑倾向于偏爱好消息而不是坏消息。但是这是怎么发生的呢?大量研究表明,在日常生活中,乐观主义者往往生活得更好;拥有更健康的心脏,更少压力,拥有更广泛的朋友圈。也许目前的这项研究显示了一种先天的生理偏见,表明乐观,即使不切实际,似乎也赋予了一种进化优势。
所以,下一次,当你发现自己在对需要多长时间的评估过于乐观后,匆忙地完成某件事情,或者在没有带伞后,把自己抖干,记住,这是你大脑的方式,保持乐观实际上符合你的最佳利益,即使这可能在当时提供不了多少安慰。
参考文章:
*Lefebvre,g .,Lebreton,m .,Meyniel,f .,Bourgeois-Gironde,s .,和 Palminteri,S. (2017 年)。乐观强化学习的行为和神经特征。*自然人类行为,1,67,1–9。
早餐 MBA 市场篮子分析的简单指南
Photo by Liene Vitamante on Unsplash
所以最近,我很幸运地参与了一个涉及市场篮子分析的项目,但显然我不能在媒体上讨论我的工作。因此,我试着在 Kaggle.com 的 T2 寻找合适的数据集。我设法在这里找到了一个,并且应用了我所知道的一切来实现它!同时也要感谢李苏珊在 MBA 上的出色表现,点击这里!
那么什么是市场篮子分析呢?根据本书数据库营销:
市场购物篮分析仔细检查客户倾向于一起购买的产品,并使用这些信息来决定哪些产品应该交叉销售或一起促销。这个词源于购物者在购物过程中装满的购物车。
顺便说一下, Market Basket 也是美国新罕布什尔州、马萨诸塞州和缅因州的 79 家连锁超市,总部设在马萨诸塞州的图克斯伯里(维基百科)。
通常 MBA 是从销售系统的角度在客户层面上对交易数据进行的。我们可以利用 MBA 从数据中提取产品之间的有趣关联。因此,它的输出由一系列产品关联规则组成:例如,如果客户购买产品 A,他们也会倾向于购买产品 b。我们将遵循三个最流行的标准来评估关联规则的质量或强度(稍后将回到这一点)。
获得正确的包(Python):
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
import mlxtend as ml
让我们来看看我们的面包篮的数据:
bread = pd.read_csv(r"D:\Downloads\BreadBasket_DMS.csv")
bread.head(8)
“数据集包含来自一家面包店的 15’010 次观察和超过 6,000 次交易。关于变量的更多信息可以在图中找到。
面包篮有哪些“热门”商品?
sns.countplot(x = 'Item', data = bread, order = bread['Item'].value_counts().iloc[:10].index)
plt.xticks(rotation=90)
Lit items at BreadBasket
咖啡似乎是数据集中最热门的项目,我猜每个人都想在早上喝杯热咖啡。
每天售出多少件商品?
是时候进入 MBA 本身了!克里斯·莫菲特使用 python 编写了令人敬畏的 MBA 指南和教程,值得称赞。
我们将使用 MLxtend 库的 Apriori 算法来提取频繁项集以供进一步分析。apriori
函数期望数据在一个热编码的 pandas 数据帧中。因此,您的数据帧应该如下所示:
首先,我们将相应地对bread
数据帧进行分组,并显示商品的数量,然后我们需要将商品合并为每行 1 个交易,每个商品 1 个热编码。这将导致上表!
df = bread.groupby(['Transaction','Item']).size().reset_index(name='count')basket = (df.groupby(['Transaction', 'Item'])['count']
.sum().unstack().reset_index().fillna(0)
.set_index('Transaction'))#The encoding function
def encode_units(x):
if x <= 0:
return 0
if x >= 1:
return 1basket_sets = basket.applymap(encode_units)
之后,我们将生成最低支持度至少为 1%的频繁项目集,因为这是一个更有利的支持度,可以向我们显示更多的结果。
frequent_itemsets = apriori(basket_sets, min_support=0.01, use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift")
rules.sort_values('confidence', ascending = False, inplace = True)
rules.head(10)
Final output
结束了
记得我告诉过你们,我们会回到三个最流行的标准,来评估关联规则的质量和强度。有支撑、信心和提升 :
1。支持度是包含特定项目组合的事务相对于数据库中事务总数的百分比。对组合 A 和 B 的支持是,
个人 A 的 P(AB)或 P(A)
2.置信度衡量结果(项目)对
前因(项目)的依赖程度。换句话说,置信度是给定前因后果的条件概率,
专业人员
其中 P(B|A) = P(AB)/P(A)
3.提升(也称为改善或影响)是一种通过支持和信心来克服
问题的措施。Lift 被认为是度量规则的置信度和预期置信度之间的差异——用比率来度量。考虑关联规则“if A then B”。该规则的提升被定义为
P(B|A)/P(B)或 P(AB)/[P(A)P(B)]。
如公式所示,lift 是对称的,因为“如果 A 那么 B”的 lift 与“如果 B 那么 A”的 lift 相同。每个标准都有其优点和缺点,但一般来说,我们喜欢具有高可信度、高支持度和高升力的关联规则。
作为总结,
置信度= P(B|A)
支持= P(AB)
升力= P(B|A)/P(B)
从输出来看,关联规则“if Toast then Coffee”的提升是 1.48,因为置信度是 70%。这意味着购买烤面包的消费者比随机选择的消费者购买咖啡的可能性高 1.48 倍。更大的升力意味着更有趣的规则。高支持度的关联规则是潜在有趣的规则。类似地,高可信度的规则也是有趣的规则。
参考:
Kaggle 数据集:【https://www.kaggle.com/xvivancos/transactions-from-a-bakery】
数据库营销书籍:https://www.springer.com/gp/book/9780387725789
Apriori 算法:http://rasbt . github . io/mlx tend/user _ guide/frequent _ patterns/Apriori/
克里斯莫菲特使用 Python 进行市场篮子分析:http://pbpython.com/market-basket-analysis.html
Kao dim . com:https://www.kaodim.com/
源代码在 Jupyter 笔记本这里!