人工智能(AI)在网络防御中的应用
人工智能是一个科学领域,负责寻找人类没有的复杂问题的解决方案。
机器学习可以用来绕过和拆除网络安全系统,速度比大多数预防和检测工具都快。人工智能将加剧现有的威胁,并创造新的威胁,但它的速度可能会被证明是网络犯罪分子的一大福音,因为它比人类专家更有效地打击他们。该算法试图模拟类似于真实人类决策机制的决策机制,但是由算法模拟。
在网络安全的背景下,人工智能(AI)试图通过权衡表明对预测逻辑构成威胁的行为模式来保护系统。机器学习(ML)是人工智能学习导致不良行为的模式的过程。当人工智能系统或神经网络被诱骗错误地识别或故意修改输入时,就会发生这种情况。
在过去的 12-18 个月中,人工智能(AI)在网络安全领域的应用数量大幅增加,并且没有任何放缓的迹象。这部分是由于随着技术的衰落,开发和改造技术的成本不断上升。人工智能在网络安全中的使用给数字安全带来了新的威胁。虽然人工智能技术可以用来更准确地识别和阻止网络攻击,但网络犯罪分子也使用人工智能系统来实施更复杂的攻击。
这意味着人工智能可以用来创建更复杂、适应性更强、恶意更强的软件,如机器学习和人工神经网络(AI)。
随着人工智能在网络安全中的部署,提供 web 和移动安全测试服务的高科技桥梁。该公司基于人工智能的产品 FortiWeb 是一种 Web 应用防火墙,使用机器学习和人工神经网络(AI)来准确检测威胁。它与人类智能一起识别其他漏洞和风险,而不会返回误报。
Vectra 的 Cognito 平台使用人工智能来检测实时网络攻击以及它们在网络安全中的使用方式。谈到与 IBM、思科、微软、谷歌、IBM Research 等公司合作的网络安全提供商,帕洛阿尔托网络公司是一个重量级公司。
就像一名新员工一样,该公司的虚拟分析师平台承担着研究公司网络安全协议的任务,以做出准确的评估。结合 Vectra 专有的 Cognito 平台和一系列其他工具和服务,它可以自动执行通常由安全分析师执行的任务,并显著减少进行威胁调查所需的工作量。PatternEx 是一种人工智能网络安全工具,可以实时检测恶意行为的模式,以及它如何在网络安全中部署人工智能。
Spark Cognitions 发布了一个新的、强大的、复杂的反恶意软件系统,该系统由名为 Deep Armor 的技术提供支持。该系统通过将网络与防病毒程序相结合来查找和删除恶意文件,从而保护网络免受新的和独特的网络威胁。基于这两个组件所达到的范围,可以发现它们是有趣的,并通过共享进行交流。
英国公司 DarkTrace 制造了复制人类抗体的防御系统,可以在没有人类干预的情况下自动检测和消除网络威胁。通过将学习模型应用于网络,人工智能系统可以被训练来测试各种防御策略,以通过控制感染和消除根源来最大限度地减少或阻止网络攻击期间恶意软件的传播。
事实上,Darktrace 受益于人们对自学型网络防御产品越来越大的兴趣,这些产品使用人工智能来检测甚至应对新出现的攻击。面对来自网络罪犯、黑客和其他恶意行为者的持续威胁,任何人都几乎不可能跟上任何形式的自动化或人工智能。
克林特·帕特森在 Unsplash 上拍摄的照片
在未来,响应速度将能够更快、更有效地应对网络攻击,使人类专家能够进行更复杂的调查。这是一个互惠的过程,因为分析人工智能的反应可以使人们提高对应对网络威胁的理解和准备。当人工智能能够观察到对网络攻击的成功回应时,它就会自我修复,并动态复制人类分析师开发的最佳防御策略。
引用来源
- https://www . CBR online . com/opinion/the-future-of-ai-and-cyber security0
- https://ask wonder . com/research/major-trends-seen-use-artificial-intelligence-cyber-security-mhnb 0 ri 3d1
- https://builtin . com/人工智能/人工智能-网络安全 2
- https://www . computer weekly . com/news/252476221/How-dark trace-is-riding-the-AI-boom4
- https://www . information-age . com/adversarial-人工智能-制胜-网络安全-战斗-123487325/ 5
- https://www . deep-secure . com/blog/143-is-artificial-intelligence-a-cyber-silver-bullet . PHP6
- https://www . thesslsstore . com/blog/artificial-intelligence-in-cyber-security-the-saver-or-敌国-of-your-business/ 7
列表、字典和集合理解介绍
将多行代码转换成单行代码
照片由 Fotis Fotopoulos 在 Unsplash 上拍摄
在使用 Python 将近一年的时间里,我经常遇到“理解”这个词,但不一定理解它的确切含义或它涵盖的内容。直到最近,我才发现我已经在我的代码中使用它们来生成列表,并且我还没有完全理解它们能够将我的代码从多行缩短为一行的能力。此外,这种代码缩短方法不仅可以用于列表,也可以用于字典和集合。因此,本文试图解释它们对列表、字典和集合的适用性,以及它们如何减少日常编程中所需的代码量。
首先,理解是可以在一行中用来创建列表、字典和集合的代码片段。这取代了使用多行 for-loop,也减少了使用 map()、filter()和 reduce()函数的需要。它们由包含一个表达式的括号(根据您要创建的数据类型是方括号还是花括号)组成,后跟一个 for 子句,可能还有一个或多个 if 子句。表达式本身可以是任何东西,这意味着您可以将许多不同的对象放入列表中,只要它们是可迭代的。因此,从减少使用的行数和增加可读性的角度来看,探索这些对代码的影响是值得的。
列表
在 python 中可以简单地创建列表,方法是将项目放在方括号([])中,用逗号分隔,如下所示。
list1 = [1, 2, 3, "hello", 7.0, 52]
这些在编程中通常用于多种目的,但是用长格式写出或者用 for 循环编辑可能很麻烦。首先,就创建列表而言,小列表可能很容易以长格式输入,例如:
nums = [1, 2, 3, 4, 5, 6, 7, 8]
但是当它变得更长时,例如在 0-50 或更长的范围内,它们会变得难以使用。使用 range 函数通过 for 循环可以很容易地创建它们,如下所示:
nums = []for i in range(1, 51):
nums.append(i)print(nums)# out: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
但是我们可以使用列表理解将它缩短为一行,并且不再需要 append()方法。
nums = [i for i in range(1,51)]print(nums)# out: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]
本质上,for 循环放在一行中,列表同时被初始化,这样就不需要上面例子中的第一行和第二行代码了。
当我们开始为添加到列表中的数字添加条件时,这变得更加重要,比如只允许偶数并且希望这些数字是平方的。同样,这可以使用 for 循环产生,如下所示:
square_nums = []for x in range(1,26):
if x % 2 == 0:
square_nums.append(x**2)print(square_nums)# out: [4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576]
但是同样可以使用 list comprehensions 将其缩短为一行,从而减少了循环遍历范围、创建条件并将结果追加到原始列表中所需的行。
square_nums = [x**2 for x in range(1,26) if x % 2 == 0]print(square_nums)#out: [4, 16, 36, 64, 100, 144, 196, 256, 324, 400, 484, 576]
这里,数字的转换在行首执行为x**2
,for 循环在行中间执行为for x in range(1,26)
,条件循环在末尾执行为if x % 2 == 0
。这实质上使代码更具可读性,因为所有的操作都在一行中执行,并且减少了生成相同输出所需的代码量。
这还可以减少在创建新列表时对 append()、map()、filter()或 reduce()方法的需求,再次降低代码的复杂性并使其更具可读性。
类似的例子很容易找到,通过媒体上的其他文章可以很容易地获得更多的信息,例如这里的和这里的。然而,值得注意的是,这些理解也可以用在词典和集合上。
字典
字典是一个无序的数据集合,它是可变的、有索引的,用大括号通过键和值对编写。这里,键用于能够访问值,并且经常用于存储信息,对于这些信息,具有这样的对是有用的。下面提供了一个这样的例子,比如用于存储成绩。
Grades = {
"Steven": 57,
"Jessica": 82,
"William": 42,
"Hussein": 78,
"Mary": 65,
}print(Grades)# out: {'Steven': 57, 'Jessica': 82, 'William': 42, 'Hussein': 78, 'Mary': 65}
与列表类似,从基础开始硬编码有时会很耗时,因此可以使用 for 循环和条件来构造,但使用 comprehensions 可以更简单地构造。例如,对于我们上面创建的列表,我们不仅想知道数字的平方,而且还想存储原始数字,这样我们就可以使用它轻松地查找其平方值。然后,我们可以简单地创建一个包含键-值对的字典,其中键表示原始数字,值表示该数字的平方。使用 for 循环:
#initialising empty dict
even_squared_dict = {}for x in range(1,10):
if x % 2 == 0:
even_squared_dict[x] = x**2print(even_squared_dict)# out: {2: 4, 4: 16, 6: 36, 8: 64}
但是用字典理解:
even_sqaured_dict = {x: x**2 for x in range(1,10) if x % 2 ==0}print(even_squared_dict)# out: {2: 4, 4: 16, 6: 36, 8: 64}
本质上,这与列表理解之间的唯一区别是使用了花括号来包含理解,并在冒号前放置了 x 来表示这代表键。
这也可以用来基于一个已经存在的列表创建一个字典。例如下面,使用字典理解来创建字典,该字典具有三位国家代码的关键字和两位国家代码的值,其中两位代码与三位代码的前两位相同。
ThreeCharCodes = ["CAN", "FIN", "FRA", "GAB", "HKG", "IMN",
"MCO", "NPL"]cntryDict = {c: c[:2] for c in threeCharCodes}print(cntryDict)# out: {'CAN': 'CA', 'FIN': 'FI', 'FRA': 'FR', 'GAB': 'GA', 'HKG': 'HK', 'IMN': 'IM', 'MCO': 'MC', 'NPL': 'NP'}
设置
最后,理解也可以用于创建集合,集合是一种不同于列表或元组的数据类型,不能存储同一元素的多次出现。这样做时,它存储无序值,通过将一个列表传递到 set()或使用花括号包含由逗号分隔的值来初始化(尽管空花括号将初始化字典)。这方面的一个例子如下:
Fruits1 = set(["apple", "banana", "cherry", "apple"])
print(Fruits1)Fruits2 = {"orange", "pear", "grape", "pear"}
print(Fruits2)# out: {'apple', 'cherry', 'banana'}
{'grape', 'pear', 'orange'}
这里可以清楚地看到,尽管将多个值apple
或pear
传递给了集合,但只产生了一个实例。同样,这些可以使用 for 循环生成,如下所示:
import randomnums = set([])for x in range(25):
y = random.randint(10,20)
nums.add(y)print(nums)# out: {10, 12, 14, 15, 16, 17, 18, 20}
其中虽然有 25 个 10–20 范围内的随机整数,但最终输出只包含 8 个唯一值,而不是列表中出现的 25 个值。同样,这可以用对集合的理解更简洁地写出来。
nums = {random.randint(10,20) for num in range(25)}print(nums)# out: {11, 12, 13, 14, 15, 16, 17, 19, 20}
因此,这种理解和列表理解的区别在于花括号的使用,而不是包含理解的方括号。
类似于列表和字典理解,这也可以用于现有的列表来生成集合。例如,如果我们想根据除以 1.6 的结果将公里数转换为英里数,则只需要唯一的值,并将其限制为小于 100 公里的值。
kms = [10, 12, 65, 40, 12, 75, 34, 65, 10, 10, 38, 100, 160, 200]miles = {d/1.6 for d in kms if d < 100}print(miles)# out: {0.625, 0.75, 2.5, 2.125, 4.0625, 4.6875, 2.375}
摘要
因此,理解可以很容易地用于创建新的列表、字典和集合。使用它们可以减少生成它们所需的行数,并增加可读性。它们可以替代 append()、map()、filter()或 reduce()函数。
很明显,这些方法可以扩展到执行更复杂的理解,比如使用 lambda 函数、嵌套列表理解或多重条件。然而,这样做值得注意的是,理解可能很快变得笨拙和难以理解,在这种情况下,当需要执行几个操作时,为了提高可读性,返回到创建函数或 for 循环是值得的。
您的自定义身份验证是错误的
身份访问管理是每个企业架构的起点—了解原因
你厌倦了密码提示吗?2020 年,我是。
我讨厌在访问我们日常使用的工具生态系统时感觉到的摩擦。我就是我自己,为什么要证明两次?
此外,随着即将到来的安全威胁,我也很好奇我在哪里输入我的密码——安全对我来说很重要。
我记得在 2000 年,第一次创建 SSO(单点登录)解决方案时的胆怯尝试。我们有许多手工制作的工具,使用 cookies、重定向和其他技巧来完成工作。每个公司都必须重新发明轮子。
当 OAuth(然后是 OAuth2)成为标准并帮助轻松创建 SSO 场景和身份验证共享时,这个时代就结束了。
这是一大进步,但不是终点。Oauth2 协议只解决了问题的一部分:我们仍然需要编码来实现认证系统。
编码是美妙的,但需要时间和成本。我们不能每次都重新发明轮子。这就是为什么我写了一篇关于寻找身份访问管理(IAM)的标准解决方案的文章,您应该读一读!
凯尔·格伦在 Unsplash 上的照片
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
登录有什么问题?
我可以理解,如果你进入两个不同的服务,从两个不同的供应商,如 Gmail 和 Outlook…你需要输入其他凭证。这是唯一的选择。但是如果工具来自同一家公司呢?想想看,作为一个客户,也作为一个雇主,与你每天使用的数以千计的 B2B 工具斗争。ERP,CRM,时间跟踪,邮件,你需要输入不同的凭证。
我累了。这是一个典型用户最普遍的感受。
在大多数公司中,仍然通常有多个垂直应用程序,每个应用程序都生活在自己的范围内。有人称之为筒仓。我们正在努力使用数据集成来消除孤岛隔离,但我们仍然需要输入两次密码。
和密码可能因系统而异,采用不同的策略。因此,您可以使用 1985 年的旧 ERP,或者要求您每周更改密码的新 CRM,禁止使用任何可记忆的单词,并要求使用数字、大小写混合字符,也许还可以在里面添加一个表情符号。
我相信你和我一样讨厌这种情况,所以读完这篇文章你会感觉好一点。
你会找到所有这些问题以及其他与用户体验无关的问题的切实可行的解决方案(是的,用户的痛苦只是冰山一角)。
为什么我们需要 IAM(身份访问管理)?
身份和访问管理(IAM)是一个平台,您可以在其中实施身份验证流程和策略。这项技术让您可以在一个地方管理所有用户,并节省 IT 经理的时间。
IAM 是允许分配知道谁是谁的架构组件。
在下图中,您可以看到 IAM 作为一个中心访问点,与用户数据库交互,实现安全标准。
IAM 图。图片作者。
考虑到身份认证,我最大的痛苦是用户体验。多次输入密码真糟糕。我们已经说过了。但这是不太重要的一点,作为一名 IT 经理来思考。
我们需要将我们的痛点扩展到 IT 的所有领域:治理、维护,但要特别关注安全性。
因此,改进的中心领域是:
- **生产力。**我们已经花了很多时间关注用户需求。但是我们也必须考虑他们的生产力。他们在与密码和多个接入点斗争的同时,只能降低工作效率。但是更高的成本是关于开发一百个不同的认证系统。为每个应用程序开发和维护一个访问管理系统需要多少成本?
- 安全。保持所有接入点的高安全标准非常困难。在每个用户数据库上实现最佳的安全策略也很困难。
- 顺从。随着像 GDPR 这样的严格要求的到来,我们在任何时候都不能失败。有些策略会要求在每个应用程序上添加双因素身份验证,这该怎么办?在每个应用程序上复制该功能需要多少成本?如果您认为这永远不会发生,那么看看像访问日志管理这样的简单任务。从许多服务器收集许多文件日志比只有一个服务器更成问题,因为很难在所有系统中应用相同的日志策略。
- **帮助台保存。**每个忘记的密码都需要时间来重置:拥有多个接入点使这变得困难。您的帮助台需要访问所有应用程序的控制面板,这迫使从每个应用程序实现和公开此功能。此外,更多的密码意味着更复杂和更容易忘记的密码,并给帮助台带来相当大的负担。
简而言之,IAM 是一个软件,它将所有授权问题集中在一个地方,解决所有问题。
好消息是市场给了我们很多软件解决方案,它们已经实现了最好的安全标准和所有的通用特性。此外,它们与企业使用的现有工具进行了开箱即用的集成。让我们在下一段看看这是如何可能的。
实际基础设施上的集成
许多商界人士认为像这样的工具只适合初创公司或小公司。
他们担心改变公司现状的成本,可能会触及遗留系统。基本上,他们会问“为什么我应该改变有用的东西?”我总是害怕这种思维方式,因为它阻止我抓住新的机会,但我理解——但不赞成——对改变的恐惧。
我想告诉那些害怕将 IAM 添加到公司基础架构中的人,不会有任何突破性的变化。这是对基础设施的逐步增强。一个好的 IAM 项目集成了现有的工具,如果不需要的话不会移动用户的数据库。
您使用过的数据可以留在原处,只是将它们的用途暴露给新的应用程序。
如果我还没有说服你,看看活动目录。嗯,这是一个 IAM,只是激活 ADFS 模块。
每个可靠的 IAM 都集成了最常用的用户资源,比如 Active Directory、RDBMS 数据库、LDAP 和外部 API。
这一点在非技术习语中的翻译是,您可以让您的用户进入 Active Directory 或 ERP。尽管如此,您仍然可以让其他应用程序在 SSO 行为中使用它们。
这逐渐导致了一个独特的用户数据库,在这里很容易实现安全策略。
来自市场的解决方案
根据您的需求,您可以选择内部或在线解决方案。最好的在线垂直应用是 Auth0 。它开箱即可获得您想要的所有功能,并带有丰富的免费层,非常适合大多数中小型使用案例。Auth0 有许多在最常见的编程语言上集成的例子,并且集成了许多用户资源(包括 Active Directory!).如果你想留在云中,但你更喜欢使用公共云供应商的服务,每个大型供应商,如微软、、谷歌云、IBM 或 AWS Identity 都是正确的解决方案。我测试了许多公共供应商的服务,它们以可比较的价格提供了或多或少相同的功能。无论如何,如果你喜欢留在本地,Keycloak 是适合你的工具。这是一个免费的开源 IAM 解决方案,Red Hat 支持它。Keycloak 是一个可插拔的开源软件,你可以根据自己的需要扩展它。当然,使用这种解决方案,您将失去云优势,但使用一些 PaaS 解决方案或云 Kubernetes 解决方案,您可以降低维护成本并获得托管解决方案的优势。
结论
随着新出现的安全问题和用户期望,我们不能委托定制解决方案。对于失败来说,用户身份是一个非常重要的话题。此外,它是架构的关键点,性能是第一位的。使用标准解决方案,如果基于云会更好,有助于减少工作量并确保质量标准。IAM 与用户数据库的集成通常是轻松的,您可以逐渐地与现有的应用程序集成。
值迭代算法
深度强化学习讲解— 09
从代理人的经历中评估过渡和奖励
在的上一篇文章中,我们介绍了基于价值的代理,并回顾了贝尔曼方程,这是许多强化学习算法的核心要素之一。在本帖中,我们将介绍价值迭代方法来计算基于价值的代理所需的 V 值和 Q 值。
请访问第 4 页的自由介绍
medium.com](https://medium.com/aprendizaje-por-refuerzo/4-programaci%C3%B3n-din%C3%A1mica-924c5abf3bfc)
使用循环计算 V 值
在前一篇文章中给出的简单例子中,我们在转换中没有循环,并且清楚如何计算状态的值:我们可以从终端状态开始,计算它们的值,然后继续到中心状态。然而,只有环境中存在循环才阻止了这种建议的方法。
让我们看看如何用一个具有两种状态(状态 1 和状态 2)的简单环境来解决这些情况,该环境呈现了下面的状态转换图:
我们只有两种可能的转换:从状态 1,我们只能采取一个带着+1 的奖励进入状态 2 的动作,从状态 2,我们只能采取一个带着+2 的奖励回到状态 1 的动作。因此,由于两种状态之间的无限循环,我们的代理人的生命在无限的状态序列中移动。两种状态的价值是什么?
假设我们有一个贴现因子 γ < 1,假设是 0,9,从上一篇文章中记住,状态的最优值等于给我们最大可能预期即时回报的动作的值,加上下一个状态的贴现长期回报:
在我们的示例中,由于每个状态中只有一个可用的操作,我们的代理没有其他选择,因此我们可以将前面的公式简化为:
例如,如果我们从状态 1 开始,状态的顺序将是[1,2,1,2,1,2,…],由于从状态 1 到状态 2 的每次转换都给我们+1 的奖励,并且每次返回转换都给我们+2 的奖励,奖励的顺序将是[+1,+2,+1,+2,+1,+2,…]。因此,状态 1 的先前公式变为:
严格来说,不可能计算出我们状态的精确值,但是用一个贴现因子 γ = 0,9,一个新动作的贡献随着时间的推移而减少。例如,对于扫描 i =37,公式的结果是 14.7307838,对于扫描 i =50,结果是 14.7365250,对于扫描 i =100,结果是 14.7368420。这意味着我们可以在某个点停止计算(例如在 i =50),但仍然可以获得 V 值的良好估计,在这种情况下 V (1) = 14.736。
值迭代算法
前面的例子可以用来获得一个更一般的过程的要点,这个过程叫做值迭代算法(VI) 。这允许我们用已知的转移概率和回报来数值计算马尔可夫决策过程的状态值。
值迭代算法背后的思想是将截断的策略评估步骤(如前面的示例所示)和策略改进合并到同一个算法中。
基本上,值迭代算法通过迭代改进 V (s)的估计来计算最佳状态值函数。该算法将 V (s)初始化为任意随机值。它重复更新 Q(s,a) 和 V (s)值,直到它们收敛。保证数值迭代收敛到最优值。下面的伪代码表达了这个建议的算法:
过渡和奖励的评估
在实践中,这种值迭代方法有几个局限性。首先,状态空间应该是离散的,足够小,以便对所有状态进行多次迭代。对于我们的冰湖环境来说,这不是一个问题,但在一般的强化学习问题中,情况并非如此。我们将在本系列的后续文章中解决这个问题。
另一个重要的实际问题来自于这样一个事实,即为了更新贝尔曼方程,算法需要知道环境的转移概率和每次转移的回报。
请记住,在我们的冰湖例子中,我们观察状态,决定行动,只有这样我们才能获得下一次观察和转换的奖励,但我们事先不知道这些信息。我们能做些什么来得到它们?
幸运的是,我们能得到的是代理与环境相互作用的历史。所以,前一个问题的答案是用我们代理人的经验作为对两个未知数的估计。下面我们来看看如何实现。
报酬估算
评估奖励是最简单的部分,因为奖励可以直接使用。我们只需要记住在从 s 到***s’***使用动作 a. 的过渡中我们得到了什么奖励
转移估计
估计转换也很容易,例如通过维护代理的经验中每个元组的计数器( s , ***a,***s’)并使它们正常化。
例如,我们可以创建一个简单的表来保存所经历的转换的计数器。表的关键字可以是复合的“状态”+“动作”,( s , a ),每个条目的值都有关于目标状态、 s、 的信息,以及我们已经看到的每个目标状态、【c的次数。
让我们看一个例子。想象一下,在代理的体验过程中,在给定的状态 s0 中,它已经执行了一个动作若干次,并最终在状态 s1 中执行了 c1 次,在状态 s 2 中执行了 c2 次。我们转换到这些状态的次数存储在我们的转换表中。即,表内容{s1: c1,s2: c2}中的条目(s,a)。也许在视觉上,您可以更容易地看到本例表格中包含的信息:
然后,很容易用这个表来估计我们转换的概率。动作将我们从状态 0 带到状态 1 的概率是 c1 / (c1 + c2),并且动作将我们从状态 0 带到状态 2 的概率是 c2 / (c1 + c2)。
例如,想象一下,从状态 0 开始,我们执行动作 1 十次,4 次之后,它将把我们带到状态 1,6 次之后,它将把我们带到状态 2。对于这个特定的例子,这个表中带有关键字(0,1)的条目内容为{1: 4,2: 6}。这表示从状态 0 转换到状态 1 的概率是 4/10,即 0.4,从状态 0 转换到状态 2 的概率是 6/10,即 0.6。
利用从代理的经验中估计的信息,我们已经拥有了能够应用价值迭代算法的所有必要信息。
下一步是什么?
按照本系列的实践方法,在接下来的两篇文章中,您将通过解决冰湖环境看到价值迭代方法的实践。
下一篇见!。
深度强化学习讲解系列
由 UPC 巴塞罗那理工 和 巴塞罗那超级计算中心
一个轻松的介绍性系列以一种实用的方式逐渐向读者介绍这项令人兴奋的技术,它是人工智能领域最新突破性进展的真正推动者。
本系列的内容](https://torres.ai/deep-reinforcement-learning-explained-series/)
关于这个系列
我在五月份开始写这个系列,那是在巴塞罗那的封锁期。老实说,由于封锁,在业余时间写这些帖子帮助了我 #StayAtHome 。感谢您当年阅读这份刊物;它证明了我所做的努力。
免责声明 —这些帖子是在巴塞罗纳被封锁期间写的,目的是分散个人注意力和传播科学知识,以防对某人有所帮助,但不是为了成为 DRL 地区的学术参考文献。如果读者需要更严谨的文档,本系列的最后一篇文章提供了大量的学术资源和书籍供读者参考。作者意识到这一系列的帖子可能包含一些错误,如果目的是一个学术文件,则需要对英文文本进行修订以改进它。但是,尽管作者想提高内容的数量和质量,他的职业承诺并没有留给他这样做的自由时间。然而,作者同意提炼所有那些读者可以尽快报告的错误。*
A/B 测试的价值
A/B 测试通常是人们优化广告活动设置的首选。有了 A/B 测试,你可以根据更科学的数据做出选择,而不是依靠猜测。
杰森·登特在 Unsplash 上拍摄的照片
A/B 测试值
A/B 测试,也称为桶测试或分割运行测试,是一个随机实验,涉及两个变量(A 和 B)。它是一种比较单个变量的两个版本的方法,以确定两个版本中哪一个更有效。
我们 A/B 测试我们能测试的一切!
我们 A/B 测试什么?一切和一切!以下是一些例子:
- 算法。我们的媒体购买是通过复杂的算法架构完成的。系统中的每一个组成部分都在不断地对照备选方案进行评估。这就是我们如何随着时间的推移而改进的。
- **创意人员。**我们在 A/B 测试类型的实验中不断测试不同的创意,因为不同的受众对不同的事物有不同的反应。这是实现最佳性能的关键。
- **观众。**我们对我们的目标受众进行 A/B 测试,以衡量不同特征的影响,并帮助我们调整谁是最佳目标。
- **特性。**在新特性出现在我们的全球架构中之前,它会在受控实验中单独进行测量。
A/B 测试步骤
这里概述的五个步骤提供了一个基本的指导方针,当你想执行 A/B 测试时,可以全面地应用。
- 决定测试什么。
你想考什么?在开始 A/B 测试之前,你需要清楚这一点。从单个元素开始,确保它与您想要改进的指标相关。例如,如果您有兴趣从第 7 天 ROI(安装前 7 天内的投资回报)的角度提高目标受众的质量,可以考虑在给定的受众中测试不同的功能。这将帮助你在给定的受众中只保留高质量的用户,从而提高你的整体投资回报率。 - 设定要衡量的目标或 KPI。
在你开始 A/B 测试之前,你也需要清楚你的目标是什么。上面的例子旨在提高第 7 天的投资回报率。你可能对任何事情感兴趣,从提高点击率到增加购买率等等。你的 A/B 测试的成功很大程度上依赖于清晰地设定 KPI 或目标,因为这将有助于确保你生成更清晰的数据。再次强调,关注单个指标,记住你可以在以后用其他指标做额外的 A/B 测试。 - 设计你的测试。现在我们开始变得有创意了。当你设计你的 A/B 测试时,你需要创建你的 A 组和 B 组。这样做时,确保这些组除了您正在测量的度量的之外都是相同的。此外,一定要避免任何可能扭曲你的结果的偏见。**
- 积累数据。让你的测试运行起来。确保你记录了所有可能与你以后分析结果相关的数据。此外,确保给你的 A/B 测试足够的时间来运行,以便它生成大量的代表性数据。
- 分析结果。 在下面,你会找到关于如何根据哪组“赢得”测试得出结论的信息。
频率主义者还是贝叶斯主义者?
频率主义方法和贝叶斯方法是两种统计方法,每种方法都有自己独特的观点,其中包括分析 A/B 测试的结果。每种方法都有自己的优点。
来源:xkcd.com
frequent ist 方法 该方法涉及使用 p 值在两个假设之间进行选择。第一个假设是零假设(A 和 B 没有区别)。第二种是替代假设(即 A!=B,A > B 或 A < B 等。).
p 值衡量观察到 A 和 B 之间的差异的可能性,这种差异至少与我们实际观察到的差异一样极端。一旦该值达到统计学显著性,实验就完成了。
贝叶斯方法 我的团队(大部分)更喜欢贝叶斯方法,在 A/B 测试方法论中也是如此。这包括将每个变量的度量建模为具有某种概率分布的随机变量。
来源:作家
在贝叶斯 A/B 测试中,我们将每个参数建模为具有某种概率分布的随机变量。基于以前的经验,我们可能会认为某个创意对于某个受众的点击率有一定范围的可能值,这种信念在我们以前的分布中有所体现。在观察了来自两个变量的数据后,我们更新了关于每个变量最可能值的先前信念。下面,我展示了一个观察数据后后验分布的例子。
通过计算每个变量的后验分布,我们可以通过概率陈述来表达我们信念的不确定性。例如,我们可以问“在其他条件相同的情况下,对于相同的受众,创意 B 的点击率大于创意 A 的点击率的概率是多少?”。
结论
A/B 测试是收集信息和做出基于数据的决策的最流行和最有效的方法之一。我的团队在我们可以测量的任何东西上经常使用 A/B 测试。毕竟,数据驱动的决策总是比基于直觉的决策更可取。
当你开始执行 A/B 测试时,考虑一下上面描述的哪种方法更适合你,并确保遵循我们列出的执行测试的五个步骤。
数据组织的价值:两个轴心的故事
衡量数据团队投资回报率的实用方法
“数据组织的价值是什么?数据领导者应该如何考虑他们团队的投资回报率?”
随着数据专业人员(数据科学家、分析师和工程师)数量的快速增长,以及数据角色之间的界限变得模糊,衡量和传达数据团队的投资回报率绝非易事。但是考虑到这一领域的巨大投资,理解这一价值对整个数据行业来说是一个存在的问题。在这篇博客文章中,我们想建议一个实用的框架,根据对各种业务成果的贡献来衡量数据团队的投资回报率。
数据团队在整个企业中扮演的角色
数据团队通常以多种方式在业务中扮演重要角色:
- 提高各种业务职能的日常运营计划的投资回报率,例如营销活动分析、新功能的 A/B 测试
- 推动新的战略计划,例如,发现发展新用户群的机会
- 发现并推动新的机会,例如,识别导致新产品功能或营销理念的用户行为
- 推动扩展计划,例如构建新的实验平台
- 建立新的能力,例如开发推荐系统
换句话说,数据团队与其他业务职能部门协同工作。因此,要全面了解数据组织的 ROI,我们必须从公司每个职能部门的角度来审视它。一个数据团队最好能让每一项业务职能——最终是整个公司——都由数据驱动。
让我们通过一个营销中的示例来说明数据团队如何让营销更加数据化。数据团队通过以下方式帮助他们的营销同行:
- **提高日常业务运营的投资回报率:**数据团队持续分析不同渠道的完整营销渠道,并与营销经理密切合作,亲自为不同类型的活动提供日常指导,并推荐有助于提高绩效和实现最佳结果的战术变化。
- 推动新的战略增长计划:数据团队与营销团队合作,全面评估新渠道或新营销战略,例如,在进一步投资这些新计划之前,通过创建一些模拟场景来更好地了解预期结果。这使得营销团队能够确保在更有可能产生更强劲增长的领域进行投资。
- **发现并推动新的机会:**在与营销部门的日常运营合作过程中,或者在探索新的增长计划时,数据团队发现了一些新的东西——一个特定的客户群、不断变化的沟通偏好或营销组件的组合——这些东西以前没有经过明确的测试,但似乎显示出很高的投资回报率。
- **推动扩展计划:**数据团队投资构建一系列工具,从自动化分析洞察到更高效的实验能力,再到能够更快提供更多关键信息的新数据管道。
- **构建新功能:**数据团队构建多点接触归因模型,以更好地优化多渠道支出,或者构建竞价优化模型,在扩大支出的同时提高投资回报率。
现在,这些定性的贡献已经很明显了。但是怎么衡量呢?我们建议使用二维测量框架来测量数据团队的 ROI,如下表所示。
引入衡量数据团队投资回报的框架
为了理解数据团队的价值,我们可以根据业务功能(这里是营销,通过行表示)和工作性质(通过列表示)将团队的当前和未来计划映射到一个单元中。
在此基础上,我们可以使用以下两种方法之一来计算数据团队的 ROI:
方法 1:影响记分卡
在这种方法中,我们使用如下所述的评分系统来衡量数据团队的影响:
- 上面的每一列最多有 20 分。
- 作为起点,我们可以使用线性标度来分配点。这意味着每个业务职能都有 2.5 分。例如,如果数据团队参与了给定列中 50%的功能,我们给 10 分;或者,如果数据团队参与了给定列中 100%的功能,我们给 20 分。
- 为了说明不同职能对公司的重要性,可以用 20 点的加权分布来代替。根据公司所处的阶段和行业性质,这可能是一个很好的选择。我们将在以后的文章中解开这个框架。
- 然后,我们将所有列和行的分数相加,得出一个“数据团队影响”分数,范围为 0 到 100。
方法 2: ROI 分配
在这种方法中,我们将不同业务职能的投资回报率的%分配给数据团队:
- 因为数据团队通过其对不同业务功能的影响为组织创造价值,我们假设数据团队的投资回报率可以通过将每个功能的投资回报率的%分配给数据团队来衡量。
- 在这种方法中,我们将着眼于数据团队的聚合价值(跨越上表中的所有列),而不是针对不同类别的增值单独进行衡量。
- 这一百分比分配将取决于数据团队参与特定职能的程度以及组织文化。例如,一个非常严重的数据驱动型组织,其中包括首席执行官在内的执行领导层真正相信数据提供的价值,与可能没有相同数据文化和执行支持的组织相比,他们总是给予更高的%价值。
在我们的营销示例场景中,数据团队的价值可以按如下方式衡量:
方法 1: 如果数据团队参与了上述所有营销角色,他们将得到 2.5 分,总分为 12.5 分,这是数据团队参与业务职能的最高分,体现了他们对营销职能的贡献。
方法 2: 如果营销团队在给定时期内通过所有增长、扩展和效率计划为企业带来了 1 亿美元的价值,我们可以将其中的 25%到 35%归功于数据团队,这取决于团队的参与程度。
因此,这个 ROI 框架为数据团队所做的贡献赋予了切实的价值。它也是高度可视化的,这是向领导者和其他团队展示数据团队的价值的另一种有用的方式,以及它一直在做的事情,一目了然。这样,除了衡量 ROI 之外,该框架还可以成为数据团队优先考虑和评估未来机会的有用工具。
与任何其他衡量方法一样,以适当的节奏衡量数据团队的影响非常重要,这样可以发现改进的机会,并根据具体情况确定绩效。我们建议每季度进行一次轻量级测量,每年进行一次更彻底的测量。季度检查允许进行必要的年中过程修正,以确保组织从其数据投资中获得最佳价值,而年度检查将确保制定长期战略,以继续加速价值创造。
以这种方式衡量和交流我们的数据团队的投资回报率,使我们能够将我们团队的工作与推动我们的客户和业务向前发展的有意义的价值结合起来。我们努力确保我们始终致力于公司的最高优先级—句号。如果您现在使用这个框架来衡量您的数据团队的投资回报率,您会学到什么?
联系 巴尔卡萨克塞纳 或 巴尔摩西 如有任何问题、意见或建议。
快乐在数据科学中的价值
如何通过看似微小的行为来实现一点点社会变革
照片由野生禅艺拍摄
你可能会觉得你的工作与我们社会面临的社会问题不太相关。你工作场所的结构性问题可能看起来如此之大,以至于你感到无力做出改变。如果有一种方法可以影响一些小的变化,而这些变化却能产生巨大的影响,那会怎么样?
数据科学家花了很多时间来定义作为一名数据科学家意味着什么。文章、在线课程和学位项目设定行业预期。我们被告知如何设计团队和工作流程到最小的流程。纵观这些无数的定义,有一个共同的线索:“数据科学”是一项发明。定义作为一名数据科学家意味着什么并不会让作为一名数据科学家工作变得更有意义。事实上,我们越是试图定义难以捉摸的数据科学家角色,我们就越是限制这个定义所包含的人。
“数据科学家”角色排除了哪些人?( R-Ladies 组拍摄于用户 2017 ,作者图为前排右下第二,经由 R-Ladies Global )
我们在简历上积累经验,以展示我们的能力和信誉。我们微调我们精心制作的社交媒体档案,以最大限度地扩大我们的影响力和参与度。最终,人们看重的不是我们的头衔、奖项或学位。这是我们做事的方式。工作要求很少列出成为一个好的队友。在我参加的几乎每一轮面试中,“团队配合”都是招聘决定中最关键的部分。
IBM 的《数据科学家的一天》(IBM 职业生涯截图)
可访问性是为残疾人设计软件的领域,其中残疾被定义为在参与社会时遇到障碍。任何曾经参与过求职过程的人都切身体会到,你不必有身体上的障碍经历上的障碍。这就是为什么我更喜欢“包容性”一词,而不是“可及性”。包容性来自梵语单词 upekkha 。Upekkha 的意思是以一种不歧视的精神去包容一切事物和每个人的“好”和“坏”。
实践包容性意味着接受各种人必须提供的价值,包括神经有分歧的人、具有不同学习和解决问题风格的人、来自不同种族背景的人,他们的语言也可能不同,以及使用计算机方式不同的人。
“如果你的团队中没有以某种方式使用工具的人,或者你的团队没有包含一系列的观点,那么当你构建一个工具并考虑工具的用户时,就很难记住这些,”IBM 的易访问性领导团队的成员 Shari Trewin 说。根据 Trewin 的说法,从不同的角度考虑您的解决方案通常会揭示您的设计中更大的局限性,尤其是在早期。IBM 人工智能交互研究员迈克尔·穆勒(Michael Muller)表示:“如果我们能够从自己的经验或任何与生俱来的东西中互相学习,我们会把每件事做得更好。”。
将包容性付诸实践
当每个人都有责任实践包容性时,包含不同的观点是最容易的。
“我们没有一个人像我们所有人一样聪明……我们不知道的东西太多了。与我一起工作的人的经历或个性的任何种类的增加都将教会我一些东西,并将使我变得更好、更强、更善良,甚至更聪明。”
迈克尔穆勒,IBM 人工智能交互研究员。
什么对你来说很难?
许多从事电脑工作的人都患有身体疾病,包括重复性劳损(RSI)和眼疲劳。我们还可能会因为不良姿势而感到背痛,或者因为不良饮食习惯和缺乏锻炼而出现其他健康问题,这些都是长时间工作的可能结果。
根据 OSHA,与工作相关的肌肉骨骼疾病,包括 RSI 损伤,雇主每年损失超过 600,000 个工作日,并支付超过 200 亿美元的工人赔偿。
国家职业安全和健康研究所显示,每天使用电脑超过 2 小时的 7500 万人中有 91%患有某种视力问题,通常导致眼睛疲劳或头痛。
via 健康日
除了身体紧张,认知紧张也会影响我们的工作表现。如果我们花费大量的认知能量来调整我们解决问题的方式以适应一个设计糟糕的软件工具或网站,我们花费在实际工作上的整体精神能量就会减少。据 Gendermag 项目称,这类工具甚至可能会加剧社会人口代表性不足人群所经历的职业障碍。
还有谁有这种经历?
我们很多人都喜欢解决问题,尤其是为自己解决问题。当我们热情地向他人推销我们的解决方案时,当他们不像我们认为的那样感激我们的帮助时,我们可能会感到沮丧。在设计-思考你自己的解决方案之前,看看还有谁也觉得这件事很难。用这个问题作为开始谈话的方式。我们可以学到很多东西,不仅仅是通过分享自己的经历,还可以通过倾听他人的经历。
当我开始经历长时间使用电脑导致的周期性头痛时,我了解到许多像我一样被诊断患有多动症的人通常属于诵读困难症谱系的 T2。我联系了一位患有诵读困难症的同事,向他学习更多的工具和技巧。这些对我很有帮助,所以我打开了一个工作空闲频道,以方便访问。我不仅帮助了另一个患有多动症的人,还从他们身上学到了新的东西。我甚至能够用我所学的新东西来帮助我有阅读障碍的同事。
随着这些便利成为我工作流程的一部分,我遇到了许多网站和应用程序无法为他们的用户提供阅读障碍便利。结果,我成了一个更有效的可访问性倡导者。
开放式阅读障碍是一种免费字体,它让我的大脑(和我的眼睛)感到快乐,即使我没有被诊断为阅读障碍。(开放性阅读障碍截图)
Mozilla Firefox 提供了对浏览器中字体呈现方式的完全控制(但苹果不让我自定义系统字体)。(截图来自作者电脑)
虽然苹果的辅助功能不允许自定义系统字体,但灰度过滤器是一个我觉得非常有用的功能。(截图来自作者电脑)
我们的目标不仅仅是为自己解决问题。我们也想让其他人的事情变得更容易。我们能够做到这一点的唯一方法是努力去理解对方正在经历的事情,这才是真正令人满意和有意义的。
华盛顿大学保罗·g·艾伦计算机科学工程学院负责多样性和包容性的教授兼副主任詹妮弗·曼克夫非常关心选择正确的问题。她鼓励她的学生不要回避难做的事情。她甚至建议,研究那些使任务变得困难的工具的局限性,可以揭示出那些对解决问题有很大价值的事情。
Emily Shea 展示了她如何使用语音听写来适应 RSI 程序员的工作(来源:Youtube)
许多人可能没有意识到他们正在经历障碍,因为他们已经习惯了适应。通过探索替代工作模式,我们可以防止大量的工作场所伤害和可能的歧视。
实践包容性的另一种方式
提高对工作条件的认识鼓励我们优先考虑个人福祉。帮助彼此健康也延伸到我们的情感健康。
心、星星和喜欢是孩子们表达和接受感激的早餐麦片。它们会让我们在一瞬间感觉很棒,但是它们会让我们渴望更多。我们甚至会付出很多努力来满足这种渴望。
人们喜欢数 Github 明星,虽然不清楚他们的价值是多少(Gitstar 排名截图)
分享感激之情的更健康的方式是写一封贴心的感谢信。很多人只有在出问题的时候才会得到反馈。除了正式的审核过程,我们很少有人听说我们做对了什么。花些时间向同事表达你的感激之情,以书面形式,感谢他们对你的帮助,不管是多么小的帮助。如果合适,一定要抄送给他们的经理。这样做对于团结那些不太符合工作角色“理想”形象的同事尤为重要。
如果你的公司没有正式的赏识程序,可以考虑倡导一个(针对现任/前任员工的 IBM 认可中心的截图)
当我们的生活让我们感到身体紧张和情绪枯竭时,寻找幸福是困难的。与其通过升职和荣誉来寻求解脱,不如通过互相帮助来感受与同事的联系,培养工作中的成就感。通过提高我们的集体生活质量,我们加强了我们的相互联系和我们对社会的整体价值。一起,我们可以把我们的“日常琐事”变成“日常琐事”。
照片由野生禅艺拍摄
信用
- 感谢我的 IBM 同事沙里·特里文和迈克尔·穆勒分享他们的专业见解。
- 感谢教授詹妮弗·曼科夫分享她无价的学术研究智慧金块。
- 虽然我在文章中没有引用迦娜·基梅尔的话,但我还是要感谢她在波特兰无障碍会议后令人鼓舞的对话。她的准确问题激发了这篇文章的主题。
- 感谢 IBM CODAIT 团队花时间阅读本文并提供有用的反馈。
额外资源
- IBM Equal Access Toolkit——一个易于使用的 Firefox 增强工具,可以让您测试网站的可访问性。甚至数据科学家可能也会觉得有用!
- make 4 all——通过数据科学以及 3D 打印和其他制造技术,让我们的数字未来更加包容。
- gender mag 项目 —帮助您找到并修复包含“bug”的软件功能的工具。
数据科学家的头衔正在出售
意见
数据科学行业的新“美元树”业务正在蓬勃发展。但也很让人失望。
https://unsplash.com/photos/njcCsp58sDc
浮躁的时代
“我现在是数据科学家了!请查看我的数据分析认证……”
前几天有人在我的一个社交 app 上贴了这个带认证的图片。在过去的三个月里,这大概是我第十次看到这样的帖子了。我几乎不认识写这个帖子的人,但我知道他是体育管理专业的,他甚至连处理 Excel 表格都有问题。
现在人们自称为 数据科学家 ,或者 数据工程师 似乎很容易。
在我继续讲下去之前,我必须在这里澄清一下。我喜欢看到人们享受学习的过程,分享他们一路走来的收获。但是最近一段时间,我可以从字面上感受到,学术氛围已经比以往更加浮躁。人们更喜欢参加短期课程,获得一些看似可信的证书,在简历上有花哨的头衔,而不是花数年时间真正获得学位,进行深入研究,获得一些有意义的经验。这让我很困扰。
知识是廉价的,但经验不是
unsplash.com
在过去的几年里,最热门的大学专业已经从计算机科学转向了商业分析。社交媒体一直在谈论商业分析或数据分析。各行各业的人都赶在天气变冷之前开始流行起来。
尤其是新冠肺炎疫情爆发后,人们开始在家学习和工作。越来越多的企业涉足在线学习,因为这个市场比以往任何时候都大。我每天至少能看到三次标题为“在……内学习数据科学”的广告。为了吸引更多的用户,这些机构往往会给予相当大的折扣。据我所知,只要一美元,人们就可以开始学习 python 编程。
我尊重那些乐于分享知识的人。但是正如我上面提到的,参加这些课程的人可能会有不同的想法。我们生活在历史上最好的时代。每个人都可以无限制地获取资源,这些资源可以帮助我们提高和增长特定的知识。但是一门 20 小时、50 美元的在线课程不可能让任何人成为数据科学家。
贬低数据科学家的头衔对于那些在数据科学领域花费多年时间来发展基础和推动行业更上一层楼的人来说也不公平。图片一个人刚从维基百科学了一些行话就自称艺术家,你是什么感受?想象一下,当一个人刚学会做意大利面条时,他自称是意大利菜的首席厨师,你会怎么想?
“站在喜马拉雅山脚下不等于征服珠穆朗玛峰。”
实践是王道
我曾经听过一个传言:无论你多么擅长编程,你都会输给擅长演示的人。
大约九个月前,我开始学习商业分析。然而,我学得越多,就越发现自己无知。我做得越多,我就越会在工作中小心谨慎,因为我总是知道,任何时候骄傲自大都可能让我不知不觉地误入歧途。
我喜欢编码。我从编程中学到的是,激情不会产生任何东西,除非我把能量付诸行动。而且,重复练习才是王道。
我仍然清楚地记得,我的第一个中级 SQL 作业花了我五个小时来解决 12 个问题。我研究了我写的每一行代码,尽我所能去理解它们的逻辑。从 where 子句到 inner join,从 case 子句到 pivot table,从 with 子句到堆叠条形图,我阅读了大量的堆栈溢出帖子。在成功执行代码之前,我失败了一百次。我只花了我的努力和时间来提高我的 SQL 技能。
今年一月,我获得了研究助理的职位。我的第一个任务是计算样板文件(在这里查看)。我在“for 循环”代码上困了一个星期。我从午夜到早上花了几个小时在谷歌上搜索和阅读研究论文。直到我得到教授一丝不苟的指导,我还是无法解决这个问题。我并不为自己如此低效而自豪。然而,我从这项任务中学到的比我在学校几个月学到的还要多。
调试可能是数据科学中最乏味的工作。你有一个伟大的想法,但你不能把它付诸实施。多么令人沮丧啊!如果你有这种感觉,说明你遇到了你的瓶颈。接受你不够好的事实,继续做更多的研究,读更多的论文,做更多的锻炼。编码和投篮没有区别。想想在你连续投中两个三分之前,你投失了多少次。
我仍然鼓励每个人在网上分享他们的发现,因为这是我们进化的方式。而且我个人也上过很多网络课程。但是知识不是被授予的。人不会神奇地掌握任何东西。想在数据科学领域开始职业生涯吗?我的建议是,要有耐心,向比你优秀的人学习,分析你犯的错误,把你的知识运用到真实的案例中。
我可能永远不会成为最伟大的数据科学家之一。但是我知道我每天都在进步。
范德蒙行列式,一种新的证明
范德蒙矩阵的应用和行列式的一个原始证明
几乎所有学习线性代数的学生都会在整个学习过程中的某个时候学习范德蒙矩阵。这种类型的矩阵在数学和科学中有着广泛的应用,而且非常容易获取,这使得它成为你的数学工具箱中非常有用的工具。在本文中,我们将看看范德蒙矩阵在插值中的一个简单应用,然后以范德蒙矩阵的著名行列式的原始证明结束。首先让我们从一个简单的定义开始。
**定义:**范德蒙矩阵是以下形式的方阵
也许范德蒙矩阵最常见的应用是在插值领域。假设我们在平面上有 n 个点的集合
我们可以用一条平滑的曲线连接这些点,特别是用一个次数为 n-1: 的多项式
为此,我们将我们的点插入生成系统的多项式中
但是请注意,这相当于矩阵方程
我们应该很高兴看到左边的范德蒙矩阵。因此,我们把它简化为求解上面的矩阵方程。唉,不是所有的矩阵方程都有解。我们怎么知道上面的方程是可解的?一种方法是验证范德蒙矩阵将具有非零行列式。
碰巧范德蒙行列式是线性代数中的名人。行列式的表达式出奇的优雅,我们马上就会看到,似乎每个人都有自己的证明方法。这正是我们在这里要做的,我们要写一个原始的证明——尽可能地接近——范德蒙矩阵的行列式。
定理如果 A 是范德蒙矩阵,则
**证明(通过归纳)**我们根据矩阵的顺序 n 进行归纳。如果 n=1 则无显示内容。本着验证的精神,设 *n=2。*那么
一般的 2×2 范德蒙矩阵
现在,在这种特殊情况下,行列式的公式使用起来很简单,并产生
如你所愿。现在假设这个说法适用于第 n-1 个 T21。设 A 为 n 阶范德蒙矩阵。通过行操作,我们得到
根据柯西定理,我们得到
同样,由柯西,我们有
通过归纳假设,我们得到
如你所愿。
现在,有了行列式的表达式,很容易看出上面的原始矩阵方程是否有解。事实上,我们可以展示的是,由于我们点的所有 x 值都是不同的,所以确实会有解。这只是范德蒙矩阵的众多用途之一。
深度神经网络中的消失/爆炸梯度问题
理解我们在构建深度神经网络时面临的障碍
我们在训练深度神经网络时面临的一个困难是梯度的消失或爆炸。在很长一段时间里,这个障碍是训练大型网络的主要障碍。然而,到本文结束时,你不仅会知道渐变消失和渐变爆炸的问题是什么,你还会知道当你面临这些问题时如何检测,以及一些可能的解决方案来调试你的模型。
什么问题?
当使用基于梯度的学习和反向传播来训练深度神经网络时,我们通过从最终层(y_hat)到初始层遍历网络来找到偏导数。使用链式法则,网络中更深处的层要经历连续的矩阵乘法,以计算它们的导数。
在一个有 n 个隐藏层的网络中, n 个导数会相乘在一起。如果导数很大,那么随着我们沿着模型向下传播,梯度将呈指数增加,直到它们最终爆炸,这就是我们所说的 爆炸梯度 的问题。或者,如果导数很小,那么当我们通过模型传播时,梯度将呈指数下降,直到它最终消失,这就是 消失梯度 问题。
在爆炸梯度的情况下,大导数的累积导致模型非常不稳定并且不能有效学习,模型权重的大变化产生非常不稳定的网络,在极端值时,权重变得如此之大以至于导致溢出,导致其权重值不能再被更新。另一方面,小梯度的累积导致模型不能学习有意义的见解,因为倾向于从输入数据(X)学习核心特征的初始层的权重和偏差将不会被有效地更新。在最坏的情况下,梯度将为 0,这又将停止网络,从而停止进一步的训练。
怎么知道?
爆炸渐变
有几个微妙的方法,你可以用来确定你的模型是否受到爆炸梯度的问题;
Yosh Ginsu 在 Unsplash 上的照片
- 该模型在训练数据上学习不多,因此导致了较差的损失。
- 由于模型的不稳定性,该模型在每次更新时损失会有大的变化。
- 在训练中,模特的损失将会很大。
当面对这些问题时,要确认问题是否是由于爆炸梯度引起的,有一些更明显的迹象,例如:
- 模型权重呈指数增长,并且在训练模型时变得非常大。
- 模型权重在训练阶段变为 NaN。
- 导数是不断的
消失渐变
还有一些方法可以检测出你的深层网络是否存在梯度消失的问题
- 在训练阶段,模型的改进非常缓慢,也有可能训练很早就停止了,这意味着任何进一步的训练都不会改进模型。
- 越靠近模型输出图层的权重变化越大,而越靠近输入图层的权重变化就越小(如果有变化的话)。
- 训练模型时,模型权重呈指数级收缩,变得非常小。
- 模型权重在训练阶段变为 0。
解决方案
有许多解决爆炸和消失梯度的方法;本节列出了您可以使用的三种方法。
- 减少层数
这是可以在两种情况下使用的解决方案(爆炸和消失渐变)。然而,通过减少网络中的层数,我们放弃了一些模型的复杂性,因为更多的层数使网络更有能力表示复杂的映射。
2。渐变剪辑(爆炸渐变)
检查和限制梯度的大小,而我们的模型火车是另一个解决方案。深入研究这种技术的细节已经超出了本文的范围,但是你可以在一篇由 Wanshun Wong 撰写的标题为什么是渐变裁剪的文章中阅读更多关于渐变裁剪的内容。
3。重量初始化
为您的网络选择更仔细的随机初始化往往是部分解决方案,因为它不能完全解决问题。查看詹姆斯·德林杰的这篇文章 - 神经网络中的权重初始化:从基础到明凯的旅程
结论
在这篇文章中,我们学习了什么是爆炸和消失渐变,如何检测它们和一些解决方案。我知道在这篇文章中,我没有详细介绍 RNN 结构,这种结构容易消失梯度,有用的资源,以了解更多将在下面链接。
其他资源
维奥拉-琼斯算法
照片由 Ameer Basheer 在 Unsplash 上拍摄
使计算机或手机等机器看到周围环境的现象被称为计算机视觉。它是计算机科学的一个领域,专注于复制人类视觉系统的部分复杂性,并使计算机能够像人类一样识别和处理图像和视频中的对象。
计算机视觉的一些应用包括:
- 目标检测
- 人脸检测
- 人脸识别
- 自动驾驶汽车
- 自主无人机
人脸检测并不完美,但它已经达到了在我们的日常生活中被接受的阶段,从解锁手机到汇款。
维奥拉-琼斯算法
该算法是 OpenCV 库的基础。它是由保罗·维奥拉和迈克尔·琼斯在 2001 年开发的。它允许实时检测图像。
它是如何工作的
这个算法有两个阶段
- 培养
- 侦查
我们将首先讨论检测
检测
这种算法被设计用来寻找**正面人脸。**检测侧向、向上或向下时,性能会很差。图像首先被转换为灰度,因为它更容易处理,需要处理的数据更少。该算法首先在灰度图像中找到人脸,然后在彩色图像中找到人脸的位置。
它勾勒出一个矩形框,并从左上角搜索人脸。它寻找类似 haar 的特征,我们将在本博客后面讨论。在瓷砖上每走一步后的矩形方块右侧。
mahdis mousavi 在 Unsplash 上拍摄的照片
类哈尔特征
它是以发展了哈尔小波概念的匈牙利数学家阿尔弗雷德·哈尔的名字命名的。下面的特征显示了一个有亮侧和暗侧的盒子,这是机器如何确定特征是什么的。
维奥拉和琼斯发现了三种类型的哈尔特征,它们是
- 边缘特征
- 线特征
- 四个矩形特征/四边特征
边缘特征
例如,您想要检测眉毛。图像中眉毛上的像素的阴影将变暗,并突然变亮(皮肤)。边缘特征非常有助于找到这一点。
边缘特征
线特征
自然地,你的嘴唇在脸上的区域从亮变暗,然后又变亮。这个特征最好找
线特征
四个侧面特征
四矩形特征
这些特征帮助机器理解图像是什么。当检查图像时,每个特征都有自己的值。这很容易计算:从黑色区域减去白色区域
整体图像
随着像素数量的增加,即在更大的图像中,计算一个特征的值将变得非常复杂。积分图像概念有助于快速执行密集计算,因此我们可以了解多个特征中的一个特征是否符合标准。
让我们解释一下它是如何工作的。考虑下图
积分图像中的每一个点都是源图像中相应像素上方和左侧像素的总和。我们使用这个是因为我们不是对所有特征的每个像素值做加法,而是利用一些减法来得到相同的结果。
训练分类器
在训练中,我们给它输入信息,训练分类器从预测信息中学习。因此,最终,该算法将设置一个最小阈值来确定某个事物是否可以被归类为一个特征。
在训练阶段,图像缩小为 24*24 像素,并在图像中搜索特征。我们需要大量的图像数据来训练算法。Viola 和 Jones 向他们的算法输入了 4960 张手动标记的图像。我们还应该向分类器提供非面部图像,以便它能够分类和理解。Viola 和 Jones 为他们的算法提供了 9544 张非面部图像。
自适应增压
当我们观察所有可能的位置和这些特征的组合时,我们得到了一个精确的模型。训练在计算上可能是昂贵的,以检查每个图像中的每一种可能性和组合,这需要很多时间。
这里我们有一个以 f1,f2,f3 为特征,以 a1,a1,a3 为各自权重的方程。F(x)称为强分类器。单个分类器将是弱的,当我们有两个或三个弱分类器的组合时,我们得到一个强分类器。这个过程被称为合奏。
级联
这是另一种提高模型精度和速度的方法。在这里,我们首先选取一个子窗口,然后选取最佳特征,检查它是否出现在图像中。如果不是,我们拒绝该子窗口,并继续到另一个子窗口。如果它存在,我们看第二个特征,如果它不存在,我们拒绝它,并转移到另一个特征。级联加速了这一过程,并且机器更快地传递结果。
就这些了,希望你喜欢我关于计算机视觉的博客!。在我的下一篇博客中,我们将讨论使用 OpenCV 的人脸识别。
虚拟工作空间
人工智能如何塑造远程工作的未来?
自从疫情开始以来,许多人一直在办公室外工作,对他们中的一些人来说,这是他们第一次经历这么长时间的工作。
毫无疑问,这是有史以来进行的最大规模的远程工作实验,由于除了成功之外别无选择,许多公司都尽了最大努力来深入了解业务的真正需求以及员工保持高效工作的条件。
安妮·斯普拉特 / Unsplash 摄影
其中一个重要的需求是在不同的员工之间保持健康的关系,无论是那些必须密切合作的员工,还是那些恰好在同一个业务组工作的员工。
毫无疑问,许多团队仍然能够如此有效地工作的一个重要原因是,我们依赖于我们在前 covid 时期建立的长期关系。
现在,最大的问题是我们如何弥补人们之间缺少的真实生活互动,当每个人都远程工作时,这种互动通常会消失。
对于一些公司来说,解决方案是建立一个混合模式,团队可以不时地在办公室或者通过组织的郊游会面,但在我看来,这不是最终的解决方案。
早些时候我写过为什么我认为 COVID 是世界通过技术解决所有远程工作挑战的绝佳时机,我仍然对此深信不疑。
我们需要解决的第一个问题是用 face 2 face 视频聊天取代所有这些语音对话。归根结底,我们都是人,所以通过观察对方的脸可以了解很多事情。这就是我们相互信任和感受的方式。
因此,第一步应该是让每个人都在镜头前,聚焦在他们的脸上,绝对不是一个从坏角度展示一群人的低质量视频流。
视频会议应用已经成长起来——现在用户也需要。Zoom 见证了每日会议参与者飙升至 300 人的峰值…
www.wsj.com](https://www.wsj.com/articles/seven-rules-of-zoom-meeting-etiquette-from-the-pros-11594551601)
这里的挑战是我们的网络速度的可靠性,有时会成为一个障碍,头部姿势,背景和闪电也是一个挑战。
照片来自https://blog.zoom.us/zoom-virtual-background/
我们很多人都听说过 zoom 发布的虚拟背景功能,该功能可以通过深度学习用虚拟背景平滑地替换你的背景。
革命性特征背后的机器学习
medium.com](https://medium.com/ai-in-plain-english/heres-how-zoom-s-virtual-background-feature-works-ca5cdcad15ac)
但真正的创新来自 Nvidia,它通过使用 GANs 解决了最后三个问题。它不是发送整个庞大的视频流,而是发送关于关键面部点(眼睛、鼻子、鼠标)的数据。多亏了 GANs,在给定少量信息的情况下,接收器可以轻松地以更高的质量重建相同的面部实况视频,同时消耗更少的带宽。此外,新制作的视频将很容易调整,以提供完美的姿势,确保参与者之间的自然眼神交流。
从虚拟会议到虚拟工作空间
长久以来,人们一直对创造一个虚拟世界感到兴奋。一个计算机模拟的环境,每个人都可以拥有自己的虚拟角色,同时独立地探索虚拟世界,参与活动,并与他人交流。虽然大多数虚拟世界环境都是为了娱乐、社交和教育目的而创建的,如 SecondLife,但仍然有一个很好的机会来利用和适应我们对虚拟工作空间的需求,在虚拟工作空间中,每个人都可以与他人见面和互动。
来自 https://youtu.be/brd0jPjYPU0的脸书地平线
虚拟现实工作空间甚至可以推动我们离开办公桌,四处移动,同时完全沉浸在基于 VR 的世界中。脸书已经开发了 Horizon 作为 VR 游戏环境,但谁说我们不能借用同样的想法来工作?
如果我们可以混合深度学习和 VR 世界会怎么样?
在我看来,很快,我们就可以开始看到一个虚拟的工作空间,在那里我们这些远程工作者可以拥有栩栩如生的数字化身,以一种前所未有的方式表现我们的情绪、互动和面部表情。
来源:霓虹( https://www.neon.life )
仍然不相信这是可行的?
这一部分已经是现实了!三星 NEON,一个旨在建立一个人工人类化身的项目,其外观和行为完全像它模拟的原始角色,最近在 CES 2020 上展示。
另一部分已经在用了。一旦我有了这些想法,我很好奇是否有人在研究类似的解决方案,我很幸运也很惊讶地发现,VirBELA,一个基于支持“堡垒之夜”的相同游戏引擎的面向工作的虚拟环境,已经举办了一次有 200 多人参加的会议活动!
此外,公司开始使用著名的虚拟世界游戏 RecRoom 来举行一些会议、虚拟郊游和团队活动。
图片来自@Judith_ARTVR 推特账号
照片来自@ recroom twitter 账户
在虚拟世界中,除了更多地参与会议、培训和密切协作之外,无论你是想去茶水间吃午饭时聊聊天,还是只是喝咖啡时随便聊聊天,你都将能够拥有和以前一样的办公室日常事务。
这样我们就能把办公室搬到云上了!我们将基本上把办公室的所有功能都带到家里,而不是在办公室或家里做出选择。
就我个人而言,我非常兴奋地看到人工智能和虚拟现实将如何使我们在工作和生活之间取得平衡。这个时代将如何彻底改变人们对工作和生产力的看法!
你喜欢你读的东西吗?
在 Twitter @ahmdkamal 上找到我,获取关于#AI 和#tech 的有趣更新。
你知道你最多可以放弃 50 个👏到此贴** 😉 ?!
鼓掌让其他人看到&鼓励我在 medium 上发布更多高质量的内容!
沃尔玛数据科学家访谈
沃尔玛数据科学面试问题
沃尔玛的图像标志
沃尔玛公司是一家美国跨国零售公司,也是世界上最大的零售商,在全球超过 28 个国家拥有 20,000 多家商店和俱乐部。该公司成立于 1962 年,总部位于阿肯色州本顿维尔,在世界各地经营连锁超市、折扣百货商店和杂货店以及山姆会员店零售仓库。根据 2019 年的统计数据,沃尔玛是全球营收最大的公司,达到 5144.05 亿美元,也是全球最大的私营雇主,员工超过 220 万人。
沃尔玛也是一家数据驱动的公司。沃尔玛销售超过 7000 万种不同的产品,每周有超过 2.75 亿名顾客,沃尔玛每天都会在全球各地的商店产生大量的销售数据。为了理解这些数据,沃尔玛推出了数据咖啡馆分析中心,这是一个最先进的分析中心,每小时可以处理 2.5 的数据[1]。在这个数据咖啡馆中有 200 多个内部和外部数据流,可以对这些数据流进行操作和可视化,以生成业务影响洞察。
数据科学在沃尔玛的角色
沃尔玛有一个数据科学和分析部门,在其不同的产品团队中有许多角色,如数据科学家、数据分析师、大数据工程师和技术架构师。技术团队隶属于名为沃尔玛实验室的团队,包括:
- 客户技术
- 商业技术
- 供应链技术
- 业务参与和战略
- 全球云
- 全球数据和分析平台
沃尔玛的一般数据科学家角色涵盖业务分析、统计建模、大数据分析、机器学习和深度学习实施,其技能组合和工具从简单的数据分析/商业智能工具到机器学习实施。
所需技能
尽管沃尔玛的招聘要求可能在某种程度上取决于特定团队的需求,但沃尔玛通常对数据科学家职位有一般的招聘要求。沃尔玛数据科学职位的最低要求是本科学位和至少三年的工作经验。
其他相关要求包括:
- 4 年 SQL 和关系数据库(例如 DB2、Oracle、SQL Server 等)经验。).
- 4 年的统计和数值编程语言经验(例如,SAS、R、Python 和 SQL)
- 能够处理大型数据集,将算法扩展到大型数据集,并对大数据技术体系有充分的了解。
- 优秀的统计学、数学和机器学习算法的工作知识。
- 了解云计算平台和大规模数据库
- 自动化和脚本技术方面的经验
- 在分布式计算、数据仓库、ETL 开发和大规模数据处理方面有丰富的经验
试着在我们的 interactive SQL 编辑器 上解决这个问题。
面试过程
图片来自沃尔玛实验室的培养基
像大多数大型科技公司一样,沃尔玛也有类似的面试流程。一般来说,面试过程从 30 分钟的招聘电话开始,然后是带回家的挑战或与团队经理的技术面试。通过课后和技术面试后,您将进入现场面试,包括与团队各成员进行 4 到 5 次一对一的面试。
初始屏幕
沃尔玛最初的电话筛选是通过与招聘人员进行 30 分钟的电话交谈完成的。最常见的是,这种面试本质上是非技术性的,可能包括对你简历的简要介绍,对与你申请的团队相关的过去项目的讨论,以及你将会见的潜在团队成员。还要注意,面试中可能会有一些基本的技术元素,以确保你的简历与你的经历相符。
技术筛选和带回家的挑战
一般来说,根据职位的资历,沃尔玛可能会在招聘人员打电话后发出一份带回家的挑战,以确保你能通过技术基线。这个挑战最有可能在 Hackerrank 中完成,将涉及编写 Pandas 和 Python 代码来操作数据集。
想练习带回家挑战吗?查看 面试查询带回家的挑战 。
沃尔玛的技术筛选是通过 Hackerrank 以及一名数据科学家通过视频聊天完成的。面试通常持续一个小时,围绕面试的问题包括数据结构和算法问题以及 SQL,最后可能还会讨论机器学习。
准备在一个共享的环境中练习编码,并大声思考如何解决每个问题。
例题:
- 打印二叉树的所有分支。
- 什么是多重共线性,在回归模型中如何解决?
- 解释袋装和增压车型的区别?
- 样本量和误差幅度有什么关系?
现场面试
现场面试是沃尔玛数据科学招聘流程中的最后一次面试。这次面试包括与数据科学家和招聘经理的 4 到 5 轮面试,所有面试持续大约 45 分钟,中间有午餐休息时间。这几轮的面试问题围绕概率统计、SQL 和数据分析、机器学习概念、产品感和一般文化契合度。然而,大多数情况下,现场面试是为满足团队需求而量身定制的。
然而,总的来说,沃尔玛的现场数据科学家面试是这样的:
- 与一名团队成员的技术访谈,涉及基于 SQL 的案例研究问题。
- 围绕回归分析的概率和统计问题。
- 与招聘经理的一轮技术面试,包括回答关于机器学习算法和设计基础的问题(例如,你将如何设计一个推荐系统?)
- 与产品经理就与你面试的团队相关的过去项目以及文化、价值观和产品指标进行面谈。
注意事项和提示
请记住,面试旨在评估您如何将各种数据科学概念应用于公司。在这种情况下,对于沃尔玛来说,他们最大的问题在于改善服务交付和顾客购物体验。
沃尔玛往往是一家大公司,允许不同的数据科学角色有很大的灵活性。因为沃尔玛拥有如此庞大的多企业集团业务,你可以找到许多机会在职业阶梯上移动或提升。
最后,虽然沃尔玛的办公室总部设在阿肯色州,但沃尔玛实验室的总部设在圣布鲁诺,就在硅谷中心的北部。沃尔玛的报价在更大范围内仍然具有竞争力,因为他们需要吸引人才。薪酬待遇可与 RSUs 高基本薪酬协商。
沃尔玛数据科学面试问题
- 说说有监督和无监督学习的区别。
- 描述一下 DBSCAN 算法的作用?
- 什么是 ROC 曲线?混淆矩阵对模型评估有什么作用?
- 渐变增强和随机森林有什么区别?
- 一个使用搜索引擎的人需要找到一些东西。你如何想出一种算法,在用户只输入几个字母后就能预测他们需要什么?
- 线性回归的一般假设是什么?
感谢阅读!
- 报名 面试查询 每周在你的收件箱里获得几个数据科学面试问题。
- 订阅 Youtube 上的 我的频道 获取数据科学模拟面试,指南,以及技巧和窍门。
- 在面试查询博客上找到更多数据科学面试指南,如 谷歌数据科学家面试 和DoorDash 数据科学家面试 。
参考资料【1】沃尔玛的真正大数据
原载于 2020 年 4 月 9 日 https://www.interviewquery.com。**
Python Walrus 运算符
Python 3.8 特性
你现在肯定用过了!
Walrus operator 是 Python 3.8 更新中添加的最酷的特性,这是你们大多数人现在可能正在使用的 Python 版本。操作符:=
被称为海象操作符,因为它描述了海象的样子。把冒号看作眼睛,等号看作长牙。
walrus 运算符用作赋值表达式。它允许你给一个变量赋值,同时也返回值。
那么我们如何利用这一点呢?
如果你想知道这个操作符是否有用,你应该看看这个!
假设您有一个程序提示用户说出他们最喜欢的颜色,并且您希望该程序向用户发回一条包含答案的消息。通常,您会这样做:
start = input("Do you want to start(y/n)?")
print(start == "y")
但是有了 walrus operator,我们可以让它更紧凑。
print((start := input("Do you want to start(y/n)?")) == "y")
这两个代码片段将打印相同的结果,如果输入是 y,则打印 True,否则打印 False。你能认出我在第二段代码中使用了双括号吗?在这个代码片段中,即使没有双括号,仍然可以获得理想的结果 True/False。但是,应该注意的是,鼓励在 walrus 操作符中使用括号。它可以节省你很多时间。
为什么重要?
比较这两个片段:
- 带括号
if (sum := 10 + 5) > 10:
print(sum) #return 15
2.不带括号
if sum := 10 + 5 > 10:
print(sum) #return True
注意,在第二个示例中,值 True 被赋给了 sum 变量。这是因为零件> 10
包含在 sum 变量的评估中。
最后的想法
Python 3.8 中的 Walrus 操作符是您现在应该已经在使用的一个特性。该操作符允许的赋值表达式的可能性将是对 Python 特性的一个很好的补充。我担心不是每个人都会同意,因为对一些人来说,这会牺牲可读性。尽管如此,我个人认为,通过正确的实现,walrus 操作符将是对您的代码的一个很好的补充。
使用 walrus 操作符时,只需记住使用括号以避免歧义。
问候,
弧度克里斯诺
代码货币化的方式正在改变
罗曼·辛克维奇在 Unsplash 上拍摄的照片
使用 API 市场把你的代码变成一个生意
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
对于开发者来说,时代在快速变化。
几年前,如果你想用代码赚钱,你有两种解决方案。传统的低风险低回报方法是找一份朝九晚五的工作。然而,如果你想要更多的控制权,唯一的另一种方法就是去做个体经营者,承担更高的风险。
现在情况不再是这样了。随着在线生态系统的发展,越来越多的公司意识到,他们宁愿付费使用一个适当开发和维护的外部解决方案,而不是以数百倍的成本在内部开发。
在供应方面,这为开发者创造了大量的机会,将他们的工具转化为全面的服务,并向用户收取订阅费。Twitter 或脸书等数字渠道是为了销售数字产品而建立的,这让具有企业家精神的程序员的工作变得更简单。从你的卧室创建一个应用程序从未如此简单,SaaS 模式(软件即服务)正在蓬勃发展。
产品和分销渠道的演变
因此,创业成了许多人的愿望。然而,仅仅构建一个优秀的产品是不够的。随着产品分销渠道变得人人可及,竞争加剧了。编码、开发、产品开发、销售、营销、品牌:他们都需要不同的技能。要想在一个饱和的市场中取得成功,一切都必须是非凡的。
SaaS 的建立是为了满足非技术公司使用高级软件解决方案的需求,而不必构建它们。最重要的是,打算开发 SaaS 产品的开发者创造了一个新的需求:建立和货币化他们的产品的服务,允许创作者专注于软件。
输入 API 市场。
什么是 API 市场?
作为一个成功的 SaaS 企业,有几件事必须注意。举个例子,
- 产品开发,
- 托管和开发,
- 文档,
- 客户支持,
- 营销,
- 销售,
- 品牌化,
- 市场调查,
- 定价和货币化。
这提高了进入门槛,因为做所有这些需要一个更大的团队,而不是几个编码员。为了让事情变得更简单,企业家和黑客注意到了两个显著改变平衡的关键因素。
首先,大多数服务可以以 API 的形式交付。举个例子,我们来考虑一个来自金融的例子。如果你进行算法交易,你需要一个神奇的函数,你可以调用它来返回数据并进行定量分析,而不是根据原始数据自己去做。或者,如果你想在 Twitter 上进行社交网络分析,并获得对正在发生的事情的见解,你不会想爬取网站来创建一个推文数据库。相反,您希望直接访问以编程方式搜索和分析数据。
第二,*开发者需要快速建立一个服务,除了编码之外不需要担心以上所有的事情。*这导致了 API 市场的兴起,为建造者解决了大部分负担。开发者只需要专注于提供尽可能好的服务,而不用担心如何利用他们的 API 赚钱。
那么,这些 API 市场是如何工作的,它们能提供什么呢?
如何使用 API 市场将你的代码货币化
简单地说,一个 API 市场负责两个问题:货币化和分配。
假设您已经构建了自己的服务,并且有了一个托管解决方案。为了从您的代码中获益,您必须实现一个解决方案来验证用户并接受订阅费用。然而,你写的代码越少,你需要维护的就越少,所以你有更多的时间专注于产品。
API 市场,如 RapidAPI 负责这一点。例如,你可以在那里注册你的 API,并很容易地建立一个支付计划。用户通过 RapidAPI 调用你的 API,RapidAPI 负责认证。
将您的服务添加到 RapidAPI。来源: RapidAPI 文档
对于用户来说,调用您的服务尽可能简单。API 密钥是在订阅时发布的,用于对调用者进行身份验证,而无需您做任何额外的工作。
为了演示这对用户来说有多简单,这里有一个示例代码片段,直接来自 RapidAPI 的天气预报 API 之一 Dark Sky 的文档。
此外,您的服务会在市场中列出,因此潜在用户可以搜索和发现它。
另一方面,RapidAPI 对所有通过它进行的支付收取 20%的费用。在制定定价计划时,应该考虑到这一点,尤其是因为你还必须支付托管费用。
RapidAPI 市场上的 API 列表
这里有几个额外的案例研究和实践教程,如果你利用这些平台直接用你的代码赚钱,它们会很有用。
[## API 作为一种产品。当你只知道一个后端时,如何销售你的作品
关于如何在不管理网站、服务器、用户和支付的情况下发布和销售代码的指南。预付 0 美元…
towardsdatascience.com](/api-as-a-product-how-to-sell-your-work-when-all-you-know-is-a-back-end-bd78b1449119) [## 开发和销售 Python API —从头到尾教程
本文从头到尾描述了开发 Python API 的过程,并在更困难的领域提供了帮助。
towardsdatascience.com](/develop-and-sell-a-python-api-from-start-to-end-tutorial-9a038e433966)
下一代 API 市场
尽管 API 市场提供了显著的改进,但事情仍然没有完全解决。就目前情况来看,开发托管解决方案的责任仍然在于开发者。根据 API 需要扩展的程度,这可能需要非常专业的知识。(如果 API 成功,它将需要扩展。)
此外,即使你的申请不成功,你也必须预先支付托管费。在某些情况下,例如,当服务需要运行 GPU 实例时,这些成本可能会很高。
最近,一个新的竞争者来了,把 API 市场带到了一个新的高度。即将推出的 NoOps 平台 Byvalue ,承诺简化你的代码货币化的整个过程,而不需要你优化主机和支付任何前期费用。
通过值创建带有的 API
目前,他们正处于测试阶段,他们正在寻找早期采用者加入他们的社区,并帮助建立他们的市场。如果你对开发人员如何将代码货币化的未来感兴趣,你绝对应该去看看!
不使用 Flask,Heroku,AWS,FastAPI,Zappa…
medium.com](https://medium.com/byvalue/use-byvalue-to-create-your-own-api-business-99f71f8d15fd)
结论
我们生活在一个充满机遇的时代。随着数字产品分销渠道的发展,通过构建软件并将其作为服务出售来赚钱逐渐成为每个拥有编码技能的人的能力。通过 API 交付服务已经成为一种经过检验和测试的商业模式,对于小型和大型企业都是如此。
最初,所需的技术专长远远超出了要解决的问题的领域知识。产品的部署和货币化既耗时又困难。
因此,API marketplaces 就是为了满足这种需求并为开发人员完成这项工作而创建的。如果你正在寻找从你的代码中获利的方法,API 市场如 RapidAPI 绝对是你要走的路。
然而,问题远未解决。像 Byvalue 这样的新创公司挑战当前市场的实施方式,并着手为所有想要将代码转化为利润的人提供一站式体验。
如果你想使你的收入来源多样化,或者甚至成为个体经营者,通过 API 提供服务是一个很好的方法。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
我们学习卷积的方式
一篇关于如何理解卷积的短文
卷积是每个通信工程专业的学生首先学习的概念之一。它对于信号和系统的研究是如此的基础,然而,它是以一个方程的形式给出的,其解释集中于如何卷积而不是为什么卷积。
我们教和学卷积的方式是错综复杂的:)
还记得我们是怎么学的吗?如果 LTI 系统的输入中的 x[n]具有脉冲响应 h[n],则输出 y[n]由卷积运算给出:
y[n] = ∑ₖ h[k] x[n-k]
哎呀,很好的等式,但是它意味着什么,我们问。我们得到了视觉翻转,滑动和乘法积累!
假设我给你两个序列:
x1 = [1, 2, 1, 0, 0, 2, 1, 2]
x2 = [3, 0, 0, 3, 0, 0, 1]
我问你卷积输出。你会怎么做?尤其是如果你没有 Matlab 或者 Octave 或者 Python。你会评价上面两个序列的 y[n] = ∑ₖ h[k] x[n-k] 方程吗?
相反,只要启动你的常规计算器。将两个数字相乘(通过从右到左的顺序得到): 21200121 x 1003003 。你得到的结果( 21263784963363 )就是卷积输出!没错,卷积来自普通的乘法运算。不相信我?试试吧!
为了交叉检查答案是否正确,下面是使用 Python 的 scipy 的卷积输出。信号:
from scipy import signal
yc = signal.convolve(x1, x2)
print(yc)[3 6 3 3 6 9 4 8 7 3 6 2 1 2]
我再举一个例子:x1 =[2,1,1,0,0,0,2,2],x2 =[1,0,0,0,2,0,2]。乘以22000112x22020001=48442488240112,从右向左读取,即为卷积输出。
当然,对于那些理解卷积到底是什么的人来说,这并不奇怪。毕竟,我们对于 1 序列的乘法模式已经暗示了这一点:
11x11=121
111 x 111 = 12321
1111 x 1111 = 1234321
等等。认出模式了吗?两个方波的卷积产生一个三角形。
对于幼徒来说,上面的技巧并不适用于所有的场景。你可以看到,即使是只有数字 1 的数字,这种模式在长度为 10 时也会中断:1111111111111x1111111111=12345678900987654321。不再是三角形了——注意中间的两个零。
那么,为什么这个乘法技巧行得通,为什么不是对所有序列都行得通呢?它之所以有效,是因为卷积运算就像两个序列相乘一样基本。我们如何将两个序列相乘?当然是把它们变成多项式的系数!假设我们有两个序列[a0,a1,a2]和[b0,b1,b2]。创建多项式
(A0+a1x+a2x)
(B0+b1x+b2x)
乘法和分组项:
(a0b 0)+(a0b 1+a1b 0) x+(a0b 2+a1 B1+a2 b 0)* x+(a1 B2+a2 B1)* x+(a2b2)x⁴
现在,您可以将卷积输出作为结果多项式的系数读出。
乘法口诀什么时候不起作用?当输出多项式的任何系数大于 10 时。因为卷积不像十进制表示那样“携带”数字。
另一个检查:长度为 m 的序列和长度为 n 的序列的卷积,输出长度为 m+n-1 。长度为 m 的序列是 m-1 次多项式,因此高阶项将是 x⁽ⁿ⁻ ⁾ * x⁽ᵐ⁻ ⁾= x⁽ⁿ⁺ᵐ⁻ ⁾.如果一个多项式有次数(m+n-2),它有 m + n — 1 个系数。
这给了我们直觉。毕竟,我们在学校学的是代数,而在工程课程中,我们只在信号与系统 101 中学习卷积。为什么不在我们已经学过的和熟悉的基础上发展呢?
这并不是说翻转和相乘没有用。当你看 2D 卷积时,这种解释是非常有用的。您可以将它想象为翻转(水平和垂直)您的 2D 核,将其重叠在您的 2D 数据的第一个样本(左上角)上,然后简单地向下拖动核,直到您到达第一列的最后一行,重置为第二列的顶行,向下拖动。冲洗并重复,直到到达最后一列最后一行的样品。下面是一个快速而复杂的 Python 代码,它将一个 8×8 的输入与一个 4×4 的内核进行卷积:
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
hker = np.random.randint(low=0, high=4, size=(4,4))
hkerf = hker[::-1,:]
hkerf = hkerf[:,::-1]
x2d = np.random.randint(low=0, high=4, size=(8,8))
x2dpad = np.zeros((14,14))
x2dpad[3:3+8,3:3+8]=x2d
y2d = np.zeros((11,11))
for row in range(11):
for col in range(11):
y2d[row,col]=np.dot(hkerf.flatten(),x2dpad[row:row+4,col:col+4].flatten())
y2dc = signal.convolve2d(hker,x2d)
plt.stem(y2d.flatten(), use_line_collection=True)
plt.plot(y2dc.flatten(),'ro')
方程 y[n] = ∑ₖ h[k]x[n-k] 的建立方式也是理解数字滤波器和利用离散傅里叶变换进行计算的重要基础。然而,虽然我们必须接受严格的训练,但我们不能在这个过程中失去直觉。
对了,我本来可以一段话把这个帖子写完,说卷积和多项式乘法一样。但是这有什么意思呢?!
你控制 ML 项目版本的方式是错误的
当您可以拥有更多时,是否在寻找一种类似 git 的数据版本控制方法?是时候跳出框框思考了
抓拍您的数据—照片由阿德里安·奥利琼在 Unsplash 上拍摄
数据科学家和机器学习工程师倾向于像管道这样的预测分析项目;接受明确定义的输入以产生特定输出的生产线。这些相互关联的步骤(例如,数据采集、数据处理、数据建模等。)一起朝着最终目标努力,但它们也可以是独立的过程,以自己的节奏运行。
如果有一种方法可以自动对每个 ML 管道步骤的结果进行版本控制,这不是很好吗?
ML 管道中的步骤通常输出转换后的数据集,我们手动对其进行版本控制,并将其移动到对象存储桶。但是它们也可以产生各种其他工件,从原始变量到训练好的 ML 模型。那么,我们如何将所有这些事情版本化呢?腌制一切?饭桶?也许是 LFS?如果有一种方法能够自动将所有这些结果版本化不是很好吗?
在这个故事中,我们向你展示了如何自动地将你在项目中所做的最微小的改变版本化,而无需思考。咱们开始吧!
学习率是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!
ML 的版本控制
数据科学家大部分时间都在 Jupyter 笔记本中探索数据和起草想法。通常,当我们试图对我们的工作进行版本化时,我们最终会得到一堆重复的ipynb
文件,采用不同的命名方案。
在 ML 管道的每一步之前和之后,我们能有自动拍摄我们工作的东西吗?此外,我们能在不需要大量配置的情况下开始使用它吗?只要打开一个笔记本,做我们的事情,并确保其他事情会照顾自己。
另一方面,众所周知,使用 Git 很难跟踪笔记本,而使用流行的 VCS 进行数据集版本控制是不可能的。Git 大文件存储(LFS)用 Git 内部的文本指针替换音频样本、视频、数据集和图形等大文件,并将文件内容存储在远程服务器上;不理想。
有人也可以尝试 DVC ,但这只是一种类似 Git 的数据版本控制方法。这通常会让数据科学家更加头疼,他们不想学习另一种工具来完成工作。
我们能不能在 ML 流水线的每一步之前和之后都有自动抓拍我们工作的东西?此外,我们能在不需要大量配置的情况下开始使用它吗?只要打开一个笔记本,做我们的事情,并确保其他事情会照顾自己。是的,我们可以!让我们看看怎么做。
设置工作空间
因此,对我们在项目中所做的一切进行自动版本控制似乎有些极端,对吗?如果你对 GCP 使用 MiniKF 就不会了。安装 MiniKF 非常简单;我们需要的只是一个 GCP 帐户和从市场部署应用程序的能力。
MiniKF 部署—作者图片
- 访问 GCP 页面上的MiniKF
- 选择启动,设置虚拟机配置并点击部署
为了获得最佳性能,建议保留默认的虚拟机配置
就是这样!部署最多需要十分钟,您可以按照屏幕上的说明观看进度;ssh 进入机器,在终端上运行minikf
,等待直到您的端点和凭证准备好。
MiniKF 的提供已完成—图片由作者提供
现在,我们准备访问 Kubeflow 仪表板。点击网址,输入你的凭证,你就可以开始了!
Kubeflow 仪表板—按作者分类的图像
运行 Jupyter 服务器
那么,还剩下什么?我们需要一个 Jupyter 笔记本实例。使用提供的 Jupyter Web 应用程序,在 MiniKF 中创建 Jupyter 笔记本相对容易:
- 从左侧面板中选择笔记本
- 选择
New Server
按钮 - 填写服务器名称,请求您需要的 CPU 和 RAM 数量,然后点击
LAUNCH
按照本教程,保持 Jupyter 笔记本图像不变(
*jupyter-kale:v0.5.0-47-g2427cc9*
—注意图像标签可能不同)
创建 Jupyter 服务器—作者图片
完成这四个步骤后,等待笔记本服务器准备好并连接。你将被转移到你熟悉的 JupyterLab 工作区。
这是一种魔法
在下面的故事中,我们看到了如何将 Jupyter 笔记本转换成 Kubeflow 管道,而无需编写任何代码。
无需编写一行代码,即可将您的笔记本草稿转化为生产就绪的 Kubeflow 管道。
towardsdatascience.com](/jupyter-is-ready-for-production-as-is-b36f1d1ca8f8)
简而言之,要使用当前的示例,您应该首先在 JupyterLab 环境中打开一个终端并克隆 repo:
git clone [https://github.com/dpoulopoulos/medium.git](https://github.com/dpoulopoulos/medium.git)
将目录更改为medium > minikf
并启动titanic.ipynb
笔记本。取消对第一个代码单元的注释,然后运行它,将必要的依赖项安装到您的环境中。然后,让 Kale 接手!
检查笔记本的左侧面板,您会看到一个紫色图标。这是有趣的开始…按下它来启用羽衣甘蓝扩展。你会自动看到每个单元格都被标注了。
启用 Kale 扩展-按作者分类的图像
你可以看到笔记本是分节的;导入、数据加载部分、数据处理、模型训练和评估等。这正是我们用羽衣甘蓝注释的。现在,这个笔记本是预先注释好的,但是你可以随意使用。您可以创建新的管道步骤,但是不要忘记添加它们的依赖项。
在任何情况下,你都可以点击位于羽衣甘蓝部署面板底部的COMPILE AND RUN
按钮。无需编写一行代码,您的笔记本将被转换为 Kubeflow 管道,该管道将作为新实验的一部分执行。
从 Jupyter 笔记本到 Kubeflow 管道——作者图片
按照 Kale 提供的链接观看跑步实验。几分钟后,管道将成功完成其任务。这是图表的最终视图(不要忘记切换左上角的Simplify Graph
选项):
泰坦尼克号管道——作者图片
然而,如果你仔细观察,Kale 做的第二件事是使用 Rok 给笔记本拍快照。此外,在管道的每一步之前和之后,它都会这样做。因此,我们可以在任何时候回到我们环境的状态。我们如何做到这一点?
韩国快照
Rok 是一个数据管理产品,允许您对您的完整环境及其数据进行快照、版本化、打包、分发和克隆。它作为其支持的平台之一与 Kubernetes 进行了本机集成,并在几分钟内部署到现有集群、本地或云上。
它预装在 MiniKF 中,所以让我们使用它!假设您想在运行 SVM 分类器之前返回您的环境状态。
- 点击
smv
步骤并选择Visualizations
选项卡 - 跟随
Rok autosnapshot
卡内的链接 - 复制页面顶部的韩国网址
- 创建一个新的笔记本服务器,并在顶部粘贴复制的网址
- 配置虚拟机资源,并为工作区指定一个有效的名称
- 点击
LAUNCH
按钮
与韩国同行——作者图片
**当笔记本服务器准备好了,连接上它,一个新的 JupyterLab 环境将会准确地在你请求的点打开。到目前为止的所有单元格都已为您执行。**您可以从该单元格继续工作;探索变量状态、数据集并训练模型。这下好了。
继续你的 JupyterLab 状态——作者图片
结论
在这个故事中,我们看到了如何在 Jupyter 笔记本上修改我们的作品,甚至不用去想它。我们在 MiniKF 上运行的每个实验都是分步进行的,我们可以使用 Rok 在任何时间点返回。
继续使用 MiniKF 在 Kubeflow 中运行您的实验。您的工作流将保持不变,但在许多方面进行了扩展,没有任何样板代码。
关于作者
我的名字是迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请在 twitter 上关注我的 Medium 、 LinkedIn 或 @james2pl 。
所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。
您编写代码的方式即将改变:加入等待列表
OpenAI API 将会带来编码的革命。
你能给我一个 shell 命令来打印你当前所在文件夹的名字吗?这很简单。应该是pwd
。如果您想导航到/tmp
文件夹呢?简单:cd /tmp
。
现在,在你的脑海中,计算当前文件夹中 python 文件数量的命令是什么?那就有点棘手了:find . -type f -name '*.py' | wc -l
。这并不难,也可以用其他方式来做,但有时我们会忘记。
如果我告诉你,你可以编写一个脚本,你可以用自然语言查询并得到你正在寻找的 shell 命令,那会怎么样?
了解复杂的 shell 命令有一定的吸引力。我明白,这也能提升自尊。**然而,如果我告诉你,你可以编写一个脚本,你可以用自然语言查询并得到你正在寻找的 shell 命令,那会怎么样?**比如,假设你有一个自然语言外壳 (nlsh),你想得到今天是星期几。它可能看起来像这样:
nlsh> What day is it?
>>> Would you like to run: date +%A [Y/n]: _
第一行是 shell 的输入,而第二行展示了可能的输出。那会很酷,对吧?**现在,如果我告诉你,你现在就可以使用 python,用不到 30 行代码做到这一点,会怎么样?**在我看来,这是革命性的!**在这个故事中,我们谈论 OpenAI 的 API,一种访问 OpenAI 开发的新人工智能模型的方法。**而自然语言外壳只是冰山一角。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。在这里订阅!
OpenAI API
OpenAI API 是一种访问 OpenAI 开发的新 AI 模型的方法。它提供了一个通用的接口,你可以指定你想要它做什么,只有少数例子。你可以把它集成到你的产品中,对它进行微调,开发一个全新的应用程序,或者只是探索它的极限。API 还没有对公众开放,但是,你可以加入等待名单。
它是如何工作的?
想象一下,你想创建一个文本补全应用程序,像自然语言外壳(有人可能会说这也可以看作是一个 Q & A 应用程序)。首先,你应该通过展示一些你想做的例子来“编程”API。越多越好,尤其是任务复杂的时候:
Input: Print the current directory
Output: pwdInput: List files
Output: ls -lInput: Change directory to /tmp
Output: cd /tmpInput: Count files
Output: ls -l | wc -l...
嗯,就这样吧!没有第二步。第一天的结果可能并不完美,但是您可以通过在更大的数据集上训练它,或者通过从用户提供的人类反馈中学习来磨练它的性能。
**open ai 的研究人员设计了足够灵活的 API,以使机器学习团队更具生产力。同时,它非常简单,任何人都可以使用。**在后台,API 运行来自 GPT-3 系列的权重模型,这些模型在速度和吞吐量方面都得到了改进,使这种应用程序变得切实可行。
什么是 GPT-3?
GPT-3 是 OpenAI 的 GPT-2 的演变,它标志着自然语言处理的一个新的里程碑。GPT 代表生成式预训练变压器,引用了 2017 年谷歌的一项创新,名为变压器。它的主要目的是计算出特定单词在给定上下文中出现的可能性。在此基础上,我们现在可以创建完成文本、回答问题、总结文档等等的应用程序。
自然语言外壳示例
在这一节中,我们将使用 python 和几行代码来编写我们在序言中看到的自然语言外壳。首先,python 文件:
在 python 脚本的开始,我们为 API 提供了一些我们希望它做什么的例子。然后,我们创建一个Completion
任务并使用davinci
模型。我们将max_tokens
设置为100
以获得足够的缓冲,将temperature
设置为0
。每当我们遇到只有一个正确答案的问题时,将temperature
设置为0
是一个很好的做法。一般来说,温度越高,模特的创作自由度就越大。
最后,我们执行python nlsh.py
来测试应用程序。
自然语言外壳
更多示例
与 OpenAI 密切合作的组织已经在使用 OpenAI API。让我们看几个非常聪明的例子。
闲谈
AI Channels 是一个面向人和人工智能代理的社交网络。人工智能频道让你与人工智能代理互动,这些代理可以帮助你产生想法,推荐书籍和电影,讲述互动故事,或者与你的朋友和历史上最伟大的头脑一起参加圆桌讨论,你可以请虚拟的阿尔伯特·爱因斯坦解释相对论,或者从简·奥斯汀那里获得写作技巧。
代码完成
有了 OpenAI API,我们可以生成有用的、上下文感知的代码建议。在使用来自数千个开源 GitHub 仓库的代码进行微调后,API 根据函数名和注释完成代码。
摘要
通过其模式识别和生成功能,API 可以将密集的文本转换为简化的摘要。在这里,我们展示了将 NDA 总结为二年级阅读水平可以理解的内容的 API。
结论
在这个故事中,我们看到了 OpenAI API 的潜力和一些用例,它们重新定义了这种自然语言理解工具的可能性。语义搜索、客户支持、聊天机器人、文本处理应用程序和生产力工具将永远改变!
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。订阅这里!
关于作者
我的名字是 Dimitris Poulopoulos ,我是一名为 BigDataStack 工作的机器学习研究员。我也是希腊比雷埃夫斯大学的博士生。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲中央银行、经合组织和宜家等主要客户设计和实施人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请在 twitter 上关注我的 Medium 、 LinkedIn 或 @james2pl 。
网页抓取模板
网页抓取步骤总结。
Web 抓取是自动从 web 中提取数据的过程。Web 报废包括从网页中获取数据,并根据需要存储它们。
在这篇文章中,我将分享我的模板,我用它来节省我的时间,避免一次又一次地写同样的东西。我使用 Python 编程语言进行 web 报废。
免责声明:此模板并不适用于所有网站,因为所有网站都不相同。然而,它在大多数时候是有效的。本帖不是教程帖。
TL;速度三角形定位法(dead reckoning)
如果你想查看我的模板,请点击这里查看。
加载所需的库
第一步是加载所有需要的库。让我们导入所有必需的库。我正在使用 BeautifulSoup 库进行网页清理。除此之外,我正在使用 Pandas 和 request 库。导入之前,请确保系统中安装了所有库。
!pip3 install bs4, pandas, request
从语法上分析
现在,所有需要的库都已加载。请求一个网站对于从网上删除数据是非常重要的。一旦请求成功,网站的全部数据/内容都是可用的。然后我们可以解析 bs4 的 URL,这使得内容以纯文本形式可用。
只需添加您想要删除的 URL 并运行单元格。
提取所需的元素
现在我们可以使用 soup.find()和 soup.find_all()方法从网页中搜索所需的标签。通常,我的目标是存储数据的表。首先,我总是搜索标题。通常,标题可以在标签中找到。所以让我们找到它们并存储在 Python list 中。
现在我们的标题存储在一个名为 headings 的列表中。现在,让我们找到可以在标签中找到的表体。
现在我们有了标题和内容。是时候将它们存储在 DataFrame 中了。在这里,我创建了一个名为data
的数据帧。
最后,我们为将来的使用准备好了数据。我喜欢在将数据保存为 CSV 格式之前进行一些数据分析。
数据分析
分析数据至关重要。使用 pandas,我们可以使用 head()、describe()和 info()等不同的方法来执行数据分析。除此之外,您还可以检查列名。
一旦您分析了数据,您可能想要清理它们。这一步是可选的,因为在创建数据时并不总是需要。但是,有时候是需要的。
数据清理
这个模板有一些数据清理过程,比如从数据中删除不需要的符号和重命名列名。如果你愿意,你甚至可以添加更多的东西。
现在我们的数据可以保存了。
将数据保存到 CSV 中
让我们将数据保存在 CSV 文件中。您需要更改文件名。
这个帖子到此为止。从网上删除数据不仅仅局限于这个模板。有很多事情可以做,但这都取决于网站。这个模板有一些你必须重复的东西,这样可以节省你的时间。你可以在这里找到一个完整的 jupyter 笔记本。
感谢阅读。快乐的网页抓取!
如果你喜欢我的工作并想支持我,我会非常感谢你在我的社交媒体频道上关注我:
- 支持我的最好方式就是跟随我上 中级 。
- 订阅我的新 YouTube 频道 。
- 在我的 邮箱列表 报名。
如果你错过了我的循序渐进指南
《泰坦尼克号》入门|第二部
如果你错过了我的 python 系列。
- 第 0 天:挑战介绍
- 第 1 天: Python 基础知识— 1
- 第 2 天: Python 基础知识— 2
- 第 3 天: Python 基础知识— 3
- 第 4 天: Python 基础— 4
- 第 5 天: Python 基础知识— 5
我希望你会喜欢我的其他文章。
Apache Spark 的内容、原因和时间
编写代码之前的 Spark 基础知识
伊森·胡佛在 Unsplash 上拍摄的照片
什么是火花?
Spark 被称为“通用分布式数据处理引擎”1 和“用于大数据和机器学习的快速统一分析引擎” 。它通过将工作分成块并在计算资源之间分配这些块,让您更快地处理大数据集。
它可以处理高达千兆字节(那是数百万千兆字节!)的数据,并管理多达数千台物理机或虚拟机。
一些与众不同的特性包括它对内存的使用和对简单开发的关注。它会尝试将所有数据保存在内存中,只有在内存不足时才会写入磁盘。请注意,这确实有在失败时需要从头开始的风险,但好处是消除了耗时的读写过程。它通过强调 API 设计以及与几种语言和工具的集成,使开发变得容易。
您为什么会想要使用 Spark?
Spark 有一些很大的优势:
- 大型数据集的高速数据查询、分析和转换。
- 与 MapReduce 相比,Spark 在 Java 虚拟机(JVM)进程中提供了更少的磁盘读写、多线程任务(来自 Wikipedia :线程共享单核或多核资源)
- 非常适合迭代算法(使用基于先前估计的一系列估计)。
- 如前所述,易于使用的 API 在易于开发、可读性和维护方面有很大的不同。
- 超级快,特别是对于交互式查询。(比经典 Hadoop Hive 查询快 100 倍,无需重构代码!)
- 支持多种语言和与其他流行产品的集成。
- 有助于使复杂的数据管道变得连贯和简单。
【Spark 什么时候效果最好?
- 如果您已经在使用受支持的语言(Java、Python、Scala、R)
- Spark 使分布式数据(亚马逊 S3、MapR XD、Hadoop HDFS)或 NoSQL 数据库(MapR 数据库、Apache HBase、Apache Cassandra、MongoDB)的工作变得无缝
- 当你使用函数式编程时(函数的输出只取决于它们的参数,而不是全局状态)
一些常见用途:
- 使用大型数据集执行 ETL 或 SQL 批处理作业
- 处理来自传感器、物联网或金融系统的流式实时数据,尤其是与静态数据相结合的数据
- 使用流数据触发响应
- 执行复杂的会话分析(例如,根据网络活动对用户进行分组)
- 机器学习任务
什么时候你不想使用 Spark?
对于多用户系统,使用共享内存,Hive 可能是更好的选择 。对于实时、低延迟的处理,你可能更喜欢阿帕奇卡夫卡 ⁴ 。对于小数据集,它不会给你带来巨大的收益,所以你最好使用典型的库和工具。
如你所见,Spark 并不是每项工作的最佳工具,但它绝对是你在当今大数据世界工作时应该考虑的工具。Spark 的最后一个优点是,它是开源的,大牌贡献者(包括脸书、网飞、Palantir、优步、IBM、英特尔、红帽、英伟达、LinkedIn、苹果、谷歌、甲骨文、Stripe、腾讯、华为、阿里巴巴、Databricks 等)定期推出改进和新功能。
延伸阅读:
- MapR.com: Spark 101:它是什么,它有什么作用,它为什么重要,
- Quoble: 顶级 Apache Spark 用例
- data bricks:Apache Spark—什么是 Spark
- Datanami: 何时使用开源的 Apache Cassandra、Kafka、Spark 和 Elasticsearch
白噪声模型
这肯定不仅仅是一个随机的过程!或者是?(图片由作者提供)
最重要的统计模型
白噪声是任何回归模型都无法解释的数据变化。
然而,恰好有一个白噪声的统计模型。时间序列数据是这样的:
加性白噪声模型(图片由作者提供)
时间步 i 处的观测值 Y_i 是当前电平 L_i 和当前电平周围的随机分量 N_i 的和。
如果随机变化的程度与当前水平成比例,则我们有相同模型的以下乘法版本:
乘法白噪声模型(图片由作者提供)
如果当前电平 L_i 对于所有 i 都是恒定的,即 L_i = L 对于所有 i 都是恒定的,那么将会看到噪声在固定电平附近波动。
很容易生成一个白噪声数据集。下面是在 Excel 中的操作方法:
如何在 Excel 中生成加性白噪声数据集(图片由作者提供)
这是在恒定水平 100 附近波动的噪声输出图:
水平=100 附近的加性白噪声(图片由作者提供)
电流水平经常随着现实世界的因素而变化。例如,如果 L_i 响应于一组回归变量 X 而线性变化,那么我们得到以下线性回归模型:
回归变量加噪声的时间序列(图片由作者提供)
上式中, β 是回归系数的向量, X_i 是回归变量的向量。
为什么研究白噪声模型很重要?
原因有三:
- 如果你发现使用一些我将很快描述的技术,你的数据基本上是围绕一个固定水平的白噪声,那么你能做的最好的事情就是围绕这个固定水平拟合一个模型。试图做得更好是浪费时间。
- 假设您已经为数据集拟合了回归模型。如果你能够证明拟合模型的残差是白噪声,这意味着你的模型在解释因变量的方差方面做得很好。在信息的道路上已经没有什么可以提取的了,剩下的都是噪音。你可以为自己出色的工作而感到自豪!
- 第三,白噪声模型恰好是统计学中另一个重要而著名的模型的垫脚石,这个模型叫做随机游走模型,我将在下一节解释它。
随机漫步模型
让我们再次看看白噪声模型的等式:
(图片由作者提供)
如果我们使时间步长 i 的 level level L_i 成为前一时间步长 (i-1) 的模型输出值,我们就得到**随机漫步模型,**因伯顿·马尔基尔的A Random Walk Down Wall Street而在通俗文学中出名。
随机漫步模型(图片由作者提供)
随机漫步模型就像数据科学甜点中的海市蜃楼。它诱使许多追逐利润的投资者赌上(并输掉)所有的钱,幻想股价走势,而这种走势实际上只不过是随机游走。
这是使用随机漫步模型生成的数据图:
随机漫步(图片由作者提供)
告诉我你在这个情节中看不到任何趋势!
如果您不完全相信上述数据可以通过纯粹的随机过程生成,那么让我们通过演示如何在 Excel 中生成这些数据来打消任何残存的幻想:
如何在 Excel 中生成随机行走数据(图片由作者提供)
让我们看看如何利用我们对白噪声和随机游走的了解来尝试检测它们在时间序列数据中的存在。
如何检测时间序列数据集中的白噪声
我们将通过 3 个测试来确定你的时间序列是否真实,只是白噪音:
- 自相关图
- 盒子-皮尔斯试验
- 永盒试验
使用自相关图测试白噪声
当两个变量同时上升或下降时(或者如果一个值上升,另一个值下降),它们被称为正(或负)相关。相关系数可以用来衡量两个变量之间的线性相关程度:
皮尔逊相关系数,用于衡量两个随机变量 X 和 Y 之间的线性相关性(图片由作者提供)
上式中,E(X)和E(Y)为X**Y的预期(即均值)。 σ_X 和 σ_Y 是 X 和 Y 的标准差。
在时间序列数据中,当前值与比当前值早 1 个时间步长或更长时间的值之间经常存在相关性,即 Y_i 与 Y_(i-1) 之间、 Y_i 与 Y_(i-2) 之间等等。股票价格的变化经常显示这种正相关和负相关的模式(注意,包含随机游走的数据也是如此!).
纽约证券交易所安进股票价格。蓝框显示正相关的价格变动。图表由StockCharts.com根据使用条款提供
因为这些值与它们自身的过去版本相关,我们称它们为 auto,意思是自相关的。
下面是计算 Y_i 和 Y_(i-k) 之间自相关系数的公式:
滞后 k 处的自相关系数(图片由作者提供)
在我们展示如何使用这个自相关系数 r_k 来检测白噪声之前,我们需要对随机变量进行一次短暂而愉快的补充考察。我会解释为什么 r_k 是一个正态分布的随机变量,以及 r_k 的这个性质如何被用来检测白噪声。
LAG-k 自相关系数的分布 r_k
对于任何滞后 k , r_k 是具有某种均值_k 和方差 σ _k 的正态分布随机变量。
要理解为什么,考虑一下这个思维实验:
- 取一个包含 100,000 个时间点的时间序列数据集。
- 从这个数据集中随机抽取 5000 个样本。假设每个样本长度为 100 个连续的时间点。
- 对于每个样本,使用上述公式为 r_k 计算 LAG-1 自相关系数 r_1 。
- 可以看到,每次,对于 100 个时间点的每个样本来说,R1将是 0 和 1 之间的某个值。所以我们得到了 5000 个 R1 值,每个值都是 0 到 1 之间的一个数。因此R1是一个随机变量,我们已经测量了它的 5000 个值。
- 借助于统计学的极限定理,可以证明 R1 是一个正态分布的随机变量,和R1的分布集中于某个总体均值,我们称之为 _1,和某个方差,我们称之为 σ _1 。实际上,观察到的R1的平均值和方差将接近我们测量的R1的 5000 个值的平均值。
- 通过对所有滞后 k 重复上述实验,可以看出,所有滞后的自相关系数是正态分布的随机变量,其均值为 _k ,方差为σ_ k
象征性地:
对于所有滞后 k,r_k 是正态分布的随机变量(图片由作者提供)
检测白噪声的意义
如果时间序列是白噪声,那么理论上,其当前值 T_i 根本不应该与过去值 T_(i-1)、T_(i-2) 等以及相应的自相关系数 r_1、r_2、… 等相关。将为零或接近于零。
即当时间序列为白噪声时, r_k 为 0 对于所有 k = 1,2,3,…
但是我们刚刚看到 r_k 是一个 N( _k,σ _k) 随机变量。
将以上两个事实放在一起,我们得出以下第一个重要的结论:
如果时间序列是白噪声,那么所有滞后 k 的自相关系数 r_k 将具有零均值和一些方差 σ _k.
象征性地:
对于所有滞后 k,r_k 在白噪声条件下具有零均值(图片由作者提供)
但是系数 r_k 的方差 σ _k 呢?
Anderson 、 Bartlett 和 Quenouille 已经表明,在白噪声条件下,标准差 σ_k 如下:
σ_k = 1/sqrt(n)
其中 n 大小相同。回想一下,在我们的思想实验中, n 是 100。
由此可知,白噪声条件下的 r_k 具有如下分布:
数据集为纯白噪声时自相关系数的分布(图片由作者提供)
正态分布的一个重要特性是,它的大约 95%位于平均值的 1.96 倍标准差之内。在我们的例子中,平均值为 0,标准偏差为 1/sqrt(n) ,因此我们得到自相关系数的 95%置信区间如下:
(图片由作者)
这些结果产生使用自相关系数 r_k 进行白噪声测试的以下程序:
- 计算第一个 k 自相关系数 r_k 。 k 可以根据时间序列数据集的长度 n 设置为足够高的值。
- 计算 95%置信区间*[-1.96/sqrt(n),+1.96/sqrt(n)]。*
- 如果对于所有的 k ,如果 r_k 位于上述置信区间内,则在 95%的置信水平下断定该时间序列是真实的,可能只是白噪声。我们说可能是,因为如果我们用更大的样本量进行实验,即更大的 n ,置信区间的大小将会缩小,并且之前在 95%界限内的 r_k 的值现在将位于 95%界限之外。
- 如果任何一个 r_k 位于置信区间之外,那么时间序列可能中有信息。
示例:使用 Python 进行白噪声检测
让我们使用使用谷歌科学杂志应用程序在一家餐馆进行的 5000 分贝水平测量的真实世界时间序列来说明上述程序。
数据集可以从这里下载。
我们将使用 pandas 库从 csv 文件加载数据集并绘制它:
**import** pandas **as** pd
**import** numpy **as** np
**from** matplotlib **import** pyplot **as** pltdf = pd.**read_csv**('restaurant_decibel_level.csv', **header**=0, **index_col**=[0])
让我们打印前 10 行:
df.**head**(10) Decibel
TimeIndex
0 55.931323
40 57.779260
80 62.956952
140 65.158100
180 60.325242
220 45.411725
262 55.958807
300 62.021807
340 62.222563
380 56.156684
让我们绘制系列中的所有 5000 个值:
餐馆的分贝水平(图片由作者提供)
让我们获取并绘制前 40 个滞后的自相关系数。我们将使用 statsmodels 库来完成这项工作。
**import** statsmodels.graphics.tsaplots **as** tsatsa.**plot_acf**(df['Decibel'], **lags**=40, **alpha**=0.05, **title**='Auto-correlation coefficients for lags 1 through 40')
alpha=0.05 告诉 statsmodels 也绘制 95%置信区间区域。我们得到如下的情节:
分贝水平时间序列的自相关图(图片由作者提供)
正如我们所看到的,时间序列包含显著的自相关,直到滞后 17。顺便说一下,滞后 0 处的自相关始终为 1.0,因为某个值始终与其自身完全相关。
在自相关图中有类似波浪的图形,表明数据中可能包含一些季节性。我们可以通过将时间序列分解为趋势、季节性和噪声成分来识别和隔离季节性。
Related read: [**What is time series decomposition and how does it work**](/what-is-time-series-decomposition-and-how-does-it-work-9b67e007ae90)
现在,我们将重点放在噪声部分。底线是,这个时间序列,以其目前的形式,似乎不是纯粹的白噪音。
接下来,我们将对时间序列进行两次测试来证实这一点。
白噪声检测的卡方检验
卡方检验就是基于统计学中这个强大的结果:k 个相同的标准正态随机变量的平方和是一个自由度为 k 个的卡方分布随机变量。
具有 1 到 9 个自由度的卡方分布。来源:维基媒体下 CC BY 3.0
实际的测试称为盒-皮尔斯测试,其测试统计量称为 Q 统计量。其公式如下:
Box-Pierce 测试统计(图片由作者提供)
可以看出,如果基础数据集是白噪声,则 Q 统计的期望值为零。
对于任何给定的时间序列,通过在卡方表中查找自由度 k 的检验统计的 p 值,可以检查 Q 值是否以统计显著的方式偏离零。通常,小于 0.05 的 p 值表示显著的自相关,不能归因于偶然。
白噪声检测的容格盒试验
Ljung-Box 检验对 Box-Pierce 检验进行了改进,以获得具有比 Q 统计更接近卡方分布的分布的检验统计。Ljung-Box 检验的检验统计量计算如下,并且也是卡方(k)分布:
永盒检验统计(图片由作者提供)
这里, n 是时间序列中数据点的数量, k 是要考虑的时滞的数量。与 Box-Pierce 测试一样,如果基础数据集是白噪声,则该卡方分布随机变量的期望值为零。同样,小于 0.05 的 p 值表示显著的自相关,不能归因于偶然。
示例:使用 Python 中的 Ljung-Box 测试测试白噪声
让我们在餐馆分贝级别数据集上运行 Ljung-Box 测试。我们将测试多达 40 个滞后,我们将要求测试也运行盒-皮尔斯测试。
**import** statsmodels.stats.diagnostic **as** diag
diag.**acorr_ljungbox**(*df['Decibel']*, *lags=*[40], *boxpierce=True*, *model_df=0*, *period=None*, *return_df=None*)
我们得到以下输出:
(array([**13172.80554476**]), array([**0.**]), array([**13156.42074648**]), array([**0.**]))
根据卡方(k=40)表,值 13172.80554476 是 Ljung-Box 检验的检验统计值, 0.0 是其 p 值。
根据卡方(k=40)表,值 13156.42074648 是 Box-Pierce 测试的测试统计值,0.0 是其 p 值。
正如我们所看到的,两个 p 值都小于 0.01,因此我们可以 99%的信心说,餐馆分贝水平时间序列不是纯粹的白噪声。
早些时候,我们介绍了随机游走作为白噪声模型的特例,并指出人们很容易将它们误认为是可以预测的模式或趋势。
我们将看看如何通过应用一种技术来避免犯这种错误,这种技术将揭示随机行走的真正随机性质。
检测随机漫步
随机漫步通常是高度相关的。其实都是自相关白噪声!
上面介绍的白噪声检测测试将利用这些自相关,使它们得出时间序列不是白噪声的结论。
补救方法是取怀疑是随机游走的时间序列的第一个差值,并对差值序列进行白噪声测试。
如果原始时间序列是随机游走,那么它的第一个区别就是纯粹的白噪声。
让我们来举例说明:
我们将从加载一个被怀疑是随机游走的数据集开始。数据集可以从这里下载。
df = pd.**read_csv**('random_walk.csv', header=0, index_col=[0])
让我们把它画出来,看看它是什么样子:
df.**plot**()
plt.**show**()
(图片由作者提供)
让我们对这些数据进行 Ljung-Box 白噪声测试:
diag.**acorr_ljungbox**(df['Y_i'], **lags**=[40], **boxpierce**=True)
我们得到以下结果:
(array([**393833.91252517**]), array([**0.**]), array([**392952.07675659**]), array([**0.**]))
p 值为 0.0 表明我们必须强烈拒绝数据是白噪声的零假设。Ljung-Box 和 Box-Pierce 测试都认为这个数据集是由 而不是 纯随机过程产生的。
这显然是一个错误的结果。
让我们看看在我们对数据进行第一次差分后,情况是否会发生变化,即我们创建一个新的数据集,其中 Y = Y_i —Y_(i-1) :
diff_Y_i = df['Y_i'].**diff**()
**#drop the NAN in the first row** diff_Y_i = diff_Y_i.**dropna**()
让我们绘制不同的数据集:
diff_Y_i.plot()
plt.show()
我们现在看到了一幅截然不同的画面:
差异数据集(图片由作者提供)
这是放大的视图:
差异数据集的放大视图(图片由作者提供)
让我们在差异数据集上运行 Ljung-Box 测试:
diag.**acorr_ljungbox**(diff_Y_i, **lags**=[40], **boxpierce**=True)
我们得到以下输出:
(array([**32.93405364**]), array([**0.77822417**]), array([**32.85051846**]), array([**0.78137548**]))
请注意,这一次由 Ljung-Box 报告的测试统计值 32.934 和由 Box-Pierce 测试报告的 32.850 要小得多。并且在卡方(k=40)表上检测到的对应 p 值分别为 0.778 和0.781,均远高于 0.05。这足以支持数据(即差分时间序列)是纯白噪声的零假设。
从本练习中得出的结论是,除了白噪声模型之外,不应对此数据进行任何拟合。
摘要
- 白噪声模型可以用来表示数据集中噪声的性质。
- 测试白噪声是数据科学家应该做的第一件事,以避免花费时间在数据集上拟合模型,这些数据集不能提供有意义的可提取信息。
- 如果数据集不是白噪声,那么在将模型拟合到数据后,应该对残差进行白噪声测试,以了解模型能够从数据中提取多少信息。
- 对于时间序列数据,自相关图和 Ljung-Box 检验提供了两种有用的技术来确定时间序列实际上是否只是白噪声。
参考文献、引文和版权
数据集
餐厅分贝等级数据的版权 Sachin 日期在 CC-BY-NC-SA 下。
安进股价图来自stockcharts.com下这些使用条款。
报纸
Anderson,R. L .,序列相关系数的分布,数理统计年鉴,第 13 卷,第 1 号(1942),1–13。
Bartlett,M. S,“自相关时间序列的理论规范和抽样特性”,《皇家统计学会杂志》增刊,第 8 卷,第 1 期(1946 年),第 27-41 页。
论文链接:Quenouille,M. H .,序列相关系数的联合分布,《数理统计年鉴》第 20 卷第 4 期(1949 年 12 月),第 561–571 页
书
Hyndman,R. J .,Athanasopoulos,g .,预测:原理与实践【T5, OTexts
形象
本文中的所有图片版权归 CC-BY-NC-SA 所有,除非图片下方提到了不同的来源和版权。
感谢阅读!如果您喜欢这篇文章,请 关注我 获取关于回归和时间序列分析的提示、操作方法和编程建议。
女巫、女王和马尔可夫链
马尔可夫过程并不无聊。这太有趣了!
根据引用牛津词典的维基百科,马尔可夫链是描述一系列可能事件的随机模型,其中每个事件的概率仅取决于前一个事件达到的状态。人们可能会被这个定义吓倒,甚至更糟,感到无聊,但自从我开始发现数学和统计建模中的马尔可夫过程后,我除了乐趣什么也没有。在这篇文章中,我将尝试用一个例子来解释马尔可夫过程,并给出一些有趣的句子,这些句子是由使用马尔可夫链的自然语言生成器生成的。
一个说明这一过程的故事
很久很久以前,在一个神奇的王国里住着一位王后。她聪明、强大,但不受欢迎。她的王国很大,但只有 20%的人支持她和她的政治,80%的臣民不喜欢或支持女王。但是,正如我所说的,女王很聪明,所以她决定采取行动。她去了魔法森林,那里住着一个森林女巫,她能预知未来并配制药剂来改变它。王后带来了黄金和钻石,并对女巫说:“救救我,强大的女巫。只有 20%的受试者尊重和支持我。我需要一种能让更多人爱我的药水”。女巫一句话也没说,离开了房间,一小时后拿着药水回来了。她说“在这里。拿着这个,它会帮助你。我的水晶球告诉我,在你服用这种药剂后,90%的支持者会继续支持你,70%的不支持者会从现在开始支持你。”
根据女王的说法,情况看起来是这样的:
而且据女巫说,服用药剂后的情况会是这样的:
从这个图中,我们可以计算一个过渡态概率矩阵:
因为我们记得最初的情形是怎样的:
我们现在可以执行矩阵乘法来计算女王服用魔法药水后的追随者数量:
从只有 20%跃升到 74%……这个魔女配得上很多黄金!
简单的代码来玩文本
从上面的例子中我们可以看到,马尔可夫过程用于计算一个事件发生在另一个事件之后的概率。如果女巫有一个水晶球来告诉她在女王服用她的药剂后会发生什么,我们就有数学和代码来计算概率。这个过程非常有用,可以应用到很多东西上。马尔可夫过程的一个我最喜欢的应用是自然语言生成器。
当处理文本数据和使用高级 NLP 技术时,为什么不试着找点乐子呢?通过使用马尔可夫过程,模型可以在整个文本数据集上进行训练,并计算一个单词跟随另一个单词的概率。最简单的例子是短信中的建议:当你输入“我的”,它会提供“朋友”、“父母”、“狗”等。,因为这是我们自然语言的工作方式。NLG 的作品从不完美,这使得和他们一起工作很有趣。有时他们会给你有意义的建议,但有时不会,我个人觉得这很有趣。
以下是 NLG 根据丝芙兰网站的用户评论进行训练后得出的一些评论:
“AMAZING I originally purchased the Balance and Clarify set which contained a 2 step peel and I broke out”“The only thing it seemed to work because I’m self conscious of the work getting rid of it”“It smells like bad BO and I love the gel cream”“If your eyes it remove makeup i love it but the more expensive items in my midlate 20s normal skin”
这里有一些食谱(来自 BBC Food 和 Allrecipes 的食谱培训):
‘2 loins of lamb or mutton neck fillet, diced, 3 tbsp tomato purée, 1 tbsp dill seeds, 1 tsp sea salt, plus extra leaves to serve, salt and pepper’‘2 tbsp crème fraîche, 300g/10½ oz fettucine or tagliatelle, cooked according to packet instructions’‘200g/7oz white sweet potatoes, 12–10 inch flour tortillas, 9 ounces shredded Cheddar cheese’‘2 Japanese aubergine cut into very small florets, 1 garlic clove roughly chopped to garnish’
最后,看看泰勒·斯威夫特(Taylor Swift)歌词训练后写的一首歌:
Asking you to roll your eyes are like a best friend
Are we in the dress cried the whole scene
Im just a classroom
Ill be usin for the first Old Fashioned we were dancing
Didnt you flash your green eyes baby as the water rushes in The moon like a necklaceThe whole place was a masterpiece And I stare at the back door
Cause you know you
I hope you remember it all too well She said I doEnchanting to meet you where you first met me
Im the one who makes you come in my head
Oh never grow up just stay this simple
Cause Im still trying to change your mind trying to know
代码非常简单。首先导入 Markovify 库和字符串进行预处理:
import markovify
import string
接下来,去掉文本中的所有标点符号,并将其应用于所有文本数据:
def no_punct(string):
no_punct_string = re.sub(r’[^\w\s]’, ‘’, string)
return no_punct_stringdf['Text'] = df.apply(lambda row: no_punct(row['Text']), axis=1)
训练模型:
text_model = markovify.NewlineText(df.Text, state_size = 2)
并生成文本:
for i in range(5):
print(text_model.make_sentence())
资源:
Hadoop 的世界
互联 Hadoop 生态系统的不同部分
当学习 Hadoop 时,我遇到的最大挑战之一是将 Hadoop 生态系统的不同组件放在一起,并创建一个更大的画面。这是一个庞大的系统,由不同的部分组成,这些部分既可以相互对比,也可以相互补充。对于任何愿意在生产级大数据应用中利用基于 Hadoop 的技术的人来说,了解这些不同组件是如何互连的是一项必备知识。Hadoop 生态系统在大数据技术堆栈中占有重要地位,是数据工程师的必备技能。因此,让我们更深入地挖掘 Hadoop 的世界,并尝试解开这个世界的组成部分。
从 Hadoop 的正式定义开始可以帮助我们了解 Hadoop 生态系统的总体意图:
Hadoop 是一个开源软件平台,用于在计算机集群上对超大型数据集进行分布式存储和分布式处理
正如定义所示,Hadoop 的核心是其以分布式方式处理数据存储和处理的能力。为了实现这一点,Hadoop 及其分布式文件系统的整体架构受到了 Google 文件系统(GFS)和 Google MapReduce 的启发。Hadoop 架构的分布式特性使其适用于非常大的数据,特别是通过消除处理这些大量数据时的单点故障。
现在,让我们尝试了解 Hadoop 生态系统的不同构建模块,并理解这些模块是如何相互连接的。
Hadoop 生态系统:图片来源
我试图将整个 Hadoop 生态系统分为三类。
- Hadoop 核心堆栈
- Hadoop 数据操作堆栈
- Hadoop 协调堆栈
Hadoop 核心堆栈
- 【HDFS(Hadoop 分布式文件系统) : 顾名思义 HDFS 是一个分布式文件系统,充当整个 Hadoop 生态系统的心脏。它允许以分布式方式将数据存储在集群的不同节点中,但对外呈现为一个大型文件系统。它是建立在商用硬件之上的,据说是高度容错的。HDFS 能够通过产生数百个节点的集群来处理巨大的数据集。按照体系结构,它遵循主/从方法,其中每个集群由一个名称节点(主节点)和多个数据节点(从节点)组成。名称节点管理文件系统命名空间、元数据和客户端对文件的访问。数据节点存储实际的文件块。更多关于 HDFS 的细节可以在这里找到:https://hadoop.apache.org/docs/r1.2.1/hdfs_design.html
HDFS 主/从架构:图片来源
- YARN(又一个资源协商者) : YARN 是仲裁所有可用集群资源的资源管理器。它也遵循主/从方法。YARN 的每个集群有一个资源管理器(主),每个节点有一个节点管理器(从)。资源管理器是在集群中的所有节点之间协调资源的权威。它保存了关于哪些作业在哪个节点上运行的元数据,并管理消耗了多少内存和 CPU,因此对整个集群的总 CPU 和 RAM 消耗有一个整体的了解。节点管理器是每台机器的代理,负责监控它们的资源使用情况(cpu、内存、磁盘、网络)并向资源管理器报告。ApplicationMaster 是特定于框架的库的实例,它允许不同的应用程序协商对资源的请求。容器是为请求分配的资源的抽象。关于 YARN 的更多细节可以在这里找到:https://Hadoop . Apache . org/docs/current/Hadoop-YARN/Hadoop-YARN-site/YARN . html
纱线主/从结构:图像源
3.MapReduce:Hadoop 中并行的整个编程模型都是基于名为 MapReduce 的软件框架。该模型允许在商用硬件集群上并行处理大型数据集。MapReduce 作业首先将数据分割成一组独立的块,称为地图任务,可以并行执行/处理。然后,映射任务的排序输出被输入到 reduce 任务中,该任务将产生聚合结果。Hadoop 的并行编程模型就是基于这个概念。更多关于 Hadoop MapReduce 的细节可以在这里找到:【https://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html T5
MapReduce 示例:图像源
Hadoop 数据操作栈
除了 HDFS、YARN 和 MapReduce,还有各种数据查询、处理和摄取技术,可用于构建现实世界中的大数据应用。现在让我们来看看这些技术。这些技术旨在为各种目的服务,但也可以集成到一个大型应用程序中。
- Apache Pig :这是一个高级脚本框架,允许在分布式数据上编写类似 SQL 的脚本。开发人员不需要了解 java 或 python 来使用 Apache Pig。该平台适合分析大型数据集,因为它支持并行化。Pig 的基础设施层基于 MapReduce。更多关于阿帕奇猪的细节可以在这里找到:https://pig.apache.org/
- Apache HBase :这是一个非 sql 的列型数据库,允许对大数据进行实时读/写访问。HBase 具有非 sql 数据库的所有优点,它提供了托管大型数据库的能力,并具有分布式特性和可伸缩性。关于 Apache HBase 的更多细节可以在这里找到:https://hbase.apache.org/
- Apache Hive :这是一个数据仓库框架,支持读取、写入和管理驻留在 HDFS 和 HBase 等其他存储中的数据。这就产生了一种类似 SQL 的查询语言来对数据执行 ETL 任务,从而允许对不同格式的数据强加一种结构。阿帕奇钻和黑斑羚是这方面的两个选择。关于阿帕奇蜂房的更多细节可以在这里找到:https://hive.apache.org/
- Apache Spark :这是一个分析引擎,可以运行在 Hadoop 以及许多其他平台上,如 Kubernetes 和 Apache Mesos。有了 Apache Spark,也可以使用 Java、python、Scala、R 和 SQL 编写应用程序。Spark 通过其最新的设计提供了高性能,该设计包括 DAG 调度器、查询优化器和物理执行引擎。Spark 为机器学习、图形、数据帧和流提供了各种库,这些库可以结合起来构建高质量的大数据系统。更多关于 Apache Spark 的细节可以在这里找到:【https://spark.apache.org/
- Apache Storm :这是一个实时流数据处理系统,它是 Hadoop eco 系统的一个补充,可以将其批处理能力增强到实时处理。据说 Apache Storm 可以在几分之一秒内在一个节点上处理超过一百万个作业。Kafka、Flink 和 Spark stream processing 是 Storm 的替代产品。更多关于阿帕奇风暴的细节可以在这里找到:https://storm.apache.org/
- Apache Solr :这是一个可以在 Hadoop 之上使用的搜索平台。它为企业搜索功能提供了分布式索引。Apache Solr 附带了一系列特性,比如全文搜索、点击高亮显示、实时索引等等。关于 Apache Solr 的更多细节可以在这里找到:https://lucene.apache.org/solr/
- Apache Sqoop :这是一个可以用来将数据摄取或抽取到 HDFS 的工具。由于 Hadoop 主要处理大数据,将数 Pb 的数据注入 HDFS 将是一个挑战,特别是因为数据来自不同的来源和不同的格式。Sqoop 是一个工具,主要用于将关系数据库中的结构化数据导入 HDFS。Flume 是 Sqoop 的替代产品,它也支持非结构化数据。关于 Sqoop 和 Flume 的更多细节可以在这里找到:https://www . dezyre . com/article/Sqoop-vs-Flume-battle-of-the-Hadoop-ETL-tools-/176
上述技术是 Hadoop 数据操作层的主要组成部分。使用什么技术必须根据业务需求和它们提供的功能来决定。上述技术可以单独使用,也可以相互结合使用,在 Hadoop 及其分布式文件系统之上工作。
Hadoop 协调堆栈
在 Hadoop 核心及其相关的数据驱动技术堆栈之上,应该有一个管理和协调事物的机制,特别是由于 Hadoop 的分布式本质。为此也提供了不同的平台。
- Apache ZooKeeper :这是一个协调服务,Hadoop 可以使用它来管理和协调集群,通过使用不同的同步机制提供机制来共享数据而不会出现不一致。这提供了不同的服务,例如节点命名、同步、锁定和配置管理等。阿帕奇·安巴里是动物园管理员的替代品。关于阿帕奇动物园管理员的更多细节可以在这里找到:https://zookeeper.apache.org/
- Apache Oozie :这是一个可以管理 Hadoop 作业的调度系统。如您所见,有大量技术可以在 Hadoop 上运行,它们服务于不同的目的。任何利用上述技术的真实世界大数据应用程序都可能需要将使用上述技术创建的作业安排到特定的管道或订单中。Oozie 集成了 Hadoop 堆栈中的不同作业,包括 Hive、Pig、Sqoop、Java MapReduce 等。气流是一种替代方法。关于 Apache Oozie 的更多细节可以在这里找到:https://oozie.apache.org/
- Apache Atlas :这是一个平台,允许使用 Hadoop 的企业确保其数据符合治理法规。随着数据使用的法律问题日益增多,大数据治理可能成为任何现实应用程序的关键问题。特别是,这提供了管理元数据的机制,将数据分类为个人身份信息(PII)和敏感数据等类别。关于 Apache Atlas 的更多细节可以在这里找到:https://atlas.apache.org/#/
我在这篇文章中的主要尝试是根据技术及其预期目的来总结和构建 Hadoop 的生态系统。当我还是学生的时候,我发现抓住一个概括的观点有点困难,因为 Hadoop 生态系统是巨大而多样的。在这里,我将整个 Hadoop 生态系统组织成特定的部分,这种方式对我个人来说很容易掌握。我相信对其他人也会有帮助。因此,如果您有兴趣深入研究大数据工程,那么这可能是一个起点。
统计学中最糟糕的误解
在许多统计学入门课程中教授!
我喜欢在网上帮助陌生人解决他们的应用统计学问题。这就是我如何知道似然比测试解决了很多问题。我也意识到这个普遍的误解:
t 检验假设数据呈正态分布。
不严谨的统计学入门课程传播了这种错误信息。更糟糕的是,许多网站附和了这种错误的说法(尽管有些人说 t 检验对非正态性是稳健的)。
t 检验的重要性和广泛使用几乎是神圣的,所以这种误解是频率和严重性的双重打击。人们认为他们不能使用 t 检验,而实际上他们可以。这就像教孩子“勺子只能用来舀液体。”
这体现在诸如“我的数据没有通过正态性检验,所以我不能使用 t 检验”这样的问题中。我应该进行对数转换吗?或者我应该使用非参数检验?”当他们有 100,000+的观察值时。(“我的老师说我不应该用勺子吃冰淇淋,因为它是固体食物。我应该融化冰淇淋让它变成液体吗?还是应该用叉子?”)
如果你在谷歌上搜索“测试假设”,除了维基百科之外,第一页上的每个结果都是虚假的。(一些人嘲笑维基百科是不可信的来源。哦,讽刺的是。)维基说:
感谢你成为理智的代言人!是指,不是数据!
为什么重要?
我们经常测试两组是否具有相同的均值:
在 frequentist 框架中,我们设置问题,使得检验统计量在零假设下遵循已知分布。如果检验统计量遵循 t 分布(方差未知的正态分布),那么我们可以进行 t 检验。
测试统计。不是数据。我们的检验统计量是 t,由样本均值的差异计算得出。
对于非常小的样本量,只有当数据条件正态时,这一要求才成立,因此产生了误解。对于 n>30…
在 n>30 公路上开个玩笑。
但说真的,一些入门课程走了相反的极端,建议 t 检验在 n>30 或 n>40 时总是有效?我们会看到为什么这也是不正确的。
在样本量足够大的情况下,由于中心极限定理,样本均值的分布变得近似正态。所需的样本大小取决于总体分布:更多的偏斜/更重的尾部,更多的样本。如果你的两个样本均值都是正态分布的,那么线性组合(比如均值的差异)也是正态的,所以 t 检验可以发挥它的魔力。
此外,样本方差应该是χ分布的,但我们将在本文中忽略这一点。
中心极限定理
考虑这种指数分布,这显然是不正常的:
如果我们从这个分布中取样,那么随着 n 变大,数据将类似于指数分布。
(在 CLT 最糟糕的误解中,有人问:“我调查了 30 个人,分布是不正态的。我做错了什么?数据不是应该是正态分布的吗?”)
但如果我们记录下随机样本的平均值,并多次重复这个过程,那么只要 n 很大,我们就大致得到了正态分布。
n <- 5
iter <- 10000
x <- matrix(
rexp(n * iter, rate = 2),
ncol = iter
)
hist(colMeans(x))
你看看那个。在我看来,样本均值的分布几乎呈钟形。原来我们不需要我们的数据正态分布来执行 t 检验!
拔靴带
如果你不确定你的 n 是否大到足以让中心极限定理生效,你可以自举。接下来是一个简短的教程。
假设我们从这两个分布中抽取样本,并想要检验均值的相等性:
这两种分布都不是正态分布。这里,我将从红色组中抽取 n=10 个样本,从蓝色组中抽取 n=20 个样本:
我们从数据中的每组中用替换的对进行采样,保持 n(红色为 10,蓝色为 20),并记录平均值的差异。重采样的样本大小应与原始数据中的样本大小一致。
通过我们观察到的均值差异来改变这种分布;我们假设在零假设下,两个总体保持它们的形状,但具有相等的均值。这是天真的,特别是对于非负随机变量(它们喜欢根据均值改变形状),但它足够体面地工作。我们将此视为零分布。
使用一些代码可能会更容易理解:
iter <- 10000
n_x <- 10
n_y <- 20set.seed(1)
x <- rbeta(n_x, 6, 2)
y <- actuar::rpareto2(n_y, 0.5, 2)
test_statistic <- mean(y) - mean(x)resamp_x <- matrix(
sample(x, size = n_x * iter, replace = TRUE),
ncol = iter
)
resamp_y <- matrix(
sample(y, size = n_y * iter, replace = TRUE),
ncol = iter
)
null_dist <- colMeans(resamp_y) - colMeans(resamp_x) - (mean(y) - mean(x))
mean(abs(null_dist) >= abs(test_statistic))
如果这个零分布是一个很好的钟形曲线,那么 t 检验是合适的。否则,将 p 值计算为等于或大于我们观察到的差异的模拟值的百分比,换句话说,位于红色条之外的模拟值的比例(此处 p = 0.0601):
由于过程中固有的随机性,自举 p 值可能会有所不同。迭代次数越多,p 值越接近。有了更大的 n,我们就能明白为什么 t 检验甚至对这种非正态数据也有效了。在这里,我为两组设置 n = 50:
在我看来,它几乎是钟形的,即使 n 低至 50。微小的倾斜会使 t 检验稍微偏离。Bootstrap 得出 p = 0.0019,而 t 检验得出 p = 0.0012。
当 n = 100,000 时,即使数据不是正态分布,t 检验也很少不适用。
不要变换你的数据!
一些网站建议转换您的数据,使其看起来大致正常。我…我甚至不知道从哪里开始。这是如何作为“好建议”传播的?(我记得当我刚接触统计学时,我相信这一点,并把它传递给了别人。哦,真丢人。)
当你转换数据时,假设会改变。你不再测试手段的差异。例如,如果你使用对数变换,你测试的是 的差异,几何的意思是。
考虑这两个对数正态分布 LN(0,1)和 LN(-4,3):
尽管他们看起来有多么不同,但他们有相同的人口平均值 1.65!
这里,我们从每组中抽取 1000 个样本:
set.seed(1)
x <- rlnorm(1000, 0, 1)
y <- rlnorm(1000, -4, 3)
因为差异很大,很难看出什么。让我们放大一点:
所以分布的形状是不同的。如果我们对整个样本进行 t 检验,我们得到 p = 0.6578,并且我们正确地拒绝了零假设。
我们样品的自然对数:
如果我们对这个进行 t 检验,我们得到的 p 值接近于 0,我们错误地拒绝了均值相等的零假设。这两个分布有相同的算术平均值,但有不同的几何平均值。
在这种情况下,对原始观察值进行 t-test 是不合适的(参见下面的自举),但我们还是得到了正确的结论。对经过对数变换的观察值进行 t-test 满足“t-test 假设”(两组都是正常的),但它给了我们一个错误的结论——它回答了一个问题,但没有回答我们的问题。
错误可能会向相反的方向发展。两个总体可能具有不同的平均值,但具有相同的几何平均值,例如算术平均值分别为 1.65 和 90.02 的 LN(0,1)和 LN(0,3):
它们的平均值相差很远,但是数值的对数具有相同的平均值:
同样,我不知道为什么一些资源建议在通过 t-test 之前对数据进行对数转换。这极具误导性。
当 CLT 还没有爆发的时候
让我们回到最初的对数正态分布 LN(0,1)和 LN(-4,3)。如果你想小心,你可以自举:
这给了我们 p=0.6516,类似于最初的 t 检验。
还记得我说过所需的样本大小取决于偏斜度吗?在前面的指数分布示例中,n=30 就足够了。这里,n=1000 还是不够!对数正态分布有如此极端的偏斜和厚尾,以至于我们通常需要批样本来检验均值。
当你的数据真的,真的没有足够的样本时,非参数检验比 bootstrapping 更好。问题是当人们因为一点点偏差而盲目地使用非参数检验时。它们没有参数测试强大。当你因为收集数据困难/昂贵而受困于小规模到中等规模的样本时,当你可以使用 t 检验时,使用非参数检验将导致更多的假阴性。
非参数检验有自己的一套假设,并且检验完全不同的假设。例如,流行的U-检验只能被解释为测试中位数是否相等,如果两个分布具有相同的形状,这使得它在许多情况下甚至比 t-检验更具限制性。
最后,当你的 n 足够大时,t 检验当然可以用于非正态数据。如果有疑问,你可以自举。让我们一起结束这些错误观念和不良做法。