数据目录到底是怎么回事?
意见
数据目录正面临一场身份危机。原因如下。
图片由 Erica Zhou 在 Unsplash 上提供。
似乎每次我刷新我的 Twitter feed,一个新的创业公司就会推出“有史以来世界上最伟大的数据目录”这太令人兴奋了!
如果一家公司能够建立自切片面包以来的下一个最佳目录,数据世界肯定会集体松一口气。不要误解我的意思:这里正在发生许多创新,并且正在取得明显的进步。支持数据工程师和软件开发人员直接在数据治理报告和仪表板中工作的集成—检查。促进更大协作的数据科学工作手册—检查。ML 支持自动数据分析—选中。
但是数据目录现在如此受关注的原因并不是因为我们对它们满意。因为他们有身份危机。
一名数据工程师或分析师走进一家酒吧…
想象你走进你最喜欢的酒吧。让我们称之为数据潜水。有当地运动队的海报,tiki 火炬(当然是用电点燃的),还有一个巨大的舞池。
你走向酒保。
“它会是什么?”她问道。
“请给我一杯开胃酒,”你说。你已经有一段时间没喝过了(可能是在疫情之前吧?),但你记得它味道很好,尤其是像今天这样的大热天。
酒保抓起一个杯子放在你面前。
“配料在吧台后面。开始吧。”
听起来熟悉吗?可能不会,但是在数据的背景下,这种“自助服务”的方法可能会有所启发。
Mode 的联合创始人兼首席分析官本·斯坦西尔(Benn Stancil)最近写了一篇文章,对自助式数据工具面临的挑战充满了诗意。
Stancil 说,“理论上人们可以自助的问题越多,实际上他们可以自助的问题就越少。随着您添加更多选项,自助工具不再看起来像疯狂的图书馆,而开始看起来像一个空白文档,需要人们完整地编写自己的故事。虽然这是分析师想要的,但不是所有人都想要的。”
虽然 Stancil 谈到了指标提取的“自以为是的简单性”与衡量数据的一刀切方法,但我们可以将这一视角应用于数据目录。太多的选择,太少的意见,实际上需要什么,使他们成功。
他举了一个例子,ELT 提供商为他们能(和不能)向数据工程师提供什么提供了一个有限的、清晰的定义:简单、快速的数据摄取。
现在,在 2021 年,数据目录正处于一个类似的十字路口:努力成为每个人的一切,或者做好一两件事。
选择你自己的冒险:数据目录版
套用简·奥斯汀的话,“一个普遍公认的真理是,运气好的数据工程师一定需要数据目录。”
过去,我曾经写过关于 数据目录如何达不到 的三个主要原因:
- **自动化需求的增加:**传统的数据目录和治理方法通常依赖数据团队来完成繁重的手动数据输入,让他们负责随着数据资产的发展更新目录。这种方法不仅耗时,而且需要大量原本可以自动化的人工劳动,从而为数据工程师和分析师腾出时间来专注于真正有意义的项目。
- **随着数据变化而扩展的能力:**当数据结构化时,数据目录工作良好,但在 2021 年,情况并非总是如此。随着机器生成数据的增加和公司对 ML 计划的投资,非结构化数据变得越来越普遍,占所有新产生数据的 90%以上。
- **缺乏分布式体系结构:**尽管现代数据体系结构的分布(参见: 【数据网格 )以及将半结构化和非结构化数据作为规范的趋势,大多数数据目录仍然将数据视为一维实体。随着数据的聚合和转换,它会流经数据堆栈的不同元素,从而几乎不可能进行记录。
我分享了为什么团队需要通过应用数据发现的原则来更有创造性地思考数据目录。简而言之,数据发现是指根据一组特定消费者如何接收、存储、聚合和使用数据,对特定领域的数据进行动态了解。作为数据从业者,数据发现是我们理解我们正在处理的事情并向利益相关者传达这种“理解”的能力的核心。
那么,好的数据发现的结果是什么?这取决于你问谁。
我鼓励您选择所有适用的选项:
- 数据质量
- 数据治理和合规性
- 合作
- 谅解
- 讨论
- 形象化
- 安全性
- 可靠性
- 新闻报道
- 可用性
- 世界和平
这份清单令人应接不暇,令人困惑。这并不是说一个好的数据目录不能勾选多个框。他们可以——也确实可以。但是,如果我们对自己的目标没有一个清晰的定义,我们怎么可能追踪我们是如何达到目标的呢?
以下是我们见过的用于跟踪数据目录性能的一些测量方法。再次检查所有适用的选项:
- 数据准确性
- 数据新鲜度
- 使用指标
- 访问数据的速度
- 编目的数据量
但是这里缺少了一些东西:这些度量跟踪“基于解决方案”的结果,但是这些真的能告诉你数据是否有用吗?可靠呢?还是值得信赖?这是数据目录经常丢失的地方。
现代数据目录经常没有一个明确的身份:换句话说,就是一个用户故事。
数据目录能找到方向吗?
在过去的生活中,我们的一个前同事花了两年时间建立了一个没有人使用的数据字典。为什么?当他的团队完成时,需求是陈旧的,解决方案不再相关。
不幸的是,他的经历往往是常态,而不是例外。虽然产品愿景为任何好的解决方案铺平了道路,但当我们为解决实际客户问题而构建时,会开发出更强大的技术并取得更好的成果。现在,无论从哪个角度看,数据都需要以光速移动,这种客户至上的方法比以往任何时候都更加重要。
数据目录非常重要,因为它们是我们衡量世界的文字索引。但是我们不认为它们真的有用,除非它们在设计时有明确的目的。
但也许这只是我们…无论如何,我们都渴望看到大数据目录身份危机如何解决。
是吗?
你知道数据星表到底是怎么回事吗?我们洗耳恭听。伸出手去 巴尔摩西 或者 黄应祥 。
本文由蒙特卡洛首席执行官兼联合创始人 Barr Moses 和 HubSpot 首席解决方案架构师兼前商业智能副总裁 Gordon Wong 共同撰写。
什么是累积分布函数?
CDF 及其在数据科学中的应用综述
(来源=https://pixabay.com/images/id-2548105/)
介绍
B ack 五月份,我看了一个属于大多数统计分布的分布函数,叫做概率密度函数,或 PDF。PDF 是统计推断的一个非常重要的部分,同样,它的兄弟函数累积分布函数也是如此。如果你想先了解 pdf 再了解 CDF,你可以在这里阅读我写的关于 pdf 的文章:
[## 什么是概率密度函数?
towardsdatascience.com](/what-is-a-probability-density-function-d9b4b8bea121)
我强烈建议在尝试使用 PDF 之前,对 PDF 及其用途有一个适当的了解。这是因为 CDF 通常比典型的 PDF 复杂得多。它们通常也用于 PDF 分发的数据。记住这一点,让我们从这一点开始。PDF 分布式数据到底是什么?这意味着数据已经使用函数进行了分发。在统计学中,这些函数通常利用数据中的某些指标。然后将公式应用于整个特征。这将数据分布到一个分布中。例如,正态分布的 PDF 只是从 xbar(当前样本)中减去 mu(平均值)除以 sigma(标准偏差)。)
更多细节
一个变量 X 的 CDF,或者只是 X 的分布函数,本质上只是 X 取一个小于等于 X 的值的概率的表示,当然这是一个连续统计特征的函数。CDF 的独特之处在于它是单调的。更具体地说,单调递增。这意味着加班,概率会一直增加。
这意味着 CDF 通常用作连续分布的标量。连续概率分布,或 CPD,是其元素是不可数集合的概率分布。这意味着它们都是唯一的,并以累积分布函数为特征。然后,这可以用于计算每个支持子集的概率。你可能熟悉的这种分布的一个很好的例子是正态分布。此外,均匀分布也是一种连续的概率分布。这在数学上等同于
Fx(x) = P(X <= x)
其中,等式的右侧代表 X 取值小于或等于 X 的概率。X 位于区间(a,b)中的概率,其中 a < b。更简单地说,我们正在检查 X 小于或等于 X 的概率。如果是这种情况,那么我们的线将继续直线前进。否则,我们就上去。这正是赋予 CDF 山形的原因。这也正是它单调不减的原因。关于 CDF 需要注意的另一点是,它们总是右连续的。这意味着值从左到右是连续的。所以如果我们画出它们,它们会从左到右增加。
公式化差异
如前所述,CDF 是单调递增的。这意味着这个功能和 PDF 之间当然有一些明显的区别。PDF 的形状为抛物线,而 CDF 为非递减斜率。如果你已经准备好了我关于保序回归的文章,从技术上讲,这个函数的公式就是 CDF。最后,让我们比较一下 CDF 和 PDF 的基本函数方法,以便对这两个函数和它们之间的差异有一个更完整的数学理解。我们将从 CDF 开始:
Fx(x) = P(X <= x)
接下来是 PDF:
f = dX.P / dmu
结论
由于 CDF 的非递减性质,它们通常也比典型的 PDF 复杂得多。因此,我们将不会解决任何函数。然而,我将是第一个承认这是因为我只在代码中写过两个。它们都是大量的工作,现实是永远不会有一个场景需要这样做。
CDF 是许多编程语言中已经编程的后端组件。当然,还有更多的 CDF 需要寻找,我认为认识到对函数或概念有一个广泛的理解也是很重要的。无论如何,这是我对 CDFs 的快速介绍,希望这篇文章对那些希望学习更多关于统计学方法的人有所帮助,并且不要有太多的感官负担,因为这是我今天通过避免进入 20 分钟阅读媒体来试图避免的。我跑题了,非常感谢大家的阅读!
什么是数据字典?
图片来自 Castor 的网站
如果您属于一个数据团队已经有一段时间了,那么您可能已经被您应该记录的表的数量淹没了。您可能还注意到,其他数据分析师和数据科学家花了大量时间处理这种类型的问题:
- 回答我问题的最佳数据在哪里?
- 列名“XXXX”是什么意思?
- 我可以信任这个资源吗?
- 谁创建了这个资源?数据是如何产生的?
- 数据库上次更新是什么时候?该资源是由哪个进程创建的?
- 如果我发现有问题(错误的记录、错误的行等),我可以联系谁…)?
- 有人已经研究过这个问题了吗?
也就是说,数据人员花费更多的时间寻找和试图理解数据,而不是有意义的创造价值的数据分析工作。好消息是,数据字典是一个可以帮助解决所有这些问题的工具,让数据人员专注于他们工作的核心并赢得时间。“数据字典”一词在过去几年中获得了很大的关注,但对于它的含义、它与其他工具(如数据术语表或数据目录)的区别以及它的主要用途仍然存在困惑。
在这篇文章中,我们提供了这个问题的清晰度,以及一个模板和你和你的团队如何使用它的说明。如果你想直接跳到数据字典模板,点击这里。关于什么是数据字典和如何使用模板的更多信息,请继续阅读!
什么是数据字典?
数据字典是与存储在给定系统中的每个数据库模式、表、事件、文件或列相关的信息的存储库。这些信息被称为“元数据”。
元数据基本上是为提供您所拥有的数据信息而生成的数据(要素数量、行数等)…).例如,与特定图书文件相关的元数据包括标题、作者姓名、出版日期、目录等。元数据具有巨大的价值,因为它允许您释放数据的潜力。如果你不清楚为什么会这样,看看这篇文章。它更深入地解释了元数据的概念,并将帮助您理解元数据收集的相关性。
与书籍相关的数据和元数据—图片来自 Louise de Leyritz
回到要点,数据字典是存储与文件系统相关的所有元数据的地方。关于数据库的元数据通常存储在不同的表中,与原始数据库分开。这种资源使数据用户能够理解大量大型数据库的内容,而不必滚动浏览每一列和记录。例如,如果您想检查数据库中是否有空值,您只需检查数据字典中的元数据,而不是滚动数据库来查看某个字段是否可能为“null”。这种资源为数据用户节省了大量时间。
以一个包含你的网站用户记录的数据库为例。你将收集关于他们的不同类型的信息:出生日期、电子邮件地址、电话号码等…比方说,您创建了一个存储客户姓名的列。在“name”列的数据字典中,您将找到该列的定义、数据类型、可能的值、值是否唯一等。包含关于您的客户的每条记录的数据库将看起来像 this:
数据库中的表格 Louise de Leyritz 的图片
特定“名称”列的数据字典如下:
包含给定列的元数据的数据字典—图片由 Louise de Leyritz 提供
这是一个具体的例子。通常,对于数据库中的每个表,数据字典包括以下内容:
- 表格名称—表格的预定义名称
- 表格位置—精确的数据库、文件、书籍…
- 表定义-数据库模式中表的内容和用途的详细描述。示例:“每行代表我们平台的一个用户”
- 列名—列的预定义名称
- 列定义—对列的内容和用途的详细描述,包括主键和外键指定。
- 数据类型—列的预定义特征。数据类型因数据库管理系统(DBMS)而异。例如,在 Oracle 中标记为 BLOB 数据类型的列在 Microsoft SQL Server 中将被标记为文本。数据类型可以是整数、日期、字符串、XML 等。我们将在后面详细讨论数据类型。
- 空值—指示“空”是否是可能的,这意味着是否可以为列存储空值。指明数据字典中的字段是否可以为空非常有用。这意味着数据用户不必打开数据库来检查一个实例是否可以为空。
- 唯一值-指示每个值/行是否唯一。
- 业务规则—包括模式验证或数据质量。
- 实体关系和其他系统级图表。
这些信息通常以表格的形式存储。使用数据字典,甚至不需要打开数据库就可以发现数据库对象的上述信息。
数据字典是用来做什么的?
数据字典是与存储在给定系统中的每个数据库模式、表、事件、文件或列相关的信息的列表。这些信息被称为“元数据”。
虽然这看起来像是一个简单的练习,但是很难从不同的地方引入一直在变化的相同文档信息。将业务部门与相同的定义联系起来就更难了。我们合作的一家 B2B SaaS 公司很难让每个人在特定的日期或时间范围内对“客户数量”有相同的定义。为什么?
- 财务团队将“客户数量”定义为在 2021 年 1 月 1 日 12:00AM→2021 年 1 月 31 日 11:59 PM 期间支付账单的客户总数。
- 销售团队将“客户数量”定义为在 2021 年 1 月 1 日上午 12:00→2021 年 1 月 31 日晚上 11:59 之间签订合同的客户总数。
- 销售团队将“客户数量”定义为在 2021 年 1 月 1 日 12:00AM→2021 年 1 月 31 日 11:59 PM 期间正在付款或处于 14 个试用期的客户总数。
这里的日期并不是真正的问题,而是在谈论特定指标时应该考虑的事件日期。
简而言之,数据字典让每个人都遵循这些定义。这样每个人都“说”同一种语言。数据字典用于:
- 文档—数据字典是一种工具,可以清晰、有序地记录文件系统。这为数据分析师、业务分析师和其他用户提供了对数据结构细节的访问。文档齐全的数据库使员工能够立即找到并理解他们需要的数据。有了维护良好的数据字典,引用特定业务对象的每个分析都可以使用数据字典中的定义和描述作为指导。引用特定业务对象的每个分析都应该使用字典中的定义作为指南。
- 沟通——为每个用户提供共享数据的唯一定义,并帮助开发人员衡量模式更改的影响。
- 数据集成——数据库管理系统(DBMS)中元素的清晰定义为每个用户提供了上下文理解。
- 决策制定——好的元数据管理软件有助于数据收集、项目开发和其他协作工作的规划。
如果你正在寻找好的数据字典软件,看看我们在市场上可用的工具基准。但是,假设您出于任何原因不想投资新的数据工具,您能做些什么呢?
Excel 解决方案
您确信数据字典的相关性,但是您还没有准备好安装一个 newt 工具?“移动”解决方案是让您的数据团队使用共享的 excel 电子表格和手动维护数据字典来处理数据文档。
此电子表格;元数据的中央存储库将包含文件系统中数据对象的描述。这包括表位置、表和数据库描述、数据质量、关于表列的细节等…该电子表格将成为贵公司中任何寻找特定表格的人的一个参考点,允许他们迅速找到、理解和使用数据对象。
点击此处获取数据发现/目录模板 —图片来自 Castor
这个 excel 数据字典易于使用、可靠,并将快速为您的数据团队提供价值。唯一的缺点是,随着文件系统中表格数量的增加,电子表格变得更加难以维护。但是,在以后迁移到自动化数据字典之前,没有什么可以阻止您手动启动。
在 Castor,我们为您的个人使用整合了一个基于电子表格的数据目录模板。请随意下载它,这样您就可以立即开始使用您的数据文档。
这个模板怎么用?
直接从你的桌面上,你可以像在谷歌上一样搜索数据资产。这个数据字典就像是您的数据资源的门户。
对于您拥有的所有数据对象,您可以使用此模板在桌面上记录它们。例如,以一个包含您的平台在 2020 年的用户列表的表格为例。在记录您的表格时,您应该特别注意三个方面:位置、质量和治理。我们依次讨论每个方面。
位置
在文档过程中,你的目标应该是根据定位你的表,在系统中的可以找到它,以及谁负责它。这样,员工可以快速方便地找到该表。因此,首先要指出表的位置(数据存储—数据库—模式)。也就是说,表是位于数据仓库还是数据湖中。您还应该指定可以在哪个数据库和哪个模式中找到该表。如果可能的话,指明表的 URL(数据源端点),这样员工就可以很容易地找到它。然后概述表名、一个 * 简短的 描述/ *表中包含的内容的定义,以及一些标记。指出数据集类型也很关键——这是该表经历了多少次转换的指示。不同的类型如下:交易数据的“应用程序”,从未修改的原始分析数据的“T0”,转换或修改过一次的数据的“T1”,等等。务必要确定表所有者的名字,**通常是负责创建表的人。这样,员工就能准确地知道关于桌子的问题应该联系谁,而不是浪费时间四处寻找答案。您可以提供一个贡献者列表:贡献者是自愿丰富表格文档的用户。这是一种给这些数据精灵以信任的方式,并把它们作为可能对数据对象有疑问的伙伴的参考点。
质量
数据记录的第二个方面与数据质量有关。您希望确保您的数据对象是一致的和定性的,并确保最好的数据资产是公司中最常用的。有了这个想法,从填写刷新频率栏开始。该表每周每 30 分钟刷新一次吗?每月?这将允许用户发现一个过时的表,并挥舞红旗。质量分数位应由数据管理员或负责数据质量的人员填写。数据是否完整、准确、一致?我们简单地使用表情符号。但是你可以随意使用你觉得最舒服的系统。质量分数很重要,因为分析人员将能够快速定位哪些表可用于进行数据分析。
一旦您的表被清楚地记录下来,就该弄清楚列端发生了什么。我已经听到你的叹息了。不要。您可能已经观察到,当分析师发现他们无法开始工作时,他们会感到非常沮丧,因为他们(可以理解)想不出一些列的名称。这是您的数据团队生产力大幅下降的开始。因此,为每一列列出列名和简短列描述非常重要,即使它们的数量很大。
对于文档级部分,你什么都不用做。该模板计算文档的质量和水平。分数介于 0 和 1 之间,1 表示最高文档级别。如果字典包含大量的空列,分数会更接近 0。同样,这将分析师引向文档记录良好的表,并鼓励表所有者记录他们的表(文档记录不良的表会对表所有者产生不良影响)。
数据类型
数据字典中的一个关键字段是“数据类型”字段。指定类型为您的分析人员增加了一层上下文,他们不需要调出有问题的表来获取这些信息。如上所述,数据类型取决于组织使用的数据库管理系统。最常用的数据类型是 SQL 数据类型,这并不奇怪,因为 SQL 是最广泛使用的数据库语言。我们将在这里做一个短暂的停留,回顾一下不同的 SQL 数据类型,这将允许您准确地填充您的数据字典。
有 6 类数据类型:
数字数据类型
- integer-当数据库中的列只包含整数值(即没有小数点的数字)时进行标记
- Tinyint —当表中的列包含整数,但只包含(0,255)范围内的数字时
- Bigint 表中的列存储大于一万亿的整数
- 浮点型—此列存储近似值
日期和时间数据类型
- 日期—给定年份和月份的日期
- 时间—一天中的时间
- 时间戳-保存日期和时间组合的时态数据类型。时间戳的格式是 YYYY-MM-DD HH:MM:SS
字符&字符串数据类型
- Char —指固定长度的字符,最多 8,000 个字符
- Varchar —上限与 char 相同(8,000),但 Varchar 指的是每个条目可以有不同的长度。Varchar 是一种流行的数据类型。
- 文本—也称为“字符串”或“STR”,这意味着列处理字母,而不是数字或符号。与 varchar 的含义相似,但最大容量为 2GB。
Unicode 字符和字符串类型
- nchar —指固定长度的字符,最多 8,000 个字符
- nvarchar —指可变长度的字符,最多 8,000 个字符。nvarchar 占用的空间是 varchar 的两倍。
- ntext-类似于 nvarchar,最大存储为 2GB。
二进制数据类型
- 二进制—固定长度的二进制数据,最多可存储 8000 个字节。例如,布尔值(真/假)是二进制数据。
- varbinary —可变长度的二进制数据,最多可存储 8000 个字节
其他数据类型
- 斑点——代表**二进制大物体。**它是一个对象的引用或指针。
- CLOB——代表字符大对象。它存储大量的字符数据,最大为 4 GB。CLOB 数据类型类似于 BLOB,但包括字符编码,它定义了字符集和每个字符的表示方式。
- XML-存储 XML 数据的数据类型。XML 文件是一个可扩展标记语言文件,它用于组织数据以便存储和传输。在 XML 文件中,您会发现标签和文本。XML 文件中的标签提供了数据的结构。文本被这些标签包围,这些标签遵循特定的语法准则
管理
数据字典就像一个门户。无论您的专业技术如何,您都可以直接从您的桌面访问有关数据资源的信息。即使是手动数据字典也可以帮助您处理治理问题。数据字典可以成为您的法律团队的数据门户。在这本字典中,您可以指出给定的列是否符合 PII (个人身份信息),这意味着它包含任何可能用于识别特定个人的数据。这允许你处理隐私问题,例如通过限制从你的桌面直接访问标记为 PII 的栏。
附加功能
我们鼓励您为您的特定业务定制这个数据字典,所以不要犹豫为您的数据对象添加额外的定义/文档字段!该模板提出了一些建议,尽管它们不是我们自动化数据目录产品的一部分。
仪表板和数据术语表
“仪表板”选项卡允许您以与表格完全相同的方式记录仪表板。
该模板还包含一个“词汇表”选项卡。这是业务术语表的空间,包含共享数据的常用词汇和定义。数据术语表是一个存储库,每个业务术语都附加到它的定义上。这确保了业务关键字总是在正确的上下文中使用,并且公司中的每个人都同意一个特定的定义。以术语“付费用户”为例。这个词在公司的产品部门经常使用。虽然这看起来很简单,但是如果员工没有一个明确的定义,他们可能会有不同的解释。例如,一个分析师可能将免费试用的用户归类为“付费用户”,而另一个分析师可能将他们排除在外。因此,每个部门都有一个术语表是很重要的。术语所有者是编写定义的人,通常准备好回答关于特定单词的问题。
将数据术语表与数据字典联系起来也可以节省时间,提高效率。这丰富了业务环境中的数据,使数据分析师和数据科学家能够根据业务战略调整数据。事实上,当数据术语表和数据字典在同一个存储库中时,数据用户可以直接访问术语的定义,以及与该术语相关的任何表或数据库。
如果您对如何使用模板有任何疑问,请联系 louise@castordoc.com的
了解更多信息
我们写了利用数据资产时所涉及的所有过程:从现代数据栈到数据团队组成,再到数据治理。我们的博客涵盖了从数据中创造有形价值的技术和非技术方面。如果您是数据领导者,并且希望更深入地讨论这些主题,请加入我们为此创建的社区!
在 Castor ,我们正在为 idea,Figma,Slack generation 构建一个数据文档工具。或者对 Fivetran,Looker,Snowflake,DBT 的狂热爱好者来说是数据方面的。我们将我们的目录设计得易于使用、令人愉快且友好。
想去看看吗?联系我们,我们将向您展示一个演示。
最初发表于【https://www.castordoc.com】。
什么是数据中心?
为什么像数据中心这样的架构正在兴起
卢卡·布拉沃在 Unsplash 上的照片
定义
数据中心是一种数据交换,其核心是无摩擦的数据流。它可以被描述为由不同技术组成的解决方案:数据仓库、工程、数据科学。这不仅仅是一种技术,而是一种更有效地确定数据需要在哪里、何时以及为谁进行传递、共享,然后链接和/或持久化的方法。端点可以是应用程序、流程、人员或算法,它们可能实时地与网络中心交互,向网络中心提供数据或从网络中心接收数据[1]。
与数据仓库和湖的区别
虽然数据仓库和数据湖被理解为支持组织的分析而存在的数据收集的端点,但是数据中心充当中介和数据交换的点。每个解决方案的特征总结如下。
特征—作者提供的图像
数据中心的优势
数据中心通过连接数据的生产者和消费者来实现数据共享。端点通过向数据中心提供数据或从数据中心接收数据来与数据中心交互,而数据中心提供了一个中介和管理点,使得数据如何在企业中流动变得可见[2]。
数据中枢实时连接许多不同的系统——它是应对当今挑战的合适工具:即尽可能快速和标准化地交换大量数据,并使其可用于系统、机器学习或报告等应用。
数据中心技术示例
即使如前所述,数据中心本身并不是一项技术,而是一种方法,但市场上仍有产品被称为数据中心。这些例子也清楚地表明,数据中心是几种技术的结合。
例子:
- Cumulocity 物联网数据中心[3]
- Cloudera,企业数据中心[4]
- 谷歌广告数据中心[5]
另一个很好的例子是对 SAP 的描述。这很好地展示了技术的相互作用以及数据中心的实际概念。
SAP 数据中心—来源 SAP [6]
结论
数据中心汇集了来自不同来源和格式的企业数据,以提取有价值的知识。我们谈论的更多的是方法或平台,而不是技术。希望本文能让您初步了解什么是数据中心。然而,为了深入研究,我建议深入阅读这个主题。我下面的消息来源可能会有所帮助。
资料来源和进一步阅读
[1] Eckerson,数据中心—数据架构的下一步是什么? (2019)
[2] A. Awadallah,大数据平台,Cloudera 白皮书(2013 年)
[3] Cumulocity 物联网,数据中心概述 (2021)
[4]云时代,企业数据中心 (2020 年)
[5]谷歌,广告数据中心 (2021 年)
[6] SAP,我有 SAP HANA,我何时需要 SAP 数据中心 (2019)
什么是数据事件指挥官?
数据团队如何利用 DevOps 最佳实践构建更具弹性的事件工作流
事故管理不仅仅是软件工程师的事。随着 数据平台 和 数据即产品心态 的兴起,构建更可靠的流程和工作流来处理 数据质量 已经成为数据工程师最关心的问题。
在 上一篇 中,我们讨论了如何设置对不良数据的自动检测和报警;现在,我们分享最佳数据团队如何在数据团队的新兴角色 数据事件指挥官 的帮助下,为您的破损数据管道进行分类和严重性评估。
现在是周一早上,你的电话一直在响。
你醒来时,你的首席执行官发来消息说,“这份报告中的数字似乎不对…又不对了。”
你和你的团队放下手头的工作,开始解决手头的问题。然而,你的团队对事件的反应却是一团糟。整个组织中的其他团队成员都在重复努力,而您的 CMO 被蒙在鼓里,没有更新被发送到组织的其他部分。
在这一切发生的同时,财务部门的 John 发短信告诉你他的电子表格中有一个错误的表格,运营部门的 Eleanor 发短信告诉你一个查询得到了有趣的结果。
数据工程师要做什么?
如果这种情况你听起来很熟悉,要知道你并不孤单。很多时候,数据工程师不仅要承担修复数据问题的负担,还要优先考虑修复什么、如何修复,并随着事件的发展交流状态。
对于许多公司来说,数据团队在这场救火中的责任往往模糊不清,尤其是在回答“谁在管理这一事件?”这个问题时
当然, 数据可靠性 SLA应该由整个团队来管理,但是当橡胶上路时,我们需要一个专门的角色来帮助发号施令,并确保在数据中断时满足这些 SLA。
在软件工程中,这个角色通常被定义为 【事件指挥官】,其核心职责包括:****
- 尽早并经常向更广泛的数据团队和利益相关者标记事件。
- 维护受影响数据资产或异常情况的工作记录。
- 针对特定事件协调工作并分配责任。
- 根据需要分发操作手册和行动手册。
- 评估事件的严重性和影响。
就像产品工程团队的 scrum master 一样,数据团队将每周或每天指派事件指挥官,通常是针对特定功能团队拥有的特定数据集。建立良好的、可重复的事件管理(和事件指挥官)实践主要是一个文化过程,但投资自动化和保持数据健康的持续发展会让您走得更远。剩下的就是教育了。
在对数据问题进行分类和评估其严重性时,每个事件经理都必须采取以下四个关键步骤:
1.将通知发送给适当的团队成员
在分散的数据团队中,团队成员分散在不同的业务部门,每个领域中的数据团队成员负责为他们的利益相关者处理事件。在这种结构中,数据团队成员通常要么向业务部门的负责人报告,要么在某些情况下向 CDO 或数据负责人报告。图片由蒙特卡洛提供。
集中式数据团队直接向 CDO 或数据负责人报告,同时处理来自不同业务部门的数据的查询和事件。除非另有说明,否则多个业务部门都是他们的利益相关者。图片由蒙特卡洛提供。
在响应数据事件时,数据组织的构建方式将影响您的事件管理工作流,并最终影响事件指挥官流程。
如果您是嵌入式数据团队的一员,那么委派事件响应就容易得多(例如,营销分析和数据工程团队拥有所有营销分析渠道)。如果您在一个集中的数据团队中,将这些事件警报发送给适当的所有者需要一些远见和规划。
无论哪种方式,我们建议您为数据团队的特定成员拥有和维护的数据管道建立专用的备用通道,邀请相关的利益相关者,以便他们知道他们所依赖的关键数据是否出现故障。我们合作的许多团队建立了page duty或 Opsgenie 工作流程,以确保不遗漏任何基础。
作为数据事件指挥官,正确发送通知并在错误向下游传播之前迅速将它们发送给正确的人是非常重要的。图片由蒙特卡洛提供。
2.评估事故的严重性
获得上述通知使您和您的团队能够评估事件的严重性,并决定是否应该优先响应事件。图片由蒙特卡洛提供。
一旦通知管道所有者数据有问题,他们应该采取的第一步是评估事件的严重性。因为数据生态系统在不断发展,所以在任何给定的时间都会有大量的变化引入到您的数据管道中。虽然有些是无害的(例如,预期的模式更改),但有些是致命的,会对下游的利益相关者造成影响(例如,关键表中的行数从 10,000 减少到 1,000)。
一旦您的团队开始对问题进行故障诊断,最佳做法是根据其状态标记问题,无论是已修复、预期、正在调查、不需要采取措施还是误报。标记问题有助于用户评估事件的严重程度,并在向特定于受影响数据的渠道中的相关利益相关方传达更新方面发挥关键作用,以便他们可以采取适当的措施。
如果对您的公司不重要的数据资产损坏了,该怎么办?事实上,如果这些数据被弃用了呢?
即使是最好的数据团队也会受到幻像数据的困扰,我也不知道有多少次我收到了一个数据问题的警报,尽管已经解决了所有的事件,但它对业务来说并不重要。因此,我没有解决高优先级的问题,而是花了几个小时甚至几天的时间来处理损坏的数据,结果却发现这是在浪费时间。自 2019 年以来,我们没有使用过那张桌子。
就像在软件工程和 DevOps 中一样,端到端谱系映射关键数据依赖关系是数据事件指挥官工具包的一个关键组件。图片由蒙特卡洛提供。
那么,您如何确定哪些数据对您的组织最重要呢?团队能够发现他们最关键的数据集的一个越来越常见的方法是利用工具来帮助他们可视化他们的血统。这使他们能够在发生事故时了解其所有数据集之间的关系,并能够跟踪数据所有权,以提醒可能受到该问题影响的相关人员。
一旦您的团队能够确定影响的严重性,他们将会更好地理解错误的优先级。如果是数据直接驱动财务洞察力,甚至是你的产品表现如何,这可能是一个超级高优先级的问题,你的团队应该尽快停止他们正在做的事情来解决它。如果不是,是时候继续前进了。
3.尽可能经常地交流状态更新
为您的事件响应任务组的所有成员提供一个关于给定事件的集中状态页面,在响应数据事件时发挥着关键作用。图片由蒙特卡洛提供。
在响应数据事件的过程中,良好的沟通会起到很大的作用,这就是为什么我们已经讨论了数据团队应该如何以及为什么创建一个操作手册来指导(逐步)如何处理给定类型的事件。遵循操作手册对于保持正确的责任线和减少重复劳动至关重要。
一旦你确定了“谁做什么”,你的团队就可以开始更新一个状态页面,利益相关者可以实时跟踪更新。中央状态页面还允许团队成员查看其他人正在进行的工作以及这些事件的当前状态。
在与客户的交谈中,我看到事故指挥授权有两种处理方式:
- 指定一名团队成员在指定时间段内待命处理任何事件: 在待命期间,该人负责处理所有类型的数据事件。一些团队有专人专职处理他们团队管理的所有事件,而其他团队则有一个每周轮换团队成员的时间表。
- 负责覆盖某些表的团队成员: 这是我们看到的最常见的结构。通过这种结构,团队成员在进行日常活动的同时,可以处理与分配给他们的表或报告相关的所有事件。表分配通常基于给定成员最密切使用的数据或管道进行调整。
要记住的一件重要事情是,这里没有对错之分。最终,这只是一个确保你致力于一个过程并坚持下去的问题。
4.定义并协调数据 SLA 和 sli,以防止将来发生事故和停机
虽然事故指挥官不对 设置 SLA负责,但他们通常负责满足这些要求。
简而言之,服务水平协议(SLA)是许多公司用来定义和衡量给定供应商、产品或内部团队将提供的服务水平的一种方法,以及如果他们未能提供的潜在补救措施。
例如, Slack 面向客户的 SLA 承诺,对于 Plus 计划及以上的客户,每个财政季度的正常运行时间为 99.99%,计划停机时间不超过 10 小时。如果他们达不到要求,受影响的客户将在他们的帐户上获得服务积分以供将来使用。
您的服务级别指标(SLIs)(SLA 的量化指标)将取决于您的具体用例,但这里有一些用于量化事件响应和数据质量的指标:
- 特定数据资产的数据事件数量(N) :尽管这可能超出了您的控制范围,但鉴于您可能依赖外部数据源,这仍然是数据停机的重要驱动因素,通常值得衡量。
- 检测时间(TTD): 当问题出现时,此指标量化您的团队收到警报的速度。如果您没有适当的检测和警报方法,这可能需要几周甚至几个月的时间。由不良数据造成的“无声错误”会导致代价高昂的决策,对您的公司和客户都有影响。
- 解决问题的时间(TTR): 当您的团队收到问题警报时,这将衡量您解决问题的速度。
通过跟踪这些,数据团队可以努力降低 TTD 和 TTR,进而构建更可靠的数据系统。
为什么数据事件指挥官很重要
在应对数据事件时,时间至关重要,作为事件指挥官,时间既是您的敌人,也是您最好的朋友。
在理想情况下,公司希望数据问题尽快得到解决。然而,情况并不总是这样,一些团队经常发现他们比他们希望的更频繁地调查数据问题。事实上,尽管数据团队投入大量时间编写和更新 自定义数据测试 ,他们仍然会经历管道中断。
一名事故指挥官,配备正确的流程、少量自动化和适当的组织支持,可以为您的数据管道的可靠性创造奇迹。
你的 CEO 以后会感谢你的。
有兴趣了解有关为您的数据团队建立可靠的事件管理流程的更多信息吗?向格伦伸出手https://www.montecarlodata.com/request-a-demo/!********
什么是数据湖?
术语和定义,以及如何从中获利
彼得·德·格兰迪在 Unsplash 上拍摄的照片
谈到存储大数据,数据湖和数据仓库都是公认的术语,但这两个术语不是同义词。数据湖是尚未确定用途的大量原始数据。另一方面,数据仓库是已经为特定目的处理过的结构化、过滤数据的存储库[1]。
数据湖的特征
在数据湖中,数据以最少的转换被接收到存储层,同时保持输入格式、结构和粒度。这包含结构化和非结构化数据。这导致几个特征,例如:
- 多个数据源的集合,例如批量数据、外部数据、实时数据等等。
- 控制摄入的数据,并专注于记录数据结构。
- 通常对分析报告和数据科学有用。
- 但是也可以包括一个集成的数据仓库来提供经典的管理报告和仪表板。
- 数据湖是一种数据存储模式,它在整个企业、所有部门和所有数据用户中优先考虑可用性。
- 新数据源的易集成性。
数据湖和数据仓库的区别
虽然数据仓库将经典的 ETL 过程与关系数据库中的结构化数据结合使用,但数据湖使用 ELT 和模式等范例读取非结构化数据[2]。
差异数据仓库与 Lake —作者图片
在上图中,您可以看到主要的区别。你使用的技术也很不同。对于数据仓库,您将使用 SQL 和关系数据库,而对于数据湖,您可能会使用 NoSQL 或两者的混合。
我自己的经验经常表明,数据湖可以更快地实现。一旦所有数据都可用,数据仓库仍然可以作为混合解决方案构建在其上。
混合数据湖概念—图片来自作者
这使得僵化和传统规划的数据仓库成为过去。这大大加快了仪表板和分析的提供,是迈向数据驱动文化的良好一步。来自云的新 SaaS 服务的实现以及 ELT 代替 ETL 等方法也加速了开发。
结论
本文简要介绍了什么是数据湖,以及它如何使您的公司能够灵活地以数据形式捕获业务运营的各个方面,同时保持传统数据仓库的活力。与传统数据仓库相比,它的优势在于不同的数据和数据格式,无论是结构化的还是非结构化的,都必须能够存储在数据湖中。这样就避免了分布式数据孤岛。还可以提供来自数据科学和经典数据仓库方法领域的用例。数据科学家可以更快、更准确地检索、准备和分析数据。所以最终数据湖不会取代数据仓库。相反,这两种选择是相辅相成的。
资料来源和进一步阅读
[1] talend,数据湖 vs .数据仓库
[2] IBM,绘制数据湖:使用读取模式和写入模式的数据模型 (2017)
什么是数据湖?这不是一个数据沼泽
介绍构建数据湖的参考体系结构
约瑟夫·巴里恩托斯在 Unsplash 上拍摄的照片
在工作中,我目前正在谷歌云平台上建立一个数据湖。在工作的同时,你才真正意识到一个中型公司已经可以拥有多少数据。我在能源部门工作。在许多文章和博客中,已经有很多关于大量数据需要整合到一个地方的讨论。一个开发者、科学家或任何人可以居住并获取项目所需数据的地方。在这样做的时候,消费者可以有各种各样的意图:构建仪表板,构建机器学习模型,或者运行说明性分析。当然还有比上面提到的更多的用例。
世界上最有价值的资源不再是石油,而是数据。(《经济学人》)
你知道这句名言吗?我没有什么要补充的。如果你有兴趣,你可以在这里阅读这篇文章。
那么什么是数据湖呢?
数据湖是存储大量数据的地方,这些数据来自不同的来源,并以原始形式存储。重要的是,在加载过程之前,异构数据既没有被清理也没有被转换。加载过程完成后,数据现在可以在单个系统中获得。除了结构化数据,数据湖还存储和管理半结构化(CSV、日志、JSON)、非结构化(电子邮件、文档、报告)和二进制数据(视频、音频、图像)。所有可能格式的列表当然是不完整的,但是我想你知道我的意思。目标是将所有公司数据收集到一个地方,以便能够快速访问整个数据库。用户应该能够立即从数据中创建可视化、报告和分析。
你可以在数据湖中存储任何你想要的东西。图片由作者创作,使用 draw.io 创建。
产生不受控制的数据沼泽的风险?
如果你想到创建一个不受控制的数据沼泽,我可以理解。所有数据都以原始形式加载到数据湖中,并且事先没有清理,这使得确保所需的数据质量变得更加麻烦。结果,数据湖会很快变成一个数据沼泽,使得恰当地评估数据变得困难。
简·安东宁·科拉尔在 Unsplash 上拍摄的照片
为了让数据湖的原理有效地为您工作,并且不会导致无法找到更多数据的数据沼泽,收集的数据必须显示未来的业务附加值。分析师很难从大量数据中提取信息。当没有使用元数据或标签时尤其如此。没有这一点,分析师几乎不可能分配数据。此外,几乎不可能从数据中导出关系,因为所有数据都存储在一个地方,没有可见的上下文。*获得更好概览的第一步是使用元数据。*以这种方式,例如,在网站上的访问、呼叫和购买可以链接到 IP 地址和位置。你必须事先定义一个组织结构。
数据湖的一般体系结构
图片由作者创作,使用 draw.io 创建。
上图显示了数据湖的参考架构。源系统/数据源显示在左侧。这些源将数据传递给数据湖。在这里,一个人是根据推还是拉原理工作并不重要。原则上,公司或设备中的任何系统都可以作为数据湖的来源。例如,这包括 web 服务器、SAP ECC、物联网设备或 CRM 系统等等。
在图的中间,您可以看到数据湖,它充当数据存储库。如上所述,文件夹图标再次提醒了元数据的使用。这是所有数据以原始状态存在的地方。这里或之前没有发生任何变化。
从这一点出发,可以从数据湖中提取数据并进行转换。在这个例子中,转换后的数据存储在数据集市中的数据湖系统之外。用户必须清楚他们需要数据湖中的哪些数据,以便能够继续使用这些选定的数据。
现在,数据分析师和其他用户可以根据自己的意愿分析或处理这些数据。例如,来自数据集市的数据可以构成数据仓库的基础,并用于报告目的。在工作中,我们目前正试图构建后者,即基于数据湖的数据仓库。
结论
我已经向您展示了什么是数据湖,并且您不必冒数据湖变成数据沼泽的风险。此外,我向您展示了一个通用架构,其中包含构建数据湖所需的必要组件。构建中间部分(数据湖)所需的所有组件几乎都可以在任何云环境中实现。只是作为一个预尝:对于一个数据湖,你可以使用谷歌云平台上的谷歌存储服务。有几个标签选项来标记你的斑点。例如,通过数据目录服务,Google 提供了一个 API 来查询这些标签,从而在 web 门户中组织数据。
我将写关于数据目录、大查询和云存储在未来的使用,并带您踏上构建数据湖的旅程。
良好的秩序是一切的基础。(埃德蒙·伯克)
如果你有任何问题,请留下评论。
混合数据湖的优势
如何将数据湖与数据仓库结合起来
康斯坦茨湖——作者图片
谈到存储大数据,数据湖和数据仓库都是公认的术语,但这两个术语不是同义词。数据湖是尚未确定用途的大量原始数据。另一方面,数据仓库是已经为特定目的处理过的结构化、过滤数据的存储库[1]。
共同点
数据仓库和数据湖代表一个中央数据库系统,可用于公司的分析目的。该系统从各种异构数据源提取、收集和保存相关数据,并提供给下游系统。
数据仓库可以分为四个子过程:
- 数据获取:从各种数据仓库中获取和提取数据。
- 数据存储:在数据仓库中存储数据,包括长期存档。
- 数据供应:为下游系统提供所需的数据,提供数据集市。
- 数据评估:对数据库的分析和评估。
差异
虽然数据仓库将经典的 ETL 过程与关系数据库中的结构化数据结合使用,但数据湖使用 ELT 和模式等范例读取非结构化数据[2]。
差异数据仓库与湖
以上,可以看出主要区别。你使用的技术也很不同。对于数据仓库,您将使用 SQL 和关系数据库,而对于数据湖,您可能会使用 NoSQL 或两者的混合。
将两者结合在混合数据湖中
那么这两个概念如何结合起来呢?在下图中,您可以从高层次的角度看到一个架构。
该过程是将非结构化和未转换的数据加载到数据湖中。从这里,一方面,数据可以用于 ML 和数据科学任务。另一方面,数据也可以以结构化的形式被转换和加载到数据仓库中。从这里开始,可以通过数据集市和(自助式)BI 工具实现传统的数据仓库分布。
混合数据湖概念—图片来自作者
您可以为这个架构使用的主要技术可以是例如:[3][4]
- ELT/ETL 流程通过——talend、Google 数据流、AWS 数据管道
- 数据湖 via — HDFS、AWS 雅典娜和 S3、谷歌云存储
- 数据仓库通过——Google big query、AWS Redshift、雪花
注意:像 Google 的 BiqQuery 或 AWS Redshift 这样的技术通常被认为是数据仓库和数据湖技术的混合体,因为它们通常已经实现了 NoSQL 的一些特征。
结论
本文解释了如何使用混合数据湖。数据湖使您的公司能够灵活地以数据形式捕获业务运营的各个方面,同时保持传统数据仓库的活力。
资料来源和进一步阅读
[1] talend,数据湖与数据仓库
[2] IBM,“绘制数据湖:使用读取模式和写入模式的数据模型” (2017)
[3]谷歌,帮助保护从数据湖到数据仓库的管道
[4] AWS,AWS 中的混合数据湖
什么是概率密度函数?
pdf 格式的统计微分方程简介
https://pixabay.com/images/id-2853022/
介绍
在统计的奇妙世界里,分布是位于数学宇宙中心的绝对重要的组成部分。分布用于以数学方式描述数据,并在机器学习和统计测试中有很强的众所周知的应用。它给出了实验中不同可能结果出现的概率。它们用于描述使用样本空间和事件可能性的随机现象。
概率分布可以以各种形式描述,例如通过概率密度函数或累积分布函数。概率密度函数,或 pdf,是通常应用于连续和离散值的数学函数。现在我们对 PDF 有了一个基本的概念,那么它们在统计中是如何使用的呢?更重要的是,它们如何应用于数据科学,它们在纸面上是什么样的?
PDF 在数据科学中的应用
pdf 在统计分析中非常常用,因此在数据科学中也非常常用。一般来说,pdf 是使用统计学研究应用科学数据的必要工具。然而,有一些 pdf 超出了这一基本用途,其用途与乍看之下的设想略有不同。例如,t 分布的 PDF 通常用于计算 T 统计量。这个 T 统计量和自由度(n 减 1)(v)通常被放入正则化的下不完全β函数,它恰好是 T 分布的累积分布函数。虽然连续随机变量取任何特定值的绝对可能性为 0,但 PDF 的值可用于推断,在随机变量的任何特定样本中,与另一个样本相比,随机变量在统计上更有可能等于一个样本。
还有一个可能是科学中最常用的 PDF 的应用,正态分布,它在机器学习中非常常用。数据的标准缩放是一种非常流行的方法,用于规范化数据具有高方差的连续值。该 PDF 将连续样本转换为总体均值的标准差。这对于机器学习来说非常好,因为通常它可以将数据的方差降低一个百分点,并使数据感觉更接近。这也是统计分析中常用的方法,因为当它与平均值相差 1.96 个标准偏差时,很容易判断出什么时候有统计学意义。我个人更认同 2.0 法则,但是 1.96 当然可以表示一些统计意义!这是因为少于 25%的数据超出平均值的 2 个标准偏差。对于已发表的测试,通常认为标准偏差应该比平均值高 2.6 倍。
查看 PDF,我们看到它有一条抛物线,中心是我们大部分数据所在的位置:
(来源)
将其与 CDF 进行比较,我们可以很容易地发现这两个函数之间的差异:
正常情况下更多
正态分布是 PDF 的一个很好的例子。这部分是因为它被大多数科学家非常普遍地使用和熟悉,但也部分是因为它在应用统计学的整个范围内有突出的应用。对于许多其他分布,正态分布是概率论的基础。
更好的是,正态分布的 PDF 的公式相对简单,并且允许我们看一看 PDF 可视化后的样子。为了计算这个 PDF,我们简单地从 xbar(当前样本)中减去 mu(平均值),然后除以 sigma(标准偏差)。)这也用于标准缩放数据,通常用于连续模型以提高准确性。
结论
pdf 是任何统计工作或应用科学的基本工具。它们不仅在分析和概率论中有应用,而且也经常应用于机器学习。了解很多关于 pdf 和与某些发行版相关的函数,一定会给你一个坚实的统计基础,并在你的 DS/ML 职业生涯中助你一臂之力。考虑到这一点,我当然认为他们是值得学习的!非常感谢你的阅读,我希望你有一个精彩的一天休息!
什么是“Python 环境”?(适用于初学者)
入门
清晰地分离出关键概念,以揭开环境创建过程的神秘面纱
照片由 Artturi Jalli 在 Unsplash 上拍摄
由于没有计算机科学背景,并且是“在职”学习编程,建立并运行一个稳定的 python 环境的整个过程令人望而生畏。出现了大量的步骤、新的术语(sys.path
、“虚拟环境”/“venv”、过时的$PYTHONPATH
等等。)以及许多工具(pip、pyenv、venv、conda、poems ),这些工具本应使事情变得更简单,但也许在这个过程中:
- 隐藏更简单的设置工作(尤其是对初学者而言),这样你永远也不会真正明白发生了什么
- 具有不同的范围,因此一些工具做一件事(依赖管理或虚拟环境设置),其他工具做几件事(如 conda 和 poems ),所以很难知道什么应该用于什么
这是我在 2021 年深入研究 python 环境的笔记集,目的是:
- 我自己明白
- 减少我点击紫色堆栈溢出链接的次数,因为 4 年前这些信息“左耳进右耳出”
- 考虑改变我以前学到的东西(conda+setuptools ),不要仅仅因为“如果它没坏就不要修理它”而质疑
一个稳定运行的环境有哪些组成部分?
在某种程度上——目标是什么?大多数人倾向于同意,当编写您希望重用或共享的 python 代码时,忘记了实际的代码本身,您需要以下内容:
- 易于操作,并且知道它以前是否工作过,它将继续工作(环境管理)
- 易于与可能使用不同版本的 python 和其他包(python 版本和依赖性管理)的其他东西一起工作
- 易于与其他人共享(包构建和分发)
- 当其他人得到它时,他们可以毫无问题地运行它(环境管理)
- 如果他们也依赖于其他人的代码,他们可以运行它(依赖管理)
- 如果上述事情变得有问题,要么很容易解决,要么如何解决就很清楚了(环境管理)
在创建考虑这些因素的 python 设置时,可以将问题分成几个子问题。
环境管理(venv、康达、诗)
这涉及到能否在计算机中设置一个容器,确保运行代码所需的一切保持不变。这通常采取目录结构的形式,其中包含您需要的内容,但也可能做一些事情,例如为目录外的您需要的内容设置稳定的方向。保持事情稳定是非常好的,因为它确保了某一天编写的未更改的代码在第二天也能工作。如果环境也是公式化创造的,那么它也可以公式化描述。这很好,因为您用来运行代码的环境可以公式化地表达出来,这样,如果其他人想要运行该代码,他们只需要遵循确切的方法,就可以有一个确切的匹配环境,并确保它不会“随机”对他们无效。
Python 版本控制(pyenv)
Python 是一种语言,就像它开发的所有语言一样。为了避免不断变化的语言完全混乱,变化/更新是离散的,每个新版本都有一个版本号来标识它。如上所述,为了确保未更改的代码继续工作,您需要确保您继续使用相同版本的 python——或者至少直到您已经测试出相同的代码可以在不同(希望是更新的)版本的 python 上工作。如果您有多个项目,每个项目都使用不同版本的 python(要么通过选择,要么因为依赖关系而不得不这样做——稍后将详细介绍),这可能会带来问题,因此理想情况下,当我们处理不同的项目时,我们可以运行不同版本的 python。这就是 Python 版本管理。
包安装(pip、康达、诗)
很可能你写的所有代码都不是你的,因此你会想利用一些已经写好的代码。Python 预装了一大堆组成 Python 标准库的东西,但是还有很多其他的包,你宁愿利用它们也不愿自己编写(NumPy、pandas、SciPy 等)。我们需要一种方法将这些东西放到我们的电脑上——或者更具体地说,放到我们已经在电脑中创建了的环境中。幸运的是,正如这段视频所解释的,有人致力于标准化这一点,并创建了一个名为 PyPI 的所有这些包的数据库。一旦代码被一致地记录在那里,我们就需要一种方法去那里获取它并将其安装到我们良好控制的环境中。我们还希望有一种方法来确保,如果我们有多个如上所述的使用不同版本 python 的项目,那么我们可以将可能相同的包的正确对应版本安装到它们各自的环境中。这是包安装。
依赖管理(康达,诗)
上面的软件包安装听起来很简单:
- 给它一个需求清单
- 它进入互联网上的一个数据库并收集它们
- 它使用它们都符合的标准化指令来安装它们
但是就像 python 语言本身一样,这些其他的包也在不断变化。事实上,因为 python 在不断更新,所以这些其他的“第三方包”也在更新——因为它们需要被测试和更新以使用底层 python 标准库的更新版本。并且有可能利用新的特性来扩展或改进现有的功能。由于大量的包在随机的日子里更新,并且对它们所依赖的东西有不同的需求,所以最终两个包依赖于另一个共享依赖的冲突版本并不困难。解决这些冲突,使得我们需要的所有依赖关系,给定我们可能已经指定的约束,都可以被获取和安装,这就是依赖关系管理。
包构建和分发(setuptools,诗歌)
到目前为止,我们只讨论了如何在假设我们需要获取他人编写的代码的情况下构建一个稳定的环境。但是,如果有一天,我们编写的代码,在这个稳定的环境下,可能对其他人有用,并且我们愿意分享它,那该怎么办呢?我们要通过电子邮件发给他们吗?我们最好将它提交给前面提到的 python 代码 PyPI 数据库,这样,就像我们所依赖的一切一样,其他人也可以以一种易于安装和准确理解的方式依赖我们的代码:
- 如何安装我们写的东西(标准化格式的代码)。文件)
- 您的代码可以使用什么代码(我们的代码具有的依赖约束集——如果有的话)
要做到这一点,我们需要一种方法来将我们的代码构建到一个“包”中,其中包含所需的所有相应元数据。标准化是这里的关键,以一种相对轻松的方式确保这种标准化是包装的构建。
仅仅写几行 python 代码似乎太多了
上面的许多步骤可能会给人这样的印象:仅仅是编写一点 python 代码,这是一项极其困难的任务。显然,在本地编写一点 python 代码就像打开命令行并输入python
一样简单(MAC 电脑已经预装了它)。但是要写一些更实质性的东西,这似乎是一种努力和复杂的负担,特别是对于一个刚刚开始并且不知道许多“最基本”单词是什么意思的人来说。让事情变得复杂的是,上面提到的工具掩盖了实际发生的事情,甚至会让理解手头的基本问题变得更加混乱:
“当您在命令行中键入单词 *python*
时,我们如何准确地控制会发生什么,以便我们可以访问我们需要的一切(模块、包)并且这种访问保持‘确定性’?”
解决这个问题意味着工作代码将一直工作,并最终节省调试棘手版本问题的时间。为了理解一些非常聪明的人是如何开发工具来帮助我们做到这一点的,我们可以看看下面两件事:
- 系统路径(
$PATH
) - python 的
sys.path
变量和“模块搜索路径”
让我们在下一篇文章中看看系统变量$PATH
是如何工作的,并深入探究流行的 python 工具(pyenv、conda、poems)是如何操纵它来简化 python 版本管理的。
什么是 Power BI 中的查询折叠,我为什么要关心它?
“这会破坏查询折叠吗?”“您的查询会折叠吗?”…也许有人问过你这些问题,但你会说:“问…什么?!"在这一系列文章中,我们来学习幂查询中最重要的一个概念!
https://www . pexels . com/photo/green-grass-field-with wind-turbines-under-blue-sky-6604984/
“这会破坏查询折叠吗?”“您的查询会折叠吗?”…也许有人问过你这些问题,但你会说:“问…什么?!"
或者,您可能听说过 Power BI 中的查询折叠,但不知道如何在现实生活中利用它。
如果你认识到自己处于(至少)上述两种情况中的一种,那么请继续阅读这篇简短的系列博文!
好吧,你很想知道什么是查询折叠。但是,首先…在你开始之前,我们需要一些理论基础,这些基础将把查询折叠特性放在适当的环境中。
数据整形
我已经写过关于数据成形的文章,以及为什么它是数据准备阶段的关键概念之一。现在,我想以一种(也许)不同寻常的方式对此进行阐述:
我想你们都知道托马斯·莫尔写的一本书,叫做《乌托邦》。
在那个故事里,一切都很完美,每个人都很满意。在一个理想的世界中,让我们称之为“数据乌托邦”,我们有干净的、高质量的数据,这些数据只是“按原样”飞入我们的报告,而不需要在此过程中执行任何类型的翻新或转换。不幸的是,“数据乌托邦”只能存在于书本中——现实更加残酷——因为我们必须在培育数据的同时应对一系列挑战。
也就是说,我们必须吸收的一个关键概念是数据整形。一旦您熟悉了您的数据,并意识到您计划在您的 商业智能 解决方案中使用的数据中可能存在的陷阱,您就应该执行数据整形过程。
我有意使用术语“商业智能”而不是“Power BI”,因为这是一个通用概念,也应该在 Power BI 解决方案之外使用。
简而言之,在数据成为数据模型的一部分之前,数据整形就是数据整合的过程。关键要记住的是两个字:之前!因此,我们应该在数据进入报告本身之前进行数据整形。数据整形可以在不同的地方进行,也可以在数据准备过程中的不同时间点进行,这取决于您应用数据整形技术的位置。
应该在哪里进行数据整形?
源数据库——这是最明显的选择,在大多数情况下也是最理想的场景。它基于提取-转换-加载(ETL)数据的传统数据仓库原则。在这个场景中,您定义想要提取的数据(并不需要数据库中的所有数据,并且通常不建议导入所有数据)。然后,您决定是否需要对数据进行转换,以更好地满足您的报告需求,例如,您是否需要执行货币转换,或者您是否需要符合国家和城市名称。
你能认出下图中的城市吗?
https://www . pexels . com/photo/skyline-photo-of-empire-state-building-in-new York-city-2190283/
是的,是纽约。或者,是 NYC?或者,是纽约市?这三个名字哪个是正确的?是的,它们都是正确的-但是如果您像这样在您的数据模型中导入数据,您将得到不正确的结果-因为每个纽约、NYC 和纽约市将被视为一个单独的实体。这一点,以及更多潜在的警告,需要在数据整形阶段解决,这就是为什么花一些时间处理数据很重要。
电源查询
如果您不在源端执行数据转换,下一站是 Power Query——它是 Power BI 中的内置工具,使您能够对数据执行各种转换。根据微软的官方文档,您可以应用 300 多种不同的转换,而且这个数字还在不断增加!
Power Query 的关键优势在于,您只需很少或不需要任何编码技能就可以执行复杂的数据转换!此外,您在数据转换过程中应用的所有步骤都将被保存,因此每次刷新数据集时,这些步骤都将被自动应用以形成您的数据,并为通过报表进行消费做好准备。
Power Query 的底层是一个 Mashup 引擎,它使您的数据整形能够顺利运行。Power Query 使用非常强大的 M 语言进行数据操作。现在,你可能会问自己,这些关于数据整形、强大查询、Mashup 引擎、M 语言等等的故事是怎么回事。与查询折叠有关。我不怪你,这是一个公平的问题,但我们很快会回来回答它。
什么是查询折叠?
对于一些数据源,例如关系数据库,以及非关系数据源,例如 OData、AD 或 Exchange,Mashup engine 能够将 M 语言“翻译”成底层数据源能够“理解”的语言,在大多数情况下是 SQL。
https://www.pexels.com/photo/black-cables-1054397/
通过将复杂的计算和转换直接推送到数据源,Power Query 利用了健壮的关系数据库引擎的功能,这些引擎是为了以最有效的方式处理大量数据而构建的。
Power Query 的 Mashup 引擎能够创建一个 SQL 语句,将您的转换背后的所有 M 语句组合起来,这就是我们所说的查询折叠。
或者,让我们简单地说: 如果 Mashup 引擎能够生成一个将要在数据源端执行的 SQL 查询,我们称该查询为 。
支持查询折叠的数据源
如前所述,查询折叠最明显的受益者是关系数据库源,如 SQL Server、Oracle 或 MySQL。然而,不仅仅是 SQL 数据库利用了查询折叠的概念。本质上,任何支持某种查询语言的数据源都可以利用查询折叠。其他数据源包括 OData、SSAS、Sharepoint 列表、Exchange 和 AD。
另一方面,当您使用 Excel 文件、BLOB 存储文件、平面文件等数据源时。在 Power BI 数据集中,查询不能折叠。
支持查询折叠的数据转换
然而,对于一般支持查询折叠的数据源,重要的是要记住不是所有的转换都可以被折叠并推送到数据源。所以,要明确的是,SQL 数据库支持查询折叠这一事实并不一定意味着您的查询会折叠!有一些强大的查询转换不能简单地推送到 SQL 数据库引擎。
通常,Power 查询转换中的一些细微差异可能对最终结果以及查询是否会折叠起决定性作用。在本系列的下一部分中,我将向您展示一些细微的区别。
一般来说,在 Power Query 中应用以下转换时,可以将其“转换”为一条 SQL 语句:
- 删除列
- 重命名列
- 使用静态值或超级查询参数过滤行,因为它们被视为 SQL 中的 WHERE 子句谓词
- 分组和汇总,这在 SQL 的 Group by 子句中是等价的
- 基于相同源的可折叠查询的合并——因为该操作可以转换为 SQL 中的 JOIN。当我说合并可折叠查询时,这意味着如果您连接两个 SQL server 表,它将工作,但如果您尝试连接 SQL 表和 Excel 文件,它将不会工作
- 追加基于相同源的可折叠查询——该转换与 SQL 中的 UNION ALL 操作符相关
- 用简单的逻辑添加自定义列。简单的逻辑是什么意思?使用在 SQL 语言中有等效项的 M 函数,例如数学函数或文本操作函数
- 透视和取消透视转换
https://www . pexels . com/photo/wood-red-industry-writing-3018978/
另一方面,一些会阻止查询折叠的转换有:
- 如前所述,合并基于不同来源的查询
- 基于不同的源追加(联合)查询——与前一种情况类似的逻辑
- 添加具有复杂逻辑的自定义列,或者使用一些在 SQL 中没有对应项的 M 函数
- 添加索引列
- 更改列数据类型。这是一个典型的“视情况而定”的案例。我将在本系列的下一部分向您展示它所依赖的东西,但是请记住,更改列数据类型可以是可折叠的和不可折叠的转换
结论
通过学习数据整形和 Power 查询,我们为理解 Power BI 中的查询折叠特性,或者更好地说是 Power Query Editor 中的查询折叠特性打下了坚实的理论基础。
在本系列的下一部分中,我们将研究为什么查询折叠如此重要,以及为什么我们应该关心查询是否折叠。我们还将学习如何检查查询是否折叠,以及为什么人们说细节决定成败…
感谢阅读!
订阅这里获取更多有见地的数据文章!
什么是张量处理单元(TPU ),它是如何工作的?
TPU 比最先进的 GPU 快 20 倍以上…但是怎么做到的呢?
TPU 是专门从事深度学习任务的硬件加速器。在这个代码实验室中,您将看到如何在 Keras 和 Tensorflow 2 中使用它们。云 TPU 在具有 8 个核心的基本配置中可用,也在多达 2048 个核心的称为“TPU pod”的更大配置中可用。额外的硬件可用于通过增加训练批量来加速训练。
来源: Colab
我们都知道,在机器学习方面,GPU 比 CPU 更快。在过去几年中,我们可以看到行业巨头 Nvidia 和 ARM 正在开发新的芯片来优化机器学习张量(矩阵)运算,这为我们带来了张量处理单元(TPU)。你可能在进行 Kaggle 比赛或使用在线 GPU 提供商如 Google colab 时遇到过它们。
在这篇文章中,我想解释为什么 TPU 比 GPU 快,是什么使它们能够执行更快的张量运算,使它们成为最快的 ML 引擎。
为了客观地看待问题,我们必须认识到每个芯片都是针对其用途而优化的。鉴于 GPU 最初是为图形渲染而构建的(因此是图形处理单元),对于机器学习和加密货币挖掘等任务,GPU 比 CPU 更快可能是一个巧合。我认为在我们开始深入 TPU 之前,有必要解释一下为什么 GPU 比 CPU 快。
GPU 与 CPU
尽管与 CPU 相比,GPU 通常拥有更小的内核,但它们拥有更多内核。这些内核包含算术逻辑单元(alu)、控制单元和内存缓存,允许 GPU 进行大量的数学运算。这些 alu 被包括在内,以允许快速的几何计算,使游戏每秒钟有大量的帧。[1]
请记住,CPU 当然比 GPU 有一些优势,但不是在机器学习方面。这些优势的一个例子是对内存的访问。GPU 通常只能访问 8GB 内存,可能是 16 GB,而 CPU 可以轻松访问更多内存(取决于您的 RAM)。与 RAM 之间的传输操作比与 GPU 之间的传输操作要快得多(但这仅适用于频繁的操作,而不是像训练模型这样的长时间操作)。
现在回到我们最初的比较,CPU 最初是为了同时处理几个任务而构建的,而不是处理一个复杂的任务,如运行操作系统操作(如内核操作)。然而,GPU 是为了尽可能快地进行数学运算而构建的,因为渲染图形都是基于这些简单的数学运算。
好消息是,所有这些几何 3D 渲染操作都是张量操作,如纹理计算、RGB 渲染,所有这些本质上都是矩阵算术操作。此外,所有这些操作都是一种浮点格式,这使得它非常适合机器学习。事实上,测量 ML 模型性能的事实是通过每秒浮点运算(FLOPS)来实现的。
好了,关于 GPU 和 CPU,让我们深入到 TPU。
TPUs vs GPU
虽然 TPU 和 GPU 执行张量运算,但与 3D 图形渲染相比,TPU 更倾向于执行大张量运算,这些运算在神经网络训练中经常出现。如果你像我一样是一个系统爱好者,这对于你来说还不够,你还想了解更多的细节!
TPU v2 内核由一个运行矩阵乘法的矩阵乘法单元(MXU)和一个用于所有其他任务(如激活、softmax 等)的向量处理单元(VPU)组成。VPU 处理 float32 和 int32 计算。另一方面,MXU 以混合精度 16–32 位浮点格式工作。
来源: Colab
谷歌的 TPU 核心由两部分组成。如上所述矩阵乘法单元和向量处理单元。至于软件层,优化器用于在 bfloat16 和 bfloat32 操作之间切换(其中 16 和 32 是位数),这样开发人员就不需要更改代码来在这些操作之间切换。显然,bfloat16 使用的 RAM 较少,但精度不如 bfloat32。
最终结果是,在计算矩阵乘法时,TPU 脉动阵列架构具有显著的密度和功耗优势,以及与 GPU 相比不可忽视的速度优势。
来源: Colab
另一个加速张量运算的有趣概念是所谓的“脉动阵列”。收缩是指流的收缩和释放(通常用于医学)[2]。脉动阵列用于在 TPU 的一个内核上执行张量的点积,而不是在多个 GPU 内核上并行展开。它们可以使用乘法累加器来实现,乘法累加器对两个矩阵使用 bfloat16 运算,对结果使用 bfloat32 运算。
这里需要注意的另一点是,当你使用 Colab/Kaggle 的 TPU 时,你不仅仅使用一个 TPU 内核,实际上你使用了相当多的内核。梯度[2]通常使用“ all-reduce 算法在 TPU 核之间交换
我想谈的最后一点是量化,它使 TPUs 的性能优于 GPU。量化是在两个极限之间逼近随机值的过程。通过将连续数字转换为离散数字,这种方法大量用于压缩浮点计算。这很有趣,你可以在这里找到更多关于它的。
最后的想法和收获
我希望这篇文章给出了一些关于为什么像苹果的神经引擎和 Colab 的 TPUs 这样的芯片在 ML 模型训练中表现良好的背景。当这些模型必须进入我想写一篇文章的移动设备时,也有更多的创新进入 ML 的芯片。我认为我们总是习惯于看到创新发生在事物的模型方面,但我们忘记了那些模型需要那些芯片来运行。
参考文献
[1]https://blogs . Oracle . com/data science/CPU-vs-GPU-in-machine-learning
[2]https://code labs . developers . Google . com/code labs/keras-flowers-data/# 2
什么是变分自动编码器?
实践教程
代码生成机器学习快速入门指南
介绍
生成机器学习在各种情况下都是有帮助的。例如,一种情况是有某种封闭形式或准封闭形式的解,但计算量很大。在这种情况下,神经网络可以提供具有可接受准确度的及时解决方案。然而,为了训练这样的网络,数据必须被聚集,并且在大多数情况下可能是稀缺的。一个很好的例子是奇异期权的定价。如果你想了解更多关于这个例子的信息,我会留下一个 SSRN 论文的链接…
这个问题的解决方案可以通过变型自动编码器在生成式机器学习中找到。有了这样一个模型,我们可以从一组有代表性的群体数据中学习,并生成新的样本,这些样本可以作为更多的数据用于训练。本文将首先考虑自动编码器,给出一个直观的例子,并使用 Python 和 Tensorflow 的函数式 API,通过本文展示的代码过渡到变化的自动编码器。
自动编码器
前馈神经网络和图表
理解变型自动编码器的最佳方式是首先理解标准自动编码器。如果你不熟悉标准的神经网络架构,我建议你看看这些文章,让你跟上速度…
假设你在神经网络领域有基础,我们可以继续学习自动编码器的结构。
通常,前馈神经网络将具有输入层、在与输入相同的、更高维或更低维的空间中的一定数量的隐藏层、以及在相对于隐藏层和输入的更低维空间的输出层中的一些目标。
作者图片:前馈神经网络架构
这个概念相对简单,任何有构建神经网络经验的人可能会立即提出这个普遍性的反例,这不仅仅是公平的,然而,我离题了。此示例的目的是突出神经网络的每个组件的维度,因为自动编码器具有使其成为自动编码器的特定结构。
自动编码器和图表
作者图片:Autoencoder architechture
自动编码器接受输入(无论是波动点的网格、图像的像素还是时间序列路径的签名),并将其压缩到称为潜在空间的低维表示。从这个低维表示,潜在空间,目标是通过重建误差的反向传播来重建输入。
这可以从类似于任何种类的维度缩减方法(即主成分分析和路径签名)的角度来看。
至于语义,自动编码器可以分解为两个模型:
- **编码器:**将输入压缩到一个潜在空间,由上图中的输入和隐藏层组成
- **解码器:**将原始输入的潜在表示作为输入,并尝试重建原始输入
自动编码器 Python 代码
关于在 Tensorflow 中实现自动编码器的资源并不多,所以我在下面提供了一个要点,作为使用 Tensorflow 的功能 API 开发您自己的自动编码器的指南。
Tensorflow 中的编码器模型
Model: "encoder"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
encoder_input (InputLayer) (None, 10) 0
_________________________________________________________________
intermediate_layer_1 (Dense) (None, 10) 110
_________________________________________________________________
intermediate_layer_2 (Dense) (None, 10) 110
_________________________________________________________________
latent_space (Dense) (None, 5) 55
=================================================================
Total params: 275
Trainable params: 275
Non-trainable params: 0
_________________________________________________________________
现在我们需要一个解码器…
Tensorflow 中的解码器模型
Model: "decoder"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
decoder_input (InputLayer) (None, 5) 0
_________________________________________________________________
intermediate_layer_3 (Dense) (None, 10) 60
_________________________________________________________________
latent_space (Dense) (None, 10) 110
=================================================================
Total params: 170
Trainable params: 170
Non-trainable params: 0
_________________________________________________________________
现在我们有了编码器和解码器,我们可以将它们编译成一个模型,称为(令人震惊的)自动编码器。
Tensorflow 中的自动编码器模型
Model: "autoencoder"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
encoder_input (InputLayer) (None, 10) 0
_________________________________________________________________
encoder (Model) (None, 5) 275
_________________________________________________________________
decoder (Model) (None, 10) 170
=================================================================
Total params: 445
Trainable params: 445
Non-trainable params: 0
_________________________________________________________________
这就是全部了!我们已经使用 Python 和 Tensorflow 成功构建了一个动态自动编码器。现在我们已经有了自动编码器的坚实基础,让我们看看为什么可变自动编码器如此有用。
可变自动编码器
简介和图表
顾名思义,它和标准自动编码器的唯一区别是变型组件…
自动编码器在潜在空间中具有原始输入的离散表示。离散,意味着它们本质上不是概率性的,它们是数学上确定的结果。
变分自动编码器保持潜在空间中的分布。如果听起来令人困惑,那是因为它确实如此。让我们来看一下这个体系结构的示意图,来阐明这个概念…
作者图片:可变自动编码器架构
其中图中的 X 表示正向传递中的输入实例。我们可以看到,潜在空间由潜在变量的分布组成,这些变量与编码器得出的平均值和标准偏差直接相关(回想一下我们的自动编码器的结构,这仍然成立)。
潜在变量分布
在变分自动编码器的情况下,编码器产生负责构建潜在变量分布的条件均值和标准偏差。没有这些条件均值和标准偏差,解码器将没有用于重构原始输入的参考框架。
为了创建分布本身,我们添加了一个ε项(正态分布),它乘以条件标准差并与条件均值相加。这是为了绕过通过随机节点的反向传播问题。虽然超出了本文的范围,但是如果你对我们为什么必须使用这个重新参数化技巧感兴趣,你可以看下面的帖子。
这开始变得非常技术性,所以请记住最初的目标:生成代表一些原始数据的新样本。
重建误差和 KL 损失
坚持这种潜在变量分布的概念意味着我们可以生成代表用于训练变分自动编码器的集合的新样本。然而,潜在分布的形状并不令人鼓舞。这在基本意义上是有问题的——我们希望从分布中提取值,并将这些提取值传递给解码器以生成新的数据样本,但是,如果我们不能确定我们在采样中捕获了整个变化的自动编码器训练空间,则生成的数据将会有偏差。
幸运的是,变分自动编码器的损失函数有两个分量:重建损失和 KL 损失。重建损失与标准自动编码器相同。KL 损失促使潜在空间中的分布形状趋于正态。这极其重要,尤其是如果我们希望生成新的数据样本——如果潜在空间中的分布是正态的,我们可以简单地从正态分布中采样,并将这些值传递给解码器以生成新的输入(这是一件大事)。
为什么变型自动编码器很棘手
不幸的是,这可能是变型自动编码器变得非常难以工作的地方。当开发上述波动率表面用例的变分自动编码器时,花费了两周来找到平衡重建和 KL 损失的适当方法。如果重构误差被优先考虑,则生成的样本将会非常差,但是输入的重构将会很成功。如果 KL 损失被优先化,则生成的样本将是奇妙的,但是实际上没有意义,因为原始输入的重建被完全放弃了。这就是为什么取得平衡是绝对重要的。如果主要的努力是为一个特定的用例构造可变的自动编码器,我鼓励你阅读我的论文,因为它更详细地展示了(并提供了参考)用于平衡这些误差的过程。
变分自动编码器 Python 代码
同样,Python 中没有多少变分自动编码器的实现。这可以部分归因于实现的困难和缺乏用例。尽管如此,我还是提供了下面的代码,用于动态实现不同的自动编码器,而不考虑用例…
张量流中的变分编码器模型
您会注意到,变分编码器使用标准偏差的对数表示,而不是标准偏差本身(这也显示在示例函数中,数学上我们使用标准偏差)。这有助于 KL 损失项的收敛。
就像以前一样,变分编码器和变分解码器可以组合成一个单一的模型:变分自动编码器。
Model: "VAE"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
encoder_input (InputLayer) (None, 10) 0
_________________________________________________________________
encoder (Model) (None, 5) 220
_________________________________________________________________
decoder (Model) (None, 10) 170
=================================================================
Total params: 390
Trainable params: 390
Non-trainable params: 0
_________________________________________________________________
结论
本文的目标是通过示例代码让您了解可变自动编码器,以便您可以开发自己的生成式机器学习模型。我们首先从简单的前馈神经网络的背景来看标准的自动编码器。离散潜在空间的概念然后扩展到概率潜在空间,自动编码器和变分自动编码器之间的主要区别。最后,我们考虑了变分自动编码器的一些更具技术性的方面,并在训练空间中分解了一些关于平衡优化的问题。
这是机器学习的一个特殊领域,我在最近的研究项目中花了很多时间。如果有任何关于特定代码或任何模型的问题,我很乐意回答。
https://github.com/RomanMichaelPaolucci
什么是对抗性机器学习?
操作机器学习模型的介绍
机器学习模型是复杂的东西,通常,我们对它们如何做出预测的理解很差。这可能会留下隐藏的弱点,被攻击者利用。他们可以欺骗模型做出不正确的预测或泄露敏感信息。假数据甚至可以在我们不知情的情况下用来破坏模型。对抗性机器学习领域旨在解决这些弱点。
来源: flaticon
在本文的其余部分,我们将更深入地探索这个领域。我们将从讨论对抗性 ML 旨在防止的攻击类型开始。然后,我们将继续讨论防止这些攻击的一般方法。最后,我们将触及对抗性的 ML 如何与一般安全措施和负责任的 AI 相关联。
敌对攻击的类型
机器学习可以帮助我们自动化更复杂的任务。不利的一面是,模型会为攻击者引入一个新的攻击目标。新型攻击现在可以用来攻击您的 IT 系统。这些攻击包括中毒、规避和模型窃取攻击。
中毒袭击
中毒攻击主要针对用于训练模型的数据。在这种情况下,攻击者将更改现有数据或引入标签不正确的数据。然后,根据该数据训练的模型将对正确标记的数据做出不正确的预测。例如,攻击者可以将欺诈案例重新标记为非欺诈。攻击者可以只对特定的欺诈案例这样做,因此当他们试图以同样的方式实施欺诈时,系统不会拒绝他们。
对于许多应用,模型只训练一次。数据和模型都将被彻底检查,因此像这样的攻击机会可能很少。对于一些系统,模型被不断地重新训练。例如,可以每天/每周一次或者甚至在引入新数据时立即对强化学习模型进行训练。最终,在这种类型的环境中,中毒攻击的机会更大。
规避攻击
规避攻击集中在模型本身。它们涉及修改数据,因此看起来是合法的,但会导致不正确的预测。明确地说,攻击者修改模型用来进行预测的数据,而不是用来训练模型的数据。例如,当申请贷款时,攻击者可以使用 VPN 掩盖他们的真实原籍国。他们可能来自一个危险的国家,因此,如果攻击者使用他们真实的国家,模型将拒绝他们的申请。
这些类型的攻击更多地与图像识别等领域相关联。攻击者可以创建在人类看来完全正常的图像,但会导致完全不正确的预测。例如,谷歌的研究人员展示了如何将特定的噪声引入图像中,从而改变图像识别模型的预测。看图 1,你可以看到,对于一个人来说,噪声层甚至是不明显的。然而,模型现在预测熊猫是一只长臂猿。
图 1:对抗的例子(来源: I. Goodfellow 等人。艾尔。)
图像识别模型可以以这种方式被愚弄,因为它们被训练成将某些像素与目标变量相关联。如果我们能以正确的方式调整这些像素,模型就会改变它的预测。如果这些类型的攻击被用来影响自动驾驶汽车等系统,其后果可能会很严重。停车标志或交通灯可以用类似的方法改变吗?这种攻击可能不会被驾驶员注意到,但会导致汽车做出错误的、危及生命的决定。
模型窃取
类似地,模型窃取攻击也集中在经过训练的模型上。具体来说,攻击者希望了解模型的结构或用于训练模型的数据。例如,可以从大型语言处理模型中提取社会保险号或地址等机密数据。
就模型结构而言,攻击者可能想要了解该模型,并利用它来获取经济利益。例如,股票交易模型可以被复制并用于股票交易。攻击者可以利用这些信息进行进一步的攻击。例如,他们可以准确识别垃圾邮件过滤模型将标记的单词。然后,攻击者可以更改垃圾邮件/网络钓鱼邮件,以确保它们被发送到收件箱。
图 2:对抗性机器学习攻击的总结
对抗攻击的方法
我们捍卫 ML 系统的方式取决于我们使用的模型类型。许多问题可以通过线性回归或逻辑回归这样的简单模型来解决。当涉及到这些类型的模型时,我们描述的许多攻击是无效的。这是因为这些模型是可解释的,这意味着我们可以很容易理解它们是如何工作的。例如,如果发生了中毒事件,我们应该能够在测试过程中发现问题。
像神经网络这样更复杂的模型更难解释。最终,这意味着我们对模型的内部运作了解得更少。这导致了隐藏的弱点,并为上述攻击提供了更多机会。这就是为什么对抗性机器学习领域的大多数研究都旨在打击针对这些模型的攻击。这项研究可以归纳为以下几种一般方法。
对抗训练
第一种方法是训练模型来识别对立的例子。对于上面的图像识别模型,熊猫的错误分类图像将被认为是一个对立的例子。希望通过使用这些例子训练/再训练模型,它将能够识别未来的敌对攻击。
问题是首先可能很难发现这些对立的例子。因此,这一领域的研究不仅旨在防御它们,而且旨在自动发现它们。也有像 IBM 开发的对抗性鲁棒性工具箱这样的软件包,旨在简化对抗性训练的过程。
切换模型
第二种方法是在您的系统中使用多个模型。用于预测的模型是随机变化的。这就产生了一个移动的目标,因为攻击者不知道当前使用的是哪个型号。为了攻击成功,他们可能还必须损害所有模型。中毒或发现多个模型的对立例子要比只有一个模型困难得多。
一般化模型
第三种方法是广义模型防御,它也将使用多个模型。它们不是切换模型,而是组合在一起创建一个通用模型。这意味着所有的单个模型都将有助于最终的预测。一个对立的例子可能能够欺骗一个模型,但它可能不会对所有的模型都有效。最终,这意味着一个一般化的模型在对抗对立的例子时更加健壮。
一般安全措施和负责任的 AI
上述方法侧重于数据和模型。重要的是要记住,模型不是孤立存在的——它们是更大的 It 系统的一部分。这意味着许多攻击可以通过改变系统来避免。例如,加密和良好的密码实践可以保护数据库,降低中毒攻击的可能性。
再举个例子,让我们回到垃圾邮件过滤系统。攻击者可能会发送多封电子邮件来慢慢了解过滤器的工作原理。我们可以修改我们的电子邮件系统,不给出任何关于被拒绝的电子邮件的信息,而不是对模型进行修改。即系统不会告诉攻击者电子邮件是否被发送到垃圾文件夹。这限制了攻击者可以了解的数量,从而降低了模型窃取攻击的威胁。
最后,一般的安全措施只能带你到这里,我们可能仍然需要使用上述的对抗性防御之一。这也意味着现有的安全框架可能不足以解决机器学习的安全问题。这就是负责任的人工智能发挥作用的地方。它是一个框架,旨在解决人工智能/人工智能系统的安全性以及其他由此产生的问题,如算法的公平性和可解释性。您可以在下面的文章中了解更多信息:
[## 什么是负责任的 AI?
towardsdatascience.com](/what-is-responsible-ai-548743369729)
图像来源
所有图片都是我自己的或从www.flaticon.com获得的。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。
参考
古德费勒等人。艾尔。、解释和治理反面事例(2015)https://arxiv.org/pdf/1412.6572.pdf
C.Kapelke,对抗性机器学习(2019)https://medium . com/cltc-bulletin/对抗性机器学习-43b6de6aafdb
B.Dickson,什么是对抗性机器学习?(2020)https://bdtechtalks . com/2020/07/15/machine-learning-adversarial-examples/
K.Wiggers,机器学习中的对抗性攻击:它们是什么以及如何阻止它们(2021)https://venturebeat . com/2021/05/29/机器学习中的对抗性攻击-它们是什么以及如何阻止它们/
加州大学柏克莱分校对抗性机器学习【https://cltc.berkeley.edu/aml/(2021)
什么是算法公平?
对旨在理解和防止机器学习中不公平现象的领域的介绍
(来源: flaticon )
起初,不公平的机器学习模型的概念似乎是矛盾的。没有种族、民族、性别或宗教概念的机器怎么会主动歧视某些群体?但算法会,如果不加以检查,它们将继续做出延续历史不公正的决定。这就是算法公平领域的用武之地。
我们探索算法公平的领域和它的目标是什么。为了突出这一领域的重要性,我们讨论了不公平模型及其后果的例子。我们还简要地谈到不公平的原因,如何衡量它和如何防止它。最后,我们讨论公平性和可解释性之间的联系。一路走来,我们链接了关于这些主题的更深入的文章。
在我们继续之前,您可以观看下面的视频,了解本文的摘要:
什么是算法公平?
在机器学习中,算法和模型这两个术语可以互换使用。准确地说,算法是像线性回归、随机森林或神经网络这样的数学函数。模型是经过数据训练的算法。一旦经过训练,模型就被用来进行预测,这有助于自动化决策。这些决定可以包括从诊断癌症患者到接受抵押贷款申请的任何事情。
(来源: flaticon )
没有一个模型是完美的,这意味着它们可能做出不正确的预测。如果这些错误系统性地使一群人处于不利地位,我们就说这个模型有偏见/不公平。例如,一个不公平的模型可能比男性更经常拒绝女性的抵押贷款申请。类似地,我们最终可能会得到一个比白人更不容易发现黑人皮肤癌的医疗系统。
算法公平是一个研究领域,旨在理解和纠正这样的偏见。它处于机器学习和伦理学的交汇点。具体而言,该领域包括:
- 研究数据和算法中偏差的原因
- 定义和应用公平的度量
- 开发旨在创建公平算法的数据收集和建模方法
- 就如何监管机器学习向政府/企业提供建议
理解公平的方法不仅仅是定量的也很重要。这是因为不公平的原因超越了数据和算法。这项研究还将涉及理解和解决不公平的根本原因。
(来源: flaticon )
为什么算法公平很重要?
如前所述,机器学习模型正被用于做出重要决策。不正确预测的后果对个人来说可能是毁灭性的。如果不正确的预测是系统性的,那么整个群体都会遭殃。为了理解我们这样说的意思,看几个例子会有帮助。
苹果公司最近推出了一种信用卡——苹果卡。你可以在网上申请信用卡,你会自动得到一个信用额度。随着人们开始使用这种产品,人们发现女性获得的信用额度比男性低得多。即使这些女性有着相似的财务状况(和信用风险)。例如,苹果联合创始人史蒂夫·沃兹尼亚克(Steve Wozniak)说,他获得的信用额度是他妻子的 10 倍。
(来源: flaticon )
另一个例子是亚马逊用来帮助自动化招聘的系统。机器学习被用来给新候选人的简历打分。为了训练模型,亚马逊使用了历史上成功候选人的信息。问题是,由于科技行业男性占主导地位,这些候选人中大多数是男性。其结果是一种不以性别中立的方式评价简历的模式。实际上,它甚至惩罚了“女人”这个词(例如女子足球队的队长)。
这些例子表明,模型可以做出基于性别歧视的预测。与男性同等的女性面临着明显不同的结果。在这种情况下,结果是降低信用额度或拒绝工作申请。这两种结果都可能产生严重的财务影响。总的来说,像这样的模式会增加男女之间的经济不平等。
(来源: flaticon )
模特也可以根据种族进行区分。COMPAS 是美国刑事司法系统使用的一种算法,用来预测被告是否有可能再次犯罪。不正确的预测(即假阳性)可能导致被告被错误监禁或面临更长的刑期。结果发现,黑人罪犯的假阳性率是白人罪犯的两倍。也就是说,黑人罪犯被错误地标记为潜在的惯犯的可能性是普通罪犯的两倍。
这些例子表明,我们可以发现有偏见的算法被用于许多行业的不同问题。这些算法做出决策的规模也是一个问题。一个有偏见的人受限于他能担保的贷款数量或他能定罪的人。一种算法可以被缩放并用于做出所有的决定。最终,一个有偏见的算法的后果可能是消极的和普遍的。
不公平的原因
很明显,它们是不好的,但是我们怎么会得到不公平的算法呢?算法公平实际上是一个有点误导的术语。算法本身并没有固有的偏见。它们只是数学函数。通过在数据上训练这些算法中的一个,我们获得了机器学习模型。引入有偏差的数据会导致模型有偏差。也就是说,我们围绕算法的选择仍然会放大这些偏见。
(来源: flaticon )
数据可能因为不同的原因而有偏差。我们收集的数据将反映历史的不公正,这可以通过一个模型**(历史偏见)来捕捉。就像亚马逊的招聘模式一样,这可能是因为缺乏少数族裔代表(不平衡的数据集)。也可能是由于与种族/性别(代理变量)**相关的模型特征。我们将在下面的文章中更深入地探讨这些原因。
分析和衡量不公平
许多算法公平性研究旨在开发分析和测量不公平性的方法。这可能涉及分析数据以找出上述不公平的潜在原因。它还涉及测量模型预测中的不公平性。
公平的定义
我们可以通过应用不同的公平性定义来衡量预测的公平性。大多数定义涉及将人口分为特权群体(如男性)和非特权群体(如女性)。然后,我们使用评估指标对各组进行比较。例如,根据均等几率的定义,我们要求两组的真阳性率和假阳性率相等。一个有明显不同的费率的模型被认为是不公平的。其他定义包括平等机会和不同影响。
(来源:作者)
探索性公平分析
当你有了最终的模型时,评估公平性并没有开始。这也应该是你探索性分析的一部分。一般来说,我们这样做是为了围绕数据集建立一些直觉。所以,当谈到建模时,你对预期的结果有一个很好的想法。具体来说,为了公平,你想了解你的数据的哪些方面可能导致不公平的模型。
在下面的文章中,我们将带您了解如何进行这样一个探索性公平分析。我们还将更深入地讨论公平的定义,并向您展示如何应用它们。
纠正和防止不公平
如果我们发现我们的模型不公平,我们自然会想纠正它。已经开发了各种定量方法。我们可以将它们分为前处理、中处理和后处理。这取决于在模型开发的哪个阶段应用它们。例如,我们可以调整回归模型的成本函数,以考虑公平性。这将被认为是一种正在处理的方法。
(来源:作者)
定量方法有其局限性。这是因为公平是一个复杂的问题。我们需要将它视为超越我们的数据和模型的东西。最终,我们还需要非量化方法来全面解决不公平问题。这些包括解决根本原因、问题的意识和团队多样性。
我们将在下面的文章中讨论更多的定量和非定量方法。这些包括预处理、加工中和后处理方法的例子。我们还试图更深入地理解这些方法的局限性。
可解释性和公平性
我喜欢写关于算法公平性的文章,但我的大部分文章都是关于可解释的机器学习的。可解释性包括理解模型如何做出预测。公平性和可解释性其实是相关的。这样做的主要原因是它们都是关于在 ML 系统中建立信任。我们将在下面的文章中讨论这一点和另外两个原因。
我希望这篇文章对你有帮助!如果你想看更多,你可以成为我的 推荐会员 来支持我。你可以访问 medium 上的所有文章,我可以得到你的部分费用。
https://conorosullyds.medium.com/membership
图像来源
所有图片均为本人或从 www.flaticon.com获得。在后者的情况下,我拥有他们的高级计划中定义的“完全许可”。
参考
Birhane,a .(2021)算法的不公正:一种关系伦理方法。https://www . science direct . com/science/article/pii/s 2666389921000155
D.佩萨奇和 e .施慕利,算法公平性 (2020),https://arxiv.org/abs/2001.09784
Gal Yona ,关于算法公平性讨论的温和介绍 (2017),https://towards data science . com/A-Gentle-Introduction-to-the-Discussion-on-algorithm-failure-740 BBB 469 b 6
j、文森特、苹果信用卡因歧视女性被调查 (2019)、https://www . the verge . com/2019/11/11/20958953/Apple-credit-card-gender-discrimina tion-algorithms-black-box-investigation
南沃希特-博特彻,技术上错误:性别歧视的应用程序,有偏见的算法,以及其他有毒技术的威胁 (2017),https://www . goodreads . com/book/show/38212110——技术上错误
《卫报》,亚马逊抛弃了偏爱男性从事技术工作的人工智能招聘工具 (2018),https://www . the Guardian . com/technology/2018/oct/10/Amazon-hiring-AI-gender-bias-recruiting-engine
维基百科,算法偏差 (2021),https://en.wikipedia.org/wiki/Algorithmic_bias
什么是 ARIMA 模型?
快速浏览 ARIMA 模特
如果您处理时间序列数据,那么您可能听说过术语 ARIMA。自 20 世纪 70 年代以来,ARIMA 模型一直被用于分析时间序列数据,而且有充分的理由证明它仍然存在;它简单而强大。在这篇博文中,我的目标是为您理解这个模型打下坚实的基础,并希望鼓励您使用它来分析时间序列数据。
一般概念
ARIMA 模型(自动回归综合移动平均的首字母缩写),本质上是创建一个线性方程来描述和预测你的时间序列数据。该等式由三个独立的部分组成,可描述为:
- AR —自动回归:基于过去数据点创建的方程项
- I —整合还是差异:说明数据中的总体“趋势”
- MA —移动平均:基于过去数据点的误差或噪声的等式项
这三个部分共同构成了 AR-I-MA 模型。
ARIMA 的 AR 和 MA 方面实际上来自独立的模型,这些模型可以描述更简化的时间序列数据的趋势。有了 ARIMA 模型,你基本上有能力结合使用这两个模型和差分(即“I”)来进行简单或复杂的时间序列分析。很酷,对吧?
模型的注意事项
在深入挖掘之前,我想指出 ARIMA 模型是在某些假设下起作用的。为了有效地使用 ARIMA 模型,你会想问自己这些关于你想分析的时间序列数据的问题。
- 是否有已知的季节性(周期性趋势)?
- 是否存在大量异常值或零星数据点?
- 关于均值的数据变异是否不一致?
如果你对这些问题的回答是否定的,那么 ARIMA 模式就是适合你的!否则,您可能需要寻找不同的时间序列模型。
了解细节
ARIMA 模型几乎总是被表示为 ARIMA(p,d,q) ,其中每个字母对应于上述三个部分中的一个。这三个字母代表您必须提供的参数,描述如下:
- p 决定自回归(AR)项的数量
- d 决定差分的顺序
- q 决定移动平均线(MA)项的数量
虽然我喜欢这些参数背后的数学,但我不会在这篇文章中解释它。如果您对这些方程的工作原理感兴趣,我强烈推荐您查看我在最后发布的参考资料。现在,我将尝试让您对这三个参数有一个大致的了解。
综合
让我们从 ARIMA 模型中的“我”开始。模型的这一部分说明了整个时间序列数据中出现的一般趋势。d 值是指需要对时间序列趋势进行多少次求导才能得到一条平坦的线(或常数)。
例如,下图显示了 1990 年至 2015 年 4 月平均土地温度的实际数据。注意线性趋势。
如果我们用 ARIMA 模型分析这个数据,我们可能会用 d=1 来解释它的线性趋势。如果趋势是二次的,我们可能必须使用 d=2。
自回归和移动平均部分
ARIMA 模型本质上是递归的,因此依赖于过去的计算。这种递归性质直接来自添加到模型中的 AR 和 MA 方程项。
p 值,或 AR 部分,本质上描述了你的数据点对过去数据点的依赖程度。如果 p=1,那么特定时间的模型输出直接依赖于之前时间的输出。如果 p=2,则输出将依赖于最后两个时间段的输出。
类似地,q 值或 MA 部分使用相同的递归概念。不同之处在于,q 描述了当前输出与其过去的误差或噪声计算的相关程度。因此,如果 q=1,那么当前输出将依赖于过去一段时间的噪声计算。对于 q=2,您的输出将依赖于前两个时间段的噪声。
结论
现在我们已经对 ARIMA 模型及其参数有了一个大致的了解,我们实际上可以看看如何使用该模型进行分析。找出正确的 p、d 和 q 值可能具有挑战性,但拥有正确的工具,如 ACF 和 PACF,会有所帮助。在另一篇文章中,我将通过一个完整的例子来说明如何使用这些工具分析时间序列数据,并展示如何一起找到 p、d 和 q 值。下次见!
参考资料:
- 宾夕法尼亚州立大学 STAT 510 在线课程;应用时间序列分析;https://online.stat.psu.edu/stat510/lesson/1;2021
- 时间序列:自回归模型 AR,MA,ARMA,ARMA 明达张;匹兹堡大学;2018.
什么是人工神经网络?
人工神经网络的直观介绍。
神经网络近年来受到了大量的炒作,这是有充分理由的。有了对这种深度学习理论的基本理解,我们就可以创造出用人类,有时是超人的能力来解决复杂问题的技术。无论是高级信号处理、对象检测、智能决策还是时间序列分析,神经网络都是为您的项目增加智能的一种好方法。在我开始解释神经网络的细节之前,让我讲一个小故事,这个故事应该会对为什么首先创建人工神经网络有所启发。如果你只想直接进入神经网络的细节,那么跳到“生物神经元建模”部分。
投资者、数学家和神经科学家的故事
假设有一位房地产投资者拥有全球数千处房产的数据。这些数据包括每个物业的位置、位置犯罪率、物业平方英尺和人口。他还有每处房产的售价。他想找出每项财产的数据与该财产的销售价格之间的关系。如果他发现了这种关系,他可以将它应用到一个不在他的数据中的新房子上,并找出它的售价。然后他可以很容易地找到比他转卖价格更便宜的房子。
好吧,这就是一个房地产投资者的愿望。不幸的是,他从来都不擅长数学。因此,带着对财富的渴望,他找到了一位数学家来解决他的问题。让我们从数学家的角度来看这个问题。
对数学家来说,我们有一些函数的一系列输入和输出。输入是资产的位置、位置犯罪率、资产平方英尺和人口。产出是房产的销售价格。这个函数就是投资者所指的“关系”,但是数学家看到的是:
*价格是投入的某种函数。这个函数可能很简单,也可能复杂得令人难以置信,我们就是不知道!*图片作者
当数学家不知疲倦地寻找这个函数时,投资者变得不耐烦了。几天后,他失去了他的病人,并与一位更有经验的投资者成为商业伙伴,而不是等待数学家。这位更有经验的投资者非常擅长他所做的事情,他可以出现在房产前,甚至不需要使用小学数学就能给出一个很好的估价。
数学家很尴尬,放弃了手动寻找这个函数。失败后,他问自己,“这个问题怎么这么难用数学来解决,但对有经验的投资者来说却如此直观?”。由于无法回答这个问题,他找到了一位神经科学家,希望了解投资者的大脑是如何解决这个问题的。
神经科学家无法准确回答投资者是如何如此准确地估计价格的,他教数学家大脑中的神经元是如何工作的。数学家然后用数学方法模拟这些神经元。经过年复一年的努力,这位数学家终于发现了如何找出任何两个相关事物之间的关系,包括一处房产的细节和它的售价。然后他利用这些信息赚了一亿美元,从此过上了幸福的生活。
生物神经元建模
正如我们从上面的故事中所看到的,如果我们想要模拟对人类来说如此直观,但却难以置信地复杂的数学模型,我们必须看看人脑是如何做到的。
人脑是由数十亿个神经元组成的。一个神经元的简化是这样的:许多大小不同的信号进入细胞核,如果总的输入信号足够强(它大于特定于该神经元的某个阈值),神经元将触发并输出信号。这个输出信号是另一个神经元的输入之一,这个过程继续进行。请参见下图对此进行形象化描述:
这个阈值在人工神经网络中被称为神经元的“偏差”。图片作者
那么我们如何用数学建模呢?神经元接收许多不同幅度的输入,接收的总信号可以建模为:
*这些 W 变量称为权重。他们给输入信号加上“权重”来改变它们的大小。在大脑中,神经连接具有不同的电阻。这种阻力在生物学上相当于我们模型中的重量。*图片作者
好的,如果总的输入信号大于这个神经元的阈值,那么这个神经元就会触发。或者数学上:
*该阈值称为偏差,标记为 B。如果加权输入之和大于 B,将输出 1。如果它们小于 B,这将输出一个 0。*图片作者
在我们称之为神经元的完整模型之前,我们必须说明一件事。去掉上面等式中的“如果”语句是有益的。我们通过将这个等式的左边传递到所谓的 sigmoid 函数中来实现。让我们来看看我们目前拥有的图形与 sigmoid 函数的图形。
*sigmoid 函数是激活函数的一个例子。目前最流行的是使用 ReLu 函数,但是 sigmoid 函数很容易理解他们最初是如何想到这个想法的,因为它与 step 函数相似。*图片作者
如你所见,sigmoid 函数的行为与我们之前的阶跃函数几乎完全一样。唯一的区别是我们不需要处理那个难看的 if 语句。这个函数现在也是可微的,这很有用,原因我将很快解释。请注意,我们可以在这里使用任何可微函数,只是有些函数比其他函数更好。
下面是我们对神经元的最终数学表示。
Z =所有输入的加权和-神经元的偏差。然后,我们将 Z 传递给 sigmoid 函数,以获得输出。图片作者
我们现在可以更新神经元的图片,以符合我们的数学模型:
图片作者
组合多个神经元
现在我们理解了一个神经元的工作方式,并且我们已经用数学方法模拟了它。正如我之前所说,人脑由数十亿个神经元组成。这数十亿个神经元都与其他神经元相互发送和接收信号,形成了一个神经网络。
让我们放大一个神经元。这个神经元接收一串输入,然后向一个或多个其他神经元发送信号。这些神经元都做同样的事情,从神经元接收一系列输入,然后向更多的神经元发送信号。大脑可以被认为是一个由相互连接的神经元组成的复杂的大网络。
当我们对神经网络进行数学建模时,我们给这个网络带来了一些秩序。最常见的是,我们将神经元组织成层。每一层接收来自前一层的输入,并将输出发送到下一层。我们让最后一层(输出层)有一定数量的神经元=我们想要的输出数量。下面是一个人工神经网络(神经网络的数学模型)的例子,有 2 个输出和 3 个输入:
*您将在实施中看到,权重可视为一个矩阵。*图片作者
回到我们的房地产投资者的问题,他拥有的关于房地产的数据将是输入,而房地产的价格将是输出。回想一下,他总共有 4 个输入,并希望这些输入告诉他价格。现在,问问自己第一层和最后一层的神经元数量应该是多少,4 个输入 1 个输出。
你的答案第一层应该是 4,最后一层应该是 1。但是,我们应该在中间放多少神经元呢?我们应该有多少层?这是精确的数学停止和尝试和错误进来的地方。我们称这些值为超参数。每个问题的最佳层数和每层中神经元的数量是不同的,这只是你需要测试的东西。一般来说,增加层的数量和每层中的神经元数量将使神经网络更加健壮。但是如果你有太多的层和神经元,那么网络将会过度适应你的数据并简单地记忆输出。
人工神经网络背后的基本思想
所以,我们有一个神经网络的数学模型。*我们实际上是如何让这个东西工作的?*在给定输入的情况下,我们如何让这个网络真正给出我们想要的输出?帮我一个忙,让你的大脑进入海绵模式一秒钟,想想下面这个非常大胆的说法。
如果在输入中给定足够的信息,并且给定一个足够健壮的架构,存在一些权重集合,将使神经网络给出我们想要的输出。我们的目标是找到这些重量。
我们可以说,对于任何两个相关的事物,都有一些复杂的函数来模拟它们之间的关系。这是数学家试图用手找到的函数。这两个相关的东西是关于房产和房产售价的所有数据。事实证明,如果我们的神经网络中有一组正确的权重,我们就可以复制这种关系。
通过一些微积分和代码,我们可以在眨眼之间找到这些权重。然而,寻找这些权重的过程是神经网络和人工神经网络各自采取不同路径的地方。我不确定是否知道真正的神经网络如何学习,但使用微积分和数据,我们可以让我们的人工神经网络找到权重,如果可能的话,将输入映射到输出。
关于寻找这些权重或训练我们的神经网络的文章贴在这里。
感谢您的阅读!如果这篇文章在某种程度上帮助了你,或者你有什么意见或问题,请在下面留下回复,让我知道!此外,如果你注意到我在某个地方犯了错误,或者我可以解释得更清楚一些,那么如果你能通过回复让我知道,我会很感激。
这是一系列文章的继续,这些文章从头开始对神经网络进行了直观的解释。其他文章请参见下面的链接:
第 1 部分:什么是人工神经网络
什么是方差分析,我们什么时候使用它?
附有示例的综合指南
马库斯·斯皮斯克在 Unsplash 上的照片
推断统计学中的两个基本概念是总体和样本。推断统计的目标是根据样本推断总体的属性。
总体是一组中的所有元素,而样本是指总体中随机选择的子集。收集群体数据并不总是可行或可能的,因此我们使用样本进行分析。
例如,美国的大学生是一个群体,在美国随机选择的 1000 名大学生是这个群体的一个样本。
将样本分析结果直接应用于整个人群是不可靠的。我们需要系统的方法来证明样本结果适用于总体。这就是我们需要统计检验的原因。他们评估样本结果真实代表总体的可能性。
想想我们做的关于肥胖的研究项目。在我们的项目范围内,我们希望比较两个不同国家(A 和 b)20 岁的人的平均体重。由于我们无法收集人口数据,因此我们抽取样本并执行统计测试。
我们设置零假设和替代假设如下:
- 零假设(H0):两组的平均体重没有差异。
- 替代假设(H1):两组的平均权重不同。
两组比较时, t 检验优于 ANOVA 。然而,当我们有两个以上的组时,t 检验不是最佳选择,因为需要执行单独的 t 检验来比较每一对。
假设我们正在比较三个国家,A、B 和 C。我们需要对 A-B、A-C 和 B-C 对进行 t 检验。随着组数量的增加,这变得更加难以管理。因此,我们选择方差分析。
在比较三组或更多组的情况下,ANOVA 是优选的。方差分析有两个要素:
- 各组内的差异
- 组间差异
方差分析结果基于 F 比率,其计算如下:
f 比率(图片由作者提供)
f 比率是组间变异和组内变异之间比较的一种量度。
较高的 F 比值表明组间的差异大于组的个体差异。在这种情况下,更有可能的是各组的平均值不同。
相比之下,在 F 比值较低的情况下,组内个体差异大于组间差异。因此,我们可以得出结论,一个群体中的元素是高度不同的,而不是整个群体。
F 比率越大,各组具有不同均值的可能性越大。
我们已经讨论了方差分析背后的直觉,以及它通常在什么时候使用。下一步是做一个例子。我们将使用 R 编程语言来执行 ANOVA 测试。
rnorm 函数基于给定的平均值和标准变化值,生成从正态分布中采样的数字数组。
> rnorm(5, mean=10, sd=3)
[1] 8.624795 8.431731 10.570984 7.136710 11.801554
我们将使用 rnorm 函数来生成示例数据,然后在数据框中堆叠组。
> A = rnorm(100, mean = 60, sd = 5)
> B = rnorm(100, mean = 71, sd = 10)
> C = rnorm(100, mean = 65, sd = 7)
> groups = stack(data.frame(cbind(A, B, C)))
分组数据框(图片由作者提供)
values 列包含值,ind 列显示它属于哪个组。ANOVA 测试使用 aov 函数完成:
> anovaResults = aov(values ~ ind, data = groups)
方差分析测试结果(图片由作者提供)
- f 值为 58.56,表明各组不同。大于 1 的 f 值表示至少一个组不同于其他组。
- p 值非常小,表明结果具有统计学意义(即不是由于随机机会产生的)。通常,p 值小于 0.05 的结果被认为具有统计学意义。
- Df 是自由度。第一行是组间差异,第二行是组内差异,计算如下:
(图片由作者提供)
让我们用平均值非常接近的组来做另一个例子。
> A = rnorm(100, mean = 70, sd = 5)
> B = rnorm(100, mean = 71, sd = 6)
> C = rnorm(100, mean = 70, sd = 7)
> groups = stack(data.frame(cbind(A, B, C)))
> anovaResults = aov(values ~ ind, data = groups)
方差分析测试结果(图片由作者提供)
在这种情况下,我们为每组选择了相同或非常接近的平均值。结果,f 值非常小,这证实了各组没有不同。
我们在示例中所做的是单向 ANOVA 测试,它基于一个独立变量比较三个或更多组的平均值。还有一个双向 ANOVA 测试,它基于两个独立变量比较三个或更多组。
结论
方差分析是一种确定组的平均值是否不同的方法。在推断统计学中,我们使用样本来推断总体的性质。方差分析等统计检验帮助我们判断样本结果是否适用于总体。
t 检验和方差分析的区别在于 t 检验只能用于比较两组,而方差分析可以扩展到三组或更多组。
方差分析也可以用于机器学习的特征选择过程。可以通过进行 ANOVA 测试来比较这些特征,并且可以从特征集中消除相似的特征。
感谢您的阅读。如果您有任何反馈,请告诉我。
什么是“人工通用智能”?
人工智能概论第一部分
一扇通往我们人性的窗户。来源:通过 Unsplash 附身摄影。
“在某个地方,一些不可思议的事情正等着被人知晓。”
卡尔·萨根
关于这个系列
你好。
我的名字是迈克·费格森,我是麻省理工学院大脑和认知科学(BCS)系的一名研究软件工程师。在我的大学时代,我是弗吉尼亚大学一门新颖的计算机科学课程的创造者和讲师,研究人工智能、神经科学和哲学的交叉。这门课程名为 CS 1501:人工智能,在弗吉尼亚大学教授了三个学期,有近 150 名学生,甚至获得了弗吉尼亚大学 CS 学院的教学奖。在我为缺乏简单易懂、简明扼要、触及相关问题的 AGI 介绍而烦恼之后,我有了将这门课转变成一系列博客的想法。
意识的本质是什么?传说中的图灵测试是什么,它会按计划进行吗?超级智慧会消灭人类吗?AGI 会摧毁还是改善经济?这些是人类必须提出的一些最重要的问题,可能会决定我们的命运。我不假装知道答案;我的希望只是强调跨学科合作的必要性,并强调哲学和认知科学如何能够阐明甚至回答棘手的计算机科学问题。
这个新的网络系列将通过查看人工智能的一个特定超集来介绍这些问题:人工通用智能——或通用人工智能。在大约 13 篇帖子中,我将把我教的弗吉尼亚大学的课转变成一个可消化的长篇故事,介绍和解释 AGI 的关键概念——从基础认知科学到心灵哲学和超智能。我们将探索神秘的意识领域,遍历认知架构的文献,并消化超智能的问题,敬请关注。对于任何对人工智能的神经科学、哲学难题的应用感兴趣的人,或者想知道天网是否真的可能的人,你找到了正确的地方。我这门课的目标是广度,所以这门“课”涵盖了很多——然而,“AGI 问题”有很多方面,我希望尽我所能介绍它们。
每周/每隔一周(我希望)会有一个新帖子出来,如果有问题、评论或澄清,可以随时给(mferg@mit.edu 发电子邮件。尽情享受吧!
免责声明:毫无疑问,有些人更有资格就我将涉及的问题和主题进行深入的讨论,从情感到神经形态计算。对于这些人来说,这个系列只是对这些主题的介绍,因此,如果为了简洁而省略或浓缩了一些内容,请见谅。我真的只是想要这个系列,以及激发它的课程,作为一个相关 AGI 主题的调查,这些主题通常在学习人工智能或人工智能时不会被教授。还要注意:这个系列与麻省理工学院或其品牌没有任何关系——我只是喜欢写一些我感兴趣的东西,麻省理工学院并不正式认可这里陈述的观点。
第一部分:什么是智能?
剧透:我们仍然不能同意。
心理学家 R.J .斯滕伯格曾经说过“……似乎有多少专家被要求定义智力,就有多少智力的定义。”另一位心理学家 E. Boring 说:“智力是通过智力测验来衡量的。”
据我所知,没有一个公认的定义,这使得我们制造和/或理解 AGI 的探索只是稍微复杂一点,因为我们不知道到底是什么智能。如果人们不能就热狗的构成达成一致,你就无法制造出识别热狗的探测器。啊,真是一团糟。
好消息是智慧的九头蛇确实对我们有些仁慈。在一篇很有影响力的论文中,AGI 大学的研究员 Marcus Hutter(我们将在这个系列中经常看到他)总结了几十个智力的历史定义,试图回答上面提出的问题。下面我转录了一些我认为很好的,真正强调了从心理学和计算机科学的角度处理这个问题的区别:
图 1:智能的各种定义。请注意,从人工智能的角度来看,重点是用有限的资源完成目标。原图。
同样,没有一个一致的定义,但在试图就什么使一个人“聪明”达成一个合理的想法时,有一些事情需要注意。首先,在人工智能的定义中,非常强调在有限的问题空间中实现目标的能力。这与强调适应环境和理性思考的心理学观点形成对比。这种二分法将在本系列的后面进行更深入的探讨,但是现在重要的是再次看到,关于什么是智力有许多观点。
还有一种叫做 G 因子(不是衡量你有多流氓)的东西,它试图将我们人类认为的智力捕捉到一个单一的数字中。早在 1916 年,心理学家刘易斯·特曼就引入了智商的概念——用心理年龄除以生理年龄来计算。一般能力,被定义为心理测量的 g (G-Factor) ,来源于人口中各种认知测试分数正相关的经验事实[4][5]。那么,简而言之,这种一般智能, g ,是一种试图捕捉我们认为使人“聪明”的不同动态的东西——比如工作记忆表现、流体推理、视觉空间处理、数字推理和整体知识。所以从理论上讲,一个人在测试工作记忆(你能记住多少单词?)、视觉空间推理(系列的下一个矩阵是什么?),或者以下字段的其他测试将被视为智能。
在流行文化中,魔方通常是智力的代表。资料来源:Olav Ahrens rtne viaun splash。
好了,我们似乎对智力有了一个坚实的概念,并且有了一个好的、简洁的方法来量化它。对吗?也许不是。
最常见的测试是 WAIS-4/WIS-C 测试,通常被认为是测量某种程度的 g. 尽管对智商测试有许多异议,但它们值得一提:
- 智力测试也被指责不公平地按照种族、性别、阶级和文化对应试者进行分层;降低创造力、性格和实际知识的重要性;以及宣传这样一种观点,即人与生俱来就具有不可改变的智力天赋,这种天赋决定了他们一生的成功。[7]
- [批评者]指出,智商测试更多的是衡量以前学到的技能和知识,而不是潜在的天生能力,许多参与者只是不习惯于静坐和服从命令(这种测试需要的条件),尽管他们在现实世界中表现良好。——APA 心理学词典[8]
然而,传统上,智商分数与人生成功呈正相关(极具争议,仍然是一个有争议的问题),所以你们门萨书呆子可能真的有一些东西可以吹嘘了…
爱因斯坦的智商估计在 160 到 200 以上。来源:安德鲁·乔治 via Unsplash 。
另一种有科学依据的智能“品种”是流动智能和*结晶智能。*总的来说,流体智力是由动态的技能组成的,如(工作)记忆、处理速度,通常包括推理、分析和解决问题的能力[10]。它也会随着年龄的增长而减少。这与结晶智力形成对比,结晶智力是利用先前的知识解决问题的能力,通常通过经验和教育获得。传统上,这随着年龄的增长而增长(希望你获得更多的知识和智慧)。
阅读是增加智力结晶的好方法。资料来源:艾娃溶胶 via Unsplash 。
最后,你可能听说过哈沃德·加德纳博士的多元智能理论,解释如下。这已经引起了相当多的争议,但在讨论智力时也值得一提。
根据这一理论,有 9 种“智力类型”[11]:
- 空间:在 3D 中可视化世界。
- 自然主义者:了解生物,阅读自然。
- 音乐:辨别声音,它们的音高、音调、节奏和音色。
- 逻辑/数学:量化事物,提出/证明假设。
- 个人内部:了解你自己,你的感觉/想要什么。
- 人际关系:感知人们的感觉和动机。
- 语言学:寻找合适的词语来表达。
- 存在主义:接受大问题。
- 身体动觉:协调你的思想和你的身体。
那是一阵旋风。情报混乱。有许多不同的类型,甚至心理学内部也没有就它到底是什么达成一致。对我们来说,这是个坏消息,因为这表明我们正试图为一个我们甚至可能不知道正确答案的问题创造一个解决方案。然而,我们可以尝试收敛于类似于人类智能的东西…
第二部分:是什么让 GI 如此难以复制?
我们在寻求一个无法实现的目标吗?
你现在可能会问:天哪,迈克,我只是想了解一下 AGI。为什么所有这些关于智力的讨论都是相关的?嗯,除非我们知道什么样的智能是智能,否则我们不可能希望将某样东西认定为人工智能(或者就此而言,人工智能一般是智能)。这是一个常见的主题,会在本课程中多次出现,包括意识、情绪、感觉等…
好吧,那么,问题是现在的机器真的擅长于缩小的任务,因为人工智能在特定领域表现出色,如玩围棋、垃圾邮件检测,以及(令人惊讶的是)Spotify 播放列表推荐。然而,计算机现在缺乏将知识推广到其他领域的能力,也没有显示任何程度的 g (目前还没有)。这是问题的核心,牛津哲学家尼克·博斯特罗姆(他将在后面多次出现)说得很好:
计算机科学家唐纳德·克努特(Donald Knuth)惊讶地发现,“到目前为止,人工智能已经成功地做了几乎所有需要‘思考’的事情,但却未能做大多数人和动物‘不用思考’就能做的事情——不知何故,这要困难得多!"
快速绕过术语,好像我们不弄清楚这一点,就知道以后会一团糟。传统上,机器学习(ML)是人工智能的子集,而人工智能是 AGI 的子集(或者,取决于谁在问,这是实现 AGI 的一种方式)。AGI 是最广泛的类别,包含人工智能和人工智能,传统的或通俗的人工智能通常被称为“窄人工智能”或“弱人工智能”:智能处理单个窄领域的系统的开发[6]。今天对人工智能的很多关注都在这个狭义的人工智能中,比如计算机视觉、深度学习和 NLP。人工智能研究员斯坦·富兰克林说
在大约 10 年内(1957 年后),人们非常清楚地认识到,要让这种“强人工智能”成为现实,人工智能必须克服的问题是巨大的,也许是难以解决的。
这让我们 AGI 人放心了…
好了,不管怎样:我们可以找到一些关于 AGI 的很好的定义,现在我们有了一个很好的智力背景。当被问及一个问题时,我们会像现代历史上所有伟大的人一样做:我们看维基百科:
- **维基百科:**人工通用智能(AGI)是机器的智能,它可以理解或学习人类可以完成的任何智力任务。
我认为这是一个相当坚实的定义,抓住了 AGI 是什么的高层次的想法,它只是缺乏一个更深层次的基础,一个 AGI 学会,以及本·戈泽尔博士触及到的基础:
- **AGI 社会:**智能堪比人脑的通用系统(或许最终会远远超出人类的一般智能)。
- Goertzel: 创造出能够执行特定“智能”行为的系统,这些行为可以与人类的行为相媲美,甚至更好”[2]。
AGI 会按照我们的形象制造吗?这个问题我们会再讨论。资料来源:Kendrick Mills viaun splash。
对于本课程和博客系列,我认为下面的定义非常好,可以很好地为我们服务。这可能就是你来的目的:
- 智力:学习新信息并运用这些知识以创造性和实践性的方式解决新问题的能力。
- AGI 的 :人工合成的人类级别的普通智能,可以做人类能做的任何认知任务。在不同领域表现出广泛的智力,在大多数(如果不是全部的话)解决问题的领域与人类一样好(或者更好)。
再说一遍,我认为这些都很好,可以作为我们未来的良好指南,这也是我在剩下的课程中提到 AGI 时的意思。如果你是一个专业的情报研究者,并且你对此有意见(不要责备我),让我知道,我们可以修改!但我认为目前来看已经足够好了【T11:)
第三部分:AGI 必须能够做什么?
希望不要消灭人类…
Goertzel 博士称之为核心 AGI 假说。
创建和研究具有足够宽(例如人类水平)范围和强概括能力的合成智能本质上不同于创建和研究具有明显更窄范围和更弱概括能力的合成智能。
基本上,这表明制造和研究 AGI 在许多方面与狭义人工智能完全不同——从研发到伦理再到部署。Goertzel 再次为我们展示了它[2]:
“AGI”这一概念和术语背后的特定目的是关注某些智能系统的一般范围和概括能力,例如人类、理论系统如 AIXI (Hutter,2005)以及潜在的未来合成智能的子集。
也就是说,粗略地说,AGI 系统是一种类型的合成智能,可以将其知识应用于各种各样的任务和领域。
更广泛地说,许多人认为 AGI 应该能够做这样的事情:
- 所有任务都有固定的结构。
- 实现一个符号系统。
- 代表并有效地使用特定模态的知识。
- 代表并有效使用大量不同的知识。
- 代表并有效使用独立于当前认知的信念。
- 展现并有效使用丰富的、层次化的控制知识。
- 展现并有效运用元认知知识。
- 支持无限和有限的审议范围。
- 支持,多样,全面的学习。
- 支持渐进式在线学习。
…我认为这是一个进行研究和开发的公平场所,许多人都在积极地追求它。
第四部分:结论
TL;速度三角形定位法(dead reckoning)
智力是混乱的,它有许多定义。简而言之,AGI 对人工智能进行了扩展,试图包含一种概括能力,即在广泛的领域内,在智力任务方面与人类一样好,甚至更好的能力。
我们怎么知道什么时候是真正的 AGI?来源:通过 Unsplash 的着魔摄影。
“采取明智的行动需要比智力更多的东西.”
――陀思妥耶夫斯基,《罪与罚》
关于作者
Mike Ferguson 是麻省理工学院 DiCarlo 实验室的计算研究开发人员。他将研究大脑评分,这是一种测量神经网络有多像大脑的工具。他将于 2021 年春天从弗吉尼亚大学毕业,获得计算机科学和应用数学学士学位,以及认知科学和哲学学士学位。他是《一周挑战》一书的参与者,在两年内阅读了超过 138 本关于人工智能、哲学以及对人类意味着什么的书籍。他和他的矮胖的伯恩山犬 boi Winston 住在弗吉尼亚州的夏洛茨维尔。
参考资料:
- 莱格,谢恩和马库斯·哈特。"智力定义的集合."人工智能与应用前沿 157 (2007): 17。
- 戈泽尔本。"人工智能:概念、现状和未来展望."人工通用智能杂志 5.1(2014):1–48。
- 特殊儿童的心理卫生。教育学院 22.4(1915):529–537。
- 查尔斯·斯皮尔曼。“‘一般智力’是客观确定和测量的。”(1961).
- 《g 因素:心理测量学和生物学》诺华基金会研讨会。奇切斯特;纽约;约翰·威利;1999, 2000.
- 人工一般智能的基础架构。人工智能进展:概念、架构和算法 6 (2007): 36。
- 【https://www.apa.org/monitor/feb03/intelligent
- https://dictionary.apa.org/iq
- https://www . thoughtco . com/fluid-crystallized-intelligence-4172807
- 《评估人类智能系统的主张和挑战》第二届人工通用智能会议论文集(2009)。亚特兰蒂斯出版社,2009 年。
- 9 种智力类型—信息图表(adioma.com)
什么是贝叶斯推理?
通过一个经典的掷硬币的例子,从直观的解释到数学理论
说明我们的先验知识如何影响我们的后验知识。图片作者。
内容
这篇文章是我将要发表的一系列文章的一部分。你可以通过点击这里在我的个人博客上阅读这篇文章的更详细版本。下面你可以看到该系列的概述。
1.机器学习导论
- (一)什么是机器学习?
- (b)机器学习中的模型选择
- ©维度的诅咒
- (d)什么是贝叶斯推理?
2.回归
3.分类
频率主义和贝叶斯主义的区别
正如本系列第一篇中提到的,机器学习主要关注预测,可以想象,预测非常关注概率。在这篇文章中,我们将探讨概率的两种主要解释:频率主义和贝叶斯主义。
概率的频率主义(或经典)定义是基于事件的频率,而概率的贝叶斯定义是基于我们对事件的了解。在机器学习的背景下,我们可以将这种差异解释为:数据所说的与我们从数据中知道的。
类比:手机丢在哪里了?
为了理解这意味着什么,我喜欢用这个类比。假设你把手机丢在家里的某个地方了。你用你朋友的电话打电话给你的手机——当它打电话的时候,你的手机开始响(它不是振动的)。你如何决定,在家里的什么地方找你的手机?
常客会用他们的耳朵来识别声音最可能来自的区域。然而,贝叶斯也可以使用他们的耳朵,但除此之外,他们还会回忆起他们以前在家里的哪些地方丢失了手机,并在推断去哪里找手机时将这一点考虑在内。
频率主义者和贝叶斯都使用他们的耳朵来推断在哪里寻找手机,但是贝叶斯也将关于丢失手机的先验知识结合到他们的推断中。
贝叶斯定理
为了利用贝叶斯理论,我们需要谈谈贝叶斯定理。假设我们有两组结果 A 和 B (也称为事件)。我们分别表示每个事件的概率 P(A) 和 P(B) 。两个事件的概率用联合概率 P(A,B) 来表示,我们可以用条件概率来扩展它
即 A 给定 B 的条件概率和 B 的概率给我们的是 A 和 B 的联合概率。因此
也是。因为(1)和(2)的左边是相同的,所以我们可以看到右边是相等的
这就是贝叶斯定理。这对你来说应该很熟悉——如果不是,我建议你在继续学习之前先阅读一些概率论的基础知识。
这可能不是很清楚,为什么这在机器学习中如此重要,所以让我们用一种更“数据科学”的方式来写贝叶斯定理:
证据(上面的分母)确保左侧的后验分布是有效的概率密度,并被称为归一化常数。因为它只是一个归一化常数,所以我们经常用文字表述这个定理
其中∝表示“成比例”。
例子:抛硬币
我们从开始,一个简单的例子,我认为它很好地说明了频率主义者和贝叶斯方法之间的区别。考虑以下问题:
一枚硬币以概率θ正面朝上,以概率 1θ反面朝上(其中θ未知)。你掷硬币 11 次,结果是正面朝上 8 次。现在,你打赌接下来的两次投掷会正面朝上吗?
设 X 是代表硬币的随机变量,其中 X=1 是正面, X=0 是反面,这样 P(X=1)=θ 和*Pr(X = 0)= 1-θ。*再者,让 D 表示我们的数据(8 头,3 尾)。
现在,我们要估计参数 θ 的值,这样就可以计算出连续看到 2 个头的概率。如果概率小于 0.5,我们将打赌不会连续看到 2 个头,但如果高于 0.5,我们就赌。
那么一个常客和贝叶斯会怎么做呢?
频繁主义方法
作为频率主义者,我们希望最大化可能性,也就是问这样一个问题:给定 θ ,什么样的 θ 值将最大化我们得到 D 的概率,或者更正式地说,我们希望找到
这就是所谓的最大似然估计。
11 次抛硬币遵循二项分布,其中 n=11 次尝试, k=8 次成功, θ 成功的概率。使用二项式分布的可能性,我们可以找到使数据概率最大化的 θ 的值。因此,我们希望找到最大化的 θ 的值
注意,(3)表示给定 D 的 θ 的可能性,和说给定 D 的 θ 的概率不一样。下图显示了我们的似然函数 P(D∣θ) (作为 θ 的函数)和最大似然估计。
可能性函数 *P(D∣θ)的图示,在最大可能性估计处有一条垂直线。*图片作者。
不出所料,使可能性最大化的 θ 的值是 k/n,即试验中成功的比例。因此,最大似然估计为 k/n = 8/11 ≈ 0.73。
假设抛硬币是独立的,我们现在可以计算连续看到两个头的概率:
既然连续看到 2 个头的概率大于 0.5,我们就赌!
贝叶斯方法
作为贝叶斯,我们希望最大化后验,所以我们提出这样一个问题:给定 D ,什么样的 θ 值会最大化 θ 的概率?形式上,我们得到
这被称为最大后验概率(MAP)估计。为了回答这个问题,我们使用贝叶斯定理
由于证据 P(D) 是不依赖于 θ 的归一化常数,我们可以忽略它。这给了我们
在频率主义方法中,我们已经发现了可能性(3)
这里我们可以去掉二项式系数,因为它不依赖于 θ 。**唯一剩下的就是先验分布 P(θ) 。这个分布描述了我们对 θ 的初始(先验)知识。**一个方便选择的分布是贝塔分布,因为它定义在区间[0,1]上,而 θ 是一个概率,必须在 0 和 1 之间。这给了我们
其中γ是伽马函数。由于分数不依赖于 θ ,我们可以忽略它,这样我们就得到
请注意,我们最终得到了另一个 beta 分布(没有归一化常数)。
**现在我们的工作是以这样一种方式设置先验分布,即在看到数据之前,我们结合我们所知道的关于 θ 的信息。**现在,我们知道硬币通常是相当公平的,如果我们选择 α=β=2 ,我们会得到一个比 θ=0 或 θ=1 更倾向于 θ=0.5 的β分布。下图显示了该先验 Beta(2,2)、归一化似然性以及由此产生的后验分布。
先验 P(θ) 、似然 *P(D∣θ)和后验分布 P(θ | D)的图示,在最大后验估计值处有一条垂直线。*图片作者。
我们可以看到后验分布最终被拉向前验分布,这使得 MAP 估计与 MLE 估计略有不同。事实上,我们得到了
这比最大似然估计值低一点——如果我们现在使用地图估计值来计算连续看到两个头的概率,我们会发现我们会赌它不赢
此外,如果我们选择 α=β=1 ,我们会得到贝塔分布是均匀分布的特殊情况。**在这种情况下,我们的 MAP 和 MLE 估计是相同的,**而且我们做了同样的赌注。下图显示了不同的 α 和 β值的先验、似然和后验概率。
作为改变 α 和 *β的结果的先验和后验分布图。*图片作者。
完全贝叶斯方法
虽然我们在之前的方法中包括了先验分布,但我们仍然将分布折叠成点估计,并使用该估计来计算连续两个头的概率。在真正的贝叶斯方法中,我们不会这样做,因为我们不只是对 θ 有一个单独的估计,而是一个整体分布(后验)。
让 H 表示连续看到两个头的事件——然后我们问:给定数据,即 P(H∣D) ,看到两个头的概率是多少?
要回答这个问题,我们首先需要找到(4)中后验分布的归一化常数。因为它是一个贝塔分布,我们可以看(4)并且看到它一定是
像前面一样,我们也假设掷硬币是独立的,这意味着连续看到两个正面的概率(给定 θ 和数据 D )正好等于看到正面平方的概率,即 P(H∣θ,D)=θ 。
我们现在可以通过“积分出” θ 来回答这个问题
在这种情况下,如果我们选择一个均匀先验,即 α=β=1 ,我们实际上得到 45/91≈0.49,所以即使我们选择一个均匀先验,我们也会下注。其原因更加复杂,并且与均匀先验不是完全不可知的有关。
此外,我们还做了一个隐含的决定,不更新我们预测的两次投掷之间的后验分布。你可以想象,在第一次投掷硬币后,我们将获得关于硬币公平性的知识(关于 θ ,我们可以用它来更新我们的后验分布。然而,为了简化计算,我们没有这样做。
摘要
- 频率主义基于事件的频率。
- 贝叶斯主义基于我们对事件的了解。
- 在之前的代表你在看到数据之前对参数的了解。
- 似然是参数的数据给定值的概率。
- 后验是给定数据时参数的概率。
- 贝叶斯定理联系了先验、似然和后验分布。
- MLE 是最大似然估计,这是 frequentists 用的。
- MAP 是最大后验估计,这是贝叶斯人用的。
什么超出了我们的模型?
我们探索一个完整软件解决方案的架构:部署一个 Python 模型,从用户界面到与模型的连接并获得结果。
泽维尔·冯·埃拉赫在 Unsplash 上的照片
背景
长期以来,特别是在我们对机器学习挑战领域的探索阶段,我们专注于寻找一种模型,从特定状态的数据开始,可以在我们认为可接受的准确范围内获得结果。
嗯,获取模型的工作领域是如此广泛、复杂,而且本身就很吸引人,以至于我们会忽略软件解决方案中涉及的其他组件。
因此,我们的模型将被另一组问题所包围,这些问题与我们开发的模型本身一样复杂、广泛和有趣,例如:
- 提取和转换数据,以获得与我们开始时相似的数据集
- 模型在生产中的部署
- 数据收集和后续验证,以监控和纠正我们的初始模型。
然后我们会遇到 ETL 、数据角力和 MLOps 的字段。
作为数据科学家,仅仅找到能够解决挑战的模型已经不够了;我们至少要考虑所有这些相关领域的可行性。
让我们假设我们设法保护了数据收集管道。
假设我们在特征工程管道中保护自己免受新案例或异常数据的影响。
让我们假设我们获得了一种有效的方法来将其投入生产并存储数据集,并且我们可以监督模型行为。
唉!似乎我们已经计划好了一切。对吗?
大概不会!
可能我们缺少与用户交互的软件来展示预测结果。有时我们的模型会与复杂的环境联系起来。需要在它们之间创建一个 API,以便模型可以显示其结果;有时有必要开发软件来使用我们的模型。
本文将在一个测试案例中呈现一个完整的解决方案;所使用的组件和工具可以根据任何其他类型的语言、库和架构而改变。
使用案例
我们从一个用 Python 开发的模型开始,它接收一个 CSV 并返回一个 Excel 文件,添加一个包含预测结果的列。
我们需要在服务器中部署这种模型,并开发一个用户界面:
- 登录用户
- 允许用户从任何来源选择适当格式的 CSV 文件,并将其上传到模型。
- 向用户显示一个面板,显示所有上传的文件及其状态(已处理、失败、进度)。
- 当模型完成处理时通知用户。
此外,我们将把模型封装在 API 中,由其他软件作为服务调用。
溶液结构
提议的解决方案由六个组件和三个接入点组成。
组件按外观顺序排列:
1)用户界面(WordPress + PHP)
2)数据库(MySQL)
3)服务器中的存储库,用于存储输入和输出数据集
4)调度程序(cronJob)用于调度待处理作业的搜索并调用模型
5)用于模型执行的 API(Pyhton—uvicone—Starlette)
6)Python 中的机器学习模型
系统的访问点有:
a)用户,当向应用程序上传新数据集时
b)调度程序,当检测到要处理的作业时
c)具有正确凭证的某人想要专门调用模型的 API 来直接处理数据库中注册的数据集。
作者图片
这个想法是用户通过界面上传一个 CSV 文件进行处理。
组件 1 允许并控制 CSV 是否正确。它将数据库中的作业保存为“待定”状态,并将数据集存放在输入存储库中。
然后,调度程序每隔“x”次检查一次是否有未完成的作业,接受它,并改变到“进行中”状态,调用调用模型的函数。流程的结果存储在输出存储库中,将任务的状态更新为“已处理”
从用户面板(第 1 点)中,您可以检测有错误的作业,将其从作业列表中删除、存档或重试。
组件
1 —用户面板
用户面板在 Wordpress 中开发,通过一个插件访问和管理用户:
作者图片
访问后,该面板有一个标题,用户可以在其中选择一个在其结构中经过验证的数据集,然后将其作为待定项加载到数据库中,并将其留在输入存储库中。
2 —数据库
作者图片
选择的数据库是 MySQL
记录任务的表“wp_records”具有以下结构
3 —数据存储库
输入和输出存储库是服务器上定义的两个目录,文件作为任务表中生成的条目保存在其中。
一旦 Python 模型处理数据集并返回一个 CSV 格式的结果,它将保存在输出目录中。
4 —调度程序执行
以下代码(process_files)说明了如何处理文件,打开数据库(open_db),查找是否有处于“待定”状态的任务,如果有,则获取其中的第一个任务并调用预测过程(process_file)。
import mysql.connector as mysql
from mysql.connector import Error
from datetime import datetime
from jproperties import Propertiesif __name__ == '__main__':
result = ''
try:
db = open_bd()
cursor = db.cursor()
sql_Query = "SELECT id FROM wp_records WHERE status_file='IN PROCESS'"
cursor.execute(sql_Query)
records = cursor.fetchall()
if (len(records) != 0):
result = 'There are files in progress' + str(records[0][0])
else:
sql_Query = "SELECT id FROM wp_records WHERE status_file='PENDING'"
cursor.execute(sql_Query)
records = cursor.fetchall()
if (len(records) > 0):
id = records[0][0]
**result = process_file(id)**
except Error as e:
result = 'Error ' + e
finally:
if (db.is_connected()):
db.close()
cursor.close()
result = result + ' (BD correctly closed)'
打开数据库的代码有一个配置文件 ConfigFile.properties,其中定义了数据库和访问凭据。
def open_bd():
configs = Properties()
with open('ConfigFile.properties', 'rb') as config_file:
configs.load(config_file)
host = configs.get("HOST")[0]
user = configs.get("USER")[0]
pass = configs.get("PASSWORD")[0]
database = configs.get("DBNAME")[0]
db = mysql.connect(
host = host,
user = user,
passwd = pass,
database=database)
return db
处理特定文件的代码(数据库 id 可能是这样的):
**def process_file(prm_id):**
os.environ['TZ'] = 'America/Montevideo'
time.tzset()
resultado = ''
try:
db = open_bd()
cursor = db.cursor()
sql_Query = "SELECT path_up FROM wp_records WHERE id=%s"
id = (prm_id,)
cursor.execute(sql_Query, id)
record = cursor.fetchone()
input_file = str(record[0])
upd_Query = "UPDATE wp_records SET status_file = 'IN PROGRESS',date_init=%s WHERE id=%s"
today = datetime.today()
params = (str(today),prm_id,)
cursor.execute(upd_Query, params)
db.commit()
outfile = ''
**output_file = predictions.prediction(input_file)**
today = datetime.today()
upd_Query = "UPDATE wp_registros SET status_file='PROCESS OK',path_result = %s,date_result=%s WHERE id=%s"
params = (output_file,str(today),prm_id,)
cursor.execute(upd_Query, params)
db.commit()
resultado = 'OK - File was created [' + output_file + ']'
except Error as e:
result = 'Error ' + e + ' processing id ' + prm_id
finally:
if (db.is_connected()):
db.close()
cursor.close()
result = result + ' (BD closed)'
return result
5—uv icon 和 Startlette API
下面是使用 Uvicorn 和 Starlette 开发 API 的 Python 代码,必须安装(使用 pip install)。
在我们的 API 中,我们部署了三种方法:
- / 验证服务器正在运行,我们的 API 正在工作
- /process_file?id=id_base_data 是一个处理某个文件的方法,我们必须通过参数传递与要处理的文件相对应的任务表的 id(记住,在组件 1 中创建了这个表中的条目,并将数据集下载到存储库中)
- 没有参数的 /process_all 用于搜索斜率的所有条目并进行处理。
from starlette.applications import Starlette
from starlette.responses import JSONResponse
import uvicorn
import connect
import pendings
from datetime import datetimeapp = Starlette(debug=True)
@app.route('**/**')
async def homepage(request):
return JSONResponse({'MySAMPLE': 'It works!'})@app.route("**/process_file**", methods=["GET"])
async def process_file(request):
elid = request.query_params["id"]
before = datetime.today()
**result = connect.process_file(elid)**
after = datetime.today()
return JSONResponse({
"resulta": result,
"Start" : str(before),
"End" : str(after)})@app.route("**/process_all**", methods=["GET"])
async def process_all(request):
before = datetime.today()
**result = pendings.process_files()**
after = datetime.today()
return JSONResponse({
"result": result,
"Start" : str(before),
"End" : str(after)})if __name__ == '__main__':
**uvicorn.run(app, host='0.0.0.0', port=8000)**
通过斜坡运行的代码和处理第 4 项中指定的文件的代码
Python 模型
该模型在应用程序的另一个模块中,因此没有在本文中显示,因为我们的目的不是在这里详述它。
摘要
与之前的文章不同,我们专注于解决特定机器学习挑战的工具和方法,这一次,我们展示了另一部分工作,也许没有那么吸引人,但对于将用例的解决方案转换为完整的解决方案来说是必不可少的。
当然,每个解决方案的架构都是根据问题、客户的现有结构、我们对每个实例的工具的了解或补充我们团队的人员来定义的。
每个阶段都有许多库和工具。
简而言之:谈论与模型相关的其他方面,这些方面可能是完整解决方案所必需的。
什么是大 O 符号,为什么要关注它
根据您的具体情况,选择最有效的算法来处理您的数据。
作为程序员,在开始一个复杂的项目之前,我们经常要做一些原型制作。在这个过程中,我们可能没有写出最有效的代码,但这没关系:更重要的是在尽可能短的时间内达到工作状态。然而,不可避免的是,开始为项目想法的可部署实现编码的时候到了。这意味着可能遗留下来的技术债务现在必须解决。
此外,如果你是一名数据科学家,你经常会发现自己同时处理大量的信息。由于处理大量数据是一项资源密集型且耗时的操作,因此找到解决该问题的最有效方法至关重要。在本文中,我将带您了解大 O 符号及其应用。
在选择算法之前
给定一个问题,有无数种可能的方法来解决它。虽然,只有少数是真正好的。你如何在算法 A 和算法 B 之间做出选择?你得先分析问题。
- 你的代码必须每秒运行多次吗?
- 您计划将您的系统扩展到什么程度?
- 您将处理什么类型的数据?
万一你的程序一次又一次地调用相同的函数,你肯定需要确保它们不会成为整个系统的瓶颈。在这种情况下,即使是很小的速度提升也会产生不同。例如,假设你为你的物理引擎写了一个函数check_collisions()
,运行它需要 20 毫秒。每秒只能计算大约 50 个物理帧。想象一下现在你已经节省了 3 毫秒的执行时间,那已经是每秒 59 帧了。
可伸缩性是另一个需要考虑的重要因素。如果您的应用程序必须处理越来越多的数据,您最好选择一种能够在合理的时间内处理数据并且不需要过多内存的算法。
谈到数据,您是否针对您的具体问题使用了合适的类型和结构?你可以通过预先知道你正在处理的数据来节省大量的内存。例如,如果存储一个人的年龄,就不必使用 4 字节有符号整数。最好只使用一个无符号字节,因为年龄永远不会为负,也不会超过 255 年(单个字节中可以存储的最大数字)。
那么,如何比较不同算法的性能呢?这就是大 O 符号派上用场的地方。
什么是大 O 记数法?
来自维基百科,大 O 符号是一种数学符号,它描述了当自变量趋向某个特定值或无穷大时,函数的极限行为。在计算机科学中,大 O 符号用于根据算法的运行时间或空间需求如何随着输入大小的增长而增长来对算法进行分类。换句话说,它测量一个函数的时间或空间复杂度。这意味着,我们可以提前知道算法在特定情况下的表现。
在开始编写代码之前,在计算算法的时间或空间复杂度时,需要遵循以下简单规则:
- 将你的算法分成单个操作或函数。
- 计算每个操作的复杂度。
- 把产生的大 Os 加起来。
- 移除任何常数和低阶项。只保留最高阶项(增长最快的项),这将是你的算法的大 O。
为了更清楚,让我们看一些具体的例子。对于代码示例,我将使用 Python,因为它有简单的类似英语的语法,任何人都可以理解。此外,我将重点关注时间复杂性,而不是空间复杂性,以保持文章更加简洁。无论如何,同样的规则也适用,所以对我来说详细谈论它似乎有点多余。
恒定时间复杂度
让我们从大 O 符号中的简单情况开始,恒定时间复杂度。看一下这段代码:
完成此计算所需的时间不取决于输入大小。如果数字是 2、60、100 或 1000,运行时间不会增加或减少,至少不会显著增加。使用大 O 符号将其分类为 O(1) ,意味着它具有恒定的时间复杂度。
这同样适用于这个代码片段。改变input_number
不会影响算法的性能。所有运算之和是O(1+1+1+1+1+1)或(6),但可以近似为刚好是 O(1) ,因为 6 是常数。当然,它的执行时间要比前一个例子长,但是大 O 并不测量完成某个任务所花费的精确时间。大 O 是关于衡量算法的性能变化与不断增长的输入大小的关系。
数学运算、赋值、逻辑语句和函数调用都近似于 O(1) ,除非它们的实现也依赖于输入大小。以下是被视为时间常数的常见操作列表:
- 算术运算:
a + b, a — b, a * b, a++ ...
- 变量赋值:
a = 2, a += 3, a -= 4 ...
- 数组索引:
a[0], a[i] ...
其中a
是一个数组,i
是一个整数。 - 函数调用:
foo(), bar(arg) ...
只要它们的运行时间不明显依赖于输入大小。 - 逻辑语句:
a && b, a and b, !a, not a, a || b, a or b ...
- 成员访问:
a.member, a.foo() ...
- 按位运算:
a << b, a | b, a & b, a >> b ...
哈希表也索引分数,平均起来,***【O(1)***像数组。尽管如此,在极少数情况下他们能达到 O(n) 。
迭代时间复杂度
假设您必须迭代数组中的每个元素,例如计算某个特定值出现的次数。
完成任务所需的时间取决于数组元素的数量n
,准确地说是成正比的。这种算法的时间复杂度可以归为 O(n) ,意思是随着n
的增加,运行时间线性增加。
我们可以忽略for
循环中的if
语句,因为它的时间复杂度 O(1) 并不强烈依赖于输入大小。注意,它的性能取决于要比较的字符串的长度,但它没有array
的长度重要,因此可以忽略。请记住,大 O 是在输入大小趋于无穷大时给出算法行为的近似值,而不是精确的测量值。
不断嵌套迭代,指数时间复杂度
假设您必须多次迭代一个数组,例如计算长度为两个字符的所有可能的密码组合,并且只使用从 0 到 9 的数字。
这种算法的运行时间显然取决于可能的字符数。准确地说,它生成了 n 个组合,其中n
是可能的字符数。如果再添加一个字符,程序将不得不在数组n
上迭代更多次。这种方法的时间复杂度得分为 O(n ) 。
如果您要添加更多的for
循环来增加密码的长度,时间复杂度将是***【o(nᶩ】,其中n
是for
循环的数量,l
是可用字符的数量。比如三圈得分 O(n ) ,四圈得分【o(n⁴】***等等。
语句combinations.append(char1 + char2)
通常可以近似为时间复杂度为 O(1) ,尽管其运行时间也可能受到输入大小的影响,这取决于函数的实现。说到 Python 的列表,它们实际上是动态数组,所以它们必须随着增长而调整大小。反正这个话题不在本文讨论范围内,我就不多讲了。
在两个阵列上迭代,线性时间复杂度
假设您现在必须迭代两个数组,以找出它们有多少共同的元素。
该算法的时间要求还取决于要检查的元素的数量n
。对于一个数组中的每个元素,它必须遍历所有其他数组。例如,如果我们向array1
添加元素,程序将不得不再次迭代array2
的每个元素。
由于迭代的总次数是第一个数组的长度乘以第二个数组的长度,将一个元素添加到一个数组中会使迭代次数增加另一个数组的长度,因为f(a,b) = a*b
的偏导数相对于a
是b
,相对于b
是a
。这个算法的大 O 符号应该是 O(ab)* ,但是通过将两个数组中的一个数组的长度视为常数,可以简化为 O(n) 。
如前所述,在计算时间复杂度时,可以忽略if
语句和counter
的增量,因为它们不依赖于输入大小。
嵌套迭代,指数时间复杂度
在给定可变密码长度的情况下,以下算法为给定的字符集生成所有可能的密码组合。
设n
为密码长度,k
为可用字符的常量,该程序执行 nkⁿ* 迭代。这是因为对于外层for
循环的每一次 kⁿ 迭代,n
其他迭代由内层for
循环执行。其他操作可以忽略。
迭代次数的导数 nkⁿ* 为 kⁿ+kⁿnlog(k) ,但可以近似为***【o(nkⁿ】,常写成*【o(n*2ⁿ】***随着输入大小向无穷大增长。
对数时间复杂度
现在让我们来看一个非常流行的算法:二分搜索法。给定一个排序数组,它查找指定元素的索引(如果存在)。
二分搜索法的工作原理是在每次迭代中丢弃数组的一半。不管给定数组的大小如何,这种方法都减少了要快速搜索的元素。它在时间复杂度上得分为 O(log(n)) ,并且由于其对数运行时间,当涉及到大输入大小时,它非常有效。
阶乘时间复杂度
对于大 O 来说,最糟糕的情况之一是阶乘运行时。以这个简单的代码片段为例:
*对于这个函数的每次迭代,factorial
都会被调用多次。这个递归调用导致for
循环被反复执行,直到number
达到零。这种算法确实非常慢,尤其是在高输入数的情况下。这个函数的时间复杂度是 *O(n!)T6。
如何选择合适的算法
当需要解决这个问题时,选择一个合适的算法是很重要的。显然,您应该选择尽可能低的时间复杂度,对吗?其实没那么容易。
根据输入大小和具体实现,an O(n) 甚至可能比 an O(1) 更快。看一下这张图表:
常见大 O 符号情况的图表。
从长远来看,较低的时间复杂度总是比较高的时间复杂度更有效。然而,如果你打算尽可能地优化你的程序,有一点你应该密切注意,一些性能线重叠。
常见大 O 符号情况的图表。
正如你所看到的,在某个阈值以下,这完全取决于情况,一些在大 O 中得分较低的算法实际上比其他在较大输入大小时可能做得更好的算法更有优势。这就是说,在跳上键盘之前,你应该首先深入分析和相关的环境。根据您必须处理的数据,您的算法的图表在这个级别可能会有所不同。
结论
总而言之,为了在这种情况下应用最有效的算法,充分了解您的问题和您的数据是很重要的。当计划构建一个应用程序时,您必须考虑随着用户群和数据的增长它将如何执行,并相应地调整您的代码。
不幸的是,没有适合所有目的和情况的工具。优化就是针对特定情况使用最合适的方法,而不是先坚持使用手头的方法。
即使你可以用锤子敲进一颗螺丝钉,你也可以用螺丝刀。
我希望你喜欢这篇文章。如果你有问题或者想补充什么,请在评论中分享你的想法。我想知道你的意见。
感谢阅读!
什么是云计算?将模型投入生产的关键
AWS、Azure、Hadoop、PySpark 等顶级云计算平台的细分。
任何数据科学家的一项关键技能是能够编写生产质量的代码来创建模型和将它们部署到云环境中。通常,使用云计算和数据架构属于数据工程师的工作。然而,每个数据专家都被期望成为通才,能够适应和扩展他们的项目。
下面是我在几十个职位描述中看到的热门平台介绍。这并不意味着我们必须在一夜之间成为专家,但这有助于了解现有的服务。入门总是学习新技能的第一步。
大数据&云计算
尽管“大数据”最近已经成为一个时髦词,并引起了大企业的兴趣,但它通常很难定义。关于定义还没有明确的共识,但是**“大数据”通常指的是增长到无法使用传统数据库管理系统和分析方法管理的数据集。**这些数据集的大小超出了常用软件工具和存储系统在可容忍的运行时间内捕获、存储、管理和处理数据的能力。
当考虑大数据时,请记住 3 V:容量、多样性和速度。
- 卷:数据的大小
- 多样性:数据的不同格式和类型,以及数据的不同用途和分析方式
- 速度:数据变化的速度,或者说创建数据的频率
随着数据的发展,对更快、更高效地分析此类数据的需求也呈指数级增长。仅仅拥有大数据已经不足以做出高效的决策。因此,需要专门用于大数据分析的新工具和方法,以及存储和管理此类数据所需的架构。
我们应该从哪里开始?
每个公司都有一个独特的技术堆栈,其中包含他们更喜欢用于其专有数据的软件。堆栈中的每个类别都有许多不同的平台。这些类别包括可视化和分析、计算、存储和分发以及数据仓库。有太多的平台无法计数,但我会仔细阅读我在最近的招聘信息中看到的流行的云计算服务。
公司可以从云服务提供商那里租用从应用程序到存储的任何东西,而不是拥有自己的计算基础设施或数据中心。这允许公司在使用时为他们使用的东西付费。与其处理维护自己的 IT 基础设施的成本和复杂性。简单来说,
云计算是按需交付计算服务——从应用程序到存储和处理能力——通常通过互联网,并以按需付费的方式进行。
虽然我不打算在这篇博客中深究细节,但重要的是要注意有三种云计算模式**。 IaaS (基础设施即服务) PaaS (平台即服务) SaaS (软件即服务)。在这三种模式中, SaaS 是目前占主导地位且应用最广泛的云计算模式。**
亚马逊网络服务(AWS)
AWS 提供数据库存储选项、计算能力、内容交付和联网等功能,以帮助组织扩大规模。您可以选择自己想要的解决方案,同时为自己消费的服务付费。像 AWS 这样的服务允许我们每分钟在这些服务器上租用时间,使得任何人都可以进行分布式培训。此外,AWS 服务器允许公司跨服务器集群使用 Hadoop 或 Spark 等大数据框架。
亚马逊还将所有主要的数据科学服务集中在亚马逊 SageMaker 内部。SageMaker 提供了许多服务,如数据标签、基于云的笔记本、培训、模型调整和推理。我们可以建立自己的模型,或者使用 AWS 提供的现有模型。类似地,我们可以设置自己的推理端点,或者利用 AWS 创建的预先存在的端点。创建一个端点需要我们使用一个 Docker 实例。幸运的是,为我们自己的模型创建端点所需的大部分工作都是样板文件,我们可以在多个项目中反复使用它。
AWS 目前支持 2000 多个政府机构和 5000 个教育机构。此外,它还是全球四大公共云计算公司之一。好处包括易用性、多样化的工具阵列、无限的服务器容量、可靠的加密和安全性、加上可负担性**。但是,一些缺点是 AWS 的一些资源受到地区的限制。它也受到许多其他云计算平台面临的问题的影响。有人担心备份保护、数据泄露风险、隐私问题和**有限控制。****
微软 Azure
微软 Azure,通常被称为 Azure ,是由微软创建的云计算服务,用于通过微软管理的数据中心来构建、测试、部署和管理应用和服务。该平台非常注重安全性,确立了其在 IaaS 安全性方面的领先地位。此外,作为云计算服务,它是高度可扩展的,同时价格合理。
和任何事情一样,微软 Azure 也有一些潜在的缺点。与最终用户消费信息的 SaaS 平台不同,IaaS 平台,如 Azure,将企业的计算能力从数据中心或办公室转移到云**。与大多数云服务提供商一样, Azure 需要专业的管理和维护,包括补丁和服务器监控。**
谷歌云平台(GCP)
就像 AWS 和 Azure 一样,GCP 是由谷歌提供的一套公共云计算服务。该平台包括一系列在谷歌硬件上运行的计算、存储和应用开发托管服务。
GCP 与 AWS 强有力竞争的一些领域包括实例和支付可配置性、隐私和流量安全、成本效益和机器学习能力**。GCP 还提供几个现成的与计算机视觉、自然语言处理和翻译相关的 API。机器学习工程师可以基于谷歌的云机器学习引擎开源的 TensorFlow 深度学习库来构建模型。**
尽管这个竞争对手有优势,但也有一些不利因素。像 BigQuery、Spanner、Datastore 这样的核心 GCP 产品很棒,但是非常偏向于有限的定制和可观察性**。此外,可用的文档有限,并且有传言称 GCP 的客户服务总体上没有回应。**
Hadoop
Hadoop 是一个分布式计算系统和环境,适用于计算机集群上的超大型数据集。它为任何类型的数据提供大容量存储、巨大的处理能力以及处理几乎无限的并发任务或工作的能力。这个生态系统也利用了 MapReduce。
MapReduce 是 Hadoop 框架内的一种编程模型或模式,用于访问存储在 Hadoop 文件系统(HDFS)中的大数据。MapReduce 作业通常将输入数据集分割成独立的块,由地图任务以完全并行的方式进行处理。该框架对映射的输出进行排序,然后输入到 reduce 任务中。通常,作业的输入和输出都存储在文件系统中。
Hadoop 和 MapReduce 允许任务被划分**,而不是仅仅使用一个系统来执行任务。任务被分成许多子任务,它们被单独解决,然后重新组合成最终结果。**
虽然 Hadoop 是开源的,并且使用了一种经济高效的可扩展模型,但它主要是为处理大型数据集而设计的。处理少量数据时,平台效率下降。此外,Hadoop 作业大多是用 Java 编写的,如果没有这种语言的专业知识,这可能会很麻烦,而且容易出错。
PySpark
PySpark 是在 Python 编程语言中用于 Apache Spark 的接口。它不仅允许您使用 Python APIs 编写 Spark 应用程序,还提供 PySpark shell,用于在分布式环境中交互分析您的数据。PySpark 支持 Spark 的大部分功能,如 Spark SQL、DataFrame、Streaming、MLlib(机器学习)和 Spark Core。
PySpark 的一些优点是,一些 Spark 作业在内存方面可以比传统的 MapReduce 快 100 倍。它还允许更高级别的查询语言在 MapReduce 之上实现类似 SQL 的语义。此外,PySpark APIs 类似于 Python 的 Pandas 和 Scikit-Learn 。
最初的 Apache Spark 服务是用 Scala 编写的,这是一种受大数据开发者欢迎的编程语言,因为它在 JVM (Java 虚拟机)上的可伸缩性**。不幸的是,Python 总体上比 Scala 慢,效率也低。此外,与 Spark 相比,PySpark 还不成熟,无法在大多数项目中使用 Spark 的内部功能。**
选择合适的服务
如果没有云计算,数据科学家和机器学习工程师将不可能训练当今存在的一些更大的深度学习模型。
有大量的云计算服务可供选择,但选择正确的服务取决于安全问题、软件依赖性、可管理性、客户服务支持等因素。
每个雇主最有可能有一个他们在公司范围内用于专有数据的首选技术堆栈。在那之前,网上有很多资源可以帮助你增加云计算知识。你也可以去每个供应商的网站,广泛阅读他们提供的服务。最后,需要注意的是,对于任何数据科学技能,没有比亲自动手实践个人项目更好的学习方法了。