TowardsDataScience 博客中文翻译 2020(八百三十二)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

将数据从雪花同步到 DynamoDB

原文:https://towardsdatascience.com/syncing-data-from-snowflake-to-dynamodb-e28363b6432?source=collection_archive---------40-----------------------

关于如何同步 DynamoDB 并用来自雪花的数据填充 dynamo db 以供实时应用程序使用的指南

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

图片来源: TanteTati 来自 pixabay

在实现移动和 web 应用程序时,使用 NoSQL 服务作为数据存储是显而易见的。这是因为它能够以低延迟处理操作,并且对开发人员来说很直观。在众多 NoSQL 数据库中,完全托管的 AWS DynamoDB(键值)是最常用的高可伸缩性数据库之一。

在本文中,我将带您了解如何将 DynamoDB 与 Snowflake 的性能增强功能相集成,以弥合低延迟数据存储和繁重复杂的数据计算之间的差距。

为什么要连接 DynamoDB 和雪花

如果您以前使用过 NoSQL 数据存储,您会知道它的主要用途是存储和接收数据,而不是运行分析计算。然而,在数据驱动的应用程序中,总是有分析的元素。

给定一个*“省钱”*类型应用程序的典型场景,当客户本月的非公用事业支出比过去 12 个月的平均支出多 20%时,您可能想要提醒客户。要执行此操作,您可能需要:

  1. 合计本月非公用事业项目的支出
  2. 计算过去 12 个月的非公用事业支出,并取平均值
  3. 找出这个月的花费和过去 12 个月的平均花费之间的百分比差异
  4. 比较客户本月消费百分比差异是否大于 20%

从这里,你将需要客户,他们在过去 12 个月的支出,支出分类器,和一堆计算。这都是 DynamoDB 不擅长的事情,但雪花却非常擅长。

集成雪花和 DynamoDB

有一些集成或 EL 工具可以让您将 DynamoDB 加载到 Snowflake,但没有多少其他方法可以让您使用分析来驱动前端应用程序。

我想给你看一些我整理的东西,这些东西对我正在做的一个项目非常有用。最棒的是,它是一种无服务器和事件驱动的方法。

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

  1. 雪花将数据卸载到 S3,无论是手动卸载、使用编排工具还是创建雪花任务。
  2. 一旦数据放到 S3 上,就会触发一个 Lambda 来读取文件并放入 DynamoDB。

从雪花到 S3 卸货

出于演示的目的,我已经将 2020 年 5 月的墨尔本停车场传感器数据加载到 Snowflake 上,以显示摄取量。

我将所有停车传感器数据卸载到 snowflake-drop2dynamodb S3 桶中,该桶包含大约 170 万行数据。请注意,我为 DynamoDB 表的“id”字段创建了一个散列,因为我没有惟一的标识符。COPY INTO 语句将创建文件块,最大大小为 10mb。对于每个数据块,Lambda 将被调用以接收到 DynamoDB 中(不保证顺序)。

使用 Lambda 将雪花提取物插入 DynamoDB

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

一旦 Snowfload 中的 CSV 文件被卸载到 S3 存储桶中,执行超时为 1 分钟的 Lambda 就开始将文件加载到 DynamoDB 表上。它的建立受到了 AWS 演示的启发。python 函数不会将任何数据加载到内存中,到目前为止,这显示了有希望的结果。

结论

通过使用支持触发器的 S3 和 Lambda,您可以轻松地在 Snowflake 和 DynamoDB 之间构建一个集成管道。这允许您按需或按计划将 DynamoDB 与来自雪花的数据同步。这样,您可以添加或更新属性,同步 DynamoDB 的在线 ML 要素存储和性能批处理计算。

由于我面临的一些挑战,我想实施一些改进,包括:

  1. 能够将失败放在一边重新处理,并将完成的文件移动到另一个文件夹/桶。
  2. 即使 S3 保证至少一次交付,我还是想在上面建立一个审计表,由雪花函数提供支持。
  3. 采用事件驱动的编排方法来提高可靠性和持久性。

希望这篇文章对你有用!

关于我

我一直在帮助企业在生产 AI/ML、数据工程、无服务器和容器领域构建可扩展的云和数据解决方案,并且对前端开发越来越感兴趣。你可以在 LinkedIn 上和我联系聊天——只要告诉我你来自 Medium。

自然语言处理的句法处理

原文:https://towardsdatascience.com/syntactic-processing-for-nlp-e88e2eb4fa35?source=collection_archive---------18-----------------------

NLP 项目

在系列的这一部分,我们将了解用于分析句子的句法或语法结构的技术。

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

图片来自 PixabayPDPics

词法分析的目的仅仅是使用词干化、词汇化、纠正拼写错误等技术进行数据清理和特征提取。但是,在句法分析中,我们的目标是单词在句子中扮演的角色,解释单词和句子的语法结构之间的关系。

你可以在我以前的文章中读到关于词法分析的内容。

举个例子,就拿这两句话来说吧:

  1. 德里是印度的首都。
  2. 德里是印度的首都吗?

两个句子用词相同,但只有第一个句子语法正确,可以理解。基本的词汇处理技术无法进行这种区分。因此,需要更复杂的语法处理技术来理解句子中单个单词之间的关系。

句法分析关注句子中词法不关注的以下方面:

  1. **词序和意义:**句法分析旨在发现单词之间是如何相互依赖的。改变词序会使理解句子变得困难。
  2. 保留停用词:去掉停用词可以完全改变句子的意思。
  3. **单词的形态学:**词干化、词目化会使单词变成它的基本形式,从而修改句子的语法。
  4. **句子中单词的词性:**识别单词的正确词性很重要。例如——“他脸上的割伤和淤青”(这里的“割伤”是名词)&“他切了一个苹果”(这里的“割伤”是动词)。

既然有了句法处理的基本思路,下面就来详细了解一下。

从语法上分析

句法处理最重要的部分之一是解析。它意味着把一个给定的句子分解成它的“语法成分”。我们通过一个例子来了解一下。

假设你向一个问答(QA)系统提问,比如 Siri 或 Alexa,下面这个问题:“谁获得了 2019 年一级方程式锦标赛的冠军?”

只有当 QA 系统能够理解短语“一级方程式锦标赛”与短语“2019 年”相关时,它才能做出有意义的响应。短语“在 2019 年”指的是一个具体的时间框架,因此大大修改了问题。找到句子中短语之间的这种依赖性或关系可以通过解析技术来实现。

我们再拿一个句子来理解一个解析过的句子是什么样子的:“敏捷的棕色狐狸跳过桌子”。这个句子分为三个主要部分:

  • “敏捷的棕色狐狸”是一个名词短语
  • “jumps”是一个动词短语
  • “over the table”是一个介词短语。

现在,让我们理解应用于任何给定文本的不同层次的句法分析。

词性标注

先说句法分析的第一层——词性(词性)标注。一个单词可以被标记为名词、动词、形容词、副词、介词等。这取决于它在句子中的作用。分配正确的标签,如名词、动词、形容词等。是句法分析中最基本的功能之一。

例如,你问 Alexa 或 google home 一个问题——“好的谷歌,我在哪里可以获得在不同州之间旅行的许可?”。现在,“permit”这个词可能有两个词性标记——一个名词和一个动词。在短语“我需要一份工作许可证”中,“许可证”的正确标记是“名词”。另一方面,在“请允许我出去”这句话中,单词 permit 是一个动词。

分配正确的词性标签有助于我们更好地理解短语或句子的意图,因此是句法处理的一个重要部分。事实上,所有后续的解析技术(选区解析、依存解析等。)使用词性标签解析句子。

注意,POS 标签集不是标准的——一些书籍/应用程序可能只使用基本形式,如 NN、VB、JJ 等,而不使用粒度形式,尽管 NLTK 使用这一标签集

虽然词性标注有助于我们识别单词在句子中的语言角色,但它不能让我们理解这些单词在句子中是如何相互关联的。因此,下一个层次的句法分析是必需的。

选区分析

为了处理自然语言的复杂性和模糊性,我们首先需要识别和定义常见的语法模式。理解语法的第一步是根据单词在句子中的语法作用将单词分成组,称为成分、

下面举个例子详细了解一下构成要素。考虑一个句子‘I shan—read—一篇关于句法分析的文章’。由连字符分隔的一组单词构成一个成分(或一个短语)。替换的概念提供了将这些词放在一个单元中的理由,也就是说,一个成分可以被另一个等价的成分替换,从而保持句子的句法有效性。

例如,用“午餐”(另一个名词短语)替换选区“关于句法分析的文章”(一个名词短语)不会影响句子的句法,尽管结果句子“Ishan read lunch”在语义上没有意义。

英语中最常见的选区有名词短语(NP)动词短语(VP)介词短语(PP) 。还有各种其他类型的短语,如状语短语、名词短语**、名词短语** (N)等。,尽管在大多数情况下我们只使用上述三个短语和名词。

最后,自由词序语言(如印地语)很难使用选区解析技术进行解析。这是因为,在这种自由词序语言中,单词/成分的顺序可能会显著改变,同时保持意思完全相同。因此,我们需要对这种语言进行依赖分析。

依存句法分析

在依存语法中,成分(如 NP、VP 等。)并不构成语法的主要元素,而是单词本身之间建立了依存关系。

让我们来看一个例句‘人看见狗’。依存关系可以这样说:‘man’是句子的主语(正在做某事的那个人);saw 是主要的动词(正在做的事情);而‘dogs’是‘saw’的宾语(对其做某事)。

所以,依存句法分析的基本思想是基于这样一个事实,即每个句子都是关于某件事情的,通常包括一个主语(做事情的人)、一个动词(正在做什么)和一个宾语(正在对谁做某事)。

一般来说,主语-动词-宾语 (SVO)是当前英语的基本语序(称为‘刚性语序’)。当然,尽管复杂的依存句法分析技术能够处理大部分句子,但是许多复杂的句子很难归入这个简单的 SVO 结构。

依存句法分析是一个相当高级的课题,它的研究涉及到对英语语法和句法分析算法的更深入的理解。因此,我们在这里不做详细介绍,让您自己去探索。

这是这篇文章的乡亲。如果您对本文中的任何内容不理解,或者需要任何主题的更多细节,请随时添加回复。如果你从这篇文章中学到了新的东西,请表示你的支持。

在这些艰难的时刻,照顾好你自己和你周围的人。干杯!

语法表达超赞!

原文:https://towardsdatascience.com/syntactical-expressions-are-awesome-dc9ba5f25911?source=collection_archive---------42-----------------------

利用朱莉娅语法的力量来断言任何事情。

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

在 Julia 中,你可以用许多不同的方法来解决任何你想用语法解决的问题。虽然大多数语言可能会限制你做某些事情的方式,但 Julia 倾向于给程序员一个玩具盒,并说

“玩得开心!”

这使得 Julia 内部有了一些非常有趣的表达式,对于内联编程非常有用。在这些有趣的表达式中包含了调度行和鸭子打字,这在我之前的文章中已经讨论过了。然而,我想提醒你,Julia 程序员还有另外一个很棒的工具:

语法表达。

尽管它们的名字可能有点误导,听起来也相对标准,但它们绝对不是。Julia 中的语法表达式是这种语言的基本方法的一部分,它使这种语言更容易输入,特别是在 Julia 中所有的东西都放在一个方法中。你可能会惊讶地发现,Julia 的调度和面向对象编程技巧都是语法表达式的极致。

第一部分:断言

Julia 中的语法表达式使用断言操作数,更好的说法是等号。在 Julia 中,这个操作数变得更加有用,因为它可以与函数、逻辑和变量配对。考虑一下我写的这个减去 5 的函数:

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

虽然这个函数相对简洁,但我们可以在任何时候使用语法表达式来应用逻辑,而不是在一行而不是三行中使用函数,根本不必正确定义函数。正如我简单提到的,在断言操作数的另一端,我们也可以放置逻辑,这将为我们定义一个新的函数。

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

第二个例子不仅在编写方式上更胜一筹,而且在性能上也有所提升!

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

虽然最小性能提升可能在误差范围内,但它似乎是相对一致的。在三分之一的行中使用相同的逻辑无疑是可读性的一大进步。然而,正如我所说的;这仅仅是我们在语法表达方面的一长串能力的开始。

第二部分:用途

所有 Julia 程序员可能知道的第一个也是最明显的用途是使用语法表达式将 Julia 类型分派给不同的函数。我们可以将该系统应用于我们的减五函数,例如:

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

现在我们有一个函数来处理从一个整数中减去 5,以及从一个数组中减去 5。多亏了语法表达式,我们可以根据通过该方法传递的变量类型,在同一个方法下分派这两种类型。这是语法表达式的一个非常实用的用法,在 Julia 语言中非常常用。

然而,在 Julia 语言中不常用的是鸭子打字。使用语法表达式,我们实际上可以操纵 Julia 语言,通过创建语法方法,然后将它们断言为类型的子类型,使其更像面向对象的编程语言。

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

我们可以像在类似的面向对象编程语言中一样使用这些方法:

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

但用途不止于此。让我们暂时回想一下我们的根源,并思考这如何应用于机器学习。当然,经常有内嵌的统计可以做,但我认为将这个概念实际应用到模型的一个很好的例子是 sigmoid 或 relu。考虑这个 sigmoid 函数:

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

虽然这个函数确实很好,而且足够简洁,可以让你得到这份工作,但我认为,如果再用一个语法表达式来描述它,会比常规函数更让雇主着迷:

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

结论

语法表达式无疑是 Julian 编程中最重要的特性之一。他们不仅使语言变得难以置信的有表现力和简单明了,他们还通过对一个操作数的一些额外使用完全形成了他们自己的方法,这在我看来很酷。语法表达式是 Julia 多范例灵活性背后的驱动力,并为该语言提供了几个有时甚至不通用的关键概念。总的来说,这种语法无疑是我在 Julia 编程语言中的一大优势。

合成数据仓库(SDV):用于数据集建模的 Python 库

原文:https://towardsdatascience.com/synthetic-data-vault-sdv-a-python-library-for-dataset-modeling-b48c406e7398?source=collection_archive---------12-----------------------

Python 库

使用统计和机器学习模型生成复杂数据集的工具

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

作者图片

在数据科学中,你通常需要一个真实的数据集来测试你的概念证明。创建捕捉实际数据行为的假数据有时可能是一项相当棘手的任务。几个 python 包试图完成这项任务。很少流行的 python 包是Faker拟态 。然而,主要是生成简单的数据,如生成姓名、地址、电子邮件、

要创建捕捉复杂数据集属性的数据,比如以某种方式捕捉实际数据的统计属性的时间序列,我们将需要一个使用不同方法生成数据的工具。Synthetic Data Vault(SDV)python 库是一个使用统计和机器学习模型对复杂数据集进行建模的工具。这个工具可以成为任何从事数据和建模工作的人的工具箱中的一个很好的新工具。

为什么是这个图书馆?

我对这个工具感兴趣的主要原因是为了系统测试:拥有从相同的实际底层过程生成的数据集要好得多。这样我们可以在现实的场景中测试我们的工作/模型,而不是有不现实的案例。我们需要合成数据还有其他原因,如数据理解、数据压缩、数据扩充数据隐私【1】。

在论文“ The Synthetic data vault ”中首次介绍了Synthetic Data Vault(SDV)】,然后在 Neha Patki 的硕士论文“The Synthetic Data Vault:Generative Modeling for Relational Databases”中将其用于生成建模的上下文中。最后,SDV 图书馆是作为 Andrew Montanez 的硕士论文“ SDV:用于合成数据生成的开源图书馆”的一部分开发的。另一篇给 SDV 增加新功能的硕士论文是由徐磊完成的(使用条件 GAN 合成表格数据)。

所有这些工作和研究都是在麻省理工学院信息与决策系统实验室(LIDS,MIT)首席研究科学家 Kalyan Veeramachaneni 的监督下在麻省理工学院数据到人工智能实验室完成的。

我带来 SDV 历史的原因是为了欣赏这座图书馆背后的大量工作和研究。一篇关于使用这个工具的潜力的有趣文章,特别是在数据隐私方面,可以在这里找到。

SDV 图书馆

该库的工作流程如下所示。用户提供数据和模式,然后使模型适合数据。最后,从拟合的模型中获得新的合成数据[2]。此外,SDV 图书馆允许用户保存适合的模型(model.save("model.pkl"))以备将来使用。

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

SDV 工作流程(转载自[2])

基于 PAR 的时间序列数据建模

概率自回归(PAR)模型用于对多类型多元时间序列数据建模。SDV 图书馆在PAR类中实现了这个模型(来自时序模块)。

让我们设计一个例子来解释PAR类的不同论点。我们将研究多个城市的温度时间序列。数据集将有以下几列:日期城市测量装置地点,噪音

PAR中,数据集中考虑了四种类型的列。

  1. 序列索引:这是具有行相关性的数据列(应该像日期时间或数值那样排序)。在时间序列中,这通常是时间轴。在我们的例子中,序列索引将是日期列。
  2. 实体列:这些列是形成测量组的抽象实体,其中每个组是一个时间序列(因此每个组中的行应该被排序)。但是,不同实体的行是相互独立的。在我们的示例中,实体列将只是城市列。顺便说一下,我们可以有更多的列,因为参数类型应该是一个列表。
  3. 上下文栏:这些栏提供关于时间序列实体的信息,不会随时间而改变。换句话说,上下文列在组中应该是恒定的。在我们的示例中,测量设备和*,其中*是上下文列。
  4. 数据列:不属于上述类别的任何其他列都将被视为数据列。PAR 类没有用于分配数据列的参数。因此,未列在前面三个类别中的其余列将自动被视为数据列。在我们的例子中,噪声列是数据列。

示例代码

示例 1:单一时间序列(一个实体)

时序的 PAR 模型在sdv.timeseries模块的PAR()类中实现。如果我们想要对单个时间序列数据建模,那么我们只需要将PAR()类的sequence_index参数设置为 datetime 列(说明时间序列顺序的列)。神奇发生在第 8-16 行!

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

示例 2:具有多个实体的时间序列

SDV 能够拥有多个实体,即多个时间序列。在我们的例子中,我们有多个城市的温度测量值。换句话说,每个城市都有一组将被独立处理的测量值。

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

使用 PAR 模型的时间序列建模的详细示例可在这里找到。

关系数据

在您使用sdv.Metadata()指定数据模式之后,SDV 可以通过生成数据来对关系数据集建模。此外,您可以使用库内置函数绘制实体关系(er)图。元数据准备就绪后,可以使用分层建模算法生成新数据。你可以在这里找到更多信息。

单表数据

SDV 还可以对单个表数据集进行建模。它使用的统计和深度学习模型是:

基准数据

SDV 库提供了使用 SDGym 库对合成数据发生器进行基准测试的能力,以评估合成器的性能。你可以在这里找到更多的信息。

结论

在这篇文章中,我们回顾了 SDV 图书馆的主要功能,以及它在基于真实数据生成匿名数据集方面的作用。主要特点是建模单表数据,时间序列,关系数据集,以及数据基准。这里要提到的一点是,您需要为 SDV 模型提供一个大型数据集来进行训练。这样,模型可以生成一个有意义的数据集,真正捕捉真实的过程。试试这个库,让我知道你的想法。

你可以在这里 找到这篇文章的笔记本

感谢阅读!

如果你喜欢这个帖子,你可以 在这里加入我的邮件列表 来接收更多关于数据科学、机器学习、统计以及有趣的 Python 库和技巧&技巧的帖子。也可以在我的 网站 ,或者LinkedIn关注我。

参考

[1]徐磊,利用条件 GAN 综合表格数据,(2020),麻省理工学院硕士论文

[2] N. Patki 等人合成数据仓库 (2016),数据科学和高级分析国际会议(DSAA-16)

[3]麻省理工学院新闻,合成数据的真正前景 (Ocotber 16,2020)

最初发表于https://www.ealizadeh.com

合成工具变量

原文:https://towardsdatascience.com/synthetic-instrumental-variables-968b12f68772?source=collection_archive---------35-----------------------

具有不可测混杂因素的因果推断

我喜欢能让你走的报纸”这在事后看来是显而易见的。为什么以前没人尝试过?”一些 NLP 的人对变形金刚做了这样的评论(“注意力是你所需要的全部”)。对我来说,“多重原因的祝福”唤起了类似的感觉:为什么人们没有创造合成乐器?

先决条件

本文假设对因果 Dag 和因果推理有基本的了解。如果你对这些术语不熟悉,请阅读我之前关于因果关系的文章的后三分之一,以获得简要概述。

此外,虽然有许多方法可以创建合成工具,但本文使用概率 PCA,因为它是最通用的方法之一。如果你对 PCA 不太了解,建议看一下这篇精彩直观的讲解

什么是乐器?

工具变量由来已久,可以说是计量经济学的中坚力量之一。我们关心的是这个 DAG:

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

u 是一个未观察到的混杂因素。我们要估计 Y 对 Z 的因果作用,Y → Z,通过这个 DAG,我们可以估计 X → Y 和 X → Z,假设线性,我们有 X → Z = (X → Y) (Y → Z),我们可以代数求解 Y → Z。

在这个设置中,我们称 X 为工具变量,如果:

  • x 与 Y 强相关(强第一阶段)
  • x 仅通过 Y 影响 Z(排除限制)

在实践中,找到一种工具是困难的。如果 X 与 Y 仅弱相关,那么因果效应估计可能会严重偏差。第二个条件无法测试或验证,所以我们只能争论假设的合理性,比如“蛋黄酱是一种工具吗?”

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

图片由玛丽亚·波尔娜

创新要求我们重新思考现有的方法。聪明之处在于:

如果寻找乐器很难,为什么不创造乐器呢?

问题设置

原论文标题为“多重因缘的祝福”,因为多重因缘是创造我们自己的工具的必要条件。DAG 看起来有点像:

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

我们希望在存在共享的未观察到的混杂因素 u 的情况下,推断每个 Y 对 Z 的因果影响。可以将 Y 视为回归模型中的列名和预测值。我们假设没有干扰,没有互动——这当然过于简单,但很实用。

这个 DAG 看起来是限制性的,但是对于许多现实世界的过程来说,它是足够合理的(参考本文中的例子)。更重要的是,与直觉相反,这个问题比单一案例要简单得多:

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

这个“更简单”的 DAG 是不可能求解的。我们无法对因果关系做出无偏见的估计。

此外,这个问题假设没有未被观察到的单一原因混杂因素。未观察到的 V 的存在会打乱我们的估计:

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

然而,正如论文指出的,假设不存在这样的 V 是一个比不可忽略更令人舒服的假设。大多数使用协变量调整的因果分析假设我们根本没有不可测量的混杂因素。这里我们假设一些不可测量的常见混杂因素,只是没有不可测量的单一原因混杂因素。

创建工具

现在我们将看到为什么多重因果关系是必要的。我们希望创建一个通用的仪器 X。这个 X 是一个局部变量,即每个观测值都有一个唯一的 X 向量(稍后将详细介绍)。

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

例如,我们可以拟合 PCA 并选择前几个主成分作为我们的 x。通过构造,排除限制得到满足,因为 PCA 不使用 z。我们不必为这一假设争论不休。

然而,如果使用整个数据集来训练 PCA,我们不知道 X 是否是好的工具。我们可以从随机噪声中获得主要成分,但 X 不能很好地预测 Y。此外,重新使用 Y 来估计仪器和因果效应在哲学上是有问题的,并将导致过度拟合。

一种思路是将数据集一分为二,在一半上使用 PCA,在另一半上执行推理。这导致了一个死胡同。对于看不见的数据(后半部分),我们对每个观察值的最佳猜测是 X =零向量,这简化为 OLS 回归。找出新方法的全部意义在于,我们知道 OLS 是行不通的。

本文通过删除每个观察值的随机 Y 来解决这个问题(比如说,一半)。经典 PCA 不能处理缺失值。概率主成分分析(PPCA),它的贝叶斯对应物,可以很好地处理缺失值。

PCA 使用 y = Wx 对每个观察值的 y 向量进行建模,其中 W 是权重矩阵,x 是潜在变量的向量。PPCA 假设存在高斯误差项ε,使得 y = Wx + ε。生成模型:

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

当σ → 0 时,我们得到 PCA。如果我们用允许对角线值变化的对角矩阵代替σ I,我们得到因子分析

所以:

  • 我们可以使用 y 的一半来估计每个观测值的潜在向量 X。通过构造,X 满足排除限制。
  • 我们可以用删除的一半来评估 X 的预测性能。换句话说,给定观察到的一半,我们能预测删除的一半吗?我们可以测试一个强大的第一阶段。

如果 X 具有良好的预测性能,那么我们有一个从 Y 综合创建的有效的工具(具体来说,在 PPCA 的情况下,残差是工具)。或者,由于 X 的概率性质,我们可以使用广义倾向得分来拟合潜在的结果模型,并获得因果效应估计。

结束语

这听起来好得难以置信吗?也许吧。但是合成控制也有代价:偏差-方差权衡

创建合成仪器的贝叶斯模型具有其自身的估计不确定性,因此在消除偏差的同时增加了方差。作者建议遵循奥卡姆剃刀。在 PPCA 的情况下,每个额外的主成分都会增加方差,因此我们希望保留最少数量的成分,但仍能产生“良好”的预测性能。

虽然本文使用了 PPCA,但是只要潜在变量模型能够处理缺失值,它们通常就能工作。例如,PPCA 不适用于计数数据,因为它假设高斯误差。

SysIdentPy:一个用于非线性动态数据建模的 Python 包

原文:https://towardsdatascience.com/sysidentpy-a-python-package-for-modeling-nonlinear-dynamical-data-f21fa3445a3c?source=collection_archive---------33-----------------------

SysIdentPy 是一个用 Python 构建 NARMAX 模型的工具

数学模型在科学和工程中起着关键作用。我们看到研究人员和数据驱动的专业人士使用许多不同的模型来分析和预测负荷需求、现金需求、股票交易数据、生物医学数据、化学过程等等。

当数据是动力系统的结果时,自回归模型通常是进一步检验的安全选择。在这方面,ARMAX(具有移动平均和外生输入的自回归模型)模型及其变体(ARX、ARMA、ARIMA 等。)是使用最多的模型类之一。然而,前述模型对于线性数据工作良好,因为它们是线性模型。这就是 SysIdentPy 的用武之地:一个用于非线性动力系统的 python 包。

动机

系统本质上是非线性的。有人可能会说,在大多数情况下,线性近似效果很好,你不需要非线性模型…我非常同意。但是,如果想要获得一个动态的非线性模型呢?嗯,你可以用系统识别来做!

系统识别

SysIdentPy 是一个使用 NARMAX 模型(具有移动平均和外生输入的非线性自回归模型)进行系统识别的开源软件包,由我与我的朋友 Luan Pascoal 、Samuel Oliveira 和 Samir Martins 合作开发。

NARMAX 模型是 ARMAX 族的推广。然而,NARMAX 模型不是 ARMAX 模型的简单扩展,它能够描述许多不同的复杂非线性系统。

目标是成为一个友好的用户和强大的工具。只需几行代码,您就可以构建一个 NARMAX 模型。下面的代码显示了如何使用该库的一个简单示例:加载样本数据、设置模型参数、拟合和预测模型、显示模型细节以及绘制两个残差测试的结果。很简单,对吧?

**from** sysidentpy.polynomial_basis **import** PolynomialNarmax
**from** sysidentpy.metrics **import** root_relative_squared_error
**from** sysidentpy.utils.generate_data **import** get_miso_data, get_siso_datax_train, x_valid, y_train, y_valid **=** get_siso_data(n**=**1000,
                                                   colored_noise**=False**,
                                                   sigma**=**0.001,
                                                   train_percentage**=**90)model **=** PolynomialNarmax(non_degree**=**2,
                         order_selection**=True**,
                         n_info_values**=**10,
                         extended_least_squares**=False**,
                         ylag**=**2, xlag**=**2,
                         info_criteria**=**'aic',
                         estimator**=**'least_squares',
                         )model**.**fit(x_train, y_train)
yhat **=** model**.**predict(x_valid, y_valid)
rrse **=** root_relative_squared_error(y_valid, yhat)
print(rrse)
results **=** pd**.**DataFrame(model**.**results(err_precision**=**8,
                                     dtype**=**'dec'),
                       columns**=**['Regressors', 'Parameters', 'ERR'])

print(results)ee, ex, extras, lam **=** model**.**residuals(x_valid, y_valid, yhat)
model**.**plot_result(y_valid, yhat, ee, ex)

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

系统标识的默认输出

您可以使用以下命令安装 SysIdentPy

pip install sysidentpy

到目前为止,我们已经实现了几个关于 NARMAX 模型的传统算法。下面列出了其中的一些方法:

  • 正向回归正交最小二乘法
  • 误差减少率
  • 户主反映
  • 扩展最小二乘法
  • 普通最小二乘法
  • 总体最小二乘法
  • 递归最小二乘法
  • 最小均方误差(和许多变体)
  • 赤池信息标准
  • 贝叶斯信息标准
  • 最终预测误差
  • 更多

读者可参考官方文档和知识库了解更多详情:

[## 欢迎使用 sysidentpy 的文档!-系统识别

该项目是由威尔逊 R. L .朱尼尔,栾帕斯科尔 c .安德拉德和萨米尔 A. M .马丁斯在 1995 年开始的,作为一个项目…

wilsonrljr.github.io](https://wilsonrljr.github.io/sysidentpy/index.html) [## wilsonrljr/系统识别

sysidentpy 是一个 Python 模块,使用构建在 numpy 之上的 NARMAX 模型进行系统识别,并且是分布式的…

github.com](https://github.com/wilsonrljr/sysidentpy)

许多附加功能已经在开发中。很高兴能与你们所有人合作,使图书馆越来越完整。

欢迎在 Linkedin 或 Discord (wilsonrljr#3777)上联系我。此外,我们有一个 Discord 服务器来讨论 SysIdentpy(问题、贡献等等)。你可以在这里加入我们的不和谐。

系统设计 101

原文:https://towardsdatascience.com/system-design-101-b8f15162ef7c?source=collection_archive---------2-----------------------

入门

设计系统的逐步指南

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

照片由乔纳森·辛格Unsplash 上拍摄

现在,系统设计面试是顶级科技公司流程的一部分。许多人害怕系统设计面试,因为没有一定的模式来准备。此外,系统设计问题是开放式的,没有标准的对错答案,这使得准备过程更加困难。

系统设计是软件工程中 最重要也是最令人畏惧的 方面。一个主要原因是每个人似乎都有不同的方法;没有明确的循序渐进的指导方针。

软件工程师与系统设计的斗争可以分为两个部分:

  • 系统设计过程本质上是非结构化的;没有合适的答案来说二元对错。
  • 软件开发人员缺乏开发复杂和大规模系统的经验。

在这篇文章中,我们将逐步解决一个设计问题。这个指南可以帮助你设计一个系统。这个是根据我学习建筑课程的经验。

★第一步:需求澄清

我们需要明确系统的目标。 系统设计就是这样一个浩瀚的话题;如果不把它缩小到一个具体的目标,设计系统就会变得复杂,尤其是对于新手。 有时候约束对系统是有好处的。这有助于将注意力集中在你试图设计的主要特征上。它澄清了关于系统功能的模糊之处。我们可以将这些需求分为两部分:

  • 功能需求:

这是系统必须交付的需求。我们可以说它是系统的主要目标。在这里,功能被描述为输出和输入之间的行为规范。什么是系统输入,什么是输出,这些要求中应该明确。

  • 非功能性需求:

现在是需要分析的更重要的需求。如果我们不满足这个要求,它将对项目的商业计划有害。这些需求通过不同的系统质量来限制系统设计。

性能、可修改性、可用性、可伸缩性、可靠性等。是系统设计中重要的质量要求。这些‘能力’是我们分析一个系统并确定我们的系统设计是否恰当所需要的。

★第二步:重要零件的估算

系统设计的重点之一是了解系统的规模。当你在设计一个系统时,规模实际上意味着什么?文章浏览量,每秒生成时间轴的次数等。可以测量系统的规模。如果系统的测量值非常大,那么它们就是大规模系统。

另一个重要的估计是关于存储。我们需要知道系统需要多少存储,比如说 5 年。只能增加,但是你需要有一个估计。它将给出数据存储的方向。

在 URL 缩短服务的系统设计中,您可能会看到这样的计算:

让我们假设,系统将所有的 URL 缩短请求和它们的缩短链接存储了 5 年。由于我们预计每个月会有 5 亿个新的 URL,我们预计存储的对象总数将是 500 M * (5 * 12)个月= 30 B。现在让我们假设每个存储的对象大约为 100 字节。我们将需要 300 亿* 100 字节= 3 TB 的总存储容量。

因此,您知道需要多少存储空间。你开始向一个方向流动。

**网络带宽使用率也是一个重要因素。**在分布式系统中,带宽使用管理至关重要。例如,如果您想要有效地处理文件传输,您可能需要将文件分成多个块。

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

图:只传输更新的块(图片由作者提供)

如果我们在每次更新时都传输整个文件,如果文件大小为 100MB,我们可能需要每次传输 100MB 的文件。例如,我们将文件划分为 2MB 的块,并且只传输文件中修改过的部分,如图所示。这将减少用户的带宽消耗和云存储。

★第三步:数据流

我们需要定义系统的数据模型,以及数据如何在不同的系统组件之间流动。我们需要弄清楚系统的实体和数据管理的不同方面。

对于系统设计新手,请记住,“如果你对系统设计从哪里开始感到困惑,请尝试从数据流开始。”

以下是类似于 Medium 的服务的一些实体:

**用户:**用户名,姓名,邮箱等。

**文章:**文章 ID,文章内容,时间戳,圈数等。

**用户跟随:**用户标识 1,用户标识 2

**关注者:**用户标识 3,用户标识 4

数据库系统选择是本节的一部分。NoSQL 或 SQL 数据库选择是一个常见的场景。另一方面,我们可能需要决定为照片和视频选择哪种存储方式。

★第四步:高层组件设计

如果我们试图一步到位地设计系统,这是一项艰巨的任务。所以,还是把它们当做高级组件来破比较好。然后,将这些组件分解成详细的设计。

试着画一个框图,用 5-6 个部分代表我们系统的核心组件。如果系统太大,它可以更多。对于我们可以将系统分成多少个部分,没有确定的规则。请记住,我们需要识别足够的组件来帮助解决系统的实际问题。

这里有一个设计文件存储和同步服务的高级图,比如 Google Drive。

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

图:Google Drive 的高层设计(图片由作者提供)

文件处理服务器将管理文件处理工作流。元数据服务器将处理文件信息、块大小和用户信息。通知服务器将让客户端应用程序知道将文件更新到客户端登录的所有其他设备。云存储将保存文件。

然后,我们可以根据系统需求分解这些组件,进行进一步的详细设计。

★第五步:详细设计

对于最后一步,我们需要更深入地挖掘对实现系统质量需求很重要的主要组件。

在这一步,我们可以分析解决问题的不同方法、它们的优缺点,并解释为什么我们更喜欢一种方法。权衡分析是这一部分的重要部分。这里可能有一些例子:

由于我们需要存储大量的数据,我们可能需要对数据进行分区,以分布到多个数据库。可能会有一个名人资料的问题,我们将如何处理这样的用户有很多追随者。

我们需要缓存多少数据来加快系统响应时间。我们应该在哪里使用负载均衡器,等等。?

下面是一个像 Google drive 这样的云文件存储服务的详细设计的例子。

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

图:Google drive的系统设计(图片由作者)

★第六步:识别瓶颈并解决它们

现在,我们有了系统的详细设计。我们必须找到系统的瓶颈,并找到不同的方法来缓解它们。例如:

  • 如果我们的系统中有任何单点故障,我们需要移除它们。这可能会导致可用性问题,这是一个很大的问题。

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

作者图片

  • 我们需要有足够的数据副本,以便在我们失去几台服务器时仍能为我们的用户服务。如果没有数据的副本,并且由于某种原因,数据丢失,则系统没有该数据。该系统将有可靠性问题。
  • 类似地,我们需要运行足够多的不同服务的副本,以便少数故障不会导致系统完全关闭。

结论:

上面提到的步骤并不是设计系统的唯一方法。这是给刚接触系统设计的初学者的简化指南。为新手设计一个系统是非常困难的。本指南让您保持正确的方向,不要迷失在系统设计的潜在问题和解决方案的海洋中。

系统设计是一个如此广阔的话题;如果没有设定具体的目标,那么设计系统就会变得很有挑战性,尤其是对于新手来说。

尽量详细说明系统的要求。然后,找到数据模型和数据流。并且在一个高层次的设计之后,如果需要的话,不要犹豫添加组件。最重要的是,试着关注解决方案的权衡分析。祝你好运!!

感谢您阅读文章。祝你今天愉快🙂

本文是初学者系统设计系列的一部分。下面给出了一些文章链接:

设计限速器

系统设计基础:缓存入门

系统设计基础:客户端-服务器架构

系统设计基础知识:负载平衡器 101

谷歌自动建议服务的系统设计

谷歌驱动 系统设计分析

TinyURL系统设计分析

分布式系统中的可用性

Google Drive 系统设计分析

原文:https://towardsdatascience.com/system-design-analysis-of-google-drive-ca3408f22ed3?source=collection_archive---------1-----------------------

如何设计一个像 Google Drive 这样的系统?

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

Elle CartierUnsplash 上拍摄的照片

系统设计是 软件工程中最重要也是最令人畏惧的 方面。这个观点来自于我自己在一个建筑助理课程中的学习经历。当我开始我的助理架构课程时,我很难理解设计一个系统的想法。

一个主要原因是软件架构书籍中使用的术语一开始很难理解,并且没有清晰的逐步指南。每个人似乎都有不同的方法。当然,还有一个心理障碍,就是这些话题可能很难理解。

于是,我根据自己学习建筑课程的经验,着手设计一个系统。第一个是关于谷歌自动建议。对于这一个,让我们设计一个类似 Google drive 的云文件存储服务。这是一个文件存储和同步服务,使用户能够将他们的数据存储在远程服务器上。

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

图片作者作者

现在那些已经使用 Google drive 的人知道,我们可以从任何设备上传任何大小的文件,并且可以在我们的手机、笔记本电脑、个人电脑等上找到它。我们很多人都想知道系统如何处理如此大量的文件。在本文中,我们将设计一个 google drive 服务!!

这绝不是一个全面的指南,而是对系统设计的介绍,是开始成为软件架构师之旅的好地方。

★系统的定义

我们需要明确系统的目标。系统设计是一个如此广阔的话题;如果我们不把它缩小到一个特定的目的,那么设计系统就会变得复杂,尤其是对于新手来说。

用户应该能够从任何设备上传和下载文件/照片。文件将在用户登录的所有设备中同步。

如果我们考虑 1000 万用户,每天 1 亿次服务请求,那么写和读操作的数量将是巨大的。为了简化,我们只是设计 Google Drive 存储。换句话说,用户可以上传和下载文件,这有效地将它们存储在云中。

★系统的要求

在这一部分,我们决定系统的特性。我们可以将这些需求分为两部分:

  • 功能需求:

用户应该能够从任何设备上传和下载文件。并且文件将在用户登录的所有设备中同步。

这些是系统的主要目标。这是系统必须交付的需求。

  • 非功能性需求:

现在是需要分析的更关键的需求。如果我们不满足这个要求,它可能对项目的商业计划有害。那么,让我们定义一下我们的 nfr:

用户可以从任何设备上传和下载文件。该服务应该支持存储单个最大 1 GB 的大文件。服务应该在设备之间自动同步;如果从设备上传一个文件,该文件应该在用户登录的所有设备上同步。

★服务器端组件设计

对于系统设计新手来说,请记住,“如果你对系统设计从哪里开始感到困惑,请尝试从数据流开始。”

我们的用户在这个系统中可以上传和下载文件。用户从客户端应用程序/浏览器上传文件,服务器将存储这些文件。用户可以从服务器下载更新的文件。那么,让我们看看我们如何为如此大量的用户处理文件的上传和下载。

上传/下载文件:

从图中我们可以看到,如果我们上传完整大小的文件,它将花费我们的存储和带宽。此外,完成上传或下载的延迟也会增加。

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

图:完整的文件传输需要更多的时间、存储和带宽。(图片由作者提供)

高效处理文件传输:

我们可以将每个文件分成更小的块。然后,我们可以只修改数据发生变化的小部分,而不是整个文件。在数据上传失败的情况下,这种策略也会有所帮助。我们需要将每个文件分成一个固定的大小,比如 2 MB。

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

图:将文件分成更小的块以优化存储利用率和带宽(图片由作者提供)

我们的块大小需要更小。这将有助于优化空间利用,网络带宽是另一个考虑因素,而作出决定。元数据应该包括每个文件块信息的记录。

因为我们有这篇文章作为练习,所以我们可以假设文件需要存储在 2 MB 的小块中。如果一个进程失败,对于文件 的较小片段,在重试操作 的情况下,我们也会受益。如果文件未上传,则仅重试失败的块。

减少客户端和云存储之间的数据传输量将有助于我们缩短响应时间。我们可以只发送修改过的文件块,而不是传输整个文件。

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

图:只传输更新的块(图片由作者提供)

在这种情况下,文件的更新部分将被传输。我们将把文件分成 2MB 的块,只传输修改过的文件部分,如图所示。

从上图中,你可以看到,我们可以只更新修改后的 2MB 文件,而不是更新整个 10 MB 文件。这将减少用户的带宽消耗和云存储。最重要的是,响应时间会更快。

客户端离线会怎么样?

客户端组件 Watcher 将观察客户端文件夹。如果用户发生任何改变,它将通知索引控制器(另一个客户端组件)关于用户的动作。它还将监控其他客户端(设备)上是否发生任何变化,这些变化由通知服务器广播。

当元数据服务收到更新/上传请求时,它需要检查元数据数据库的一致性,然后继续更新。之后,将向所有订阅的设备发送通知,以报告文件更新。

元数据数据库:

我们需要一个负责保存文件、用户等信息的数据库。它可以是类似 MySQL 的关系数据库,也可以是类似 MongoDB 的 NoSQL。我们需要保存数据,如块、文件、用户信息等。在数据库里。

众所周知,我们必须在 SQL 或 NoSQL 这两种类型的数据库之间做出选择。无论我们选择什么,我们都需要确保数据的一致性。
使用 SQL 数据库可能给我们带来实现同步的好处,因为它们支持 ACID 属性。

NoSQL 数据库不支持 ACID 属性。但是它们提供了对可伸缩性和性能的支持。因此,我们需要在元数据服务器的逻辑中为这种类型的数据库提供对 ACID 属性的编程支持。

同步:

现在,客户端从设备更新文件;需要有一个组件来处理更新并将更改应用到其他设备。它需要同步客户端的本地数据库和远程元数据数据库。元数据服务器可以执行管理元数据和同步用户文件的工作。

消息队列:

现在想想吧;如此庞大的用户量同时上传文件,服务器如何处理如此大量的请求。为了能够处理如此大量的请求,我们可以在客户机和服务器之间使用消息队列。

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

图:消息队列提供可伸缩的请求队列和更改通知,以支持大量使用拉或推策略的客户端。(图片由作者)

当目标程序繁忙或未连接时,消息队列提供临时消息存储。它提供了一个异步通信协议。 It 是一个将消息放入队列,不需要立即响应就能继续处理的系统。RabbitMQ,阿帕奇卡夫卡等。是消息队列的一些示例。

在消息队列的情况下,一旦客户端接收到消息,消息将从队列中删除。因此,我们需要为客户机的每个订阅设备创建几个响应队列。

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

图:每个设备类型的响应消息队列(图片由作者提供)

对于大量的用户,我们需要一个可伸缩的消息队列来支持客户端和同步服务之间基于消息的异步通信。该服务应该能够在一个高度可用、可靠和可伸缩的队列中高效地存储任意数量的消息。例子:阿帕奇卡夫卡,rabbitMQ 等。

云存储:

如今,有许多平台和操作系统,如智能手机、笔记本电脑、个人电脑等。他们提供随时随地的移动访问。

如果你将文件保存在笔记本电脑的本地存储中,并且你要外出,但想在手机上使用它,如何获取数据?这就是为什么我们需要云存储作为解决方案。

它存储用户上传的文件(块)。客户端可以通过文件处理服务器与存储器交互,从存储器发送和接收对象。它只保存文件;元数据 DB 保存文件的块大小和编号的数据。

文件处理工作流程:

客户端 A 上传 chunk 到云存储。客户端 A 使用元数据服务器更新元数据并提交 MetadataDB 中的更改。客户端得到确认,通知被发送到同一用户的其他设备。其他设备接收元数据更改,并从云存储中下载更新的块。

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

图:客户端 A 的文件处理工作流程(图片由作者提供)

★可扩展性

我们需要对元数据数据库进行分区,这样我们就可以存储大约 100 万个用户和数十亿个文件/块的信息。我们可以对数据进行分区,将读写请求分布在服务器上。

元数据分区:

i) 我们可以基于文件路径的第一个字母在分区中存储文件块。例如,我们将所有以字母“A”开头的文件放在一个分区中,而将那些以字母“B”开头的文件放在另一个分区中,依此类推。这被称为基于范围的划分。像“Z”或“Y”这样出现频率较低的字母,我们可以将它们组合成一个分区。

主要问题是有些字母在开头字母的情况下比较常见。例如,如果我们将所有以字母“A”开头的文件放入一个 DB 分区,并且我们有太多以字母“A”开头的文件,以至于我们不能将它们放入一个 DB 分区。在这种情况下,这种方法有一个缺点。

ii) 我们也可以根据文件的‘fileId’散列来分区。我们的散列函数将随机生成一个服务器号,并将文件存储在该服务器中。但是我们可能需要要求所有的服务器找到一个建议的列表,并将它们合并在一起以得到结果。因此,响应时间延迟可能会增加。

如果我们使用这种方法,仍然会导致分区过载,这可以通过使用一致散列来解决。

缓存:

众所周知,缓存是一种提高性能的常用技术。这对于降低延迟非常有帮助。服务器可以在命中数据库之前检查高速缓存服务器,以查看搜索列表是否已经在高速缓存中。我们不能将所有数据都放在缓存中;太费钱了。

当缓存已满,我们需要用新的块替换一个块时。最近最少使用(LRU)可用于此系统。在这种方法中,首先从缓存中删除最近最少使用的块。

★安全性:

在文件共享服务中,用户数据的隐私和安全至关重要。为了解决这个问题,我们可以将每个文件的权限存储在元数据数据库中,以便让 perm 知道哪个用户可以看到或修改哪些文件。

★客户端:

客户端应用程序(web 或移动)传输用户上传到云存储中的所有文件。该应用程序将上传、下载或修改文件到云存储。客户端可以更新元数据,如重命名文件名、编辑文件等。

客户端 app 功能包括上传、下载文件。如上所述,我们将把每个文件分成 2MB 的小块,这样我们只传输修改过的块,而不是整个文件。

如果因为用户离线状态产生任何冲突,app 需要处理。 现在,我们可以在客户端保存元数据的本地副本,以便进行离线更新。

客户端应用程序需要检测客户端文件夹中是否有文件被更改。我们可能有一个组件,观察者。它将检查客户端上是否发生了任何文件更改。

★客户如何知道云存储中发生了变化?

客户端可以定期检查服务器是否有任何变化,这是一种手动策略。但是如果客户端频繁地检查服务器的变化,就会对服务器造成压力,使服务器保持忙碌。

我们可以使用 HTTP 长轮询技术来代替。在这种技术中,服务器不会立即响应客户端请求。服务器保持请求打开,而不是发送空响应。一旦新信息准备就绪,服务器就向客户机发送响应。

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

图:客户端应用程序向元数据服务器请求更新元数据信息(图片由作者提供)

我们可以将客户端应用程序分为以下几个部分:

本地数据库将跟踪所有文件、块、目录路径等。在客户端系统中。

块控制器会将文件分割成更小的部分。它还将执行从块中重建整个文件的任务。这部分将有助于仅确定文件的最近修改的块。并且只有修改过的文件块将被发送到服务器,这将节省带宽和服务器计算时间。

观察器将观察客户端文件夹,如果用户发生任何变化,它将通知索引控制器用户的操作。它还将监视同步服务广播的其他客户端(设备)上是否正在发生任何变化。

索引控制器将处理从观察器收到的事件,并更新本地数据库中已修改的文件块信息。它将与元数据服务通信,将更改传输到其他设备并更新元数据数据库。该请求将通过消息请求队列发送到元数据服务。

以下是该系统的完整示意图:

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

图:Google drive 的系统设计(图片由作者提供)

★结论:

在这个系统中,我们没有考虑 UI 部分。系统中也没有考虑更新和离线编辑的历史。*手机客户端可以按需同步,节省用户的带宽和空间。这里我们没有使用另一台服务器进行同步。元数据服务器正在执行该任务。
我们决定将文件分成更小的块,以节省存储和带宽使用,同时减少延迟。*我们添加了负载平衡器,以便在后端服务器之间平均分配传入的请求。如果一个服务器死了,LB 将停止向它发送任何请求。

在云架构中,用户数据的隐私和安全至关重要。我们可以将每个文件的权限存储在元数据数据库中,以检查哪个用户可以看到或修改哪些文件。

这个系列的第一部分是关于谷歌汽车建议。如需了解系统设计步骤,请点击以下链接:

[## 系统设计 101

设计系统的逐步指南

towardsdatascience.com](/system-design-101-b8f15162ef7c)

参考:钻研系统设计课程。对于视频参考,您可以查看此链接。感谢您阅读文章。过得愉快🙂

系统设计面试清单——通向 FAANGs 的大门

原文:https://towardsdatascience.com/system-design-interview-checklist-a-gateway-to-faangs-2b7fac80e423?source=collection_archive---------3-----------------------

这是我进行系统设计面试的策略,它帮助我解决了一大堆问题。你也可以试试!

通常,系统设计面试是冗长的,并涵盖了许多复杂的组件。这使得我们很容易迷失在小事情中,错过大的画面。因此,以这样一种方式组织你的面试变得非常重要,这样你就可以轻松地传达整个画面,而不会浪费时间在任何没有附加值的事情上。

下面是我遵循的结构,你也可以尝试。

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

格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片

推动面试

确保你是主导面试的人,而不是你的面试官。这并不意味着你不让他们说话,而是说,你应该是说话最多的人,在面试官指出你的设计中的问题之前主动提出来,处理面试官可能会戳到你的问题等等。

FRs 和 NFRs

清楚地说出功能性和非功能性需求。目的是需求应该足够大,使问题具有挑战性,也足够有限,以便您可以在规定的时间内构建满足这些需求的系统。从非功能方面来说,试着做一个大规模工作的系统。设计一个在低规模下工作的系统有什么乐趣?
在最终确定财务报告和非财务报告之前,让你的面试官看一下,确保他们不想添加/删除某些东西。有时候,面试官确实有一些他们想要查看的特定用例。

容量估计

问问你的面试官他们是否想了解这一点。许多人更愿意跳过计算,更多地关注设计,假设所需的内核数量或所需的磁盘数量等有足够大的近似值。

计划

基于 FRs 和 NFRs,想出这些东西:

  1. 用户互动点。
  2. 每个用户交互点的延迟/可用性/一致性要求。
  3. 快速分析,判断是重读交互还是重写交互。
  4. 基于以上三点,想出您需要的所有服务,以及您可以使用哪种数据库来存储这些服务各自拥有的数据。

肝豆状核变性

提供一个高级组件图,包括以下内容:

  1. 所有服务都有哪些?确保将流程划分为多个功能组件,看看基于微服务的方法是否有意义。通常,在 SD 访谈中使用基于微服务的方法是一个好主意。
  2. 服务之间是如何相互作用的,什么样的协议用于服务间的通信,如 Async/Sync-Rest、RPC 等?
  3. 用户将如何与整个系统交互,以及所有服务面向用户。您是否需要缓存来减少延迟?
  4. 哪个服务使用哪个数据库,为什么?您可以参考此视频,它可以帮助您根据您的使用案例选择合适的数据库
  5. 看看你是否需要在任何地方缓存,如果需要,那么驱逐策略是什么,你是否需要密钥过期,它应该是一个直写缓存等?
  6. 在所有这些分析的基础上,画出整个系统的高层次图。

必备

您的高级图表应该包括以下关键内容:

  1. 负载平衡器
  2. 服务
  3. 数据库和缓存
  4. 用户交互点
  5. 任何其他工具,如消息队列、CDN 等。

浏览设计

一旦你准备好了整个图表,仔细检查整个设计,一次一个用例,向你的面试官解释你的设计。谈谈你为什么在这里选择了一个特定的数据库,为什么使用了一种特定的通信模式,比如同步/异步等。如果你做了一个特别的设计选择,你也可以进入一个 RPC vs HTTP 类型的对话。你应该检查你的数据库中使用的是哪种数据复制策略,例如,你是使用主-从还是多主设置等。

如果这听起来有点吓人,你可以看看我通常是如何在这个视频中进行设计演练的。

警告:除非面试官要求,否则不要马上谈论 API、数据库模式等细节。大多数人在这一点上迷失在为一个系统设计 API 的过程中,并在以后耗尽时间。

**印象分:**大多数面试没有关于分析的 FRs 和 NFRs,但是如果你的设计涵盖了这一点或者为分析留下了足够好的范围,那么你的解决方案会提升很多。试着补充一下。比如你可以看看这个

履行

一旦你向面试官解释了整个流程,问他们想详细讨论哪个部分。通常,人们不想详细检查整个系统。让他们决定哪一个是他们想要深入研究的组件,然后您可以检查该特定系统的实现细节。
这里你应该涵盖的内容有:

  1. API—调出该系统公开的 API。确保您使用的是这里的最佳实践。例如,不要使用 URL 为GET/user/getUserbyUserId的 GET API,最好使用:GET*/user/{ id }*
  2. API 协议 —您可以涵盖您在哪些协议上公开 API。大多数人选择 REST APIs,但是你可以根据你的用例决定使用更有效的东西,比如 Thrift,Protobuf 等等。
  3. 事件 —您可以调用这个特定服务监听哪些事件、谁产生了那个事件、什么有效负载进来、在那个事件上发生了什么处理等等。
  4. **数据库模式:**在这里查看数据库模式。如果您在之前讨论高级设计时没有回顾 SQL 与 NoSQL 的争论,或者您为什么选择特定的数据库。如果是 SQL,一定要谈谈你会有什么索引,以及你如何优化你的查询。在 NoSQL 的情况下,请确保您仔细检查了数据库提供的一致性保证,它是否会导致任何问题以及您将在该数据库上运行的查询类型。清楚地调出键值存储的键或列存储的分区键等。

处理墨菲定律

这是大多数人跳过的,但这是你必须涵盖的最重要的事情之一,它涉及到你的系统有多大的弹性。在现实世界中,事情会发生变化,当它们发生时,你需要确保你能完全控制你的系统。

谈谈你是如何监控系统的。您有什么样的警报机制?你的 KPI(关键绩效指标)是什么,你如何跟踪它们?当发生故障时,当您的服务崩溃时,当您的数据库主节点宕机时,甚至当您的一个数据中心宕机时,会发生什么?

同样,如果你以前没有这样做过,看看我是怎么做的,在这个视频的后半部分。

这是我的清单,当我试图设计任何系统时,无论是在面试中还是在现实世界中,我通常都会遵循它。

这是系统设计,如果你想看看我是如何破解谷歌、脸书、亚马逊等公司的,看看我的总体准备策略:

[## 我是如何破解谷歌、脸书、亚马逊的采访的,你又是如何做到的!

我正在分享我的策略,来破解我申请的几乎所有软件工程面试,包括 FAANG…

medium.com](https://medium.com/@sandeep.1904/how-did-i-crack-a-bunch-of-faangs-and-how-you-could-do-it-too-d824cfc6b974)

希望这有所帮助!

系统设计面试准备:你应该把数据放在缓存中吗?

原文:https://towardsdatascience.com/system-design-interview-prep-should-you-put-the-data-in-cache-56936697ee54?source=collection_archive---------32-----------------------

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

约书亚·索蒂诺在 Unsplash 上拍摄的照片

(这个帖子也在我的博客里)

缓存是一种以相对较快的速度提供数据的数据存储。有硬件和软件缓存。在系统设计面试中,我们将主要关注软件缓存。在许多情况下,缓存是存储数据的内存块。由于访问内存的速度比磁盘和网络等 IO 快得多,应用程序可以将数据放在内存中以避免访问 IO。因此,吞吐量可以增加,延迟可以减少。

并非所有数据都适合缓存

缓存存储在内存中,它通常比持久性存储(如磁盘)小得多。因此,如果您的应用程序需要处理大量数据,将所有内容都存储在缓存中是不现实的。只有一小部分数据应该放在缓存中。当数据可以在缓存中找到时,它被称为缓存命中。如果没有,则称为缓存未命中。

对于系统设计人员来说,找出哪些数据需要放在缓存中是至关重要的。不难发现,只有经常被请求的热数据才应该留在缓存中。以设计脸书为例,帖子必须比用户简介更热门。而那些名人的帖子,一定比那些普通用户要火得多。所以,你应该在面试中优先考虑这个问题。

并非所有应用程序都应该有缓存

重要的是要知道,在所有类型的系统中,高速缓存都不会增加吞吐量。在某些情况下,它会对系统产生负面影响。例如,如果您的系统需要频繁更新或写入数据,缓存中的数据也需要不断变化。这会导致缓存大量失效。因此,应用程序需要将缓存中的数据标记为无效。此外,它还需要将更新后的数据写入其对应的持久性数据存储。在这个例子中,高速缓存的失效成为一个开销。因此,缓存只对那些读取量大而写入量小的应用程序有益。

缓存写入策略

当应用程序需要更新数据时,它需要:

  1. 更新持久数据存储中的数据。
  2. 无效或更新缓存中的数据。有几种类型的缓存写入策略。

直写:将新数据同步写入缓存和后台数据存储。

优点是数据在后备和缓存上都是一致的。即使停电,数据更新也不会丢失。

缺点是花费在写入上的时间要长得多,因为它不需要写入非常慢的持久数据存储。

**回写:**先写入缓存。在数据被替换之前,它不会写入后备数据存储。

优点是写更快,因为不需要更新后备数据存储。

缺点是它可能会丢失更新。此外,实现更加复杂,因为它需要跟踪哪个缓存块在缓存中被更新,但尚未写入磁盘。这种类型的缓存块称为脏块。

缓存替换策略

因为缓存很小,只保存一小部分热数据,所以它可能会超出限制。在这种情况下,当一个新请求到来时,如果出现缓存未命中,我们将需要为新数据逐出一个块。这个过程就是呼叫替换。有许多算法用于高速缓存替换,以找到要驱逐的高速缓存块。最佳策略取决于应用程序的用途。我在这里介绍两个著名的政策。

最近最少使用,LRU ,它丢弃最近最少使用的数据。在这个策略中,需要跟踪“何时”。

**最不常用,LFU,**丢弃最不常用的数据。使用计数被跟踪。

摘要

缓存是优化读取密集型应用程序的一种方式。它通过将相对少量的热数据放入内存来提高吞吐量并减少延迟,以便数据访问可以避免命中磁盘。根据您的应用程序,您可能需要相应地选择写策略和缓存替换策略,以获得最佳性能。要了解有关系统设计的更多信息,您可以在探索系统设计设计数据密集型应用中找到更多信息。

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

我的其他帖子

系统设计面试:如何设计一个系统来处理长时间运行的作业

FAANG Ace 系统设计面试

我如何获得 6 个月的代码并获得 FAANG offer

这些都是帮我找到方工作的资源

系统设计面试准备:如何用长轮询、发布订阅和队列异步处理长时间运行的作业

系统设计面试的成功步骤

SQL(关系数据库)还是 NoSQL?the FAANG 系统设计面试

利用 Scipy 实现最小风险的投资组合优化—有效边界解释

交易策略:Python TA-Lib 技术分析

交易策略:与反向交易者进行反向测试

千禧一代对 Robinhood 的投资选择 vs. Motley Fool 股票顾问

组合风险股票投资,降低风险

交易:用熊猫计算技术分析指标🐼

用熊猫库获取交易数据🐼

在加拿大各大银行找工作?银行求职俱乐部给你洞察热门 IT 技能那里

从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅

全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中

全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据

全栈开发教程:在 Angular SPA 上可视化交易数据

强化学习:Q 学习简介

URL 缩短服务的系统设计

原文:https://towardsdatascience.com/system-design-of-url-shortening-service-b325b18c8f88?source=collection_archive---------2-----------------------

提供缩短 URL 的 web 服务的系统设计分析

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

照片由 马库斯·斯皮斯克 发自 佩克斯

系统设计是软件工程中 最重要也是最令人畏惧的 方面。这个观点来自于我自己在一个建筑助理课程中的学习经历。当我开始我的助理架构课程时,我很难理解设计一个系统的想法。

一个主要原因是软件架构书籍中使用的术语一开始很难理解,并且没有清晰的逐步指南。每个人似乎都有不同的方法。

所以,我根据我学习建筑课程的经验着手设计一个系统。这是初学者系统设计系列的一部分(下面给出了链接)。对于这一个,让我们设计 URL 缩短服务。

,我们可以看到网址相当大,尤其是好友链接;当分享一篇文章时,我们倾向于缩短 URL。一些已知的 URL 缩短服务有 TinyURL、bit.ly、goo.gl、rb.gy 等。我们将设计这样一个网址缩短服务。

★系统的定义:

我们需要明确系统的目标。系统设计是一个如此庞大的话题;如果我们不把它缩小到一个特定的目的,那么设计系统就会变得复杂,尤其是对于新手来说。URL 缩短服务为长 URL 提供较短的别名。当用户点击缩短的链接时,他们将被重定向到原来的网址。

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

作者图片

★系统要求:

在这一部分,我们决定系统的功能。我们需要关注的需求是什么?我们可以将系统需求分为两部分:

  • 功能需求:

用户给出一个 URL 作为输入;我们的服务应该为该 URL 生成一个更短且唯一的别名。当用户点击较短的链接时,我们的系统应该将他们重定向到原来的链接。链接可能会在一段时间后过期。用户可以指定到期时间。我们这里不考虑用户自定义链接。

这是系统必须提供的一个需求。这是系统的主要目标。

  • 非功能性需求:

现在是需要分析的更关键的需求。如果我们不满足这个要求,它可能对项目的商业计划有害。那么,让我们定义一下我们的 nfr:

系统应该是高度可用的。如果服务关闭,所有 URL 重定向都将失败。URL 重定向应该实时发生。没有人应该能够预测缩短的链接。

性能、可修改性、可用性、可伸缩性、可靠性等。是系统设计中一些重要的质量要求。这些‘能力’是我们分析一个系统并确定我们的系统设计是否恰当所需要的。

在这个系统中,可用性是主要的质量属性。安全性是另一个重要的属性。通常,可用性和可伸缩性是系统设计的重要特征。默认情况下,性能是重要的,没有人希望构建一个性能更差的系统,对吗?!

★系统需要处理多少请求?

让我们假设,一个用户可能请求一个新的 URL,并使用它 100 次进行重定向。因此,写和读的比率应该是 1:100。所以系统的读取量很大。

我们需要在服务中处理多少 URL 请求?假设我们可能每秒收到 200 个 URL 请求。所以,一个月的计算,我们可以有 30 天* 24 小时* 3600 秒*200 =~ 500 M 的请求。

因此,每月会有近 5 亿个新的 URL 缩短请求。那么,重定向请求将是 500M * 100 = 50 亿。

要计算年份,你必须将这个数乘以 12。

★我们需要多少储物空间?

让我们假设,系统将所有的 URL 缩短请求和它们的缩短链接存储了 5 年。由于我们预计每个月会有 5 亿个新的 URL,我们预计存储的对象总数将是 500 M * (5 * 12)个月= 30 B。

现在让我们假设每个存储的对象大约有 100 个字节。我们将需要 300 亿* 100 字节= 3 TB 的总存储容量。

如果我们想要缓存一些经常被访问的流行 URL,如果我们遵循 80–20 规则,这意味着我们从缓存中保留 20%的请求。

因为我们每秒有 20K 个请求,我们将得到

20K * 60 秒 60 分钟 24 小时=每天~ 17 亿**

如果我们计划缓存 20%的请求,我们将需要

0.2 * 17 亿 100 字节= 34GB 内存。*

★数据流:

对于系统设计的新手,请记住,“如果你对系统设计从哪里开始感到困惑,请尝试从数据流开始。”

现在,服务器端组件的主要任务之一是为输入 URL 生成唯一的键。在这里,我们的输入数据只是一个 URL。因此,我们需要将它们存储为一个字符串。输出是 URL 的另一个缩短版本。如果有人点击这个缩短的网址,它会重定向到原来的网址。现在,每个输出 URL 需要是唯一的。

★为给定的 URL 生成一个简短的唯一键

例如,我们可以取一个随机缩短的网址“【rb.gy/ln9zeb】”。最后几个字符应该构成一个唯一的键。所以,我们的输入是用户给的一个长 URL。

我们需要计算输入 URL 的唯一散列。如果我们使用 base64 编码,6 个字符长的密钥将给我们 64 个^(6)= ~ 687 亿个可能的字符串,这对于我们的系统应该足够了。

**问题:**如果多个用户输入同一个网址,系统应该不会提供相同的缩短网址。如果一些字符串是重复的,系统会有什么行为?

**解决方案:**我们可以将带有递增序列号的输入 URL 附加到每个请求 URL。它应该使网址唯一。但是,序列号的溢出可能是一个问题。假设 user-id 是惟一的,我们可以将 user-id 附加到输入 URL。

★唯一密钥生成:

在系统中,user-id 应该是唯一的,这样我们就可以计算唯一的散列。我们可以有一个独立的唯一密钥生成服务(UGS),它预先生成随机 id 并将它们存储在数据库中。

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

图:UGS 唯一密钥生成服务(图片由作者提供)

每当我们需要一个新的密钥时,我们可以从已经生成的 id 中选择一个。这种方法可以使事情变得更快,因为当一个新的请求到来时,我们不需要创建一个 ID,确保它的唯一性,等等。UGS 将确保所有的 id 都是唯一的,它们可以存储在数据库中,这样就不需要每次都生成 id。

因为我们需要一个字节来存储一个字符,所以我们可以将所有这些键存储在:

6(字符)* 68.7B(唯一键)~= 412 GB。

★可用性和可靠性:

如果我们只保留 UGS 的一份拷贝,那就是单点故障。所以,我们需要做一个 UGS 的复制品。如果主服务器死了,备用服务器可以处理用户的请求。

每个 UGS 服务器都可以缓存 key-DB 中的一些密钥。它可以加快速度。但是,我们必须小心;如果一个服务器在使用完所有密钥之前就死掉了,我们就会丢失那些密钥。但是,我们可以假设,这是可以接受的,因为我们有将近 68B 个唯一的六字母键。

为了确保可用性,我们需要确保消除系统中的单点故障。数据复制将消除单点故障并提供备份。我们可以保留多个副本,以确保数据库服务器的可靠性。此外,为了实现不间断服务,其他服务器也需要副本。

★数据存储:

在这个系统中,我们需要存储数十亿条记录。我们保存的每个对象可能小于 1 KB。一个 URL 数据与另一个不相关。因此,我们可以使用 NoSQL 数据库,如 Cassandra、DynamoDB 等。NoSQL 选择将更容易扩展,这是我们的要求之一。

★可扩展性:

为了支持数十亿个 URL,我们需要对数据库进行分区,以便将数据存储到不同的数据库服务器中。

I)我们可以根据哈希键的第一个字母对数据库进行分区。我们可以将以“A”开头的密钥放在一台服务器上,将“B”放在另一台服务器上。这被称为基于范围的分区。

这种方法的问题是它会导致不平衡的分区。例如,另一方面,以“z”开头的单词很少;我们可能有太多以字母“e”开头的 URL。

我们可以将不经常出现的字母组合到一个数据库分区中。

ii)我们还可以基于我们存储的对象的散列进行分区。我们可以采用关键字的散列来确定可以存储数据对象的分区。哈希函数将生成一个服务器号,我们将密钥存储在该服务器中。这个过程可以使分布更加随机。这就是基于散列的分区。

如果这种方法仍然导致分区过载,我们需要使用一致散列法

★缓存:

我们可以缓存用户经常访问的 URL。在查询数据库之前,UGS 服务器可以检查缓存是否具有所需的 URL。那么它不需要再次进行查询。

缓存满了会怎么样?我们可能会用新的或流行的 URL 替换旧的未使用的链接。我们可以为我们的系统选择最近最少使用的(LRU)缓存回收策略。在此策略中,我们首先删除最近最少使用的 URL。

★负载平衡器:

我们可以在系统的不同位置添加一个负载平衡层,在 URL 缩短服务器、数据库和缓存服务器之前。

我们可以使用简单的循环法来分配请求。在这种方法中,LB 在后端服务器之间平均分配传入的请求。这种 LB 方法实现起来很简单。如果一个服务器死了,LB 将停止向它发送任何流量。

问题:如果一个服务器过载,LB 不会停止向这个服务器发送新的请求。我们以后可能需要一个智能 LB。

★一段时间后链接过期:

如果到了 URL 的到期时间,链接会发生什么?

我们可以在数据存储中搜索并删除它们。这里的问题是,如果我们选择搜索过期的链接,将它们从我们的数据存储中删除,这会给我们的数据库带来很大的压力。

我们可以用另一种方法。我们可以定期慢慢删除过期的链接。即使一些死链接存在的时间更长,它也不应该返回给用户。

如果用户试图访问过期的链接,我们可以删除该链接并向用户返回一个错误。定期清理过程可以运行,从我们的数据库中删除过期的链接。随着存储越来越便宜,一些链接可能会留在那里,即使我们在清理时错过了。

移除链接后,我们可以将它放回数据库以供重用。

★安全性:

我们可以将每个 URL 的访问类型(公共/私有)存储在数据库中。如果用户试图访问他没有权限的 URL,系统会发回一个错误(HTTP 401)。

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

图:URL 缩短服务的最终设计(图片由作者提供)

结论:

在这个系统中,我们没有考虑 UI 部分。因为这是一个 web 服务,所以也不讨论客户端部分。唯一密钥生成是该系统的重要部分。因此,我们添加了一个额外的服务来创建和存储 URL 的唯一键。为了确保服务的可用性,我们使用了服务器复制,这样,如果一台服务器出现故障,其他服务器仍然可以提供服务。数据库也被复制以确保数据的可靠性。缓存服务器用于存储一些流行的查询,以加快延迟。并且添加了负载平衡器,以便在后端服务器之间平均分配传入的请求。

来源:钻研系统设计面试课程。

感谢您阅读本文。 过得愉快😃

本文是面向初学者的系统设计系列文章的一部分。这里是链接

服务于机器学习算法的系统设计——不同环境下管道的最佳实践

原文:https://towardsdatascience.com/system-design-proposal-for-serving-machine-learning-algorithms-best-practices-for-pipelines-for-8b14d4f6e13c?source=collection_archive---------40-----------------------

拥有生产管道和开发管道的重要性

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

昆腾·德格拉夫在 Unsplash 上的照片

找到了。在处理一个长期难以解决的问题时,你发现了一个适销对路且有利可图的解决方案。为了简化您的纳税申报,您决定提交文件来启动您的有限责任公司。你意识到将个人和企业财务分开的重要性。如果你不能把你的财务分开,到时候报税会变得很麻烦。这个概念非常类似于为不同的环境构建管道,特别是开发/非生产和部署/生产环境。拥有这些独立环境的目的是什么?我们将在本节中介绍划分这些环境的好处。

在构建我们的数据科学解决方案的过程中,我们制定了一系列步骤来执行我们取得成功所需的操作。我们从源中提取数据,设计我们的特征,训练我们的各种模型,验证我们的源数据子集,然后上传我们的预测。虽然使用脚本构建我们的解决方案很简单,但是我们可以很快引入管道部署的复杂性。我们为什么以及如何做出这样的声明?我们在生产中使用的数据可能不同于我们在开发中使用的数据。

仅仅因为这个原因,我们需要有不同的考虑或额外的步骤来补偿这些差异。一旦我们开始考虑与数据湖同步数据,我们的数据科学解决方案不得将我们在开发中做出的预测与我们的客户将看到的数据湖同步。除了以上几点,稳定性和验证测试还会受到我们如何构建管道的影响。如果我们的管道已经合并成一个,那么创建检查来确保预期的功能将变得具有挑战性。通过遵循这些概念和思想,我们可以通过限制我们对简化我们的视野隧道和划分的关注来为我们自己节省一些“痛苦和折磨”。

为什么有单独的训练管道和预测管道?

在上一小节中,我们讨论了在开发和生产中运行我们的数据科学解决方案之间有两条不同管道的重要性。我们提高了管道的稳定性和可测试性。然而,如前一节所述,开发我们的管道很容易,因为我们已经在同一个脚本中集成了我们的训练和预测过程。通常,在这些情况下常见的是,布尔值被传递到软件中,以表示我们是预测我们的机器学习模型还是训练我们的机器学习模型。将两个根本不同的过程融合在一起会使数据科学代码库变得复杂,并降低软件和管道的可维护性。有软件概念和原则来增加可维护性和减少认知超载。可以应用单一责任原则来帮助使训练和预测过程更容易维护和管理。如果坚持并执行这一原则,预测管道实际上可以由五个基本操作和多达十个代码行组成。遵循这一原则减少了部署团队的每个成员需要了解的关于培训管道的内容。

感谢您阅读到目前为止!这是后续系列文章的一部分。

请保持关注!

一如既往,#快乐编码

人工智能中的系统偏差

原文:https://towardsdatascience.com/systematic-bias-in-artificial-intelligence-8698ffa20d57?source=collection_archive---------42-----------------------

照亮了明天最大的问题之一

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

数据真的有更好的想法吗?鸣谢:弗兰基·查马基

最近,詹妮弗·林肯医生做了一个抖音强调了非裔美国人在医疗保健中面临歧视的多种方式,例如接受较少的止痛药和在急诊室等待更长时间。该视频基于发表在《国家科学院院刊》( PNAS)上的研究,已在抖音获得 40 万次点击量,在推特上获得近 800 万次点击量。如果人工智能模型根据医疗记录进行训练,以预测患者的止痛药剂量,它可能会建议非裔美国人患者使用更低的剂量,因为它是在非裔美国人患者接受更低剂量的数据集上训练的。显然,这将变得非常成问题,因为这种人工智能的假设用例将进一步使种族主义制度化。

偏见的后果

随着人工智能日益融入当前系统,系统偏差是一个不容忽视的重要风险。当模型输入的数据存在对某个种族或性别的偏见时,它们就不能有效地达到预期目的。根据准确性、利润等指标评估的模型将试图最大化所述指标,而不考虑其形成的偏差。如果不采取措施解决这个问题,更重要的是,人类或监管机构可能会对人工智能失去信心,阻止我们释放这项技术的潜力。为了理解这个问题的严重性,这里有两个更可怕的人工智能偏见的例子。

  • 正如论文“仇恨言论检测中种族偏见的风险”中所概述的那样,华盛顿大学的研究人员在超过 500 万条推文中测试了谷歌的人工智能仇恨言论检测器,发现来自非洲裔美国人的推文比其他种族的人更容易被归类为有毒言论。
  • COMPAS(替代制裁的矫正罪犯管理概况)是一种算法,由纽约、加利福尼亚和其他州用于预测获释囚犯再次犯罪的风险。在研究文章“预测累犯的准确性、公平性和局限性”中,达特茅斯大学的研究人员得出结论,“没有累犯的黑人被告被错误地预测为重新犯罪的比例为 44.9%,是白人被告 23.5%的近两倍;而曾经再犯的白人被告被错误地预测为不会再犯的比例为 47.7%,几乎是黑人被告(28.0%)的两倍。考虑到 COMPAS 分数会影响被告的刑期,这是非常麻烦的。

战斗偏见

许多人工智能批评者表达的一个担忧是人工神经网络的“黑盒”性质:机器学习模型可以为我们提出的问题提供答案,但由于涉及的计算非常复杂,我们无法理解该模型如何得出答案。这种不透明性让偏见悄悄潜入。即使抛开偏见,消费者/企业也有兴趣了解人工智能是如何得出结论的。

解释人工智能如何做出高风险决策的一个潜在解决方案是可解释的机器学习。顾名思义,可解释机器学习涉及创建模型,其决策过程比黑盒模型更容易理解。为了变得可解释,这些模型被设计成具有诸如附加约束和领域专家的输入等因素。例如,防止贷款申请中的偏见的另一个约束是合规性:该模型必须遵守公平贷款法,不得歧视某一种族的消费者。

虽然可解释的机器学习模型由于其复杂性的增加而更加耗时和昂贵,但对于自动驾驶汽车、医疗保健或刑事司法等错误会产生严重影响的应用来说,可解释性层绝对是值得的。人性使社会抵制变化,但更透明的模型可以开始使公众/政府更容易接受人工智能的广泛采用。

其他潜在的解决方案关注模型使用的数据,而不是模型如何使用数据。一种提议的方法涉及获取通常保持机密的大型数据集(例如医疗数据)并在删除个人身份信息后向公众发布。这个想法是偏见将在这些匿名数据集中被过滤掉。然而,这种策略有其自身的风险,因为黑客可以交叉引用数据,使其通过匿名层。与此同时,有意识地纳入代表性不足的人群将支持缺乏多样性的数据集。最后,在设计这些算法的工程师中培养多样性应该有助于对抗偏见。

随着人工智能的快速发展,主动打击偏见仍然是当务之急。

参考

[1] Cynthia Rudin,停止解释高风险决策的黑盒机器学习模型,转而使用可解释的模型,《自然》

[2]克里斯托夫·莫尔纳尔,可解释机器学习,Github

[3]朱丽亚·德雷塞尔,《预测累犯的准确性、公平性和限度》,科学进展

感谢阅读!

我是 Roshan,16 岁,对人工智能的应用充满热情。如果你对人工智能更感兴趣,可以看看我关于人工智能在医疗保健中的应用的文章。

在 Linkedin 上联系我:https://www.linkedin.com/in/roshan-adusumilli/

用 Black Scholes 对金融期权进行系统定价

原文:https://towardsdatascience.com/systematically-pricing-financial-options-with-black-scholes-4998c591ccbd?source=collection_archive---------21-----------------------

疫情唯一没有破坏的模型?

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

M. B. M.Unsplash 上拍摄的照片

欧式与美式期权

金融市场上交易的普通金融期权有两种:美式期权——你可以在行权日之前的任何时候行使期权——以及欧式期权——你必须等到行权日才能行使期权。

美国”和“欧洲”这两个名字实际上与期权的交易地点或公司的国籍无关。如果股票支付股息,并且行权日之前的时间包括除息日,那么这两种期权的估值将会有很大的不同——此时购买股票将不再授予你获得股息的权利。

Black-Scholes 假设了欧式期权,但它也可以用于不支付股息的美式期权。

布莱克·斯科尔斯公式

获得诺贝尔奖的原始 Black-Scholes 公式指出,看涨期权的价格取决于股票现货价格 S 的函数的累积正态分布(此处用 *N、*表示)、以 K 值(等于执行价格)交易的无风险债券的现值、股票年化回报的波动率以及从今天到行权日的时间除以一个财政年度的天数(此处用 t 表示)

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

布伦娜·托里诺

如果你想知道更多关于公式推导的信息,这里有一个非常好的资源。在本文中,我将更多地关注公式的系统应用。

数据

为了计算我们从期权中的潜在收益,我们需要一年(在本例中,2018 年 6 月 12 日至 2019 年 6 月 12 日)股票价格的历史数据和期权当前交易价格水平的数据,以便我们可以比较我们的结果。

历史数据可以从雅虎财经获取:进入历史数据下载一年的数据集。

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

首先,我们需要计算输入布莱克-斯科尔斯模型的波动率。传统上,我们使用股票年回报率的波动率,计算如下:

最后一行将检索股票行权日期为 7 月 24 日的看涨期权数据表。

Python 中的 Black-Scholes 公式

下面是本文开头描述的相同的 Black Scholes 公式,但是现在用一个名为 black_scholes 的 Python 函数表示。请注意,无风险债券的现值公式就是债券价格 K 除以(1 +无风险利率)的时间分数的幂 T,,我们使用 Python 函数 cdf 来计算变量 d1 和 d2 的累积分布函数值。

布莱克-斯科尔斯算法

计算出波动率(金融市场天数的平方根乘以年化回报的标准差)后,我们可以对我们目前拥有的所有执行价格进行估计。在特斯拉的案例中,我们有 35 种不同的看涨期权执行价格。

对于每个执行价格,我们输入股票的现货价格(目前为 972.84),循环遍历数据框 *r,*中的执行价格,我使用的无风险利率是 10 年期美国国债收益率,目前为 0.69%。

我们输出数据框 df_estimate ,我们可以用它来计算 Black Scholes 模型的估计值与期权在市场上的实际交易价格有多接近:

布莱克·斯科尔斯正确预测了期权的市场价值吗?

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

我们的平均估计误差为 0.49%,标准差为 2.46 个百分点。我们的中位数更有希望达到 0.29%左右。我们的标准差似乎仍然有点高,但仔细观察数据集,我们可以看到有几个合约今天根本没有交易,这扭曲了数据集,因为这些价格没有高度更新。

如果我们只包括今天至少交易过一次的合约:

df1 = df_estimate[(df_estimate.Volume != '-')]

对于估计误差,我们实际上可以产生更好的结果:

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

这里,我们有一个-0.13%的平均估计误差,这意味着与我们的估计相比,期权价格平均低估期权 0.13%,我们的标准差减少到只有 1.8 个百分点。

出于好奇,让我们分析一下布莱克·斯科尔斯误差超过 1%的几份合同:

df1[df1['estimate_error'] > 1]

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

大多数合约的交易量都很小,在股市交易日只交易一次。然而,4 号合约具有 1.4%的估计误差,具有 21 个合约和 466 个未平仓权益的高容量。执行价格在 850,这意味着如果股票价格高于 850+174.65 = 1021.65 美元,它将获利,而目前股票交易价格为 972.84 美元。在大约 31 个股市交易日中,这只上涨了 5.325%,这对特斯拉来说并不是一个困难的壮举。

我们的估计略低,但差异的一个原因可能是这些期权的非常大的价差,做市商以 6%的无风险利润退出。这表明,目前 7 月 24 日特斯拉期权的风险要高得多,考虑到这些交易的低交易量和行权日期的临近,这是有道理的。

隐含波动率

雅虎金融期权数据的一个重要壮举是,它向我们展示了期权价格的隐含波动率,这可以通过从期权交易价格开始反向求解波动率的布莱克-斯科尔斯方程来计算。对于这个分析,我没有使用隐含波动率作为输入,因为我想比较市场参与者如何对期权定价与布莱克-斯科尔斯模型的估计。

隐含波动率是前瞻性,意思是它可以给我们一个感觉,交易者目前在期权中定价了多少未来波动率,T5,如果交易者是理性的 。当谈到隐含波动率时,最后一个假设很重要,因为其他因素,如行为经济学(由于这种信念,特斯拉是市场上最被做空的股票),当前疫情期间的非理性避险情绪,以及其他外部因素,都可以在期权定价中发挥作用,但不一定反映股票的预期波动率。

你的神经网络应该有多少个神经元?

原文:https://towardsdatascience.com/systematically-tuning-your-model-by-looking-at-bias-and-variance-4986662315b2?source=collection_archive---------48-----------------------

通过观察偏差和方差来系统地调整你的模型

作为数据科学家,我们在建立一个模型的时候经常会面临很多决策,比如用哪个模型它应该有多大需要多少数据增加多少特征或者使用还是不使用正则化。虽然一些决策可以相对快速地进行评估,但其他决策(如收集更多数据)可能需要几个月的时间,然后才发现没有帮助。

在这篇文章中,我将实际演示一种基于观察偏差和差异做出这些决策的方法,这种方法改变了我在几乎每个项目中进行的方式。

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

Valentin SaljaUnsplash 上拍摄的照片

实践中的偏差和差异

许多人在调整他们的模型时犯的错误是,他们只关注他们的验证错误。虽然这最终是最重要的数字(除了测试误差),但同时观察训练误差可能会给你几个提示,告诉你该如何使用你的模型

偏差和方差可能有不同的更正式的定义,但实际上是这样的:

偏差是训练集的错误率(1-训练精度)

方差是验证集上的模型与训练集相比差多少的比率(训练精度-验证精度)

我将用一个实际的例子来说明这些概念的重要性。

创建数据集

让我们首先创建一个数据集,我们将使用它来训练和评估我们的模型。

我将使用 sklearn 的 make_classification 来完成这项工作,然后将数据集分成训练集和验证集。

场景#1:高偏差,低方差

接下来,我们将开始使用 Keras 创建一个相对较小的神经网络,并在我们的数据集上训练它。

经过训练的模型得到以下结果:

Training accuracy: 62.83%
Validation accuracy: 60.12%

Bias: 37.17%
Variance: 2.71%

我们可以看到,我们的模型有一个非常高的偏差,同时有一个相对较小的方差。这种状态俗称欠配合

有几种方法可以减少偏差,让我们脱离这种状态:

增加模型的尺寸

添加更多功能

减少正则化

场景#2:低偏差,高方差

让我们试试增加模型大小来减少偏差的方法,看看会发生什么。

为了做到这一点,我增加了每个隐藏层中神经元的数量。

我们更大的模型得到以下结果:

Training accuracy: 100.0%
Validation accuracy: 89.82%

Bias: 0.0%
Variance: 10.18%

正如你所看到的,我们已经成功地减少了模型的偏差。事实上,我们已经完全消除了它,但是,现在方差增加了。这种状态俗称过拟合

减少模型方差的方法有:

减小模型的尺寸

减少功能数量

添加正则化

添加更多数据

场景#3:低偏差、低方差

让我们这次尝试通过引入一些正则化来减少方差。

我以 Dropout(训练时随机忽略一组神经元)的形式将正则化添加到每一层。

我们新模型的结果是:

Training accuracy: 98.62%
Validation accuracy: 95.16%

Bias: 1.38%
Variance: 3.46%

完美!我们现在非常接近一个最优状态,具有相对较低的偏差和相对较低的方差,这正是我们的目标。如果我们现在看看我们的验证误差(1-验证准确性或偏差+方差),这是迄今为止最低的。

也许你已经注意到,在最后一个场景中,与场景#2 相比,偏差又增加了一点。你也可以看到减少偏差和减少方差的方法是完全相反的。这种特性称为偏差-方差权衡,如下图所示:

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

偏差-方差权衡|作者图片

基本上,我们试图找到偏差和方差之间的平衡,即最小化总误差

结论

我们经历了基于偏差和方差调整模型的 3 种不同场景,以及可以采取的相应步骤。

可能存在第四种情况,即高偏置高方差,这还没有被涵盖。然而,这通常意味着你的数据有问题(训练和验证分布不匹配,噪音数据等。),因此,很难给你一个确切的指导方针。

我希望这种方法能帮助你在项目中区分任务的优先级,并最终为你节省一些时间。

我用的所有代码都可以在 GitHub 上找到。

灵感来自吴恩达对机器学习的向往。

[## 主动学习能节省多少时间?

在 NLP 数据集上的动手实验。

towardsdatascience.com](/how-much-time-can-you-save-with-active-learning-b4886f5da462) [## 零射击学习字母字符(代码实验)

是否有可能识别培训中未提供的字母字符?

towardsdatascience.com](/zero-shot-learning-the-alphabetic-characters-an-experiment-with-code-d1a0f23f4b4c)

t 分布随机邻居嵌入(t-SNE)

原文:https://towardsdatascience.com/t-distributed-stochastic-neighbor-embedding-t-sne-bb60ff109561?source=collection_archive---------7-----------------------

了解 t- SNE 的基础知识,它与主成分分析的区别,以及如何在 MNIST 数据集上应用 t-SNE

在本文中,您将了解到:

  • t-SNE 和 PCA(主成分分析)的区别
  • 简单易懂的解释 SNE 霸王龙是如何工作的
  • 了解可用于 t-SNE 的不同参数
  • t-SNE 和主成分分析在 MNIST 的应用

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

如果一个数据集中有数百个特征或数据点,并且希望在二维或三维空间中表示它们,该怎么办?

两种常见的技术在保留数据集中大部分信息的同时降低了数据集的维度

降低数据维度的目标

  • 在低维表示中尽可能多地保留高维数据中存在的数据的重要结构或信息。
  • 提高低维数据的可解释性
  • 最小化因降维导致的数据信息损失

什么是 PCA 和 t-SNE,两者有什么区别或相似之处?

PCA 和 t-SNE 都是无监督的降维技术。这两种技术都用于将高维数据可视化到低维空间。

主成分分析

  • 用于特征提取和可视化的无监督确定性算法
  • 应用线性降维技术,其中的重点是在低维空间中保持不同点之间的距离。
  • 通过使用特征值保留数据中的方差,将原始数据转换为新数据。
  • 离群值影响 PCA。

t-分布随机邻域嵌入(t-SNE)

  • 一种无监督的随机化算法,仅用于可视化
  • 应用一种非线性降维技术,重点是在低维空间中保持非常相似的数据点接近在一起。
  • 使用学生 t 分布来计算低维空间中两点之间的相似性,从而保留数据的局部结构。
  • t-SNE 使用重尾 Student-t 分布来计算低维空间中两点之间的相似性,而不是高斯分布,这有助于解决拥挤和优化问题
  • 异常值不会影响 t-SNE

T-分布式随机邻居嵌入(t-SNE) 是由 Laurens van der MaatenGeoffrey Hinton 开发的一种用于可视化的无监督机器学习算法。

t-SNE 是如何工作的?

第一步:在高维空间中寻找相邻点之间的成对相似性。

t-SNE 将数据点 xᵢ和 xⱼ之间的高维欧几里德距离转换成条件概率 P(j|i)。

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

D 高维空间中的数据(图片由作者提供)

xᵢ会根据以 xᵢ.点为中心的高斯分布下 xⱼ的概率密度比例来选择它作为邻居

σᵢ是以数据点 xᵢ为中心的高斯方差

一对点的概率密度与其相似度成正比。对于附近的数据点,p(j|i)将相对较高,而对于相距较远的点,p(j|i)将非常小。

将高维空间中的条件概率对称化,得到高维空间中的最终相似度。

条件概率通过对两个概率进行平均来对称化,如下所示。

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

对称化条件概率

步骤 2:基于高维空间中的点的成对相似性,将高维空间中的每个点映射到低维映射。

低维图将是二维或三维图

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

D 低维空间中的数据(图片由作者提供)

yᵢ和 yⱼ是高维数据点 xᵢ和 xⱼ.的低维对应物

我们计算条件概率 q(j|i ),类似于以点 yᵢ为中心的高斯分布下的 p(j[I ],然后对称化该概率。

步骤 3:使用基于 Kullback-Leibler 散度(KL 散度)的梯度下降,找到最小化 Pᵢⱼ和 qᵢⱼ之间不匹配的低维数据表示

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

Pᵢ 代表点 xᵢ.在所有其他数据点上的条件概率分布 Q 表示给定地图点 yᵢ的所有其他地图点上的条件概率分布

t-SNE 使用梯度下降优化低维空间中的点。

为什么用 KL 发散?

当我们最小化 KL 散度时,它使得 qᵢⱼ在物理上等同于 Pᵢⱼ,因此高维空间中的数据结构将类似于低维空间中的数据结构。

基于 KL 散度方程,

  • 如果 Pᵢⱼ较大,那么我们需要一个较大的 qᵢⱼ值来表示相似性较高的局部点。
  • 如果 Pᵢⱼ很小,那么我们需要一个更小的 qᵢⱼ值来表示相距很远的局部点。

第四步:使用 Student-t 分布计算低维空间中两点之间的相似度。

t-SNE 使用一个自由度的重尾 Student-t 分布来计算低维空间中两点之间的相似性,而不是高斯分布。

t 分布在低维空间中创建点的概率分布,这有助于减少拥挤问题。

如何在数据集上应用 t-SNE?

在我们用 python 写代码之前,让我们了解一些我们可以使用的 TSNE 的关键参数

n _ components*:嵌入空间的维度,这是我们希望高维数据转换成的较低维度。二维空间的默认值为 2* 。

**困惑度:**困惑度与 t-SNE 算法中使用的最近邻的数量有关。较大的数据集通常需要较大的困惑度。困惑度的值可以在 5 到 50 之间。 默认值为 30。

n_iter:优化的最大迭代次数至少应为 250,默认值为 1000

learning _ rate:t-SNE 的学习率通常在[10.0,1000.0]范围内,默认值为 200.0。

在 MNIST 数据集上实现主成分分析和 t-SNE

我们将使用 sklearn.decomposition.PCA 应用 PCA,并在 MNIST 数据集上使用 sklearn.manifold.TSNE 实现 t-SNE。

加载 MNIST 数据

导入所需的库

import time
import numpy as np
import pandas as pd

获取 MNIST 训练和测试数据,并检查训练数据的形状

**(X_train, y_train) , (X_test, y_test) = mnist.load_data()** X_train.shape

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

创建一个包含大量图像和图像中像素计数的数组,并将 X_train 数据复制到 X

**X = np.zeros((X_train.shape[0], 784))
for i in range(X_train.shape[0]):
    X[i] = X_train[i].flatten()**

混洗数据集,取 10%的 MNIST 训练数据并将其存储在数据框中。

**X = pd.DataFrame(X)
Y = pd.DataFrame(y_train)
X = X.sample(frac=0.1, random_state=10).reset_index(drop=True)
Y = Y.sample(frac=0.1, random_state=10).reset_index(drop=True)
df = X**

在数据准备好之后,我们可以应用主成分分析和 t-SNE。

在 MNIST 数据集上应用主成分分析

使用来自***sk learn . decomposition .***的 PCA 库应用 PCA

**from sklearn.decomposition import PCA**
time_start = time.time()
**pca = PCA(n_components=2)
pca_results = pca.fit_transform(df.values)**print ('PCA done! Time elapsed: {} seconds'.format(time.time()-time_start))

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

PCA 生成两个维度,主成分 1 和主成分 2。将两个 PCA 成分连同标签一起添加到数据框中。

**pca_df = pd.DataFrame(data = pca_results
             , columns = ['pca_1', 'pca_2'])
pca_df['label'] = Y**

只有可视化时才需要标签。

绘制 PCA 结果

**fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1) 
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = [0,1,2,3,4,5,6,7,8,9]
colors=['yellow', 'black', 'cyan', 'green', 'blue', 'red', 'brown','crimson', 'gold', 'indigo']****for target, color in zip(targets,colors):
    indicesToKeep = pca_df['label'] == target
    ax.scatter(pca_df.loc[indicesToKeep, 'pca_1']
               , pca_df.loc[indicesToKeep, 'pca_2']
               , c = color
               , s = 50)****ax.legend(targets)
ax.grid()**

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

在 MNIST 数据集上应用 t-SNE

导入 t-SNE 和可视化所需的库

**import time
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import matplotlib.patheffects as PathEffects**
**%matplotlib inline**

首先使用默认参数创建一个 TSNE 实例,然后将高维图像输入数据放入嵌入空间,并使用 fit_transform 返回转换后的输出。

图像数据的维数应该是(n _ 样本,n _ 特征) 的形状

time_start = time.time()
**tsne = TSNE(random=0)
tsne_results = tsne.fit_transform(df.values)**print ('t-SNE done! Time elapsed: {} seconds'.format(time.time()-time_start))

将标注添加到数据框中,这将仅在绘制时使用,以便为聚类添加可视化标注。

**df['label'] = Y**

函数来可视化数据

**def plot_scatter(x, colors):**
    # choose a color palette with seaborn.
   ** num_classes = len(np.unique(colors))
    palette = np.array(sns.color_palette("hls", num_classes))
    print(palette)**

    # create a scatter plot.
  **  f = plt.figure(figsize=(8, 8))
    ax = plt.subplot(aspect='equal')
    sc = ax.scatter(x[:,0], x[:,1],  c=palette[colors.astype(np.int)], cmap=plt.cm.get_cmap('Paired'))
    plt.xlim(-25, 25)
    plt.ylim(-25, 25)
    ax.axis('off')
    ax.axis('tight')**# add the labels for each digit corresponding to the label
  **  txts = []****for i in range(num_classes):**# Position of each label at median of data points.**xtext, ytext = np.median(x[colors == i, :], axis=0)
        txt = ax.text(xtext, ytext, str(i), fontsize=24)
        txt.set_path_effects([
            PathEffects.Stroke(linewidth=5, foreground="w"),
            PathEffects.Normal()])
        txts.append(txt)****return f, ax, sc, txts**

可视化 MNIST 数据集的 SNE 结果

**plot_scatter( tsne_results, df['label'])**

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

尝试不同的参数值并观察不同的图

不同困惑值的可视化

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

n _ ITER 不同值的可视化

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

我们可以看到,从 t-SNE 图生成的聚类比使用 PCA 生成的聚类更加明确。

  • PCA 是确定性的,而 t-SNE 不是确定性的,而是随机的。
  • t-SNE 试图只映射局部邻居,而 PCA 只是我们初始协方差矩阵的对角旋转,特征向量代表并保持全局属性

代码在这里可用

结论:

主成分分析和 t-SNE 是两种常见的降维方法,它们使用不同的技术将高维数据降维为可以可视化的低维数据。

参考资料:

[## sk learn . manifold . tsne—sci kit-learn 0 . 23 . 2 文档

t 分布随机邻居嵌入。t-SNE [1]是一个可视化高维数据的工具。它转换…

scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html)

劳伦斯·范·德·马滕杰弗里·辛顿使用 t-SNE 可视化数据。

[## t-SNE

t 分布随机近邻嵌入(t-SNE)是一种降维技术,特别适用于

lvd maten . github . io](https://lvdmaaten.github.io/tsne/)

面向端到端数据科学家的 2020 年 t 型技能构建指南

原文:https://towardsdatascience.com/t-shaped-skills-builder-guide-in-2020-for-end-to-end-data-scientist-33d2652511b0?source=collection_archive---------20-----------------------

该行业需要更多有能力根据这些大量信息进行总结、分析和决策的人。

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

设计

我父亲过去常说,如果一个人专攻一个领域,他就会很富有。对他这一代人来说,成为某个特定领域的专家将保证事业成功。几十年前,当我们还生活在信息时代,互联网还没有像今天这样普及时,信息是珍贵的,人们试图在非常有限的资源内逐个收集知识。那时,只有当他们频繁接触工作时,他们才能获得更多的信息和经验,因为他们几乎找不到可以快速学习的额外信息来源。这些专家因此成为公司的宝贵财富,没有人可以取代他们的角色。专注于一件事是他们独特的价值观,因此这有助于确保他们的工作以及确保事业蒸蒸日上。二十年前很难找到一个 Java 开发者,那时大学还在学士课程中教授 Pascal 或 C 语言,Coursera、Udemy 或 YouTube 还没有成立。这些开发人员经常获得极高的薪水,他们构建了我们现在所说的传统系统。每当我接触这些系统,我真的很尊重制造商。

如今,信息随处可见,不再是一个秘密,公司不再那么依赖拥有高度专业技能的员工。相反,该行业需要更多有能力根据这些大量信息进行总结、分析和决策的人。我们现在生活在概念时代,我们不仅拥有比以往更多的数据,而且面临更复杂的问题,需要综合技能和多学科来提供完整的端到端解决方案。这种趋势目前正在包括数据科学在内的所有行业迅速采用,这就是为什么公司现在需要更多独角兽或 T 型数据科学家来解决他们复杂的业务问题。换句话说,数据科学家应该在 T 形的横条(宽度)上拥有多样化的技能,同时在竖条(深度)上成为特定领域的专家。

基于我作为一名数据科学家非常有限的经验,我想为那些想成为数据科学领域 T 型人的人分享一个基本的构建者指南。

建筑指南

专家

成为某一方面的专家并不意味着你必须深入了解某一特定领域,事实上,你不应该太深入。时间是有限的资源,每个人每天都有同样的 24 小时。当你太专注于学习一项技能时,你将没有足够的时间去探索行业所需的各种技能。你能做的是建立一个核心知识,并在此基础上发展其他技能。

核心知识

作为一名数据科学家,你应该知道关于统计和数学的基础知识(代数是必须的,可能还会有一点微积分)。统计学将为假设检验和理解数据特征提供工具,而微积分是分析数据变化或趋势的工具。没有统计学和微积分的相关知识,你将无法理解你的预测的置信区间和神经网络的消失梯度。

除了统计学和数学,尝试让自己熟悉一些机器学习模型,如分类、聚类和回归。他们将介绍机器学习的不同分支的概述,以便您可以为您的特定业务问题选择合适的模型类型。此外,您还可以了解一些高级的 ML 模型,如 Random Forest 和 XGBoost,因为它们是可解释的模型,非常准确,广泛用于大多数使用 ML 的常见问题。

深度学习将是一个加号。然而,由于最近没有关于神经网络架构的破坏性探索,并且每个网络结构的用例已经建立了多年,所以你应该认为自己是一名在应用这些模型解决实际业务问题方面经验丰富的人工智能从业者。此外,关于人工智能及其应用的信息现在在互联网上无处不在,因此你可以快速找到要使用的模型。有些甚至提供了代码和微调说明,假设你已经有了基本的知识。这里的问题是,当你坐在大学里时,你不会有足够的时间掌握所有这些领域。因此,你需要第二个核心技能:研究。

研究技能

大多数数据科学家团队都是根据业务需求组建的,以解决业务问题为导向。他们必须为每种类型的问题提供非常具体的解决方案,因此团队必须拥有具备不同技能的人员来处理公司分配的任何任务。然而,他们通常不知道业务问题,因此也不知道需要事先学习的技能。换句话说,它必须在飞机上学习。在这种情况下,研究技能变得极其重要,因为它会帮助你快速、准确地了解事情,足以解决问题。例如,如果由于对变量类型的严格要求,项目要求您用 Typescript 编写代码,那么您将不得不学习 Typescript,即使您对 Python 更有信心。或者,如果企业主要求您构建一个 web 应用程序来为用户提供您的推荐模型,那么您将不得不学习 ReactJS 或 Angular,尽管您对前端开发的了解有限。

当然,你不可能在一两周内成为打字稿或前端开发的专家。然而,你可以交付一个完整的端到端解决方案,带来商业价值,而不是一个高度精确的模型,但没有人可以使用。

学习“如何学习”是最难的科目,没有人能教你。尽管流行的研究方法有一些共同的做法,但每个人的思维路径都是独特的,因为他们有不同的能力,生活条件,教育甚至习惯都会影响他们的思维方式。因此,人们以许多不同的方式学习,找到学习事物的最佳方式是你自己的冒险。这项技能将有助于拓展你在 T 型单杠上的技能组合,最终有助于你事业的成功。

多面手

随着核心知识的积累,你在机器学习和研究方法方面已经足够专业,然后你可以开始扩展技能集,成为多面手。你可以把 T 字横线上的这些技能想象成用来连接充电器和设备的不同类型的电缆。你有越多类型的连接器(微型 USB、USB-C 或 Lightning),你就有越多类型的设备可以充电。换句话说,作为多面手,你掌握的技能越多,你能涉足的行业就越多。以下是对在生产中使用数据的数据科学家有用的一些基本技能。

云平台

虽然“快速失败,经常失败”是数据科学中敏捷开发的关键概念,但如何从失败中立即恢复是团队应用敏捷所需要的。毕竟,您不希望您的应用程序经常失败,并且在事件发生后需要几个小时才能恢复。尽管自 1957 年初以来就出现了迭代和增量开发,但敏捷如今如此受欢迎的原因之一是,它现在得到了多种技术的支持,如容器、微服务、Kubernetes、持续集成/持续部署(CI/CD)和云计算。这些技术使系统更健壮,更容易出错,这样团队就可以从崩溃整个应用程序的恐惧中解放出来。本地系统几乎无法实现这些功能,并且通常需要昂贵复杂的硬件和软件配置。当公司无法快速扩展其系统并在团队中共享计算资源时,计算性能是另一个问题。

我曾经有机会在一个使用本地服务器的数据分析团队中工作,我可以确认这些难题是真实存在的。我的前半个工作日通常花在运行数据库查询和等待结果返回上。直到我把所有的数据转储到我的工作空间,我才能开始处理和分析它。有时,我的队友运行计算密集型查询和代码,使服务器挂起几个小时。然后,他们必须联系 DBA 来终止查询,并在下班后服务器不忙时运行查询。在这种情况下,如何快速测试您的假设并迭代数据科学流程?幸运的是,团队中的人都很聪明,他们都有办法以这样或那样的方式克服问题,完成工作。然而,这真的让他们慢了下来。

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

谷歌云平台(图片来源:博客。谷歌

云环境是解决上述所有问题的良方,因为它具有高可用性和可扩展性。该环境也是可复制的,因此即使整个系统崩溃,您也可以用最少的努力来重新创建它。此外,containers orchestration 解决方案将持续检查每个服务器(微服务)的健康状况,如果一个服务器出现故障,它将在几秒钟内自动启动一个新的服务器。您可以放心地测试您的代码和想法,而不必担心会导致应用程序崩溃的未知错误。如果您需要更多的计算能力,云计算实例也将自动扩展。

信不信由你,大多数公司都在努力寻找他们在云上的家,特别是当人们到处都在谈论数字化转型时,当前的疫情甚至增加了企业领导者将他们的公司转型为几乎百分之百数字化或数字化双胞胎的压力。因此,强烈建议拥有一两个云平台的一些经验。

后端 API

你有一个非常精确的模型。现在怎么办?你不能仅仅使用 Jupyter Notebook,通过手动将看不见的观察结果输入笔记本并重新运行来服务数百个用户。相反,您应该将您的 ML 模型公开为一个服务,或者换句话说,一个 API。这里的意思是,您有一个服务器正在运行并接受预测请求。你所要做的就是发送一个带有未知数据的 HTTP 请求,服务器会自动返回一个预测值。

下面是一些流行的 Python web 框架,可以用来构建后端。

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

顶级 Python Web 框架(从 Google 搜索中获取)

你也可以在这里 *(要学习的 10 大 Python Web 框架)*阅读更多关于这些框架的内容。

请记住,这个列表中有两种类型的 web 框架:全栈和非全栈。如果你决定用微服务架构来构建你的应用,那么我会推荐你使用非全栈框架,比如 Flask,因为它灵活、轻量、容器友好。

前端框架

有了后端之后,你的模型现在变成了一个活的服务。但是,您不希望用户输入一个很长的请求 URL 来获得预测结果。

# A long request URL
http://mymodel.com/api/predict?sepal-length=2.3&sepal-width=1.1&petal-length=3.4&petal-width=2.5

你需要一个用户界面。

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

照片由哈尔·盖特伍德Unsplash 上拍摄

您应该知道一个前端框架来帮助您构建与后端通信的 UI。例如,如果您正在构建一个 web 应用程序来预测鸢尾花的种类,那么 UI 可能有四个输入框来获取萼片长度、萼片宽度、花瓣长度、花瓣宽度的用户输入,并有一个提交按钮来获取预测结果。在用户点击提交按钮后,前端将使用给定的参数构造请求 URL,并将其发送到模型服务的后端。之后,后端将回应预测的花卉品种,然后可以在前端显示。

React、Vue.js 和 Angular 是我写这篇文章时最流行的三个框架,你应该选择其中一个来学习。

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

React,Vue.js 和 Angular(图片来源: Hackernoon )

集装箱化和流程编排

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

Docker-Kubernetes 在一起(由来自 Docker 博客大卫·弗里德兰德插图)

在其他机器或云平台上运行您的代码时,环境依赖性是一个常见的问题,在软件工程中,容器被广泛用于解决这个问题。具体来说,代码和运行代码所需的必要组件都装在一个叫做容器的封闭盒子里。然后,可以将该容器部署到任何地方运行,而不用担心依赖性问题。

每个容器都可以被看作是一个微服务,执行一个更大架构的简单功能,如果一个服务被关闭,它不应该在系统中产生大的中断,恢复时间应该是最小的。考虑到这一点,熟悉 Docker 容器是你应该放在简历上的一项基本技能。

容器编排管理容器的生命周期,并确保平台上运行的每个服务的可用性。例如,您可能希望三个模型同时在线(副本),这样,如果一个模型出现故障,另外两个模型仍然可以为用户服务。它还可以执行其他任务,如负载平衡,以帮助利用所有可用的副本并提高平台性能。对于容器编排,您应该将 Kubernetes 添加到您希望学习的技能列表中。

CI/CD 管道

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

图片来源: Katalon 博客

如果一个模型被重新训练或更新以包含一个新的特性,它应该在后端被更新,这个任务应该被自动完成以避免人为错误并缩短更新周期以获得一个真正的敏捷体验。为了使其无缝,并在为容器推出较新的机器学习模型时减少人力,建议使用 CI/CD(持续集成和持续部署)管道。

可以建立 CI/CD 管道来执行以下任务:重新训练模型,将较新的模型提交到 Git repo 中,自动测试和部署 ML 模型,等等。一些流行的 CI/CD 解决方案有 Travis CI、Jenkins 和 Gitlab CI,我个人更喜欢最后一种,因为它在一个平台中包括 Git repo 和 CI/CD 管道。

统计思维

最后,作为一名数据科学家,你应该始终保持开放的心态,不要陷入偏见的陷阱,不让自己探索更有价值的见解。换句话说,不要轻易接受结果,轻易下结论。

让我们以著名的亚伯拉罕·瓦尔德和《琼斯母亲》中缺失的弹孔来结束这个故事。

回到第二次世界大战期间,英国皇家空军在德国防空炮火下损失了很多飞机。所以他们决定给他们穿上盔甲。但是盔甲放在哪里呢?显而易见的答案是观察执行完任务返回的飞机,统计各个地方的所有弹孔,然后在吸引最多火力的地方增加装甲。

显而易见却是错误的。正如匈牙利出生的数学家亚伯拉罕·瓦尔德当时解释的那样,如果一架飞机安全返回,即使它的机翼上有很多弹孔,这意味着机翼上的弹孔不是很危险。你真正想做的是武装那些平均来说没有任何弹孔的区域。

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

照片来自琼斯妈妈——违反直觉的世界

为什么?因为那些地方有弹孔的飞机再也回不来了。这就是为什么你在返回的子弹上看不到任何弹孔。聪明!

(来自琼斯妈妈)

特色图像中使用的图标的属性

t-SNE:数学背后

原文:https://towardsdatascience.com/t-sne-behind-the-math-4d213b9ebab8?source=collection_archive---------27-----------------------

作为近年来谈论最多的降维算法之一,特别是对于可视化来说,我想我应该花一些时间来帮助其他人发展对 t-SNE 实际上在做什么的直觉。

由 Laurens van der Maatens 和 Geoffrey Hinton 于 2008 年开发的t-Distributed random Neighbor Embedding与主成分分析(PCA)不同,它是一种非线性方法,用于在人类可解释的维度(如 2D 或 3D)中可视化高维数据。

虽然主成分分析试图通过点的线性投影找到具有最大变化量的维度,但 PCA 有时无法在非线性情况下保持数据的内部结构,如正弦和圆柱关系。t-SNE 通过保存数据的内部结构克服了这一点。

t-SNE 试图保持点的邻域,即使它们是从高维转换到低维。该算法计算出彼此靠近的点和较远的点。邻域,即具有彼此接近的点的聚类被保留,并且即使存在多个聚类,这也保持良好。但是,变换后不会保留簇之间的距离。

SNE 霸王龙在做什么?

SNE 霸王龙试图找出这些点的相似程度,并根据相似程度对它们进行分组,因此能够保留数据的内部结构。

请看下图,t-SNE 计算出了点与点之间的距离,并将较近的点组合成较低维度的簇。

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

图一。使用 t-SNE l 从 2D 到 1D 的降维

SNE 霸王龙是怎么做到的?

对于一个查询点,假设是红色聚类中的一个点(图 1),测量所有点之间的距离,并沿着学生的 T 分布绘制,该分布类似于高斯曲线,但具有更高的尾部。t 分布能够更好地区分相对于查询点更远的点,因为它们的尾部更高。

以查询点为中心,测量每个点相对于其他点的距离。一个点离查询点越远,它的距离就会远离曲线的峰值。位于峰值附近的点将被认为是查询点的邻居。

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

图 2: t-SNE 嵌入查询点的邻居

图 2 显示了 t-SNE 是如何计算出红色星团邻域的。对所有点重复这一过程,以找出多个聚类。

使用 Python 的 PCA vs t-SNE

我使用了 MNIST 的数据进行比较。MNIST 数据包括各种手写数字图像,有利于光学字符识别。

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

图 3:执行 PCA 的代码

PCA 能够将 784 维数据转换成 2 维数据,但是可视化这是相当困难的。这些数字无法清楚地区分。

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

图 MNSIT 数据上的 PCA |[图片由作者提供]

现在让我们试着用 SNE 霸王龙来想象。它应该能够比 PCA 更好地将相似的数字组合在一起。

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

图 5:执行 t-SNE 的代码

下面(图 6)是 t-SNE 的图,它比主成分分析更好地聚类了各种数字,我们可以清楚地看到哪个聚类属于哪个数字。

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

图 6: t-SNE 在 MNSIT 数据上|[图片由作者提供]

SNE 霸王龙在哪里使用?

t-SNE 广泛用于高维数据的可视化,t-SNE 的一些应用领域如下:

1.癌症研究、生物信息学和音乐分析是 t-SNE 广泛用于可视化相似性和不可区分性的领域。

2.它广泛应用于图像处理、自然语言处理、基因组数据和语音处理中,用于从高维数据中获取相似性。

t-SNE 的谬论

1.作为一种随机算法,t-SNE 算法的结果在每次运行时都是不同的。

2.尽管 SNE 霸王龙能够保留数据的本地结构,但它可能无法保留数据的全局结构。

3.困惑度是邻域中要考虑的邻居数量,应该小于点数。理想情况下,范围从 5 到 50。

4.t-SNE 发现随机噪音的邻居,以及在低困惑,可以被误解。

参考文献

  1. YouTube。(2017 年 9 月 18 日)。StatQuest: t-SNE,解释清楚[视频文件]。从 https://www.youtube.com/watch?v=RJVL80Gg3lA取回
  2. 如何有效使用 t 型 SNE:https://distill.pub/2016/misread-tsne/
  3. t-SNE 算法综合指南及 R & Python 实现:https://www . analyticsvidhya . com/blog/2017/01/t-SNE-implementation-R-Python/

t-SNE 清楚地解释道

原文:https://towardsdatascience.com/t-sne-clearly-explained-d84c537f53a?source=collection_archive---------1-----------------------

理解 ML

t-SNE 算法的直观解释以及它在实践中如此有用的原因。

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

资料来源:K. Movahedi,Y. Saeys,http://www.brainimmuneatlas.org/tsne-cp-irf8.php

什么是 SNE 霸王龙?

你们很多人已经听说过像 PCA 这样的降维算法。其中一种算法叫做t-SNE(t-分布式随机邻居嵌入)。它是由劳伦斯·范德·马滕和杰弗里·辛顿在 2008 年开发的。你可能会问“我为什么要在乎?我已经知道 PCA 了!”这将是一个很好的问题。t-SNE 是一种叫做非线性降维的东西。这意味着这个算法允许我们分离不能被任何直线分离的数据,让我给你看一个例子:

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

线性不可分数据,来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0

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

线性不可分数据,来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0

如果你想玩这些例子,去访问蒸馏

可以想象,当通过 PCA 解析时,这些例子不会返回任何合理的结果(忽略将 2D 解析为 2D 的事实)。这就是为什么至少知道一种处理线性不可分数据的算法是很重要的。

你需要记住,t-SNE 是迭代的,所以与主成分分析不同,你不能将它应用于另一个数据集。PCA 使用全局协方差矩阵来减少数据。您可以获得该矩阵,并将其应用于一组新数据,得到相同的结果。当您需要尝试减少您的特征列表并重用从训练数据创建的矩阵时,这很有帮助。t-SNE 主要用于理解高维数据,并将其投影到低维空间(如 2D 或 3D)。这使得它在处理 CNN 网络时非常有用。

SNE 霸王龙是如何工作的?

概率分布

让我们从 t-SNE 的 SNE 部分开始。我更擅长直观地解释事物,所以这将是我们的数据集:

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

它有 3 个不同的类别,你可以很容易地将它们区分开来。该算法的第一部分是创建一个表示邻居之间相似性的概率分布。什么是“相似”?原文陈述“数据点 xⱼ 到数据点 xᵢ 的相似度是条件概率 p_{j|i} ,即 xᵢ 会选择 xⱼ 作为其邻居”。

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

我们从数据集中挑选了一个点。现在,我们必须选择另一个点,并计算它们之间的欧几里得距离|xᵢ-xⱼ|

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

原始论文的下一部分指出,在以 xᵢ.为中心的高斯分布下,它必须**与概率密度成比例因此,我们必须生成在 xᵢ 处具有平均值的高斯分布,并将我们的距离放在 x 轴上。

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

现在你可能想知道 σ (方差),这是一件好事。但是让我们暂时忽略它,假设我已经决定了它应该是什么。计算完第一个点后,我们必须对每一个点做同样的事情。

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

你可能会想,我们已经完成了这一部分。但这只是开始。

分散聚类和方差

在这一点上,我们的集群被紧紧地束缚在它的组内。如果我们有一个这样的新集群会怎么样:

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

我们应该能够应用与以前相同的过程,不是吗?

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

我们还没完。您可以区分相似点和非相似点,但是概率的绝对值比第一个示例中的要小得多(比较 Y 轴值)。

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

我们可以通过将当前投影值除以投影总和来解决这个问题。

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

如果你应用于第一个例子,看起来会像这样:

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

对于第二个例子:

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

这会缩放所有值,使其总和等于 1。这里很好的提一下,p_{i|i}设置为等于 0,而不是 1。

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

处理不同的距离

如果我们取两个点并试图计算它们之间的条件概率,那么 p_{i|j}和 p_{j|i}的值将是不同的:

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

这是因为它们来自两个不同的发行版。那么我们应该选择哪一个来计算呢?

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

其中 N 是维数。

谎言:)

现在,当我们将所有东西都缩放到 1(是的,所有的总和等于 1)时,我可以告诉你,我对你的过程并不完全诚实:)计算所有这些对算法来说将是非常痛苦的,这并不是 t-SNE 论文中的确切内容。

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

这是一个计算 p_{j|i}的原始公式。我为什么要骗你?首先,因为更容易对它的工作原理有一个直觉。第二,因为无论如何我都要向你展示低谷。

困惑

如果你看看这个公式。你可以发现我们的

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

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

如果我直接向您展示这一点,将很难解释 σ 的来源以及它与我们的集群之间的依赖关系。现在你知道方差取决于高斯和围绕它中心的点数。这就是困惑值来的地方。困惑或多或少是我们中心点的目标邻居数。基本上,困惑度越高,方差的值就越高。我们的“红色”组彼此靠近,如果我们将困惑度设置为 4,它会搜索合适的值来“适应”我们的 4 个邻居。如果你想更具体一些,你可以引用原文:

SNE 对西格玛的值进行二分搜索法,产生具有用户指定的固定困惑度的概率分布

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

在哪里

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

就是香农熵。但是,除非您想自己实现 t-SNE,否则您唯一需要知道的是,您选择的困惑与\mu_i μi 的值正相关,并且对于相同的困惑,您将有多个不同的\mu_i μi ,基于距离。典型的困惑值范围在 5 到 50 之间。

原始公式解释

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

当你看这个公式的时候,你可能会注意到我们的高斯转换成

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

让我给你看看这是什么样子:

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

如果你玩一会儿 σ ,你会注意到蓝色曲线保持固定在点 x =0。只有当 σ 增加时,它才会拉伸。

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

这有助于区分邻居的概率,因为你已经理解了整个过程,你应该能够调整它到新的值。

创造低维空间

t-SNE 的下一步是用与原始空间相同数量的点创建低维空间。点应该随机分布在一个新的空间。该算法的目标是在低维空间中寻找相似的概率分布。对于新分布,最明显的选择是再次使用高斯分布。不幸的是,这不是最好的主意。高斯的特性之一是它有一个“短尾巴”,正因为如此,它产生了一个拥挤问题。为了解决这个问题,我们将使用单自由度的学生 t 分布。关于如何选择这种分布以及为什么高斯分布不是最佳方案的更多信息,你可以在的论文中找到。我决定不在这上面花太多时间,让你在合理的时间内阅读这篇文章。所以现在我们的新公式看起来像:

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

而不是:

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

如果你是更“视觉化”的人,这可能会有帮助(X 轴上的值是随机分布的):

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

使用学生分布正是我们所需要的。它“下落”很快,而且有一条“长尾”,所以各个点不会被挤成一个点。这次我们不用为 σ 费心了,因为 q_{ij}公式里没有。我不会生成计算 q_{ij}的整个过程,因为它的工作原理和 p_{ij}完全一样。相反,只留下这两个公式,直接跳到更重要的事情上:

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

梯度下降

为了优化这种分布,t-SNE 使用条件概率 p_{j|i}和 q_{j|i}之间的 Kullback-Leibler 散度

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

我在这里不讨论数学,因为它不重要。我们需要的是的导数(它在原文内的附录 A 中推导)。

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

你可以把这个梯度看作点与点之间的排斥和吸引。为每个点计算一个梯度,并描述它应该被拉动的“力度”以及它应该选择的方向。如果我们从随机 1D 平面开始,对之前的分布进行梯度计算,结果应该是这样的。

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

Ofc。这是一种夸张。SNE 霸王龙跑得没那么快。我跳过了很多步骤来加快速度。除此之外,这里的值并不完全正确,但足以向您展示这个过程。

t-SNE 为提高性能所做的技巧(优化)

t-SNE 表现不错,但也有一些改进,让它做得更好。

早期压缩

为了防止早期聚类,t-SNE 在早期阶段将 L2 惩罚添加到成本函数中。你可以把它当作标准的正则化,因为它允许算法不关注局部组。

早期夸张

这个技巧允许移动更多的(q_{ij})簇。这次我们在早期乘以 p_{ij}。因为集群不会妨碍彼此。

例子

如果你还记得文章顶部的例子,现在是时候向你展示 SNE 霸王龙是如何解决这些问题的了。

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

来源:CC-BY 2.0

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

*困惑 5、来源:*https://distill.pub/2016/misread-tsne/CC-BY 2.0

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

**来源:https://distill.pub/2016/misread-tsne/CC-BY 2.0

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

*困惑 5、来源:*https://distill.pub/2016/misread-tsne/CC-BY 2.0

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

*困惑 5、来源:*https://distill.pub/2016/misread-tsne/CC-BY 2.0

所有运行执行 5000 次迭代。

CNN 应用

t-SNE 在处理 CNN 特色地图时也很有用。你可能知道,深度 CNN 网络基本上是黑匣子。没有办法真正解释网络中更深层次的内容。一个常见的解释是,更深层次包含关于更复杂对象的信息。但这并不完全正确,你可以这样解释,但数据本身对人类来说只是高维噪音。但是,在 t-SNE 的帮助下,您可以创建地图来显示网络中哪些输入数据看起来“相似”。

其中一个翻译是由安德烈·卡帕西和 https://cs.stanford.edu/people/karpathy/cnnembed/cnn6k.jpg共同完成的。

卡帕西做了什么?他从 LSVRC 2014 中取了 50k 张图片,提取了一张 4096 维的 CNN 特征图(更准确的说是 4096 图来自 fc7 层)。

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

CNN 网络,来源: 使用整体视觉描述符在不同光照下拓扑模型中的分层定位

在得到每一张图像的矩阵后,他用 t-SNE 计算了 2D 嵌入。最后,他只是用 2D 海图上的原始图像生成了那张地图。对于特定的 CNN 网络,您可以很容易地找出哪些图像彼此“相似”。

结论

t-SNE 是理解高维数据集的一个很好的工具。当您想要为 ML 训练执行维度缩减时,它可能不太有用(不能以相同的方式重新应用)。它不是确定性的和迭代的,所以每次运行时,它都可能产生不同的结果。但是即使有这些缺点,它仍然是该领域中最流行方法之一。

参考资料:

  • 长度辛顿·马滕。使用 t-SNE 可视化数据,2008 年
  • Cristobal Parra,Sergio Cebollada,Luis Payá,Mathew Holloway,Oscar Reinoso,“使用 RGB-D 点云估计地下环境中移动机器人位置的新方法”, Access IEEE ,第 8 卷,第 9084–9101 页,2020 年。

最初发布于https://erdem . pl*。*

T5:文本到文本转换转换器

原文:https://towardsdatascience.com/t5-text-to-text-transfer-transformer-643f89e8905e?source=collection_archive---------4-----------------------

了解基于变压器的自监督架构

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

通过谷歌人工智能博客为 QnA 提供 T5

随着迁移学习的蓬勃发展,深度学习已经取得了许多奇迹。更确切地说,在 NLP 中,随着 Transformer 的兴起( Vaswani 等人。艾尔。),出现了各种“语言建模”的方法,其中我们通过为一个非常通用的任务预先训练模型,然后针对特定的下游问题对其进行微调,来利用迁移学习。

在这篇文章中,我们将讨论 Google 的最新技术,T5Text-To-TextTTransferTTransformer 模型,该模型是今年早些时候在论文中提出的,“用统一的文本到文本转换器探索迁移学习的极限”。本文本质上是对语言理解中使用的现代迁移学习技术的综述,因此提出了一个统一的框架,试图将所有的语言问题结合到一个文本到文本的格式中。我们将在接下来的章节中更详细地讨论这种方法。此外,作者还开源了一个新的数据集(为了方便他们的工作),名为C4ColossalCleanCrawledCor pus。

T5—文本到文本转换转换器

如前所述,T5 试图将所有下游任务组合成文本到文本的格式。

文本到文本的框架

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

通过谷歌人工智能博客为所有下游任务提供统一框架

考虑 BERT 风格架构的示例,该架构针对屏蔽 LM 和下一句预测目标进行预训练,然后针对下游任务进行微调(例如预测分类中的类别标签或 QnA 中的输入跨度)。这里,我们在不同的下游任务上分别微调预训练模型的不同实例。

相反,文本到文本框架建议在所有 NLP 任务上使用相同的模型、相同的损失函数和相同的超参数。在这种方法中,输入以这样一种方式建模,即模型应该识别任务,而输出只是预期结果的“文本”版本。参考上面的动画可以更清楚地看到这一点。

有趣的事实:我们甚至可以通过训练 T5 来输出预期输出的字符串表示,从而将 T5 应用于回归任务。

C4——庞大干净的爬行语料库

在巨大的未标记数据集上预先训练语言模型是一种刻板印象。通用爬虫就是这样的数据集之一。它是通过抓取网页并忽略 HTML 中的标记而获得的。它每月产生大约 20TB 的废弃数据。然而,普通爬行包含大量的像菜单或错误信息,或重复文本的乱码文本。此外,对于我们的任务来说,还有相当数量的无用文本,比如攻击性的词语、占位符文本或源代码。

对于 C4,作者从 2019 年 4 月开始使用普通抓取,并对其应用了一些清理过滤器:

  1. 保留仅以有效的结尾标点符号(句号、感叹号、问号或结束引号)结尾的句子。
  2. 移除任何包含出现在“肮脏、淘气、淫秽或其他不良词语列表中的攻击性词语的页面。
  3. “必须启用 JavaScript”类型警告通过过滤掉任何包含单词 JavaScript 的行来移除。
  4. 带有占位符文本(如“lorem ipsum ”)的页面将被移除。
  5. 通过移除任何包含花括号“{”的页面来移除源代码(因为花括号出现在许多众所周知的编程语言中)。
  6. 为了消除重复,考虑三句话的跨度。相同的 3 个句子的任何重复出现被过滤掉。
  7. 最后,由于下游任务多为英语语言, langdetect 用于过滤掉任何概率至少为 0.99 的未归类为英语的页面。

这产生了 750GB 的数据集,不仅比大多数预训练数据集合理地大,而且包含相对非常干净的文本。

输入和输出表示

这是 T5 的主要关注点之一,因为这使得统一的文本到文本的方法成为可能。为了使所有下游任务使用相同的模型,将特定于任务的文本前缀添加到提供给模型的原始输入中。这个文本前缀也被认为是超参数。

例如,要求模型翻译句子“那很好”从英语到德语,模型将被输入序列“将英语翻译成德语:很好。“并将被训练输出” Das ist gut。

T5 纸

类似地,对于分类任务,模型预测对应于目标标签的单个单词。

例如,在 MNLI 基准上,目标是预测一个前提是否暗示(“蕴涵”)、矛盾(“矛盾”),或者都不是(“中性”)一个假设。经过我们的预处理,输入序列变成了" mnli 前提:我讨厌鸽子。假设:我对鸽子充满了敌意。"与对应的目标词**"蕴涵。**

T5 纸

这里有一个问题。如果预测的单词是其他的东西,即不是“蕴涵”、“矛盾”或“中性”的,该怎么办?嗯,在这种情况下,模型被训练成认为所有其他单词都是错误的。

模型

所提出的模型本质上是一个编码器-解码器变换器。艾尔。)进行了一些架构上的改变(如在子块之前应用层归一化,然后将初始输入添加到子块输出;也称为预规范)。而且,模型配置类似于 BERT base ( Devlin et。艾尔。)。

我们将跳过这些架构,因为它们超出了本文的范围。如果您特别想了解这些型号的规格,我已经在下面的文章中介绍了它们:

  1. 变形金刚:https://towards data science . com/transformers-explained-65454 c0 F3 fa 7
  2. 变形金刚实现:https://medium . com/swlh/abstract ive-text-summary-using-transformers-3e 774 cc 42453
  3. BERT:https://medium . com/swlh/BERT-pre-training-of-transformers-for-language-understanding-5214 FBA 4a 9 af

培训方法

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

模型结构来自论文

在架构层面上,选择训练方法有几种选择:本文是对许多现代语言理解方法的详尽调查。因此,已经研究和比较了许多架构规范。

  1. ****编码器-解码器(左):这是标准的编码器-解码器,seq2seq 架构,其中编码器以伯特风格、完全可见的方式训练(即,每个标记都有助于序列中每个其他标记的注意力计算),解码器以 GPT 风格因果的方式训练(即,序列中出现在它之前的所有标记都参与每个标记)。
  2. ****语言模型(中):这本质上就是前面讨论过的因果注意机制。这是一种自回归建模方法。
  3. ****前缀 LM(右):这是 BERT 风格和语言模型方法的组合。例如,将英语翻译成德语的任务可以具有伯特式的注意力:“将英语翻译成德语:很好。目标:“。然后翻译成“这是直觉”将自回归出席。

通过实验,编码器-解码器方法获得了最佳结果。

无监督目标

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

纸张的损坏跨度

关于培训前的目标,作者也在实践中探索了一些方法:

  1. ****语言建模:这种方法主要包括因果预测任务,即考虑该单词之前的所有单词来预测句子中的下一个单词。
  2. ****去混洗:将一个句子中的所有单词进行混洗,并训练模型来预测原文。
  3. Corrupting Spans: 屏蔽句子中的单词序列,并训练模型预测这些屏蔽的单词,如上图所示。它也被称为去噪目标。

经过探索,去噪目标具有最有希望的结果。

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

论文中探索无监督目标

结果

首先,T5 已经在许多粘合、强力胶任务以及翻译和摘要基准测试中达到了最先进的水平。

T5 惊人地擅长这项任务。完整的 110 亿参数模型在 TriviaQA网络提问自然问题上分别有 50.1%、37.4%和 34.5%的时间产生答案的精确文本。

谷歌人工智能博客

为了生成真实的文本,T5 依赖于填空类型的任务,由于预先训练,T5 对填空类型的任务很熟悉。因此,作者创建了一个新的下游任务,称为大小的填空**。例如,给定句子“我喜欢吃花生酱和 4 三明治,【T11”),模型将被训练来预测空白的大约 4 个单词。**

有趣的事实:该模型还根据所需的缺失文本大小来调整其预测。

以上的演示,参考官博

把所有的放在一起

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

通过谷歌人工智能博客对 T5 进行预训练和微调

  • T5 首先在 C4 数据集上被预训练,用于利用编码器-解码器架构的去噪、破坏跨度目标。
  • 然后在下游任务上使用监督目标进行微调,并为文本到文本设置建立适当的输入模型。

结论

在这篇文章中,我们深入研究了 Google 的 T5 模型,它是语言理解领域最先进的模型之一。我们看到了新的数据集:C4。这篇文章的主要收获是 T5 作者获得的关于训练方法、模型架构和数据集的实证结果。此外,还可以观察到,DL 越来越接近实现人类质量理解——在这种情况下,概括为许多 NLP 任务的一个模型。

github repo:https://github . com/Google-research/text-to-text-transfer-transformer

huggingface 用于模型架构和预训练权重的 API:https://huggingface.co/transformers/model_doc/t5.html

https://www.tensorflow.org/datasets/catalog/c4 C4 张量流数据集:

参考

**T5 论文:【https://arxiv.org/abs/1910.10683 **

** [## 用 T5 探索迁移学习:文本到文本的迁移转换器

在过去的几年里,迁移学习在自然语言领域引发了一波新的前沿成果…

ai.googleblog.com](https://ai.googleblog.com/2020/02/exploring-transfer-learning-with-t5.html) [## 变形金刚解释

对谷歌 Transformer 模型的详尽解释;从理论到实施

towardsdatascience.com](/transformers-explained-65454c0f3fa7) [## 伯特:语言理解变形金刚的前期训练

了解基于变压器的自监督架构

medium.com](https://medium.com/swlh/bert-pre-training-of-transformers-for-language-understanding-5214fba4a9af)**

表 ETL 的设计最佳实践

原文:https://towardsdatascience.com/table-design-best-practices-for-etl-200accee9cc9?source=collection_archive---------33-----------------------

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

田宽Unsplash 上拍照

如何为 ETL 管道设计源系统表

不久以前,在源系统(应用程序数据库)中设计表的方法曾经是——我们不关心 ETL。弄清楚后,我们将专注于构建应用程序。过去几年是 ETL 方法发展的大好时光,许多开源工具来自一些大型科技公司,如 Airbnb、LinkedIn、Google、脸书等等。随着云成为主流,Azure、谷歌和微软等提供商已经确保他们构建并支持数据工程领域的所有开源技术。

我参与过许多 ETL 项目,其中一些失败得很惨,其余的都成功了。ETL 项目出错的方式有很多。我们今天将讨论最重要的一个方面——源系统中的表设计。

ETL 管道和构建它们的源系统一样好。

不管在 ETL 管道的 T 层做了多少努力,这个说法都是完全正确的。转换层通常被误解为修复应用程序和应用程序生成的数据的所有错误的层。这绝对不是真的。不多说了,让我们看看在设计将要被 ETL 到目标系统的表时,您应该考虑的最低要求——

强制唯一性

这一点应该不说,但我看到系统也没有强制执行(作为设计的一部分)。唯一键本质上是单列还是组合并不重要。但是,可能会要求用户在没有惟一键的情况下对表进行满负荷,并在每次满负荷后推断出变化。这个解决方案实际上比听起来更糟糕。

启用增量 ETL

使数据工程师能够通过访问created_timestampupdated_timestamp等简单字段来识别新的和更新的记录。确保这两个字段都是由数据库而不是应用程序填充的。如果要从应用程序中填充日期时间或时间戳字段,应该有一个单独的日期时间或时间戳字段。这些应该被定义为—

1\. created_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
2\. updated_timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

只追加主键总是递增的表可以正常工作。您不需要为这些设置审计时间戳列。

定义&记录关系

在大多数情况下,我们将关系数据库作为源系统来处理。因此,理解源系统中的数据流和沿袭是非常重要的。在大多数情况下,负载的目标系统中的数据流和沿袭保持不变,尽管这不是强制性的。这里有两件事会有帮助——来自产生数据的应用程序的服务架构图和源数据库的 ER 图。

那又怎样?

所有这些问题都可以被完全或部分解决,即使这些点在源系统中没有被注意到,但是没有一个解决方案是可持续的。是的,这就是开始构建一个整洁的 ETL 管道所需要的一切。

作为一个规则,ETL 系统的任务应该仅仅是通过一个通用的转换层将数据从一个地方移动到另一个地方(这个层不处理 bug,特殊的一次性情况)。记住垃圾进垃圾出的普遍原则——如果源系统中有错误的数据,那么目标系统也会有错误的数据。

我在很多地方看到的一个实践是,数据团队试图修补有问题的数据,并暂时处理它。它通常会一直工作到冲刺阶段结束,而同样的问题总是会回来困扰你。抵制诱惑,不要养成像这样解决问题的习惯。正确的做法是报告问题,修复源系统中的数据,并在有问题的时间段内进行干净的重新加载。与显示在应用程序 UI 和 data BI 仪表板上的不同数据相比,重新加载更容易证明。

参考文献

[## 数据工程初学者指南—第二部分

数据建模、数据分区、流程和 ETL 最佳实践

medium.com](https://medium.com/@rchang/a-beginners-guide-to-data-engineering-part-ii-47c4e7cbda71) [## 设计数据密集型应用程序

数据是当今系统设计中许多挑战的核心。困难的问题需要解决,例如…

www.oreilly.com](https://www.oreilly.com/library/view/designing-data-intensive-applications/9781491903063/) [## 为什么数据仓库项目会失败

数据仓库项目是组织可以采取的最明显和最昂贵的计划之一。可悲的是,他们…

www.timmitchell.net](https://www.timmitchell.net/post/2017/01/10/why-data-warehouse-projects-fail/)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值