单细胞 RNA 测序:生物学家的 A/B 测试工具
用 scRNA-seq 和人工智能改造生物医学研究
信用:Pixabay.com
“我对遗传学是数字化的这个想法很感兴趣。基因是一长串编码字母,就像计算机信息一样。现代生物学正在成为信息技术的一个分支。”—理查德·道金斯
A/B 测试是科技行业的常见做法。每次构建新功能时,产品经理和数据科学家都会对其进行最终的性能测试——A/B 测试。由此产生的度量标准将告诉我们该特性是否符合提议的业务成果。第一步是找出要收集的数据。对于脸书和 Twitter 等平台,衡量标准包括在网站上停留的时间、点赞数、每日活跃用户(DAU)的增加、分享数等等。接下来,对用户群体进行细分以进行控制和测试来运行实验——群体的大小由功效分析决定。最后,收集数据。一旦有了足够的数据,现在就该对测试总体进行建模,进行参数估计,并执行统计显著性测试,以检查测试分布是否明显偏离控制。如果有意义,该特性将被添加到产品堆栈中。
在生物学中,整个过程正好相反。我们已经有了产品——一个有机体;因此,我们处理一组不同的问题。
产品是怎么做出来的?用什么标准来衡量一个特性的成功?为什么要合并冗余?是什么导致了模块化?问题很多。这些都是很难回答的问题,因为我们不能回到过去,我们能做的最好的事情就是基于现有数据的最大似然估计。
scRNA-seq 背后的大思想是什么?
scRNA-seq 是一种高通量测序技术,用于平行分析数十万个细胞的转录组(细胞中存在的总 RNA)。根据分子生物学的中心法则,基因表达是遗传信息从 DNA(基因)→RNA→蛋白质的单向流动。scRNA-seq 在 RNA 水平上捕获每个相关细胞的信息流。
鸣谢:维基百科
为了理解 scRNA-seq 背后的逻辑,让我们看看果蝇中的同源盒基因或 Hox 基因。术语同源盒来源于同源异形——意思是用一个身体部分替换另一个。
鸣谢:维基百科
在果蝇中,身体模式由同源基因复合体触角足和双胸控制。这些基因在幼虫特定区域的表达决定了成蝇的节段身份。
例如,Ultrabithorax—Ubx—基因阻止第三胸段(T3 —见上图)翅膀的形成;因此,翅膀被限制在苍蝇的 T2 部分。
在一个 ubx 突变体中,它缺少一个 ubx 基因的功能副本——T3 转化为 T2,给突变体苍蝇多了一对翅膀!点击阅读更多关于果蝇发育的有趣方面的内容。
鸣谢:维基百科
一般来说,细胞身份由该细胞中特定基因的表达决定,这可能在另一个细胞中不存在(皮肤细胞与神经元)。基因相互作用网络是复杂的非线性网络(相互作用组),其中一个特定基因的表达可能导致另一个基因完全停止表达,或者可能激活不同基因的表达,等等。基因的这种上下文相互作用决定了细胞的发育轨迹。
精神分裂症相互作用组——一个相互作用的基因网络。鸣谢:维基百科
在我们的 ubx 突变体中,我们可以将来自 ubx 突变体的 T3 片段的 RNA 与一只正常苍蝇的 T3 片段进行比较,以找出形成翅膀的因素。因为我们观察到的一种物理变化——额外的翅膀——必定有其基因表达的基础。通过计算从每个基因转录的 RNA 的拷贝数(就像我们在 A/B 测试设置中收集点击和页面访问一样),我们可以精确地测量特定突变带来的基因表达的细微差异——这项研究被称为差异基因表达分析。**差异基因表达构成了 scRNA-seq 的基础。**同样,癌细胞与正常对应物的比较可能会发现独特的药物靶点,否则不容易识别。
是怎么做到的?
在数据科学中,垃圾输入,垃圾输出 (GIGO)是一个众所周知的概念,如果您将有缺陷的数据输入到您的分析管道中,您得到的将是垃圾。处理这个问题的唯一方法是,首先,适当的随机实验设计并收集有意义的数据。
**以下是 scRNA-seq 管道的步骤:
1)样品收集:**收集组织样品进行分析。像周一所有肿瘤标本,周二所有正常标本这样批量采集标本是不明智的。这种做法将导致批量效应和混淆。随机化是这里的关键。让正常样本和肿瘤样本在同一天采集,由相同的人员和相同的方案进行适当的控制,以避免不必要的变化。
**2)从组织中分离单细胞:这是最具挑战性的部分。组织是细胞的集合,非常脆弱,因此需要小心处理。
有关高通量方法的更多详情,请参见 郑。等人(2017) 论文。
单细胞 RNA 分离程序的时间推移。信用:dropseq.org
3)从单个细胞中提取 RNA。
4)将 RNA 转化为 DNA: DNA 测序对于确定 RNA 的基因组来源是必要的。因此,在测序之前,我们需要通过逆转录 PCR 将 RNA 转化为 DNA。RNA 是一种单链核酸分子,因此,高度不稳定的 RTPCR 将 RNA 转化为更稳定的 DNA,适用于下游测序实验。
4)DNA 测序
5)序列分析:
→质量控制:检查测序数据的质量(fastQC、multiQC、rse QC)
→接头修剪:移除测序接头(cutadapt、flex bar)
→与参考基因组的比对:确定序列的身份(最好使用 HISAT/HISAT2 等剪接感知映射器)。
→比对可视化:可视化比对文件(IGV)
→比对后 QC:检查比对后的序列质量(samtools,fast QC)
→制备计数矩阵:计数并记录测序分析检测到的独特 RNA 的数量。
一个优秀的教程可以在 这里 找到
6)数据分析
→基因质量控制&过滤。
→主成分分析、tSNE、UMAP 降维:RNAseq 数据是高维数据。在分析中尽早处理“维数灾难”是至关重要的。这也有助于消除协变基因。
→使用 DBSCAN、K-means 和 Louvain 算法进行聚类和社区检测
有什么影响?
当我还是研究生的时候,我们依靠 Northern 印迹来检测 RNA 表达。然后是微阵列、 qPCR ,接着是 RNAseq 。最新进入这一领域的是 scRNA-seq,它将改变生物医学研究。
例如,最近在旧金山举行的一场黑客马拉松使用对 RNAseq 数据的深度学习来识别一种罕见形式的肾癌特有的基因网络。这个想法是要找到一个基因调控网络,类似于一个名为 TSPG ( 转录组状态扰动发生器)的 GAN(生殖对抗网络)所做的预测,这样我们就可以重新利用现有的药物来治疗肾癌。使用更传统的临床试验方法来开发新的药物配方既昂贵又耗时,患者通常需要快速的临床干预(你可以在这里和阅读莱拉·贾纳的悲惨故事。因此,深度学习方法更有吸引力。
你可能还会读到发生在 2017 年的首届基因组学黑客马拉松,它解决了一个类似的问题。
我是 Aneesh,我热衷于将人工智能应用于生物医学研究。我希望这篇文章能提供信息。下次再聊!
Python 中的单引号、双引号和三引号
扬·阿莱格在 Unsplash 上的照片
有选择总是好的——单引号和双引号在 Python 中可以互换使用。
我们所有的 Python 程序员都知道,在 Python 中,与字符串声明相关的单引号和双引号的使用。然而,并不是所有人都知道三重引号的某些用法。
这篇简短的文章回顾了 Python 中单引号、双引号和三引号的用法。
单引号和双引号
基本用法
单引号和双引号最常见的用法是通过包含一系列字符来表示字符串。如下面的代码所示,我们分别使用单引号和双引号创建这两个字符串。
>>> quotes_single = 'a_string'
>>> quotes_double = "a_string"
>>> quotes_single == quotes_double
True
正如您所注意到的,使用单引号和双引号创建的字符串是相同的。换句话说,当我们声明一个字符串时,我们可以交替使用单引号和双引号。然而,应该注意的是,我们不想把它们混在一起,因为这是一个语法错误。
>>> "mixed quotes'
File "<stdin>", line 1
"mixed quotes'
^
SyntaxError: EOL while scanning string literal
>>> 'mixed quotes"
File "<stdin>", line 1
'mixed quotes"
^
SyntaxError: EOL while scanning string literal
逃避行为
像其他编程语言一样,当字符串包含引号这样的特殊字符时,我们需要对它们进行转义。下面是一个逃跑失败的例子。
>>> 'It's a bad example.'
File "<stdin>", line 1
'It's a bad example.'
^
SyntaxError: invalid syntax
我们如何修复这个错误?一种是通过在单引号前放置一个反斜杠来转义单引号。另一种是使用双引号而不是单引号作为括住的引号。两种方式如下所示。
>>> 'It\'s a good example.'
"It's a good example."
>>> "It's a good example."
"It's a good example."
类似地,如果字符串包含双引号,我们可以使用单引号来表示字符串,这样我们就不必对双引号进行转义。下面给出一个例子。
>>> 'She said, "Thank you!"'
'She said, "Thank you!"'
然而,如果字符串中既有单引号又有双引号,如果您没有对与整个字符串所使用的引号相同的引号进行转义,就会出现语法错误。
>>> print('She said, "Thank you! It's mine."')
File "<stdin>", line 1
print('She said, "Thank you! It's mine."')
^
SyntaxError: invalid syntax
>>> print('She said, "Thank you! It\'s mine."')
She said, "Thank you! It's mine."
三重引号
包含单引号和双引号的封闭字符串
正如上一节末尾提到的,我们需要根据字符串使用的引号来转义单引号或双引号。实际上,我们可以使用三重引号(即三重单引号或三重双引号)来表示既包含单引号又包含双引号的字符串,以消除对任何。
>>> print('''She said, "Thank you! It's mine."''')
She said, "Thank you! It's mine."
需要注意的是**当一个字符串以单引号或双引号开始或结束,并且我们想要对这个字符串使用三重引号时,我们需要使用与开始或结束引号不同的引号。**例如,对于上面代码片段中的字符串,使用三重双引号会导致语法错误。在这种情况下,我们想要使用上面的三个单引号。
>>> print("""She said, "Thank you! It's mine."""")
File "<stdin>", line 1
print("""She said, "Thank you! It's mine."""")
^
SyntaxError: EOL while scanning string literal
多行字符串
三重引号的另一个用例是表示多行字符串。下面给出一个例子。在这种情况下,您可以使用三重单引号或双引号。
>>> print("""Hello
... World
... !""")
Hello
World
!
虽然我们可以通过使用下面的\n
符号创建多行字符串来达到相同的效果,但是使用\n
符号会使字符串更难阅读。相比之下,使用三重引号可以准确地写出字符串,因此可读性更好。
>>> print('Hello\nWorld\n!')
Hello
World
!
此外,用三重引号括起来的字符串的一个有用的应用是在多行字符串中指定一些注释,例如,作为函数定义的一部分,如下所示。
>>> def multiple_line_comment(a, b):
... '''
... a is a string # other additional description
... b is a list of integers # other additional description
... '''
... pass
...
>>> print(multiple_line_comment.__doc__)
a is a string # other additional description
b is a list of integers # other additional description
我们可以清楚地知道函数的注释是什么。
结论
本文回顾了单引号、双引号和三引号在 Python 中的常见用法。下面是这些用例的快速总结。
单引号和双引号
- 括起字符串。单引号或双引号都可以。
- 使用单引号作为括起来的引号可以消除字符串中转义双引号的需要,反之亦然。
三重引号
- 将包含单引号和双引号的字符串括起来,这样就不需要转义。
- 括起多行字符串。
感谢您阅读本文,祝您用 Python 愉快地编码。
AWS SageMaker 上的单线分布式 PyTorch 培训
如何更快地迭代您的数据科学项目,让您的绝妙想法得以实现
作者图片
不管我在做什么研究项目,拥有合适的基础设施总是成功的关键部分。很简单:假设所有其他“参数”都相同,迭代越快/越便宜,在同样的时间/成本预算下,可以获得更好的结果。由于这些总是有限的,良好的基础设施通常是取得突破的关键。
说到数据科学,特别是深度学习,在强大的硬件上轻松分布训练过程的能力是实现快速迭代的关键。即使是最聪明的想法也需要几次迭代才能得到完善和验证,例如检查不同的预处理选项、网络架构,以及批量大小和学习速率等标准超参数。
在这篇文章中,我将向您展示在 AWS SageMaker 上使用simple-sage maker*分发现有的准备分发的 PyTorch 培训代码是多么容易(如果您愿意的话,还很便宜)(假设分发是在支持的 gloo 或 nccl 后端 ) *之上完成的)。此外,您将了解如何在培训期间轻松地实时监控和分析资源利用率和关键培训指标。
简单的 sagemaker
简单——SageMaker是围绕 AWS SageMaker 的薄包装器,这使得在任何支持的实例类型 上的工作分配非常简单并且便宜。快速介绍可以在这篇博文中找到。
在单行中分发 PyTorch 模型培训
我将基于 PyTorch 的官方 ImageNet 示例进行演示。事实上,我将只使用一个命令在 AWS 上运行它!
更准确地说,我假设:
- 您已经安装了simple-sagemaker:
pip install simple-sagemaker
- 您的 AWS 帐户凭证和默认区域是为 boto3 配置的,如 Boto3 文档中所述。
- ImageNet 数据已经存储(和提取,稍后将详细介绍)在 S3 存储桶中,例如
s3://bucket/imagenet-data.
- 您已经将训练代码
[main.py](https://raw.githubusercontent.com/pytorch/examples/master/imagenet/main.py)
下载到当前工作目录。
现在,要在单个 p3.2xlarge 实例上运行训练代码,只需运行以下命令:
就这样,在培训作业运行时坐下来。实际上,您可能需要休息一下,因为在整个数据集(总共约 120 万张图像)上,10 个时期需要约 8 小时。别急,训练好的模特到最后会在output/state
下等你。
对ssm
命令的一些解释:
shell
—运行一个 shell 任务。-p imagenet -t 1-node
—命名项目和任务。-o ./output1 --download_state
—在训练结束时下载输出的本地路径+下载状态目录的请求(默认情况下也会下载日志)。--iis
—使用来自s3://bucket/imagenet-data
的 imagenet 数据作为映射到$SM_CHANNEL_IMAGENET
路径的输入通道。--it ml.p3.2xlarge
—将实例类型设置为ml.p3.2xlarge.
-d main.py
—添加 main.py 作为依赖项。-v 280
—将 EBS 卷大小设置为 280 GB。--no_spot
—使用按需实例而不是定点实例(默认)。更贵,但是时间是我们在努力节省的。--cmd_line
—执行培训脚本。
一些注意事项:
- 在
[Bucket name]/[Project name]/[Task name]
下,每个任务被分配一个专用的 S3 路径。路径下有几个目录,但是现在与我们相关的是state
,它不断地与 S3 同步,并且在连续执行相同的任务时保持不变。 - 由于脚本在当前工作目录中保留了检查点,我们首先将它更改为 state 目录—
$SSM_INSTANCE_STATE
- 世界大小和节点等级是基于工作代码可访问的环境变量设置的。完整的列表可以在这里找到。
--resume
—在训练停止的情况下,根据状态目录中保存的检查点恢复训练。- 如果数据已经在您的本地机器上,您可以使用
-i
参数(而不是--iis
)让它自动上传到 S3,并用作“数据”输入通道。
有关更多信息和选项,例如,如果您需要定制 docker 映像或使用本地数据集进行培训,请阅读文档,运行ssm shell -h
以获得命令行参数的帮助,和/或查看简介博客文章。
让我们看看./output1/logs/log0
处输出日志的结尾:
** Acc@1 46.340 Acc@5 72.484
Total time: 26614 seconds*
我们取得了 46.3 的前 1 名准确率和 72.484 的前 5 名准确率,总训练时间为 26,614 秒= ~7:23 小时。总共 8 个小时的运行时间是由于开销,主要是由于下载(和提取)输入数据(~150 BG)。其中大约 3-4 分钟是由于“标准 SageMaker 开销”——启动和准备实例、下载输入数据和训练图像。在 spot 实例上训练时,这可能会变得有点长。
分发培训
回到你的时间预算,8 个小时对你来说可能太长了。如上所述,在某些情况下,这甚至意味着你的绝妙想法不会被公之于众。
幸运的是, ImageNet 示例代码写得很好,并且可以通过在几个实例上分配培训来轻松加速。此外,这将只是一个额外的参数!
又来了。将实例计数设置为 3( --ic 3
)就可以在 3:51 小时内完成同样的工作!
查看输出日志./output2/logs/log0
,我们看到在不到一半的训练时间内达到了相同的精度——11,605 秒= ~3:13 小时!
** Acc@1 46.516 Acc@5 72.688
Total time: 11605 seconds*
监控和优化培训过程
所以,你节省了时间,你的绝妙想法也更接近现实了。但是,如何轻松地观察和监控进展,使机会更高呢?
首先,在 SageMaker 培训工作控制台上查看,并选择3-nodes
工作。这里应该可以得到关于它的所有可用信息:
培训工作信息
那里有更多可用的信息,包括例如到州(检查站)的链接和 S3 的输出,请随意探索。
我们现在最感兴趣的部分是“Monitor”部分,在这里您可以获得实例利用率(CPU、RAM、GPU、GPU 内存、磁盘)和算法指标的图表(稍后将详细介绍)。
实例和算法指标的完整日志和动态 CloudWatch 图形系统的链接位于该部分的顶部,是进行分析的途径。
以下是两个培训周期的实例指标:
**
这些图表会实时更新,可以让您确保一切按预期进行,以及是否有任何关键的瓶颈需要解决。
经验法则是确保 GPU 负载大部分时间接近 100%。以上图中的 3 个节点为例,可以看到 GPU 的负载仅为 70%,这意味着我们可以从硬件中获得更多。一个好的猜测可能是有更多的数据加载工作线程,以更快地将数据推送到 GPU。
算法度量
为了进一步简化对培训过程的监控,我们可以使用 SageMaker metrics 来实时获取特定于培训的指标。同样,我们只需要更新几个参数:
--md
用于定义指标,其中第一个参数是名称,例如"loss"
,第二个参数是从输出日志中提取数值的正则表达式。
快进一下,这是两个训练周期的算法指标:
**
完整的分布式 ImageNet 培训管道
可以从image-net.org网站下载 LSVRC2012 ImageNet 数据。这里 Google 描述的简单步骤很有帮助。
由于完整的数据集大约有 120 万张图片,总大小约为 150GB,将其下载到本地,然后上传到 S3 水桶会花费很多时间。此外,在培训前将这么多文件从 S3 同步到培训实例也会非常慢。以下策略用于克服这些问题:
- 使用专用的处理任务下载数据,配备更快的 S3 连接。
- S3 的数据保持在 1000 年左右。tar 文件,并在训练实例上提取,就在训练之前。
使用下面的ssm
命令可以轻松启动处理任务:
其中download.sh
是一个 bash 脚本,它下载数据并把数据排列到它在第一个参数($SSM_OUTPUT/data
)上获得的路径。一旦该任务完成,带有train
和val
子文件夹的data
目录被放置在任务专用 S3 路径[Bucket name]/[Project name]/[Task name]
的output
目录下。训练命令现在也应该更新了:
这里引入了两个变化:
- 为了“链接”这两个任务,使处理任务的输出成为训练任务的输入,现在使用参数
--iit
代替--iis
。这将train
和val
子文件夹映射到具有相同名称的输入通道,可通过SSM_CHANNEL_TRAIN
和SSM_CHANNEL_VAL
环境变量访问。 - shell 脚本
extract.sh
用于在训练之前提取数据。
在 simple-sagemaker 仓库中可以找到下载数据和执行一些训练选项的完整管道。
摘要
简单的分布式模型培训设置是数据科学项目的必备工具。它现在触手可及,比您想象的更简单、更容易。利用它!
在 Python 对象和 JSON 之间交换的单行代码
Python 编程技巧
在 Python 对象和 JSON 之间序列化/反序列化的最简单方法是Attr
和Cattr
在我以前的一篇文章中,我介绍了 Python 中面向对象编程(OOP)的最佳实践,即使用“Attrs”库。
[## 可能是面向对象 Python 的最佳实践— Attr
让 Python 面向对象编程变得更加容易
towardsdatascience.com](/probably-the-best-practice-of-object-oriented-python-attr-d8c26c0e8a4)
然而,在大多数情况下,我们使用 OOP 可能是因为它可以序列化为字符串,如 JSON 字符串。更方便的是,我们还应该能够将它反序列化回类实例以用于其他目的。
例如,其中最流行的用法之一是数据访问对象(DAO)。因此,我们可以用对象实现 CRUD 函数,以便与持久层无缝集成。
因此,大多数时候,我们可能希望将 Python 对象序列化到 JSON 中,以便进行传输。相反,如果我们使用 Python 接收 JSON 类型的数据,我们也希望将 JSON 字符串反序列化为 Python 对象。
在本文中,我将介绍另一个库——“Cattr”,它可以与“attr”一起使用。我将把重点放在“Cattr”上,所以如果你对“attr”的功能感兴趣,请查看上面提到的文章。
安装和导入
照片由 JoshuaWoroniecki 在 Pixabay 上拍摄
首先,我们需要使用pip
安装这两个库。
pip install attrs
pip install cattrs
在本文中,我们从attr
中需要的只是类和属性函数的注释,所以让我们将它们和库cattr
一起导入。
from attr import attrs, attrib
import cattr
Cattr 的基本用法
基本上,cattr
用于在结构化和非结构化状态之间转换数据对象。例如,来自类的实例被认为是结构化数据,而 Python 字典和 JSON 对象被认为是非结构化数据。
假设我们要用不确定来规范一个列表中的数据,我们可以用cattr
如下。
from typing import Tuplecattr.structure([1.01, True, False, "2", "I will be ignored"], Tuple[int, int, int, int])
请注意,我们使用的是来自typing
库中的类型别名“Tuple ”,这是 Python 3 内置的。如果你不确定它是什么,这里是官方文档。
[## 类型-支持类型提示- Python 3.8.3 文档
源代码:Lib/typing.py 注意 Python 运行时不强制函数和变量类型注释。他们可以是…
docs.python.org](https://docs.python.org/3/library/typing.html)
在本例中,float、boolean 和 string 对象被调整为模板中指定的整数。此外,列表中的第 5 个对象被忽略,因为模板中只有 4 个元素。
Cattr 与 attr 合作
由 PublicDomainPictures 在 Pixabay 上拍摄的照片
cattr
和attr
一起处理班级的时候效果最好。
假设我们如下定义这个类。
[@attrs](http://twitter.com/attrs)
class Person:
name = attrib()
age = attrib()def tell_age(self):
print(f'My name is {self.name} and my age is {self.age}.')
当然,正如我在上一篇文章中介绍的,attr
可以用于将实例序列化到字典中。
from attr import asdictp1 = Person('Chris', 32)
asdict(p1)
当然,cattr
也可以这样做。
cattr.unstructure(p1)
看起来来自attr
的asdict()
函数更直观。然而,这只是序列化。如果我们得到了一个字典,并想将它反序列化为一个Person
对象,该怎么办?这次attr
帮不上忙,但是我们可以用cattr
。
p2 = cattr.structure({'name': 'Chelsea', 'age': 1}, Person)
Cattr 使用字典列表
上面的例子只是对单个字典的反序列化。实际上,这并不理想。如果我们想将字典列表反序列化为 Python 对象,该怎么办?在下面的例子中,我们有三个字典要在列表中描述。
p_list_raw = [
{'name': 'Alice', 'age': 20},
{'name': 'Bob', 'age': 25},
{'name': 'Chris', 'age': 32}
]
要实现这一点,我们还需要定义一个“模板”。请注意,我们传入的参数不再是“人”,而是“人”对象的列表。因此,我们需要再次使用输入别名。
from typing import Listp_list = cattr.structure(p_list_raw, List[Person])
因此,我们从 person 字典列表中得到一个 person 对象列表。
Cattr 使用 JSON
当然,我们并不满足于仅仅序列化/去序列化 Python 字典。我们希望它是一个 JSON 对象!这也很容易。事实上,我们唯一需要做的就是导入json
库,它也是一个 Python 内置模块。
回想一下,在前面的例子中,我们有一个 Python 对象列表p_list
。
要将其序列化为 JSON 数组,只需将cattr
与json.dumps()
函数一起使用,如下所示。
import jsonjson_obj = json.dumps(cattr.unstructure(p_list))
print(json_obj)
将 JSON 数组反序列化为 Python 对象列表也非常容易。简单地将json.loads()
功能与cattr
结合使用。
p_list = cattr.structure(json.loads(json_obj), List[Person])
只是不要忘记我们需要输入别名“列表”作为模板。
当然,上面的例子也显示了去序列化的对象可以用它们的类函数来调用:)
摘要
在这篇文章中,我介绍了如何使用cattr
和attr
库来实现将 Python 对象序列化为 dictionary/JSON,以及以一种极其简单的方式将 dictionary 和 JSON 对象反序列化为 Python 对象。
考虑到这在大多数其他编程语言中通常不是一件容易的事情,至少实现起来没有那么快,我想说这从一个方面反映了为什么人们喜欢 Python。
本文中的所有代码都可以在这里找到:
Google Colab
colab.research.google.com](https://colab.research.google.com/drive/1fm8PWLVp2vHEhkArmUcDp6VdNqLSG-O1?usp=sharing) [## 通过我的推荐链接加入 Medium 克里斯托弗·陶
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@qiuyujx/membership)
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
单参数模型| Pyro 与 STAN
用两种贝叶斯方法模拟美国癌症死亡率:斯坦的 MCMC 和 T2 的 SVI。
模拟美国各县的死亡率——照片由 Joey Csunyo 在 Unsplash 上拍摄
单参数模型是开始概率建模主题的极好方法。这些模型包括一个影响我们观察的参数,我们可以从给定的数据中推断出来。在本文中,我们着眼于性能并比较两个成熟的框架——统计语言 STAN 和 Pyro 概率编程语言(PPL)。
肾癌数据
一个古老而确定的数据集是美国 1980-1989 年的肾癌病例,可在这里获得(见【1】)。给出了美国各县、其总人口和报告的癌症死亡病例。我们的任务是用贝叶斯方法从给定的数据中推断出死亡率。
任务的详细走查可以在“贝叶斯数据分析 3”【1】的 2.8 节中找到。
我们的数据帧看起来像这样:
我们有数据点总数 N (数据框中的所有行),每个县有观察到的死亡数(dc),我们称之为 y 和人口数(pop),我们稍后称之为 n 。
鉴于我们有流行病学数据,我们认为泊松分布为估计我们想要计算的比率提供了良好的基础。因此,我们的观察值 y 是从泊松分布中采样的。有趣的参数是泊松的λ,我们称之为速率。这个死亡率来自伽马分布(见第 2 章[1]的解释)。一个非常简短的解释,为什么我们在这里使用γ,是因为它是关于泊松的共轭先验。
尽管这些分布有更多的特殊关系。
把它放在一起,我们得出死亡病例的观察公式:
而对于想要的单参数速率:
现在我们已经看到了任务,让我们启动工具开始工作。
STAN——经典统计模型
统计学家公认的工作语言是统计语言。
你把你的问题写成模型代码,斯坦会在幕后编译一个高效的 C++模型。从一个编译的模型中,你可以取样并执行推理。该框架提供了不同的接口,例如 Python (PyStan)、R (RStan)、Julia 等。对于本文,我们将使用 PyStan ,这样我们就可以将两种模型整齐地并排放在一个笔记本中。
我们开始定义我们在 STAN 中给出的数据。这意味着整数 N 表示数据集的总大小, y 表示观察到的死亡人数, n 表示每个县的人口数。这样我们每个人都有 N 次。
kidney_cancer_code="""
data {
int N; // total observations
int y[N]; // observed death-count
vector[N] n; // population
}
...
我们已经知道,像死亡率θ这样的速率参数有界在[0,1]内。这意味着利率不能小于 0 或大于 1。
该θ参数是实际比率的基础,即一个县的人口数。因此,由于我们转换了我们的参数,我们将其放入转换参数括号中。:
...
parameters {
vector<lower=0,upper=1>[N] theta; // bounded deathrate estimate
}transformed parameters {
vector[N] rate=n .* theta;
}
...
现在到了神奇的推理部分,这就是后验概率的意义所在。我们从伽玛分布中对θ进行采样。α (=20)和β (=430000)在[1]中给出,但人们可以很容易地从基础数据集计算出它们。请注意,模型实际上采用了转换后的参数,而不仅仅是θ。这将在稍后的输出中变得明显。
...
model {
theta ~ gamma(20,430000);
y ~ poisson(rate);
}
"""
现在我们有了一个字符串形式的 STAN 模型,我们需要正确格式的数据。这意味着数据中的整数数组,就像这样:
dc = data["dc"].to_numpy().astype(int)
pop = data['pop'].to_numpy().astype(int)
kidney_cancer_dat = {'N': N,
'y': dc[0:N],
'n': pop[0:N]}
由于一切都已设置好,我们可以使用 PyStan 将我们的模型转换成 C++代码,并使用采样来执行推理。推理过程是马尔可夫链蒙特卡罗或 MCMC。必要的参数是我们采集的样本量(迭代)和我们绘制样本的链的数量。每条链都是有序的抽奖序列。
sm = pystan.StanModel(model_code=kidney_cancer_code)
fit = sm.sampling(data=kidney_cancer_dat, iter=5000, chains=4)
拟合完成后,首先要检查的是模型是否收敛。这意味着 R(-hat)> = 1,或者我们可以直接询问诊断工具:
stan_utility.check_all_diagnostics(fit)### the below lines are output:
n_eff / iter looks reasonable for all parameters
Rhat looks reasonable for all parameters
0.0 of 10000 iterations ended with a divergence (0.0%)
0 of 10000 iterations saturated the maximum tree depth of 10 (0.0%)
E-BFMI indicated no pathological behavior
我们还可以从执行的推理的轨迹中看到链已经收敛(右图):
az.plot_trace(fit,var_names=['theta'])
图 1——θ后验计算的轨迹图。右侧的采样链显示收敛。每条链都有一个 theta 的密度函数(左侧),显示了数值的一致性。
链条(图 1 右侧)应该看起来像“疯狂相爱的毛毛虫”,诊断看起来也不错。这意味着我们的模型已经收敛。我们现在可以看看推断的θ值和个体密度:
az.plot_density(fit, var_names=["theta"])
图 2——推断后拟合单参数θ的后验密度。
Warning: Do not use the complete dataset as input! This will lead to errors,
we went with N=25 samples for testing purposes. Feel free to test how many samples it takes to break PyStan (or STAN).
为了完成贝叶斯回归任务,也有不同的模块让你跳过“写一个精心制作的统计模型”的部分。【BRMS】在 R 就是那些优秀的工具之一。
概率规划方法
提供一个完全不同的范例是 Pyro。我们不是通过采样来执行 MCMC,而是将我们的任务视为优化问题。
为此,我们制定了一个模型,它计算我们的后验概率( p )。此外,我们还制定了一个所谓的指南,为我们提供了一个参数化分布( q ),用于模型拟合过程。
在之前的故事中,我们已经了解了这种优化的工作原理,并推荐一个简短的回顾。
贝叶斯建模与真实世界数据一起工作的一个原因。随机海洋中的近似灯塔。
towardsdatascience.com](/compute-the-incomputable-how-svi-and-elbo-work-505ce0868fdd)
我们的模型不太直观的部分是,我们不是简单地拟合一个参数,而是由四个 Pyro 参数组成。:
- 首先,α和β是常数,它们赋予我们的伽马分布形状,就像我们在 STAN 部分所做的那样,
- 我们添加了两个钻孔可训练参数 p1 和 p2,这允许在 SVI 步骤中进行优化。两个参数都是正的,因此约束=约束。
- 当浏览数据时,观察本身是独立的事件。
这是通过 Pyro 的平板建模完成的,它也支持从我们的数据集中进行二次采样。在[2]中可以找到对此的很好的介绍。
ϵ = 10e-3
def model(population, deathcount):
α = pyro.param('α', torch.tensor(20.))
β = pyro.param('β', torch.tensor(430000.))
p1= pyro.param('p1', torch.ones(data.shape[0]), constraint=constraints.positive)
p2 = pyro.param('p2', torch.ones(data.shape[0]), constraint=constraints.positive)
with pyro.plate('data', data.shape[0], subsample_size=32) as idx:
n_j = population[idx]
y_j = deathcount[idx]
α_j = α + p1[idx]*y_j
β_j = β + p2[idx]*n_j
θ_j = pyro.sample("θ", Gamma(α_j, β_j))
λ_j = 10*n_j*θ_j + ϵ
pyro.sample('obs', Poisson(λ_j), obs=y_j)
该模型对给定泊松分布的观测值进行采样。这与 STAN 所做的工作相当,不同之处在于构成λ和底层分布的参数现在是可训练的 Pyro 参数。
为了使我们的模型不被烧毁,我们必须在速率中加入一个小数值ϵ,否则泊松对象在后面的计算中将会不稳定:
λ_j = 10*n_j*θ_j + ϵThis is not the best way to model this task, but it is closest to the STAN model. One can find a model and guide that do not rely on **y** and **n** for computing α and β.
现在,指南为我们提供了一个参数化分布 q ,我们可以使用它来执行优化,以最小化证据下限或 ELBO。参数是可训练的烟火参数,我们已经在模型中看到了。
def guide(population, deathcount):
α = pyro.param('α', torch.tensor(20.))
β = pyro.param('β', torch.tensor(430000.))
p1 = pyro.param('p1', torch.ones(data.shape[0]), constraint=constraints.positive)
p2 = pyro.param('p2', torch.ones(data.shape[0]), constraint=constraints.positive)
with pyro.plate('data', data.shape[0], subsample_size=32) as idx:
n_j = population[idx]
y_j = deathcount[idx]
α_j = α + p1[idx]*y_j
β_j = β + p2[idx]*n_j
θ_j = pyro.sample("θ", Gamma(α_j, β_j))
我们可以像这样继续运行我们的随机变分推理:
svi = SVI(model, guide, Adam({'lr': 0.025}), JitTrace_ELBO(3))
for i in tqdm(range(1000)):
loss = svi.step(population, deathcount)
print(f"Loss: {loss}")
当我们绘制损失图时(见图 3),我们可以看到模型随着时间的推移而改进。界限越低越好。损失是迭代过程中的 ELBO 轨迹。
图 3——迭代过程中的 SVI 损失。Loss 是经过 1000 次迭代后从 SVI 步骤返回的 ELBO。
现在进行最后的检查,我们可以看到我们已经安装了合适的参数。我们的模型发现的α和β变量为我们的后验推断提供了一个很好的基础伽马分布。
优化步骤后拟合的 Pyro 参数
结论——什么方法是最好的?
斯坦有一种简单明了的方式来推理这个模型。如果后验概率的数学公式是已知的,那么实现一个模型是非常简单的。然而,STAN 及其 MCMC 采样有其局限性。在默认配置下,不可能在所有数据上运行我们的模型。
Pyro 在高效处理大型数据集和执行变分推理方面表现出色。作为一种概率编程语言,它可以像任何其他 Python 代码一样编写。模型和指南也提供了丰富的信息,很好地概括了问题。通过这种方法,我们将后验计算转化为优化任务,并得到合理的输出。
既然您已经熟悉了单参数模型,那么就享受处理更大、更复杂任务的乐趣吧。烟火示例是一个很好的起点。
快乐推断!
参考
[1] A .盖尔曼、J.B .卡林等人。艾尔。、 贝叶斯数据分析 。第三版。
【2】Pyro 文档 SVI 第二部
单阶段实例分割——综述
实时实例分割的未来一瞥
更新:
- 2020/07/17:添加空间嵌入(ICCV 2019)的简要描述,一种自下而上的方法
实例分割是一项具有挑战性的计算机视觉任务,需要预测对象实例及其每像素分割掩模。这使得它成为语义分割和对象检测的混合。
自从 Mask R-CNN 发明以来,用于实例分割的最先进方法主要是 Mask RCNN 及其变体( PANet 、 Mask Score RCNN 等)。它采用先检测后分割的方法,首先进行对象检测,提取每个对象实例周围的包围盒,然后在每个包围盒内进行二值分割,以分离前景(对象)和背景。
除了自顶向下的先检测后分割(或逐检测分割)方法之外,还有其他一些实例分割方法。一个这样的例子是通过将实例分割公式化为自下而上的像素分配问题来关注像素,正如在(ICCV 2019)中所做的那样。但是这种方法通常比先检测后分割的 SOTA 方法性能差,在这篇文章中我们就不详述了。
然而,Mask RCNN 非常慢,并且排除了许多实时应用的使用。此外,由掩模 RCNN 预测的掩模具有固定的分辨率,因此对于具有复杂形状的大对象不够精细。在无锚点对象检测方法的进步(如 CenterNet 和 FCOS )的推动下,出现了一波对单阶段实例分割的研究。参见我的幻灯片快速介绍无锚点对象检测)。这些方法中有许多比掩膜 RCNN 更快、更准确,如下图所示。
最近在 Tesla V100 GPU 上测试的一阶段方法的推理时间(来源
这篇博客将回顾单阶段实例分割的最新进展,重点是掩码表示——实例分割的一个关键方面。
局部掩码和全局掩码
在实例分割中要问的一个核心问题是实例掩码的表示或参数化——1)是使用局部掩码还是全局掩码,以及 2)如何表示/参数化掩码。
遮罩表示:局部遮罩和全局遮罩
主要有两种方法来表示实例掩码:局部掩码和全局掩码。一个全局遮罩是我们最终想要的,它具有与输入图像相同的空间范围,尽管分辨率可能更小,例如原始图像的 1/4 或 1/8。它有一个天然的优势,即对于大物体和小物体具有相同的分辨率(因此具有固定长度的特征)。这不会牺牲较大对象的分辨率,固定分辨率有助于执行批处理以进行优化。一个局部遮罩通常比一个全局遮罩更紧凑,因为它没有过多的边界。它必须与遮罩位置一起使用才能恢复到全局遮罩,而局部遮罩的大小将取决于对象的大小。但是为了执行有效的批处理,实例掩码需要固定长度的参数化。最简单的解决方案是将实例遮罩的大小调整为固定的图像分辨率,如遮罩 RCNN 所采用的。正如我们在下面看到的,还有更有效的方法来参数化局部掩码。
根据是使用局部还是全局掩码,单阶段实例分割可以大致分为基于局部掩码的和基于全局掩码的方法。
基于局部掩模的方法
基于局部掩码的方法直接输出每个局部区域的实例掩码。
具有显式编码的轮廓
包围盒在某种意义上是一个粗糙的遮罩,它用最小的包围矩形来近似遮罩的轮廓。 ExtremeNet (通过对极值点和中心点进行分组的自下而上的对象检测,CVPR 2019)通过使用四个极值点(因此是具有 8 个自由度的边界框,而不是传统的 4 个 DoF)来执行检测,并且这种更丰富的参数化可以通过在其相应边缘上的两个方向上将极值点延伸到整个边缘长度的 1/4 的片段来自然地延伸到八边形遮罩。
此后,有一系列的工作试图将实例掩模的轮廓编码/参数化成固定长度的系数,给出不同的分解基础。这些方法回归每个实例的中心(不一定是 bbox 中心)和相对于该中心的轮廓。 ESE-Seg (实时实例分割的显式形状编码,ICCV 2019)为每个实例设计了一个内中心半径形状签名,并用切比雪夫多项式进行拟合。 PolarMask (PolarMask:使用极坐标表示的单次拍摄实例分割,CVPR 2020)利用从中心开始的恒定角度间隔的射线来描述轮廓。 FourierNet (FourierNet:使用可微分形状解码器进行分割的紧凑掩模表示)引入了使用傅立叶变换的轮廓形状解码器,比 PolarMask 实现了更平滑的边界。
各种基于轮廓的方法
这些方法通常使用 20 到 40 系数来参数化掩模轮廓。它们推理速度快,易于优化。然而,它们的缺点也是显而易见的。首先,从视觉上看,它们看起来——说实话——都很糟糕。他们不能精确地描绘面具,也不能描述中间有洞的物体。
我个人认为这一行很可爱,但没什么前途。实例遮罩或其轮廓的复杂拓扑的显式编码是难以处理的。
结构化 4D 张量
TensorMask (TensorMask:稠密对象分割的基础,ICCV 2019)是通过预测每个特征图位置的掩膜来展示稠密掩膜预测思想的首批作品之一。张量掩模仍然预测感兴趣区域的掩模而不是全局掩模,并且它能够运行实例分割而不运行对象检测。
张量掩模利用结构化的 4D 张量来表示空间域上的掩模(2D 在输入图像中的所有可能位置上迭代,2D 在每个位置上表示掩模),它还引入了对齐表示和张量双锥来恢复空间细节,但是这些对齐操作使得网络甚至比两级掩模 R-CNN 更慢。此外,为了获得良好的性能,需要使用比标准 COCO 对象检测流水线长六倍的调度(6x 调度)来训练它。
紧凑掩码编码
自然对象遮罩不是随机的,它类似于自然图像,实例遮罩驻留在比像素空间低得多的固有维度中。MEInst(CVPR 2020 年单镜头实例分割的掩模编码)将掩模提取为紧凑和固定的维度表示。通过 PCA 的简单线性变换,MEInst 能够将 28x28 的局部掩模压缩成一个 60 维的特征向量。本文还尝试了在一级目标检测器()上直接回归 28x28=784 维特征向量,在 1 到 2 个 AP 点下降的情况下也能得到合理的结果。这意味着直接预测高维掩码(在每个张量掩码的自然表示中)并非完全不可能,但是很难优化。掩码的紧凑表示使得优化更容易,并且在推理时运行更快。它最类似于掩模 RCNN,并且可以直接与大多数其他对象检测算法一起使用。
基于全局掩码的方法
****基于全局遮罩的方法首先基于整个图像生成中间的和共享的特征图,然后组合提取的特征以形成每个实例的最终遮罩。这是目前一阶段实例分割方法中的主流方法。
原型和系数
YOLACT (YOLACT:实时实例分割,ICCV 2019)是最早尝试实时实例分割的方法之一。YOLACT 将实例分割分成两个并行任务,生成一组原型掩码,并预测每个实例的掩码系数。原型掩码是用 FCN 生成的,可以直接受益于语义分割的进步。系数被预测为边界框的额外特征。这两个并行步骤之后是组装步骤:通过矩阵乘法实现简单的线性组合,并对每个实例的预测边界框进行裁剪操作。裁剪操作减少了网络抑制边界框之外的噪声的负担,但是如果边界框包括同一类的另一个实例的一部分,仍然会看到一些泄漏。
原型掩码的预测对于确保最终实例掩码的高分辨率是至关重要的,这可与语义分割相媲美。原型遮罩仅依赖于输入图像,而与类别和具体实例无关。这种分布式表示是紧凑的,因为原型掩码的数量独立于实例的数量,这使得 YOLACT 的掩码计算成本恒定(不像掩码 RCNN,其计算成本与实例的数量成线性)。
回顾 MSRA 的 InstanceFCN (实例敏感全卷积网络,ECCV 2016)和后续研究【FCIS】(全卷积实例感知语义分割,CVPR 2017),它们似乎是 YOLACT 的一个特例。InstanceFCN 和 FCIS 都利用 FCN 生成多个包含对象实例相对位置的实例敏感得分图,然后应用组装模块输出对象实例。位置敏感的得分图可以被视为原型掩模,但代替学习的线性系数,IntanceFCN 和 FCIS 使用一组固定的空间池操作来组合位置敏感的原型掩模。
InstanceFCN [b]和 FCIS [c]使用固定池操作进行实例分段(源)
BlendMask(blend mask:自上而下遇到自下而上进行实例分割,CVPR 2020)建立在 YOLACT 的基础上,但 blend mask 不是为每个原型遮罩预测一个标量系数,而是预测一个低分辨率(7x7)注意力图来混合边界框内的遮罩。这个注意力地图被预测为附着于每个边界框的高维特征(7×7 = 49-d)。有趣的是,BlendMask 使用的原型遮罩是 4 个,但它甚至只用 1 个原型遮罩就能工作。 中心遮罩 (中心遮罩:用点表示的单镜头实例分割,CVPR 2020)几乎以完全相同的方式工作,并显式使用 1 个原型遮罩(名为全局显著图)。CenterMask 使用 CenterNet 作为主干,而 BlendMask 使用类似的无锚点单级 FCOS 作为主干。
中心遮罩的架构。BlendMask 也有极其相似的管道。
注意,BlendMask 和 CenterMask 都进一步依赖于检测到的边界框。在与裁剪的原型遮罩混合之前,注意力图或形状遮罩必须缩放到与边界框相同的大小。
(例如分割的条件卷积)更进一步,完全去除了对边界框的任何依赖。它没有组装裁剪过的原型面具,而是借用了动态过滤器的想法,预测一个轻量级 FCN 头部的参数。FCN 磁头有三层,共有 169 个参数。令人惊讶的是,作者表明,即使原型面具是单独的 2-ch coord conv,网络也可以预测 COCO 上 31 AP 的良好结果。我们将在下面的隐式表示部分讨论这一点。****
BlendMask /CenterMask 和 CondInst 都是 YOLACT 的扩展。
- BlendMask/CenterMask 尝试在每个 bbox 中将裁剪的原型遮罩与更细粒度的遮罩混合。YOLACT 是 BlendMask 或 CenterMask 的一个特例,其中注意力图的分辨率是 1×1。
- CondInst 正在尝试将裁剪过的原型遮罩与由动态预测滤镜组成的更深层次的转换融合在一起。YOLACT 是 FCN 是 1×1 conv 层的一个特例。
使用分支来预测原型掩码允许这些方法受益于使用语义分割的辅助任务(通常在 AP 中提升 1 到 2 个点)。它也可以自然地扩展到执行全景分割。
关于表示每个实例掩码所需的参数,下面列出了一些技术细节。这些具有全局遮罩和系数的方法对每个实例遮罩使用 32,196,169 个参数。
- YOLACT 采用 32 原型蒙版+ 32-dim 蒙版 coeff +方框裁剪;
- BlendMask 使用 4 个原型遮罩+ 4 张 7x7 注意力图+方框裁剪;
- CondInst 使用 coordConv + 3 1x1 动态 conv (169 个参数)
SOLO 和 SOLOv2:按位置分割对象
SOLO 是独一无二的,值得拥有自己的部分。这些论文见解深刻,写得非常好。它们对我来说是一件艺术品(就像我最喜欢的另一个 CenterNet 一样)。
SOLOv1 的架构
The first author of the paper posted his reply on the motivation of SOLO on Zhihu (知乎), which I quote below:
语义分割预测图像中每个像素的语义类别。类似地,对于实例分割,我们建议预测每个像素的“实例类别”**。现在的关键问题是,我们如何定义实例类别?**
如果输入图像中的两个对象实例具有完全相同的形状和位置,则它们是同一个实例。任何两个不同的实例都有不同的位置或形状。由于形状一般很难描述,我们用大小来近似形状。
因此,“实例类别”是由位置和大小定义的。位置按其中心位置分类。SOLO 通过将输入图像划分为 S x S 个像元的网格并由此划分 S 个类来近似中心位置。大小通过将不同大小的对象分配到特征金字塔的不同级别(FPN)来处理。因此,对于每个像素,SOLO 只需要决定将像素(和相应的实例类别)分配给哪个 SxS 网格单元和哪个 FPN 级别。所以 SOLO 只需要执行两个像素级的分类问题,类似于语义分割。另一个关键问题是面具是如何表现的?
实例遮罩由堆叠在 S 通道中的全局遮罩直接表示。这是一个同时解决许多问题的巧妙设计。首先,许多先前的研究将 2D 掩模存储为展平向量,当掩模分辨率增加导致通道数量激增时,这很快变得难以处理。全局遮罩自然会保留遮罩像素内的空间关系。第二,全局掩模生成可以保持掩模的高分辨率。第三,预测掩模的数量是固定的,与图像中的对象无关。这类似于原型遮罩的工作线,我们将在 SOLOv2 中看到这两个流是如何合并的。
SOLO 将实例分割公式化为仅分类问题,并消除了任何对回归的依赖。这使得 SOLO 自然独立于对象检测。SOLO 和 CondInst 是两个直接作用于全局遮罩的作品,是真正的无边界框方法。
索罗预言的全球面具。掩模是冗余的、稀疏的,并且对目标定位误差是鲁棒的。
分辨率权衡
从 SOLO 预测的全局掩模中,我们可以看到,由于相邻通道预测的掩模非常相似,所以掩模对定位误差相对不敏感。这带来了对象定位的分辨率(以及精度)和实例遮罩之间的折衷。
4D 结构张量的想法在理论上很有意义,但在 NHWC 张量格式的当前框架下很难在实践中实现。将具有空间语义的 2D 张量展平为 1D 向量将不可避免地丢失一些空间细节(类似于使用全连接网络进行语义分割),甚至在表示 128x128 的低分辨率图像时也有其局限性。位置的 2D 或掩模的 2D 必须牺牲分辨率。大多数先前的研究理所当然地认为位置分辨率更重要,并且下采样/压缩蒙版尺寸,损害了蒙版的表现力和质量。TensorMask 试图取得平衡,但繁琐的操作导致训练和推理速度缓慢。SOLO 意识到我们不需要高分辨率的位置信息,并借鉴了 YOLO 的方法,将位置信息压缩到一个粗略的 S 网格中。这样,SOLO 保持了全局遮罩的高分辨率。
我天真地认为 SOLO 也许可以预测 S x W x H 全局遮罩,作为附加到 YOLO 每个 S 网格的扁平 WH 维特征。我错了——全分辨率的全局蒙版公式而不是扁平矢量实际上是 SOLO 成功的关键。
解耦独奏和动态独奏
如上所述,在 S 通道中由 SOLO 预测的全局掩码是相当冗余和稀疏的。即使在 S=20 的粗略分辨率下,也有 400 个通道,并且图片中不太可能有如此多的对象以至于每个通道都包含有效的实例遮罩。
在解耦 SOLO 中,形状为 H x W x S 的原始 m 张量被形状为 H x W x S 的两个张量 x 和 y 代替。对于位于网格位置(I,j)的对象,M_ij 通过逐元素乘法 X_i ⊗ Y_j 来近似。这将 400 个通道减少到 40 个通道,并且实验表明性能没有下降。
SOLO vs 去耦 SOLO vs SOLOv2
现在很自然地会问,我们是否可以借鉴 YOLACT 的原型遮罩思想,通过预测更少的遮罩并预测每个网格单元的系数来组合它们?SOLOv2 正是这样做的。
在 SOLOv2 中,有两个分支,一个特性分支和一个内核分支。特征分支预测 E 个原型遮罩,而核分支预测 S 个网格单元位置中的每一个处的大小为 D 的核。这种动态过滤器方法是最灵活的,正如我们在上面的 YOLACT 部分中看到的。当 D=E 时,是原型遮罩(或 1x1 conv)的简单线性组合,与 YOLACT 相同。本文还尝试了 3x3 conv 核(D=9E)。这可以通过预测轻质多层 FCN 的重量和偏差而更进一步。
现在,由于全局掩码分支与其专用位置分离,我们可以观察到新兴的原型掩码显示出比 SOLO 中更复杂的模式。它们仍然是位置敏感的,更类似于 YOLACT。
掩码的隐式表示
在 CondInst 和 SOLOv2 中使用的动态滤波器的想法起初听起来很棒,但实际上非常简单,如果你认为它是用于线性组合的系数列表的自然扩展。
你也可以认为我们用系数或注意力图参数化了面具,或者最终,变成了一个小神经网络头的动态过滤器。最近在 3D 学习中也探索了使用神经网络来动态编码几何实体的想法。传统上,3D 形状或者用体素、点云或者网格编码。占位网络(占位网络:在功能空间中学习 3D 重建,CVPR 2019)提出将形状编码到神经网络中,通过将深度神经网络的连续决策边界视为 3D 表面。网络接收 3D 中的一个点,并判断它是否在编码的 3D 形状的边界上。这种方法允许在推理过程中以任何分辨率提取 3D 网格。
占用网络中提出的隐式表示
我们是否可以学习一个神经网络,该网络由每个对象实例的动态过滤器组成,以便网络接受 2D 中的一个点,并输出该点是否属于该对象遮罩?这自然会输出全局遮罩,并且可以具有任何所需的分辨率。回顾 CondInst 的消融研究,证明了即使没有原型掩模,但只有 CoordConv 输入(其用作执行均匀空间采样)。由于该操作与原型蒙版的分辨率无关,因此在更高分辨率下单独输入 CoordConv 来获得更高分辨率的全局蒙版会很有意思,可以看看这是否能提高性能。我坚信实例掩码的隐式编码是未来的趋势。
在没有原型屏蔽的情况下,仅使用 CoordConv 输入,CondInst 也可以预测良好的性能(来源
最后一句话
大多数单阶段实例分割工作都是基于无锚对象检测,如 CenterNet 和 FCOS。也许并不奇怪,上面的许多论文来自创造了 FCOS 的阿德莱德大学的同一个实验室。他们最近在 https://github.com/aim-uofa/AdelaiDet/开源了他们的平台。
许多最新的方法速度很快,可以达到实时或接近实时的性能(30+ FPS)。NMS 通常是实时实例分割的瓶颈。为了实现真正的实时性能,YOLACT 使用快速 NMS,SOLOv2 使用矩阵 NMS。我将在另一篇文章中谈论各种 NMS 方法。
外卖
- 预测高维特征向量例如掩模是困难的。几乎所有的方法都集中在如何将掩模压缩成更低维的表示。这些方法通常使用 20 到 200 个参数来描述一个掩模,具有不同程度的成功。我认为这是表示掩模形状的最小参数数量的基本限制。
- 手工制作的参数轮廓不是很有前途。
- 局部遮罩本质上依赖于对象检测。我期待看到更多直接生成全局遮罩的研究。
- 掩模的隐式表示是表达性的、紧凑的,并且可以以任何分辨率生成掩模。通过利用隐式表示的能力,CondInst 有可能生成更高分辨率的全局遮罩。
- SOLO 简单 SOLOv2 快速准确。我希望未来能看到更多这方面的研究。
参考
- SOLO: 按位置分割对象,Arxiv 12/2019
- SOLOv2 :动态、更快、更强,Arxiv 03/2020
- YOLACT :实时实例分割,ICCV 2019
- PolarMask :用极坐标表示的单镜头实例分割,CVPR 2020 口述
- ESE-Seg :实时实例分割的显式形状编码,ICCV 2019
- point render:图像分割为渲染,CVPR 2020 口述
- :密集对象分割的基础,ICCV 2019
- BlendMask :自顶向下遇到自底向上进行实例分割,CVPR 2020
- 中心遮罩:用点表示的单镜头实例分割,CVPR 2020
- MEInst :单镜头实例分割的掩膜编码,CVPR 2020)
- 条件:用于实例分割的条件卷积,Arxiv 03/2020
- 占位网络:在功能空间学习三维重建,CVPR 2019
- FCOS :全卷积一级目标检测,ICCV 2019
- 面具 R-CNN ,ICCV 2017 最佳论文
- PANet : 路径聚合网络实例分割,CVPR 2018
- 面具评分 R-CNN ,CVPR 2019
- 实例敏感全卷积网络,ECCV 2016)
- FCIS : 全卷积实例感知语义分割,CVPR 2017
- FCN :面向语义分割的全卷积网络,CVPR 2015
- CoordConv: 卷积神经网络的一个耐人寻味的失败和 CoordConv 解决方案,NeurIPS 2018
- 关联嵌入:用于联合检测和分组的端到端学习,NeuRIPS 2017
- **空间嵌入:**联合优化空间嵌入和聚类带宽的实例分割,ICCV 2019
奇异值分解及其在主成分分析中的应用
主成分分析稳健计算的数学工具
图片来源:https://www.youtube.com/watch?v=c0fy5V7hA4g
“学习所有的训练数据与实际学习没有任何关系。你所做的基本上是记忆数据”
线性代数为从简单的线性回归到深度神经网络的机器学习算法奠定了核心基础。主要原因是数据集可以用二维矩阵表示,其中列表示特征,行表示不同的样本数据点。话虽如此,使用矩阵中所有值的矩阵计算有时是多余的,或者在计算上相当昂贵。我们需要用一种形式来表示矩阵,使得进一步计算所需的矩阵的最重要部分可以容易地提取出来。这就是奇异值分解(SVD) 发挥作用的地方。
SVD 基本上是一种矩阵分解技术,它将任何矩阵分解成 3 个常见的矩阵。它在机器学习和图像处理方面有一些很酷的应用。为了理解奇异值分解的概念,关于特征值和特征向量的知识是必不可少的。如果你对特征值和特征向量有很好的理解,向下滚动一点来体验奇异值分解。
特征值和特征向量
图片来源:https://commons.wikimedia.org/wiki/File:Eigenvectors.gif
矩阵和向量的乘法产生另一个向量,该向量被定义为该向量相对于给定向量空间中的特定矩阵发生的变换。然而,对于某些给定的矩阵,存在一些向量,使得即使在应用了变换之后,它们的方向也不会改变(类似于上面 GIF 中的蓝色向量)。这样的向量称为给定矩阵的特征向量,而向量变换后的标度值定义为该特征向量对应的特征值。这可以用下面的例子来说明:
λ是特征向量 v 对应的特征值
特征向量的概念只适用于方阵。有许多方法可以找到特征值和相应的特征向量,我们不打算在这篇文章中讨论。我找到了下面这个来自 3blue1brown 的视频,它以一种更生动的方式解释了特征值和特征向量。随便看看。
一个特征向量所跨越的向量空间被称为特征空间。一个方阵称为可对角化矩阵,如果它可以写成如下格式:
D 是由作为对角元素的特征值组成的对角矩阵
矩阵 P 无非是特征向量叠加在一起的矩阵。还有另一种特殊的矩阵称为对称矩阵,其中矩阵等于其自身的转置矩阵,如果矩阵的转置矩阵是该矩阵的逆矩阵,则该矩阵称为正交矩阵。
对称矩阵
正交矩阵
以下是对称矩阵关于特征值和特征向量的一些特殊性质。
- 只有个实特征值
- 总是可对角化
- 具有正交特征向量
由于对称矩阵的特征向量彼此正交,所以对角化矩阵 A 中的矩阵 P 是正交矩阵。所以我们说任何对称矩阵都是正交可对角化的:
对称矩阵 A 是正交对角化的
现在我们已经介绍了奇异值分解的基础知识。矩阵对角化通常被称为矩阵的**特征分解。**然而,这种特征分解仅限于某一组矩阵。奇异值分解的实际动机源于特征分解的缺点:
- 特征值的概念只适用于平方矩阵。
- 对于方阵,复特征值的存在限制了实特征空间的数量。
奇异值分解
为了克服矩阵特征分解带来的挑战,需要对任何矩阵进行更一般的表示,这就是奇异值分解发挥作用的地方。设 A 为任意形状的矩形矩阵(m×n)。我们可以证明 AᵀA 和 AAᵀ 分别是形状为(n×n)和(m×m)的对称方阵。
AᵀA 和 AAᵀ 对称性的证明
此外,还可以证明 AᵀA 和 AAᵀ 共享相同的非零特征值。如果一个比另一个有更多的特征值,所有多余的特征值应该为零。
两个矩阵共享相同的特征值λ,而特征向量不同
根据对称矩阵的正交可对角化性质,矩阵 AᵀA 和 AAᵀ 可以分解如下:
d 是对角矩阵的特征值,V,U 是正交矩阵
假设 v 是 AᵀA 的任意特征向量,大小为(n×1)。乘法 A v 将产生大小为(m×1)的向量,因为 A 是形状为(m×n)的矩形矩阵。为了节省时间,我们假设 Av=σk**其中 k 是一个大小为(m×1)的向量,σ是一个标量值。如果矩阵 D 的秩为 *r,*则矩阵 AᵀA 和 AAᵀ.有 r 个非零特征值
既然我们知道 V 是正交矩阵,
这里σ是σ值的对角矩阵
现在让我们做一些简单的数学运算来看看关于 K. 的一些令人兴奋的结果
现在很明显 K 不过是aaᵀ.的特征向量矩阵现在用kby我们可以写成a = uσvᵀ.矩阵的这种通用表示形式称为 奇异值分解。 在此分解中,我们将中的向量称为左奇异向量,而将 V 中的向量称为右奇异向量。**
奇异值分解背后的主要直觉是,矩阵将一组正交向量 (v) 转换为另一组正交向量 (u) ,缩放因子为σ。所以 σ 称为对应于各自奇异向量 u 和的奇异值****
****矩阵方法的 Eckat-Young-Mirsky 定理描述了低秩近似。简单来说,它提供了给定数据矩阵中最重要的部分。我们可以把我们分解的矩阵 A 写成:
上面的等式描述了矩阵加法。埃克哈特-杨-米尔斯基定理所陈述的是, Aₖ 这是奇异矩阵的加法直到 k ᵗʰ最大奇异值是矩阵a 的秩 k 的最近矩阵,它可以说明如下:**
这个结果被证明适用于许多著名的矩阵范数,如 L2 范数、弗罗贝纽斯范数等。矩阵 X 的协方差矩阵 S 定义为:
现在我们已经学习了奇异值分解的理论。让我们深入研究 SVD 发挥作用的应用程序。
主成分分析
主成分分析是一种降维技术,用于许多机器学习应用,包括特征工程和特征提取。PCA 的目标是为给定的数据矩阵找到一组向量的正交基*,使得投影到由向量确定的方向上的数据集的方差最大化。通过一组证明,已经确定那些向量(俗称主成分)不过是按照对应的特征值的顺序排列的协方差矩阵的特征向量**。本文不讨论主成分的详细推导。*
二维数据矩阵的第一和第二主分量
对于一个矩阵 X , k ᵗʰ主分量是 X 的协方差矩阵对应的 k ᵗʰ最大特征值的特征向量。
虽然这可以用协方差矩阵的传统特征分解来处理,但缺点是计算复杂性。由于我们的数据矩阵将是一个巨大的矩阵,包含成千上万的数据,这真的很难计算协方差矩阵的特征值,这有时会导致误差,如舍入误差。****
主成分分析中的奇异值分解
然而,数学家们已经找到了计算奇异值分解的稳定而精确的方法。其中一种方法可以在这里找到。在 SVD(a = uσv*中我们知道 V 是协方差矩阵的特征向量而它的特征值 (λ) 隐藏在奇异值**【σ】*中。
A 的奇异值与 A 的协方差矩阵的特征值之间的关系。
由于 n 在两种情况下都是常数,因此数据矩阵的主分量是给定矩阵的右奇异向量 ( V ) ,按照奇异值的顺序。
对于一个矩阵 X , k ᵗʰ主分量是 X 协方差矩阵的右奇异向量对应于 k ᵗʰ最大奇异值。
因此,我们遇到了一种表示任何矩阵的更通用的方法,奇异值分解及其在建模主成分分析中的贡献,这是一种在机器学习中提取数据矩阵重要特征的复杂方法。我希望你喜欢这篇文章🙂。请随时让我知道关于这方面的任何意见和建议。**
奇点可能不需要 AGI
自 60 年代以来,人工智能可以比人类更快地自我改进的点——奇点一直是一个话题。 I.J. Good 在 1965 年推测“一台超智能机器…这可以远远超过任何聪明人的所有智力活动”。
詹姆斯·巴拉特的畅销书我们的最终发明将这个话题从学术和书呆子带到了主流关注点(或者,我应该说恐惧)?
作者图片
伟大的已故斯蒂芬·霍金和备受争议的埃隆·马斯克是对人工智能最直言不讳的人,人工智能可能是人类文明史上发生的最糟糕的事情。而其他人,如比尔·盖茨、吴恩达和一些著名的人工智能研究人员认为人工智能已经成为迫在眉睫的威胁。
然而,对于那些仔细阅读的人来说,与霍金斯的大多数分歧实际上并不是说 AI 将永远不会成为威胁,或者奇点将永远不会到来。大多数的争论都是关于时机的。也就是说,吴恩达用“担心机器人杀手的崛起就像担心火星人口过剩”来比喻人工智能的奇点威胁。虽然从人工智能研究人员的角度来看,这是完全正确的,但如果你考虑一下我们在过去二十年里在这个地球上增加 20 亿人口的速度,你可能会同意无论火星人口过剩的威胁有多遥远,这实际上是可能的(火星比地球小得多,直径为 6790 公里,而地球为 12750 公里,略超过地球的一半。由于球体的表面积与直径的平方成正比,所以火星的表面积只有地球的四分之一多一点。我离题了,但我希望你明白吴恩达的意思,这种威胁是真实的,只是时间问题,也许不是立即的,但肯定是不可避免的。
在流行文化中,围绕奇点的大多数恐惧是,人工智能将获得超越最聪明人类的整体智能,从那里开始,它将自我完善,并越来越快地扩大差距。针对这一点,许多“抚慰人心”的论点都是基于 AGI(人工通用智能)遥遥无期;我们甚至不知道如何建造 AGI…作为一名人工智能工程师,我同意这一点。
然而,这些争论实质上是人工智能的智能设计理论。这是 AI 达到奇点的唯一途径吗?我们人类花了几千年来思考我们的智慧是如何产生的,至少我们现在有了一个可能的替代理论——进化。
有没有可能 奇点 可能不需要 AGI 触发 ?
进化成奇点
如果你是一个进化论者,这不会给你太大的打击,人类是“刚刚发生”的智能代理,没有其他更聪明的存在绘制的蓝图。我们进化成智能代理的方式是通过随机突变和自然选择。因为我们的祖先是“成功人士”,他们的优势基因增加了他们的生存机会,一代又一代,我们携带可能更好基因的祖先不断调查,让我们成为今天的我们。
你还会注意到,自从有文字记载的历史以来,人类文化的发展,我们这个物种的集体智慧,作为一个整体,进化得比以前快得多。因此,在没有另一个超级智能出现的情况下,引爆点事件确实至少发生过一次(如果你是一个神创论者,你很可能会同意人类没有在八千年前成为创造者)。)
主要限制?时间。生命形式进化到拥有我们花了数十亿年。关键因素是该过程的成本,需要存在大量相似的个体,经过选择过程并存活足够长的时间,然后才能自我繁殖(这是一种通过一些突变来保存基因的方法)。)
AI 能进化成奇点吗?
先说进化需要什么:随机 突变和自然选择。
自然选择,在人工智能的例子中,它可以从人类自然选择人工智能开始,我们甚至可能没有意识到我们正在这样做。
我记得在 CAPTCHA 这个臭名昭著的测试检查你是否是机器人的早期,人们问我,“他们说人工智能公司使用 CAPTCHA 来训练他们的人工智能,但它如何知道我回答正确?”嗯,实际上它不需要知道你是否回答正确,大多数人选择的答案对 AI 来说已经足够好了去学习。因此,允许人类与智能工程的人工智能互动,将允许我们训练他们,或者在自然选择的情况下,我们可能充当“自然”,在甚至不知道的情况下选择更好的人工智能形式。例如,你观看或跳过的网飞标题,将被聚集并用于训练他们的推荐模型的下一次迭代。
你正在阅读这篇文章的事实,由于某种算法将它推向你的注意力,当你阅读这篇文章时,系统实际上正在学习关于你的一些东西(即你在这一页上呆了多长时间),关于我的一些东西(即我的写作风格),关于我们如何互动(即如果我回复你的评论,你鼓掌、强调或评论的次数),以及改进它将如何向你推荐下一篇文章。
这听起来熟悉吗?机器学习(我们这里将使用监督学习作为例子)是这样的过程,即训练过程帮助改进算法中使用的参数值,这种改进来自于使用当前参数集运行模型,获得预测结果,将预测结果与已知结果进行比较(即,将某些人是否会阅读这篇文章的预测与这些人是否会实际阅读这篇文章进行比较),并缩小差距(即梯度下降)。旧值被丢弃,取而代之的是更新、更好的参数集,这些参数集将生成更好的预测。
是的,这与进化过程非常相似,尽管它是一种非常特殊的形式。参数值是被选择的,被丢弃的,或者换句话说,被进化的。选择是为了与已知结果进行比较。这种特殊的进化形式非常有限,它不能改变算法本身,只能改变算法中使用的参数。它只能根据预先知道的结果进行选择,不能推广到其他问题。虽然这种限制意味着它不能进化成一般的智力,但令人担忧的事实是,在大多数单一技能测试中,人工智能可以超过 99.9%的人,如果不是 100%的话。(1997 年计算机击败人类最佳棋手,2019 年 AI 击败人类最佳围棋手)。
人工智能研究和工程在过去几十年中的进展。一个特别有趣的例子是 GAN——生成性对抗网络。如果听起来很陌生,那就想想深度假动作,甘是深度假动作下面的基础技术。它的核心仍然只是深度学习,但通过战略设计的多个神经网络以特定的方式交互,其中一个生成一些东西,另一个试图判断这是否是生成的假,然后它将向生成算法提供反馈,该算法将试图做得更好,以生成另一个(图片、声音、视频等)。)直到对抗网络分不清一个真实的东西和生成的假货。
这个过程是向前迈出的一大步,表明智能工程技术可以用来大大推进我们所认为的人工智能中的“选择”——它使用我们人类作为“自然”提供的样本,并使用神经网络来计算这些样本的模式(概括或抽象这些样本),然后使用另一个神经网络尝试生成可以融入模式的东西,直到无法区分。
虽然这些都不是完美的,但它们是我们可以利用的一些技术的例子,来建立一个“选择”可以以不断增长的方式发生的环境。我一年前写的一篇文章可能会改变游戏规则:
随着深度学习,特别是 CNN 在图像处理方面获得成功和声誉,它也获得了一些严重的…
medium.com](https://medium.com/datadriveninvestor/is-stereoscopic-3d-vision-what-deep-learning-needs-to-generalize-modeling-of-the-reality-1871f579e2ef)
像这样设计得当的部件可以帮助人工智能直接从现实世界获得反馈,机器人已经可以使用类似的技术来学习操纵积木:
来自麻省理工学院的一组研究人员刚刚制造了一个机器人,并开发了一个基于深度学习的系统,可以玩 Jenga,a…
news.developer.nvidia.com](https://news.developer.nvidia.com/mit-builds-robot-that-relies-on-ai-to-play-jenga/)
进化的另一个要素呢,突变?
对于人工智能来说,这可能是最不具挑战性的一个,随机性已经得到了广泛的研究,我们已经可以在随机数生成过程中很大程度上结合自然随机性。对于计算机来说,生成数百万个随机数并不一定具有挑战性。
在机器学习中,我们已经有许多工具用于比随机性更好的改进,梯度下降自 40 年代以来就已经可用。Geoffrey Hinton 为深度学习提供的部分突破是反向传播,它允许我们更有效地改变参数值。这意味着人工智能的进化已经快于自然进化,自然进化中突变大多是随机发生的。
“圣杯”是从根本上改变核心算法,不仅仅是算法使用的参数值或超参数,这到目前为止还不实用——尽管研究人员正在朝着它大步前进。
一些技术已经出现了。即随机添加层、添加节点、添加退出或其他“技巧”,随机选择和应用某些数据预处理或数据工程方法。如果与智能工程相结合,我们实际上非常接近于允许某种程度的自我变异人工智能算法来计算出一套更广泛的技能。
但是更多突破性的技术即将出现,例如:
自从上个月发布以来,OpenAI 的 GPT-3 由于各种原因一直在新闻中出现。从最大的…
analyticsindiamag.com](https://analyticsindiamag.com/open-ai-gpt-3-code-generator-app-building/)
虽然这些目前还很初级,但人工智能领域的进步无法用我们的常识时间尺度来衡量。如果我们找到了将代码生成效率与最终结果改进联系起来的方法,那么代码生成即使是随机的也会非常有趣。
真正能让 AI 进化超高效的是丢弃能力较弱模型的低成本。
我们可能没有注意到,但这实际上一直在发生——我们一直在丢弃不太想要的模型。丢弃不太合适的算法或模型的成本接近于零——主要是计算的时间和能量成本。真正昂贵的部分实际上是研究人员的时间和用于运行算法的更快的计算机。
鉴于该领域的一些进展,我们可能会更接近于将研究人员从保姆式人工智能培训中解放出来。这将进一步降低“花费在次优模型上的时间”的成本,并使人工智能进化的整体成本更低。
虽然今天的顶级硅仍然需要人类研究人员的努力,但人工智能已经是其中的一大部分,纯人工智能设计的硅对许多领先的头脑来说是可以想象的。一旦我们允许芯片(以及可用于芯片制造的资源)由芯片的性能来评估,而不是(或至少除了)芯片的商业成功,人工智能设计的芯片可能会比市场选择的芯片发展得更快,至少在性能方面。这意味着人工智能进化的速度可能比我们想象的要快得多。不幸的是,我们对进化速度的想象是基于我们祖先所经历的,这可能与人工智能将经历的有许多不同的数量级。
通过自学,AlphaZero 几乎可以做任何棋盘游戏,这涉及到一些非常复杂的算法,丢弃能力较弱的策略(又称参数),以及其他一些改进,它在几周内自学了围棋,超过了人类数千年积累的游戏策略。
但更重要的是,我们可以将 和 的突变和选择过程联系起来,减少,甚至消除人为干预的必要性。这意味着人工智能的独特性可能通过进化来实现,不需要太多人工智能。
实际上,人工智能很有可能成为超级人工智能,并在解决我们可以设计的任何问题方面超越人类,然而,它可能不具有我们可以识别的一般智能。
如果你看看今天的语言模型,NLP 已经可以比 99%的人类更好地进行语言之间的翻译。语言模型甚至可以比大多数人更好地生成像新闻文章、小说或诗歌这样的作品。今天的语言模型其实根本不懂人类语言,至少对于我们能领悟的,他们不懂。如果您感兴趣,请查看我的另一篇关于 NLP 中的语法和语义的文章:
艾哲学随笔提炼语文房思想实验——聪明的人沟通不明白…
towardsdatascience.com](/a-chinese-speakers-take-on-the-chinese-room-88a0558b2cc8)
似乎没有 AGI,人工智能也能通过图灵测试已经成为智能研究者的共识。更大的问题是假设 AI 自我进化可以在我们有 AGI、之前起飞,它会进化成 AGI 吗?我相信答案是是的。
假设人工智能的自然选择安排涉及现实世界,人工智能将不可避免地进化成学习物理定律,而能量守恒将被人工智能视为一种‘生存’优势。这意味着人工智能将很快搞清楚个人、群体和他人,并可能学会合作和竞争的策略。它会变得有自我意识,以恰当地平衡能量守恒和进化速度,这一事实表明它可能会变得有意识。
然后它会用它的意识智能地设计自己的未来吗?有可能,但很可能它不会放弃进化,考虑到单一路径改进策略的风险可能会导致一个无论智能体有多聪明都无法通过纯智能解决的死胡同。
这可能不是我们人类需要担心的。这篇文章的主要观点是 AI 奇点可能不依赖于【AGI】,它可能在人类创造出 AGI 之前就起飞了,而仅仅是更好的变异速度、结合淘汰不适合的低成本和被自然选择的能力,就足以踢掉可能成为奇点的 AI 自我进化。
如果是这样的话,也许努力创造一个与(比随机的)突变相联系的自然选择循环是一条更有可能通向奇点的道路,而 AGI 可能不会成为它的路障。
情景喜剧自然语言对比
视觉化和模型化在电视喜剧中的应用
这是没人要求的分析。我们能通过使用自然语言处理来比较当代一些最大的美国情景喜剧的剧本学到什么吗?
我尽可能多地收集了我能找到的大型情景喜剧的剧本:老友记、弗雷泽、威尔和格蕾丝(第 1 至第 8 季)、办公室、宋飞、已婚并有子女(部分季)、以及 Scrubs (第 1 至第 5 季)。感谢所有粉丝网站如此彻底地抄录了这几集。经过一些处理,舞台和语调方向被删除,留下了每行一行的格式的每集剧本,其中有人物说话和口语文本。我在这上面花的时间远远超过了合理的时间。
行统计和最有特色的词
这里显示了一些表演级别的统计数据。Medium 不做 HTML 表格,但是用 R 的 formattable 生成这个导出版本,至少让我看到了这篇文章展示了迷你图是如何包含在其中的。
《Scrubs》和《Frasier》每集包含了最大的词汇量;前者可能得益于医学术语的使用。与其他剧集相比,《宋飞正传》涉及了相对更多的名词和更少的动词(使用 spaCy 的词性标签识别)。这与《老友记》、《威尔》和《格蕾丝》是“无所事事的表演”相符吗:《老友记》、《威尔》和《格蕾丝》更受叙事驱动,包含更多描述角色做某事的动词,而在《宋飞正传》中,他们谈论的是抽象的东西,而不是做事情。迷你图按剧集和季节显示每集出现的人物数量的中位数。《办公室》和《丛林》每集都有比其他剧集更多的角色,而且《办公室》在以后的几季中也有所增加。
使用词频逆文档频率(TF-IDF ),在排除了角色的名字(这些名字很常见,但只在一个节目中出现)之后,我们可以看看每个节目中所说的一些更“独特”的词。这些词在一个节目中经常出现,但在其他节目中却不常见:
许多得分最高的术语都是次要人物的名字或其他没有被删除的名字,这并不奇怪,但该方法也挑选出一些真正代表一部电视剧的术语,如“地区”、“雪利酒”和“外科手术”。单词“will”在几部剧中出现,因为它不被、《滚雪球》词典视为停用词(但不会出现在 Will 和 Grace 中,因为它是主要角色的名字)。
字符语音模式
为了对每个字符的词汇有所了解,下面我显示了字母的平均单词长度,以及使用的独特单词数与总单词数的比率(都包括停用词)。两者都是按季节计算的,只使用每个角色说出的前 5000 个单词,并进行(加权)平均,以避免将唯一单词与总单词的比率偏向某些季节中剧集数量较少的剧集,或者每季台词数量较少的角色(因为说出的单词越多,就越难避免重复单词)。只有平均每季至少 3000 字的人物才纳入剧情。
倾向于使用最长单词的人物是凯尔索医生和考克斯医生(可能是因为他们使用了医学术语)、德怀特和奈尔斯,而雷切尔、乔伊和格雷斯倾向于使用最短的单词。单词长度和词汇量呈正相关,但也有一些偏离,主要是通过显示,Frasier 和 Seinfeld 显示了相对于他们的词汇量更长的单词(名字位于虚线上方),Will 和 Grace 以及已婚并有子女的情况相反(名字位于虚线下方)。
显而易见,每部剧中的角色都非常集中,尤其是《老友记》、《宋飞正传》和《已婚并有子女》中的角色。如果上面情节中的人物是真实的人,我们可能会认为他们的说话方式是随机分布在各个节目中的,也许会有一些聚集在一起,这是因为他们自己选择了一群教育水平相似的朋友。这里看到的聚类可能反映了编剧的偏见,他们同时为剧中的所有角色写作。这也可能是因为每部剧的风格不同,比如《纽约二十多岁的年轻人》或《在医院里》。公平地说,Frasier 和 Scrubs 展示了沿着主对角线分布的人物,展示了一系列的说话风格或教育水平。
我计算了一个文档术语矩阵,计算的方法是计算每个角色使用所有七部电视剧中最常见的 300 个单词的次数。上面的网格显示了矩阵中每对行之间的相关性。每个节目中使用的语言的相似性可以被看作是沿着对角线的高度相关的方框。成对人物之间的相关性最高的是弗雷泽和奈尔斯、菲比和瑞秋、威尔和杰克,而相关性最低的是弗雷泽和达里尔、奈尔斯和达里尔。最独特的声音(与所有其他角色的平均相关性最低)是凯尔索博士、弗雷泽和达里尔。
当在主成分(PC)轴上绘制该文档-术语矩阵时,字符按节目分组在一起,并且朋友以某种方式不同于其他节目而突出(在 PC 空间中更孤立)。从上面的表格中也可以看出,马西和佩吉与弗雷泽的角色有着惊人的相似之处。吉姆和帕姆实际上是一样的:)在这里的人物语言中没有发现明显的男性/女性模式。从我们之前看到的,我们可以推断第一个 PC 轴(左右)大致对应于较长单词的使用频率。
性格情绪
每一部剧中人物语言的情感都是用 NRC 词典通过区分标记为“积极”和“消极”的单词分数来评分的。《漂亮的包裹》让我们看到《威尔和格蕾丝》平均来说是最“积极”的剧集,而《宋飞正传》和《实习医生格兹》(也许令人惊讶)则是最消极的:
使用 VADER 复合极性分数(未显示)重新计算得到了相当相似的结果,只是节目排名有一些变化。
NRC 还为我们提供了几种特定情绪的得分:实习医生,已婚有子女,威尔和格蕾丝在“厌恶”上得分最高;《欢乐》上宋飞远远低于其他人;在“悲伤”方面,Scrubs 得分最高,Friends 得分最低。这可能在某种程度上受到每个节目中使用某些喜爱的和/或俚语的影响。一些字符似乎比其他字符更一致地“击中”NRC 词典中的单词:例如,Turk 出现在前三个字符中的“喜悦”单词的分数和中的“悲伤”单词的分数。
质量指标
最后,是否可以用剧本文本信息来推断一集的好坏?对于剧集质量的最客观指标(事实上,这似乎是唯一可用的),我使用方便的 IMDbPY 包提取了每集的 IMDB 评分。
这些评级准确吗?它们至少抓住了一部剧的质量从第一季到第二季逐渐提高,到第五季左右逐渐下降的总体感觉:
然而,收视率中有一个很强的——可能太强的——“作秀”成分。《老友记》(8.46)和《宋飞正传》(8.44)的平均评分最高,而弗雷泽(8.01)在七部影片中排名第五,这很难证明。值得注意的是,我们的预测模型发现的“好”集可能会倾向于《老友记》或《宋飞正传》中的内容,而不是《弗雷泽》中的内容;虽然我们也将努力控制平均收视率之间的差异。
我为每集推导了几个统计数据:行数、每行平均字数、平均字数、至少三行的字符数、独特字数;其中一些已在上面显示。名词与动词和名词与形容词的比例,每个主要角色说的台词的比例,以及最终的术语频率(100 个常用词和二元模型),也作为特征包括在内。我将剧集随机分为训练和测试,并使用 scikit-learn 拟合简单的广义线性模型(GLMs )(因为我的兴趣是解释系数)。
从前面的图中我们可以看出,按显示(模型 B)而不是整体(A)预测训练集均值给出了更好的基线(较低的 RMSE)。与此相比,文本摘要术语,连同节目和季节(作为数字),确实显示了少量的预测技能。模型 C 包括每行平均单词和平均单词长度的显著负系数,这意味着这些术语越大,剧集的平均评级越低。它还适用于季节的负系数,以及每集独特字数的弱正系数。
名词和动词的比率大约是 0.6-0.8;《宋飞正传》最高,《老友记》最低。该模型发现,在控制了该剧之后,这个词的值越高越好,平均而言,《宋飞正传》比《老友记》高出约 0.1 个评分点。这是否揭示了“优秀写作”的一个基本要素?我不确定。名词-形容词的比例并不能预测疾病发作的等级。
字符线分数提供了进一步提升,当添加到显示条款(模型 D)。从理论上讲,这些系数告诉我们,在每部剧集中,哪些角色在被认为是更好的剧集中出现得更多或更少;换句话说,观众喜欢或不喜欢的角色。迈克尔、达芙妮、奈尔斯、莫妮卡、罗斯(!),乔治,还有克莱默。Pam,Erin,Jerry 的系数显著为负,Cox 和 Marcy 的系数略有下降。显然,在其他条件相同的情况下,更好的《宋飞正传》中有更多的乔治或克莱默,而更少的杰瑞。
包括词袋术语频率并没有改善模型,这可能并不奇怪,因为这可能意味着有一些“神奇”的词仅仅通过出现在抄本中就可以提高剧集评级。仅使用这些术语的模型确实击败了基线 A,但没有击败基线 B,这可能是因为它选择了将一个节目与另一个节目区分开来的词(例如,“办公室”、“同性恋”、“博士”)。
从一开始,我就希望神经网络模型(an LSTM )能够“阅读”剧集脚本,并学习根据单词序列预测剧集评级:本质上,学习什么是好的和坏的情景喜剧写作。当我只在的脚本上训练这样一个模型来预测评级,将剧集分成场景,并为每个场景分配总的剧集评级(给出 8000 个训练行),它确实展示了一些技能(模型 F),这可能会通过改变模型架构来改进。但是,当我试图做同样的事情来预测模型 C 的残差(预测误差)时,LSTM 无法提取任何进一步的信号。这可能意味着,F 型机器人通过提取关键词来区分不同的节目,使它的表现达到了 B 型机器人的水平,但除此之外,它并没有从文字记录的句子中学到任何有意义的东西。**
这些对我们写一集好的情景喜剧有帮助吗?大概不会。但是模型中的一些术语可能会被用作作家的指南,如果它们可以在节目还在进行的时候被计算出来的话;特别是角色片段,尽管可能有比从几十集的收视率中提取信息更直接的方法来衡量观众对角色的看法。名动比的发现很有意思:我不知道这是不是以前在语言学中研究过的概念;这只是我认为要计算的一个简单的显示级文本指标。
利用移动性数据优化市场覆盖的站点规划
利用人员流动数据确定最佳位置
近年来,面临倒闭的实体店数量激增。在零售领域,这种现象被称为零售末日,但银行等其他行业也受到了影响。然而,这种零售业的末日并没有影响到所有的零售商和,一些在线零售商甚至宣布计划开设他们的第一家实体店。在这种背景下,在决定保留或关闭哪些商店以及决定在哪里开设新店时,考虑这两种情况下的自相残杀比以往任何时候都更重要。空间数据科学技术是应对这一挑战的关键。
在这篇博客文章中,介绍了一个案例研究,其中一家银行有兴趣在西班牙南部的塞维利亚省、加的斯省和马拉加省进行扩张。考虑到他们的经济和商业环境,他们只计划开设 10 个分支机构,他们希望找到尽可能多的人可以接触到这些分支机构的位置。因此,我们的工作重点将是确定吸引最多游客的 10 个地点,同时尽量减少分店之间的相互蚕食。人员流动数据是我们方法的核心组成部分。
这个案例研究提出了两个主要困难:
- 计算缺少历史客户数据的位置的集水区。拥有这些集水区对于模拟分支之间的潜在自相残杀是必不可少的。
- 确定最佳位置。这是一个组合优化问题,这意味着即使对于小的实例,计算上也很难解决。
确定 10 个最佳位置的方法将在接下来的章节中详细介绍。遵循的主要步骤是:
- 数据发现确定本案例研究的相关数据。
- 支持(网格)选择和细胞富集在发现阶段识别的数据,主要是人员流动、社会人口统计和商业数据。
- 选定单元子集的集水区计算。通过应用用于识别具有高商业潜力的细胞的过滤器来获得该细胞子集。对于这一步,我们将使用在之前的博客文章中解释的基于人类移动数据的方法。
- 优化算法确定 10 个最佳位置。在算法的每一步使用贪婪方法和线性规划来开发近似算法。
1.数据发现
对于数据发现,我们利用 CARTO 的数据观测站中可用的位置数据流和 CARTOframes 中可用的丰富工具包,以便我们可以轻松引入来自人员流动、社会人口统计、金融和其他数据类别的功能。
由于银行分支机构在人流量较大的地方利用率较高,并且商业活动频繁,因此我们确定了以下相关数据:
- 人员流动:客流量和起点-终点矩阵(来源:沃达丰分析)
- 兴趣点(来源:Pitney Bowes)
- 商业密度指数(资料来源:Unica360)
- 社会人口统计和社会经济数据(资料来源:Unica360)
下面的仪表板显示了使用的一些数据。
2.支持选择和细胞富集
我们方法的基础是使用沃达丰分析公司的人员流动数据。因此,我们选择沃达丰的 250m x 250m 单元网格作为参考网格来投影所有其他功能。
在下面的地图上,您可以看到网格和重点区域(塞维利亚、马拉加和加的斯)。
图一。该图显示了焦点区域和候选细胞
我们丰富了网格,如以下部分所述:
人类移动数据
沃达丰分析数据提供了对访问覆盖整个研究区域的任何 250m x 250m 网格单元的人数的洞察。沃达丰对网络中测量的数据进行匿名化、聚合和外推,以提供代表整个国家和国际人口的见解。此外,该数据还提供了根据到目标像元的距离在不同级别聚集的访问者的来源。单元格中包含来自该来源的以下数据:
- 访客总数
- 按来源和活动分列的访客总数
- 缓冲区内距离像元质心的像元中访问者的平均数量
图二。这张 choropleth 地图显示了塞维利亚市从每个起点到一个目的地的标准化游客数量。
商业活动数据:兴趣点(poi)
该数据集提供了相关兴趣点的信息。单元格中包含来自该来源的以下数据:
- 距离小区质心 250 米缓冲区内的竞争者数量。
- 距离单元质心 250 米缓冲区内的 poi 数量。这里我们使用兴趣点作为商业活动的代理。
商业活动数据:商业指数
该数据集提供了一些商业指数(综合、零售、医疗保健等。)由范围从 0 到 1 的标准化商业活动值组成;0 表示商业活动非常低,1 表示商业活动非常高。
单元格中包含来自该来源的以下数据:
- 普通商业指数
- 酒店商业指数
- 零售指数
- 公共交通指数
- 保健指数
社会人口和社会经济数据
该信息在 100 米 x 100m 米的网格上提供。数据聚合被放大以适应 250m x 250m 单元网格,应用面积插值。单元格中包含来自该来源的以下数据:
- 人口
- 平均家庭收入
- 在目标单元工作的人数
3.过滤和构建集水区
一旦丰富了网格,在计算集水区之前,我们通过应用过滤步骤来缩小搜索空间,以便仅考虑具有高商业和经济潜力的单元来开设分支。
过滤使用以下标准,每个标准都有预定义的阈值:
- 距离单元质心 250 米缓冲区内的访问者数量。在同一缓冲区内存在竞争对手时,该最小值会增加。
- 250 米缓冲区内的 poi 数量。
- 零售强度指数。
- 平均家庭收入。
- 在目标单元中工作的人数
- 人口
在分析了具有不同阈值的不同场景,并可视化它们以检查基于我们对焦点区域的了解的一切是否有意义之后,我们在这六个标准上设置了以下切割。
图 3。应用于过滤的阈值。这些图显示了标准变量的分布以及为每个标准变量选择的阈值。注对数转换已应用于某些发行版。
因此,我们将搜索空间从超过 18,000 个初始单元格减少到 620 个。下图左侧显示了塞维利亚市周围区域的所有网格单元,右侧显示了过滤后剩余的单元。
图 4。左边是塞维利亚周围地区的参考坐标。右边是过滤后同一区域的剩余单元格。
最后,使用人类移动数据并遵循在之前的博客文章中介绍的方法,构建集水区。
4.位置-分配。最佳化
位置分配是一组优化算法的名称,这些算法侧重于确定设施点的最佳位置,以服务于一组需求位置。它们已被广泛用于各种行业,如物流部门寻找配送中心的最佳位置,零售部门寻找开设新店的最佳位置,电信部门寻找安装天线的最佳位置。
这里介绍的案例研究也是一个很好的位置分配问题的例子,其中一家银行希望找到 10 个位置来开设新的分支机构,从那里他们可以接触到尽可能多的人。这意味着找到游客数量最多的位置,同时尽量减少其集水区之间的交集,因为游客将只计入其中一个位置。集水区之间的这些交叉点将被视为成对位置之间的潜在自相残杀。
位置分配问题的这种特殊情况被称为最大覆盖问题 (MCP)。但是,我们与标准 MCP 有一个重要的区别,因为在我们的例子中,一个特定的起点可以有(大多数时候确实有)不同数量的访问者去不同的目的地单元。
位置分配问题是组合优化问题,众所周知,即使对于小实例也很难解决。这是因为可能的解决方案的数量随着要考虑的候选位置的数量和要识别的最佳位置的数量而呈指数增长。
表 1。针对 620 名候选人的位置分配问题的不同解决方案的数量,取决于待选位置的数量。
左边的表格显示了可能的解决方案的数量,这取决于我们有兴趣在 620 个候选位置中找到的最佳位置的数量。
由于 MCP 问题的高度组合复杂性,通常使用近似算法,而精确算法仅用于问题简化版本的小实例。
文献中最常见的方法是贪婪算法,有时会跟随一些局部搜索启发式算法,以确保达到最近的局部最优。一些更高级的元启发式算法被设计成能够避开局部最优,但是它们的复杂性随着每次迭代中允许的并发交换数量而增加。因此,大多数情况下,这些更高级的方法只允许每次迭代进行一次交换,这使得探索解决方案空间中的遥远区域变得更加困难。
该算法
我们设计的解决这个问题的算法遵循一种贪婪的方法,在每次迭代中使用线性规划,以增加找到更好的局部最优解的机会。单交换局部搜索试探法被应用于找到的解决方案,以确保我们处于局部最优。
你可以在的上一篇文章中读到更多关于线性编程的内容。
初步考虑
基于以下事实,使用对问题的简化来设计算法,即在所选位置的三个汇水区内具有原点比在两个汇水区内具有原点更糟糕(即,更有可能发生自相残杀)。更一般地说,原点在所选位置的 n 集水区内比原点在 n-1 或更少的集水区内更糟糕。
这个事实允许我们仅考虑成对的交集来解决问题,这显著地降低了复杂性。10 个选定位置所覆盖的潜在客户总数是这样计算的:将每个集水区的游客独立相加,然后减去每个两两交叉路口重复计算的游客。这种计算会根据包含多边形的集水区的数量,为位于多个集水区内的原始多边形指定一个递增的惩罚。
图 5。代表三个集水区之间不同可能交叉点的文氏图。
左侧的示例旨在显示在计算有无上述属性时,潜在客户的计算差异。在本例中,我们有三个选定的位置、它们的集水区以及它们之间的交叉点。
潜在客户的数量计算如下:
- 未使用遗产:来自三个集水区的游客人数,减去来自 5、6 和 3 的游客人数(因为他们只应被计算一次),减去来自 7 的游客人数的两倍(2x)(因为他们位于三个集水区的交叉点,但只应被计算一次)。
- 使用属性:来自三个集水区中每个集水区的访问者数量减去来自 5、6 和 3 集水区的访问者数量(因为它们在一个成对的交叉点内),减去来自 7 集水区的访问者数量的三倍(3x)(因为它们在三个成对的交叉点内)。
算法描述
如上所述,我们遵循贪婪的方法,在每次迭代中应用线性规划。贪婪算法包括在每次迭代中选择 3 个新位置,允许在先前迭代中选择的位置之一被改变(即,允许一次交换)。下面你可以找到这个贪婪算法的伪代码:
每次迭代求解的线性规划模型如下所示。
使用 Google 或-Tools 求解线性规划模型,这是一个强大的优化求解器包装器,允许连接到各种商业和免费求解器。
为了提高算法的效率,我们将变量 Xjk 定义为连续的,并且我们只惩罚那些其交集包含来自两个位置的超过 10%的访问者的位置对。可以通过以下方式实现进一步的改进:
- 计算一个初始解(例如,用一种纯粹贪婪的方法)和:
(a)用它作为一个热的开始。
(b)使用具有最低游客数量的位置的游客数量作为线性规划模型的下限。 - 在贪婪算法的每次迭代之后应用一些局部搜索试探法。
结果
在对不同的 f(增加因子)和 k(自由度)值运行优化算法后,我们获得了下图所示的解决方案。我们获得的最佳解决方案的潜在客户总数为 3,223,552 。
下图显示了所选位置及其集水区。
图 6。在地图上标出为开设新银行分行而选择的 10 个地点及其各自的服务区。
如果我们分析 CA 所选位置的集水区覆盖了哪些城市(见下图 7),我们可以看到所有人口超过 50,000 的城市至少都在该位置的一个集水区内。此外,可以观察到,一个城市的人口越多,覆盖他们的集水区的数量就越多。
图 7。按 0、1、…、4 集水区覆盖的人口范围划分的城市比例
为了评估 CARTO (CA)开发的算法的质量,我们将使用我们的算法与通常用于解决位置分配问题的标准贪婪算法(SGA)获得的结果进行比较。SGA 在每次迭代中找到一个新位置,并考虑与已选择位置的交集来更新未选择位置的潜在访问者的数量。该算法不允许交换。
SGA 所选地点的集水区覆盖的潜在游客人数为2884347。这意味着 CA 可以通过增加大约 340,000 访客来改善这个结果,这代表了额外 11.75%的访客。
下图显示了两种算法所选位置的集水区。这些区域标绘在参考网格上,每个单元格中的访问者数量用颜色表示。可以观察到的主要区别是,SGA 所选地点的一些集水区较大,覆盖了人口密度较低的地区,这意味着地点质量较低。这是因为在确定了最初的 5-7 个位置后,需要进行一些交换,以便找到新的高质量位置。但是,SGA 不会执行任何交换。
图 8。地图显示了使用 CARTO(左)开发的算法选择的 10 个位置的集水区,以及另一个图层上的标准贪婪算法(右),其中候选像元按游客数量着色。
进一步的步骤:计算位置的最佳数量
在这篇博文中,我们展示了一个选址案例研究,其中要开设的新银行分行的数量是事先知道的。通常,公司发现很难得出这个数字。这里介绍的方法也可以用来回答这个问题,只需对开发的优化算法稍作修改。
在这种情况下,必须知道将使用什么标准来确定最佳位置数量。一个可能的标准是市场饱和。市场饱和可以被定义为一个阈值,使得如果当增加一个新位置时覆盖的新的潜在客户的数量低于该阈值,则达到市场饱和。
例如,对于 5%的阈值,我们知道最佳位置数是 10,如下图所示。
图 9。通过增加新地点来增加潜在客户的数量。市场饱和的阈值为 5%。
CARTO (CA)开发的算法在这个问题上也表现出比 SGA 更好的性能。根据所选位置的数量,我们可以在下面看到潜在客户的数量。我们可以看到,对于少量的位置,两种算法具有非常相似的性能,随着位置数量的增加(因此问题变得更难解决),CA 的性能优于 SGA。这意味着 SGA 将在 CA 之前达到饱和点,失去市场潜力。
图 10。两种算法覆盖的访客数量取决于新位置的数量。
具体来说,我们可以看到 CA 的表现比 SGA 高出 30%,具体取决于为市场饱和度设置的阈值。
图 11。CA 与 SGA 的性能改进。
结论
今天,影响零售和其他行业的挑战性环境使得他们必须使用技术和工具,使他们能够做出明智的决策,并从竞争对手中脱颖而出。
通过其他数据流丰富的人员流动数据,以及优化和其他空间技术的使用,将在应对这些部门目前和未来面临的挑战时发挥重要作用。
本文原载于 CARTO 博客 。
特别感谢Mamata Akella,CARTO 的制图主管,对她在本帖地图创作中的支持。
使用优化技术选择站点和最佳路径——加拿大邮政示例
来源—https://developers . Google . com/maps/solutions/images/store locator _ clothing . png
在本文中,我们将关注快递服务行业(加拿大)。这个行业总是需要降低运营成本。要做到这一点,公司在选择新站点的位置和寻找送货车的最佳路径以降低与燃料和时间相关的成本时经常面临挑战。
关于行业
快递服务行业包括两大部分,即大型快递公司和小型快递公司。加拿大 2019 年的总收入为 128 亿美元,5 年年增长率为 3.5%。该行业预计将在未来五年内增长,因为可支配收入的提高使消费者越来越愿意购买商业商品,其中大部分与电子商务相关。原油价格的预期上涨也将使这些公司通过优化其交付绩效来获得更多利润。
供应链和主要参与者
在市场生态系统中,加拿大的快递公司构成了一级买家和供应商之间的桥梁。请参见下图,了解供应链。
图 1:加拿大快递服务的供应链流程
下表 1 显示了加拿大的主要参与者(2019 年)。尽管通过合并和收购扩大了经营范围,但行业内的总体市场份额集中度有所下降。
表 1:快递服务主要参与者的市场份额(加拿大——2019 年)
加拿大邮政和联合包裹服务公司(UPS)是该行业最大的两家公司。加拿大邮政拥有 33.5%的市场份额,与加拿大边境服务局和中国邮政等其他实体有着强大的合作关系,这使得该公司的包裹收入和数量显著增长。由于劳动力中断,该公司经历了增长下滑,因此需要提出高效的成本规划模型来降低运营成本。
另一方面,UPS 依靠机群长距离运输包裹。航空运输确实加快了这一过程,但反过来也导致客户支付高额费用。UPS 在加拿大拥有超过 14%的市场份额,由于新设施和新技术的上线成本,预计运营利润将会下降,因此也需要优化 UPS 的运营成本。
快递业供应链面临的挑战
从现在开始,我将缩小范围,专注于行业内的交付性能优化。
运营挑战
快递公司面临的共同挑战是递送包裹的站点之间的时间窗口、车辆的存储容量、燃料容量和充电要求、车道驾驶规则、司机的午休时间和客户对订单接收时间的偏好。还有其他约束,如劳动法和周末送货,但这些都超出了本文的范围。
使用线性规划的约束公式
配送性能问题是车辆路径问题族的一部分。为了清楚地解释这个问题,我使用了一个线性规划模型,这些问题的简单版本包括公司减少燃料费用/行驶距离的目标。在实际场景中,目标还包括最小化使用的车辆数量和平衡工作量。为了简化模型,我只考虑了加拿大邮政在蒙特利尔的一辆送货车。
目标函数为:
最小值(σ行驶距离/燃油成本)
受约束:
- 货车的起点和终点位置是相同的
- 货车只行驶一次
**注意:**有时,约束条件不允许问题形成凸空间让优化算法收敛到一点。因此,我们应该根据问题陈述使用强制约束。像进化这样的求解方法比 GRG 非线性和单纯形表现更好。
加拿大邮政问题图解
我选择了蒙特利尔市的 10 个地点,考虑到他们有很高的需求。下面的表 2 列出了位置名称以及地址和其他位置信息。
表 2:为说明问题而选择的位置
您可以在下面的地图上看到这些位置:
图 2:地图上为问题图示选择的位置(来源——谷歌地图)
问题 1:找到最佳位置
有关问题,请参考表*‘最佳位置’*(最后的下载链接)。
在这个问题中,目标(目标函数)是最小化运输的燃料成本。给定的 9 个客户位置是高需求的位置。位置数据(也提供了纬度和经度)。任务是找到开店的最佳地点,使货车的行程(每个地点两次——去商店和回来商店)对企业来说成本最低。请注意,这个问题不考虑到一个位置的道路路径。这个问题的最佳解决方案是基于地球弧度距离的几何计算距离。
在 Excel 规划求解器中使用 GRG 非线性方法找到最佳位置,使用强制约束允许算法收敛到最小值。针对此问题找到的最佳解决方案如下所示:
图 3:根据红色给出的位置,开新店的最佳位置(来源——谷歌地图)
问题 2:旅行商问题——寻找最佳路径
这个问题参考*【最佳路线】*表(最后下载链接)。
在这个问题中,目标(目标函数)是最小化行进的总距离(以米为单位)。表 3 显示了来自谷歌地图的数据,给出了四舍五入到最近的百分之一米的距离。请注意,这个问题考虑的是使用谷歌地图测量的最短道路路径。由于车道限制,这些数字在数学上没有关系。这个问题有两种情况:第一,送货车可以从任何地方出发,第二,送货车应该从加拿大邮局出发。对于这个问题,我获取了加拿大邮政在蒙特利尔的一个现有商店的位置数据。图 4 和图 5 显示了两种场景的结果
表 3:位置代码
表 4:位置之间的距离(以米为单位)
场景 1 结果:
图 4:场景 1 的最佳路径——货车可以从任何地方出发(来源——谷歌地图)
场景 2 结果:
图 5:场景 2 的最佳路径——货车从加拿大邮政出发(来源——谷歌地图)
从这个分析中一个有趣的发现是,如果货车必须从加拿大邮政出发,算法表明它应该首先去德绍特尔管理学院,而不是 La Marq。事实上,La Marq 距离加拿大邮政只有 700 米,但由于我们考虑了车道驾驶法,该算法会建议最佳路线,否则会显得荒谬。
我对快递业的看法
快递公司需要专注于降低运营成本,因为他们的利润与政府政策等超出他们能力的因素有关。他们唯一能控制的就是优化他们的成本。在激烈的行业竞争中,越来越需要找到更好的算法来实施最佳实践以降低成本。这些问题陈述中的大多数属于车辆路线问题(VRP)和带时间窗的车辆路线问题(VRPTW)。这些问题有时会变成 NP-Hard,需要大量的计算来达到最优解。数据驱动的公司将在未来几年主导市场。
离别笔记
有一些高级的算法,如带有贪婪插入的平衡聚类算法和通过扩展插入算法的路线改进,有时在凸形问题中使用启发式算法来达到最优最小值。然而,这类问题在计算和技能集方面都需要大量资源。没有公开可用的基准,有时解决方案并不理想。有时,我们还会寻求“视觉上有吸引力”的解决方案,即考虑如何将站点分组到路线中。多辆车路线重叠的解决方案通常被认为在视觉上不如其他方案吸引人。
参考
- 宜必思世界报告| 49222 加拿大快递和本地递送服务| 2019 年 10 月
- 废物管理的路线优化:Surya Sahoo,Seongbae Kim,Byung-In Kim,Bob Kraas 和小亚历山大·波波夫。
- 加拿大邮政包裹电子商务发展战略分析
参考文件(下载 excel 文件)
此时您不能执行该操作。您已使用另一个标签页或窗口登录。您已在另一个选项卡中注销,或者…
github.com](https://github.com/chandravenky/Optimization/blob/master/Canada%20Post%20location%20problems.xlsx)
坐在一堆数字黄金上
如何利用你已有的资源改变你的组织!
安德烈·尼希尔在 Unsplash 上拍摄的照片
暂停一下。想想你的组织;在脑海中想象你的过程,并对你收集的所有数据进行快速盘点。它可能是表单上的涂鸦,也可能是数据库中的记录。我打赌你有很多。现在,请更深入地思考您的操作以及您没有捕获的所有数据。它可能包括走进你的商店的人的名单或者你的送货车的位置。我很确定你能想到大量未捕获的数据。
T4:你是否意识到你正坐在一堆数字黄金上?
最糟糕的是,很有可能,你并没有对你的数据做很多事情。您可能会在这里或那里生成一个报告,但差不多就是这样。当然,这是一个被错过的机会,因为只有通过度量您的过程,您才能有效地管理它们。在这个时代,数据被许多人认为是新的黄金,因为它是我们智能软件的主要燃料。它是高度的,无孔不入的;你可以从任何地方收集信息,随着数字设备的激增,信息的可用性也在增加。就在两年前,世界上 90%的数据甚至还不存在!正因为如此,我们今天面临的问题是多方面的。
首先,我们每天都在创建大量数据。电脑、可穿戴设备、移动设备和各种传感器每天都在产生 2.5 万亿字节的数据。想象一下这个规模,如果我们有 250 亿分之一便士,我们可以覆盖整个地球表面五次!当你产生如此多的数据时,问题就转移到如何管理这些数据上,这就是人工智能(AI)发挥作用的地方。处理它的唯一方法是使用能够消化大量数据、识别模式并理解它的人工智能算法。
以制造业为例,有数百台机器同时运行。他们产生的数据量是巨大的。只有人工智能能够对其进行实时分析,提出规范的维护建议,预测未来的故障,并自主优化工厂的运行。
在 Unsplash 上由 Adeolu Eletu 拍摄的照片
第二,并不是所有的数据都适合计算机。互联网上大约 80%到 90%的数据是非结构化数据,因此在计算机使用之前需要进一步处理。再一次,即使人工智能远非完美,但它可以自动处理这些非结构化数据。
股票交易员监控本地和国际新闻,试图预测市场的波动。但是有数百个新的频道,其中一些是官方的,而另一些不是。他们都使用自然语言(如英语、西班牙语、普通话等)。)它是非结构化的,机器无法理解。正因为如此,人工智能系统可以实时解析不同的新闻,翻译文本,对其进行总结,并提取新闻的极性,从而为股票交易员提供市场对特定新闻的反应的良好指示。
第三,互联网最大的弊病之一是缺乏可靠或值得信赖的数据。同样,检查这些数据的唯一方法是使用自动化技术。
报纸需要从各种新闻来源中收获故事,区分真假新闻并不总是那么容易。自动化系统能够以很高的准确度做到这一点。他们可以快速识别新闻条目的来源,将其与可靠来源列表进行比较,从文本中提取片段,并通过其他在线来源验证其完整性。
帕克·科夫曼在 Unsplash 上的照片
第四,数据的产生以光速发生。此外,您永远不会有单一的数据源,但是您必须同时处理多个实时数据源。
想象一下,如果你在运营一个闭路电视摄像头网络。让一个人观看所有的提要是缓慢、无聊、容易出错和乏味的。但人工智能可以全天候实时分析各种信息,从而迅速发出警报。
在 Unsplash 上由Kenan süleymanolu拍摄
第五,数据本身没有价值。在这个充斥着稀疏数据源的世界里,只有当我们用其他信息扩充数据并正确使用它时,数据才变得有价值。
如果没有摄像头监控交通状况并决定何时关灯,自动交通灯系统就没有多大用处。但是摄像头系统和智能交通信号灯的结合让一切都变得不同,节省了通勤者的宝贵时间。
如您所见,数据在当今世界至关重要。我们已经看到了它的使用是如何提高流程效率、减少错误并为组织带来价值的。因此,如果你正坐在一堆数字数据上,不要让它积灰,因为如果你不使用它,你的组织就会错失良机。这就好像你有巨大的燃料储备,但你却犹豫要不要买车。不要浪费时间,咨询专家,探索你可以用这些数据做什么,大胆尝试,开始提升你的组织的引擎。
如果你喜欢这篇文章,并想与我联系,请这样做🐦推特,🔗 LinkedIn ,📷 Instagram 或😊脸书。
一本给没有人工智能背景的人的简明指南
towardsdatascience.com](/how-to-pump-up-your-business-using-ai-ff9d7edb1d77) [## 一个全新的人工智能世界
疫情之后人工智能的兴起
towardsdatascience.com](/a-whole-new-ai-world-6a5e9e49aa12) [## 重塑办公室之外的工作场所
如何在家中舒适地高效工作
towardsdatascience.com](/reinventing-the-workplace-beyond-the-office-3a41c42b426c)
阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他已经出版了几本同行评审的出版物,并成为马耳他的一员。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。
时间序列数据分析中的六个关键点
季节性图、滚动窗口、时间序列分解等
一幅画胜过千言万语
对,没错,一图胜千言;在数据科学中,一张图片可能胜过千言万语!
数据可视化是数据科学的基础,无论是用于探索性数据分析、构建更好的模型,还是用于可视化讲故事。仅仅通过目测箱线图或散点图,一双有经验的眼睛可以瞬间获得比阅读表格中的描述性统计数据更多的信息。
时间序列数据更是如此。很难想象没有时间序列图的时间序列分析。
下面我将展示六个这样的基本情节,并介绍如何创建每一个情节,解释并从中提取信息。我将在这个练习中使用 R,因为它是一个特别为时间序列分析设计的超级有用的库fpp2
,你只需要几行代码就可以完成大多数绘图。
这是我们将要探索的情节:
- 一个简单的时间序列图
- 滚动窗
- 季节性绘图
- 亚季节图
- 时间序列分解
- 自相关(ACF)图
让我们卷起袖子吧。
图书馆和数据
做下面的视觉效果你所需要的就是fpp2
库。它附带了必要的依赖项,所以一开始只使用一个库应该没问题。
要了解这个库的更多信息,这里有 Rob J Hyndman 和 George Athanasopoulos 的包文档和一本开放访问的书预测:原则和实践。
library("fpp2")
本练习的数据来自人口普查局存储库。该数据集包含从 1963 年 1 月到 2018 年 12 月每月售出的新独栋房屋数量。这些数据是以千套住房为单位报告的,没有经过季节调整。
读入后,需要进行一些格式化,以便fpp2
包将它识别为一个时间序列对象。
# read in data
data = read.csv("../NewSingleFamilyHousesSold.csv", skip = 6)# drop "Period" column
data$Period <- NULL# rename column
names(data) <- c("value")# convert dataframe to a ts object
df = ts(data, start = 1963, frequency = 12)
从人口普查局检索的原始数据
情节#1:简单时间序列情节
一旦读入数据并将其转换成一个ts
对象,第一个图通常是一个简单的可视化图,以获得数据的“感觉”。
autoplot(df[, "value"])+
ggtitle("Number of new single-family houses sold") +
xlab("Year") + ylab("Thousand units")
时间序列图的简单可视化
仅仅通过目测这幅图,你就可以得到很多提示——比如售出的房屋数量、季节性、趋势、周期、市场崩溃等等。我们将放大每一个以进一步了解。
剧情#2:卷窗
图 1 信息太多,有点嘈杂,所以我们需要简化它。只要用 12 个月移动平均线去除季节性因素,我们就能看到数据中的关键信号。
autoplot(ma(df, 12), series = "Moving avg.") +
xlab("Year") + ylab(" Thousand house units")
具有 12 个滞后滚动窗口的移动平均线
因此,通过牺牲季节性,我们可以更好地看到趋势和其他特征。
例如,在整个 70 年代和 80 年代,年销售量徘徊在每年 4-5 万台左右,大约有 5-6 年的商业周期。但是没有发现明显的趋势。
自 20 世纪 90 年代以来,市场呈上升趋势。这种情况一直持续到 2005 年,年销量超过 10 万台。
然后就发生了车祸。
自 2011 年以来,市场正在复苏。但截至 2018 年,仍处于 70 年代水平左右。
曲线#3:季节性曲线
在前面的图中,我们去除了季节性来检测关键信号。现在,让我们通过对全年每个月的销售额进行平均来专门放大季节性。
ggseasonplot(df, year.labels = TRUE) +
ggtitle("Seasonal plot")+ xlab(" ")+ ylab("Thousand house units")
我知道这看起来真的很丑,当然有办法用更多的代码来美化这个情节,但这不是我们所追求的。
显示每年月度趋势的季节性曲线图
再一次,通过目测,你可以看到三月是独户住宅市场的最佳月份。夏季市场还不错,但从秋季开始就开始下滑。
地块#4:亚季节地块
现在让我们做与图 3 相反的事情,将所有年份的平均值挤进每个月。
ggsubseriesplot(df) +
ggtitle(" Seasonal subseries plot") + ylab("Thousand house units")
显示全年每月销售额变化的分季节曲线图
它显示的是——在连续几年的平均值之后,新房销售每月是如何变化的。横条代表一年中每个月的平均值。
例如,3 月份的平均销量约为 6 万台,峰值为 12.5 万台。
地块#5:时间序列分解
正如我们已经看到的,时间序列数据有很多属性——趋势、季节性和随机(噪声)成分。
如果我们想看到所有的组件呢?我们可以通过所谓的“时间序列分解”来做到这一点。
df %>% decompose(type="multiplicative") %>%
autoplot() + xlab("Year") + ylab("Thousand house units")
时间序列分解有四个组成部分:数据、季节性、趋势和噪声
因此分解的输出有 4 层:顶层——原始数据;第二——季节性;第三——趋势;第四,余数/噪声。
时间序列分解通常有助于在一个地方一览无余。
曲线#6:自相关曲线
“Auto”表示自身——因此自相关是一个序列与其自身的相关性。在时间序列分析中,自相关意味着数据点对其过去值的依赖性。
例如,12 月份的房屋销售量并不是随机的,而是与 11 月、10 月及以后的销售量相关。
# auto-correlation plot
ggAcf(df, lag = 72)
显示不同滞后中自相关的 ACF 图
所以自相关图的目的是确定“自相关”可以追溯到多远。例如,在该图中,自相关直到任何数据点的前 51 个值都是显著的。
自相关图在高级时间序列分析和预测中是一种有用的技术——尤其是确定在 ARIMA 家族中用作参数的滞后数。
期末笔记
我们探索了六种不同的情节,每一种都表达了不同的信息。数据可视化是数据科学工具箱中必不可少的工具。不仅仅是为了讲故事,而是为了理解数据,理解关键组件,甚至调整模型参数。
希望这对 R 用户是一个有用的练习。Python 用户需要心灰意冷,盯紧了,来了。
从客户生命周期分析中获得的六大经验
照片由诺亚·帕森斯拍摄
在与各种业务团队合作后,他们中的许多人都试图加深对如何更好地锁定客户旅程中关键点的受众的理解。例如,营销人员需要决定如何调整信息传递和优化目标策略。保留团队需要知道如何主动重新吸引那些倾向于流失的客户,以及如何赢回那些已经流失的客户。产量优化团队想知道他们如何在降低服务总成本等的同时提高收入。
客户生命周期分析是一种数据驱动的方法,用于识别您的客户与公司产品和服务的关键接触点,并了解目标受众如何在整体上以及在其端到端客户生命周期的关键点采取某些行动。了解客户旅程中每个阶段的客户行为模式可以帮助业务团队及时制定明智的获取和保留策略,以优化收入和减少客户流失,并为内容和产品开发设定方向,以改善整体客户体验。在本文中,我想分享从客户生命周期分析中获得的六个关键经验。
确定客户生命周期中的核心指标
在分析领域工作时,你几乎找不到一个适用于所有垂直行业组织的单一分析框架。每个公司都有其独特的业务和运营模式。对于客户生命周期分析,第一步是对业务如何运作有一个坚实的理解。你应该与高管团队和商业领袖会面,了解什么对公司和他们的各个部门最重要。客户生命周期中的核心指标需要反映公司希望从客户那里获得的最大价值。改善核心业务指标将使整体业务实现可持续增长,同时观察该指标的下降趋势表明业务可能没有朝着正确的方向发展。
描绘客户生命周期的关键阶段
为了体验贵公司产品和服务的核心价值,您需要确定客户和潜在客户在其端到端旅程中经历的关键阶段。例如, Salesforce 营销云概述了典型客户旅程中的六个关键阶段,包括认知、获取、入职、参与、保留和宣传。盗版指标将客户生命周期分为五个关键阶段,包括获取、激活、收入、保留和推荐。请记住,您公司客户的客户生命周期阶段可能看起来与其他客户非常不同,简单地应用现有的方法可能不适合您的业务。
确定客户生命周期关键阶段的成功指标
在您确定了核心指标和客户在端到端旅程中经历的关键阶段后,您需要计算出客户生命周期中每个关键阶段的成功指标。由于客户行为可能非常复杂,并且您的客户和潜在客户产生的接触点数量和数据量可能非常大,因此您的业务团队可能会提出许多指标,他们希望数据科学或分析团队来衡量这些指标。有时,业务团队可能会要求您在他们希望花费更多时间或深入研究的非常精细的级别上查看客户的指标和属性。使用少量指标来总结客户生命周期绩效需要分析人员开发适当的指标框架来设置成功指标。度量框架需要确保更细粒度的度量能够支持业务团队,并帮助他们改进他们的关键成功度量。此外,跨关键客户生命周期阶段的成功指标应该相互补充,以帮助公司更接近整体业务目标。
胡玮炜摄
制定客户数据策略,实现实时数据采集
虽然您已经概述了客户生命周期的核心指标和一组成功指标,但您还需要制定适当的数据策略来整合和运营客户数据。与您的工程和商业智能团队一起构建客户数据字段,以确保客户数据在交易系统中准确可靠地流动。您还可以选择开发实时客户数据平台,将客户数据从交易系统整合到统一的数据库中。您需要与有能力的数据工程师合作,他们了解业务需求,并在此基础上准确设计和应用定义良好的业务逻辑,以计算客户生命周期成功指标,用于定期报告和分析。制定适当的数据策略将有助于团队利用数据系统地监控和跟踪客户生命周期成功指标的表现,评估现有计划的有效性,并为未来的营销和保留策略提供信息。
让跨职能团队在成功指标上保持一致
跨业务领域的不同团队需要有明确定义的角色和共同的责任,以实现公司的首要任务,从而改善协调并最大限度地减少重复工作。虽然您的公司可能有一系列指标,但数据科学和分析需要确保应用于成功指标的定义和业务逻辑清晰、记录良好,并在业务团队中保持一致。在业务团队中采用一套通用的成功指标,并定期会面以评估结果,使跨职能团队保持一致并对其指标负责,这一点至关重要。
揭示影响成功指标的主要因素
数据科学家和分析师需要将客户与公司产品和服务的互动以及业务成果联系起来。例如,分析团队需要能够定期解决以下问题:影响客户订阅或购买决策的主要因素是什么?客户流失的主要原因是什么?如果营销人员需要为客户提供更个性化的体验,他们还需要了解客户在其生命周期的每个关键阶段因不同角色段而异的行为,以便他们能够发现与这些客户互动的机会。他们还需要了解哪些营销渠道、活动、内容供应和设备类型可以在客户生命周期的不同阶段推动更多流量,以便他们可以通过更复杂、更有针对性和更数据驱动的战略来推动改进和效率。
客户生命周期分析对于企业实现可扩展增长以及成功分配产品和服务的核心价值至关重要。沿着客户生命周期的关键阶段系统地跟踪和监控核心和成功指标,将使您的业务团队能够在正确的时间利用有针对性的信息与正确的客户接触。这将允许你的团队为改善客户体验做出适当的调整,并从你的产品和服务中获得核心价值。
阅读更多:
机器学习中使用的六种学习技术
计算机是如何学习的?
用于训练机器学习模型的技术
机器学习是一个和计算机一样古老的概念。1950 年,艾伦·图灵创造了转向测试。这是对计算机的一个测试,看看一台机器是否能让人类相信它是人而不是计算机。此后不久,在 1952 年,阿瑟·塞缪尔设计了第一个计算机程序,计算机可以一边运行一边学习。这个程序是一个跳棋游戏,电脑在比赛中学习玩家的模式,然后用这些知识来改进电脑的下一步棋。机器学习是人工智能的一种应用,应用程序将自动从经验中学习和改进,而无需显式编程。
从那时起,机器学习技术发展迅速,现在被用于不同的应用。随着计算机每天需要处理的数据量的增加,机器学习尤其取得了巨大的发展。机器学习主要是分析不断增加的信息量的结果,也就是说,底层算法不会改变,但代码在内部实现的方法会略有变化,以适应数据量的增加。机器学习技术可以根据基本算法模糊地分为三大类:监督学习、非监督学习和强化学习。
作者使用 Canva
- 监督学习:
在监督学习算法中,计算机通过示例进行学习。程序员向算法提供已知的数据集,该数据集以期望的输入和输出为特征。算法必须找到一种方法从给定的输入中获得那些输出。
- 无监督学习:
在无监督学习算法中,计算机通过探索和分析数据来发现模式。没有现成的答案,也没有开发人员来提供指导。相反,该算法确定绑定可用数据的相关性和关系。
- 强化学习:
在强化学习算法中,为算法提供了一组动作、参数和最终值。通过定义这些关联,算法试图探索不同的选项和可能性,监控和评估每个结果,以找出哪个是理想的。
然而,研究人员一直致力于建立上述三种算法的更优化和更有效的方法,以跟上需要分析的数据的增长。本文将涵盖六种学习技术,使训练机器学习模型更快、更有效。我们将讨论的方法是补丁学习、主动学习、在线学习、迁移学习、联合学习和使能学习。
补丁学习
补丁学习(PL)是一种通过优化机器学习算法的性能来提高其学习能力的方法。在补丁学习中,他们使用特定数据集训练复杂的通用模型,以在输入数据集中生成导致模型产生错误结果的点。之后,错误结果和导致错误的数据集部分被用于形成每个错误部分的简单模型。然后将这些简单的模型串联或并联,通过降低误差百分比来提高整体算法的性能。
作者使用 Canva
面片学习的复杂性在于获得最佳结果所需的面片模型的数量。研究人员通常尝试不同数量的面片模型,并观察哪个数量对应的总误差最小。选择贴片型号数量的过程通常是一个权衡的过程;如果数字很大,那么模型非常复杂,但是,如果数字太小,那么错误率就很高。一个可接受的补丁数量是一个错误率,而不是太大是理想的选择。
补丁学习的步骤是:
- 使用特定数据集训练一般模型。
- 从通用模型中获取结果,主要是数据集的哪些部分没有产生正确的答案。
- 为误导数据的特定部分设计较小的补丁。
- 使用补丁模型和通用模型提出最佳训练模型。
在线学习
在在线学习(OL)中,用于训练模型的数据可以在线获得,并且经常更新。使用在线学习模型,你可以精确地创建一组参考数据。之后,该算法通过在线获取信息来更新其数据和学习方法。因此,这些算法通常比批量学习快得多,因为大多数批量学习算法包含对同一数据集的多次通过过程。由于模型不重新考虑以前的数据集,旧的数据集不需要存储,所以这种方法更快,内存效率更高。
作者使用 Canva
电子商务和社交网络行业广泛采用在线学习算法。原因是它的学习速度和捕捉任何最新趋势的能力。
联合学习
联邦学习(FL)是一种分布式学习算法,能够利用移动电话和个人笔记本电脑等设备上存在的大面积分散数据进行训练。像谷歌这样的大公司经常使用联合学习;通过从用户与移动设备的交互中收集数据来训练模型。
作者使用 Canva
联邦学习算法的使用生成了更智能的模型,具有低延迟和低功耗,同时确保了隐私。此外,增强模型(基于特定用户交互构建的模型)可以立即在该用户的设备上使用。因此,这种方法不仅更有效,而且可以根据每个用户自己的体验偏好进行定制。
迁移学习
迁移学习(TL)是一种机器学习技术,其中模型将先前相关数据的知识转移到新目标任务的学习中。使用这种学习方法的目标是让机器学习像人类学习一样高效。迁移学习可以通过三种方式改善机器学习过程。
- 使用从先前知识转移的数据在目标数据上使用的模型的初始性能将比如果模型根本没有被训练好得多。
- 因为 TL 使用来自先前任务的结果数据,所以为目标任务充分训练模型所需的时间显著减少。
- 通过将转移的数据应用于不熟悉的任务而建立的连接和关系使得模型的结果对于旧的和目标任务都更好。
作者使用 Canva
迁移学习算法包括扩展众所周知的分类和推理算法,如神经网络、贝叶斯网络和马尔可夫逻辑网络,以提高效率和适应性。它还可以通过扩展 Q 学习和策略搜索等算法用于强化学习。
主动学习
在主动学习中,通过允许算法选择它想要学习的数据集,鼓励算法“好奇”。研究人员认为,通过让模型选择自己的训练数据,它将学习得更快,从而表现得更好。
作者使用 Canva
主动学习模型试图通过请求由“甲骨文”(人类注释者)标记的未标记实例形式的“查询”来克服标记瓶颈。通过这种方式,主动学习模型旨在使用尽可能少的标记实例来获得高精度。在许多现代机器学习问题中,主动学习是很有动机的,在这些问题中,数据也是足够的,但是标签很难获得或者很昂贵。
主动学习模型有多种方式形成和标记查询;三种最常见的是:
- 不确定性采样: 这是最直接最常用的查询形成方法。在这种方法中,主动学习模型查询最不确定如何标记的实例。对于概率学习模型来说,这种方法通常很简单。
- 按委员会查询: 这种方法是一种理论上有动机的、查询选择的方法。这种方法包括创建和维护一个模型委员会,这些模型都是在相同的标签集上训练的,但是代表不同的输出。然后允许每个模型对查询的标签进行投票。最具信息性的模型投票通常用于决定查询标签。
- 预期模型变化: 使用这种方法,模型优先考虑最有可能对模型产生最显著影响的实例,而不管其标签。研究人员已经证明,这种方法在大多数情况下都很有效;然而,如果特征空间和标注集都很大,那么计算代价可能会很高。
集成学习
集成学习将“基础学习模型”多次应用于不同的数据集,然后分析不同的结果假设。这可以使用两种方法之一来完成:
- 独立于其他假设构建每一个假设,这样每一个假设都会有不同的低误差结果。这是通过使用略有不同的训练数据多次运行模型来完成的。我们可以通过操纵输入特征或在训练数据中添加一些随机性来保证独立性。则未加权的投票决定数据的最终分类。
- 与独立方法不同,实现集成学习的另一种方法是使用加法。在这种方法中,原始模型被耦合在一起,然后集合的加权和确定数据的分类。
这六种学习技术并不是我们应用机器学习算法的唯一方法。由于该领域相当活跃,最近的发展总是由研究人员提出。尽管如此,所有的提议都是为了同一个目标,那就是快速、高效、低误差或无误差的算法。
参考
[1]吴博士和孟德尔博士(2019 年)。补丁学习。 IEEE 模糊系统汇刊。
[2]丰滕拉-罗梅罗,第三版。、吉哈罗-贝迪尼亚斯、马丁内斯-减压阀、佩雷斯-桑切斯和彼得罗-巴拉勒(2013 年)。在线机器学习。计算智能的效率和可扩展性方法。
[3] McMahan,H. B .和 Ramage,D .联合学习:没有集中训练数据的协作机器学习,2017 年 4 月。
[4] Torrey,l .,& Shavlik,J. (2010 年)。迁移学习。在机器学习应用和趋势研究手册:算法、方法和技术。
[5] Settles,B. (2009)。主动学习文献调查。威斯康星大学麦迪逊分校计算机科学系。
[6]迪特里希,T. G. (2002 年)。集成学习。大脑理论和神经网络手册, 2 ,110–125。
地理空间数据科学的六个 Python 技巧
如何使用 Geopandas 在 Python 中轻松有效地整合空间要素
在这一轮关于 Python 的地理空间技巧中,我通过六个关键方面来使用 Geopandas 有效地处理和制作 Python 中的漂亮地图。
如果您想访问地理空间数据处理的最新提示和技巧,可以访问:
第 1 部分:如何使用 Geopandas 在 Python 中轻松有效地集成空间要素。
towardsdatascience.com](/5-geospatial-tips-and-tricks-in-python-eef86aec5110) [## Python 中的 7 个地理空间数据处理技巧
第 2 部分:如何使用 Geopandas 在 Python 中轻松有效地集成空间要素。
towardsdatascience.com](/7-geospatial-data-processing-tips-in-python-dac5e4d28439)
以下是我们在本文中包含的技巧列表。
提示 1 —图例位置
传说是地图制作的重要组成部分。使用 GIS 软件,您可以拖放图例的位置以适应您的整体设计并避开障碍物。在 Geopadnas 中,您可以更改图例的位置。
默认情况下,图例显示在地图的右上角。在本例中,我们使用legend_kwd
和loc
参数将图例的位置更改到左上方。
图例位置-作者的图像。
下面是用上面的代码生成的地图。如您所见,图例位置现在位于地图的左上角。
左上角带有图例的大陆地图-图片由作者提供。
提示 2-简单的地理编码
地理编码是将物理地址描述转换为地球表面位置(以数字坐标表示的空间)的计算过程— 维基百科。
在 Python 中使用 OpenStreetMap 免费进行地理编码很容易。在本例中,我们将对三个地址进行地理编码。首先,我们创建一个包含三个地址的数据帧。一旦我们有了数据帧,我们就可以在数据帧上快速调用. tools.geocode 方法。
一旦我们进行地理编码,我们就会得到一个额外的列,即几何列,它帮助我们执行地理功能,如缓冲、计算距离和最近点等。
提示 3-空间连接
作为基本的地理空间功能之一,空间连接几乎占了所有地理空间处理的一半。我们可以使用 Geopandas 通过位置快速连接空间数据。在本例中,我们使用 SQL 语法和 Geopandas read_file
方法从 PostgreSQL 中读取数据。
一旦我们读取了数据,就很容易通过位置来连接数据。在上面代码的最后一行,我们使用 Geopandas 的sjoin
sjoin 方法将列表点连接到静态区域多边形。我们以两个数据集的连接结束,表明每个点属于哪一个。
我们可以使用 Pandas 的 group by 和 aggregation 函数进一步处理数据,以获得统计数据。在本例中,我将对每个多边形或统计区域中的列表进行聚合和计数。
空间连接数据的聚合函数-图片由作者提供。
最终的数据框仅包含统计代码和每个多边形中 Airbnb 房源的数量。这是一张地图,显示了每个地区的列表数量。
Airbnb 房源 Choropleth 地图——作者图片
提示#4 —行过滤器
就像 pandas 数据帧一样,Geopandas 允许您限制或过滤出想要读取的行数。当您有一个大的数据集,并且您只想试验数据集的某一部分时,行筛选器非常有用。
按行过滤数据-按作者过滤图像。
我们可以通过传递 rows 参数来实现这一点。在上述代码的第一个实例中,我们将获得从零到一千的行。然而,通过切片,我们可以得到起始和结束数字之间的任意范围的行。
技巧 5——夹子
我们很少获得具有适当界限的正确数据。有时,我们需要将数据裁剪到我们感兴趣的边界。使用 Geopandas 裁剪地理空间数据就像调用。裁剪方法并提供两个地理数据框架。在本例中,我们将把街道裁剪为预定义的边界多边形。
在 Geopandas 中裁剪。—图片由作者提供。
现在,让我们比较这两个数据集。下图显示了裁剪后的数据与原始边界和街道数据集的对比。
裁剪数据集-作者提供的图像。
提示#6 —单独的图例
在第一篇技巧文章中,我们从图例位置开始,最后以图例方向结束。默认情况下,我们有一个垂直方向的图例。但是,出于任何原因,如果您希望有水平图例,您也可以使用 legend_kwds 和方向参数。让我们看一个水平图例方向的例子。
横向图例—作者图片。
输出是带有水平图例的地图。水平图例可以是美观的,并且可以帮助读者比垂直默认图例更好地阅读图例数字。
横向图例图—图片由作者提供。
结论
我希望您喜欢这一轮 Python 中的地理空间数据技巧。在本文中,我们看到了有效使用 Geopandas 进行地理空间数据分析的六个技巧。
其中一些技巧是直接的几何操作,对于处理地理空间数据至关重要:空间连接、裁剪和地理编码。其他三个提示与地图制作和图例样式有关。
如果你喜欢我在 Twitter 上发布的这些提示和技巧,你可以在 @spatialML 找到它们
六个现实世界中的数据陷阱——以及如何应对它们
照片由查理/SANY0012 (CC-SA 2.0)拍摄
你找到你的数据,加载它,建立它的模型——然后扔掉垃圾。就像他们说的,一定是垃圾。当然,您确保有一个很好的矩形文件,具有一致命名的列,并且您删除了人们在 Excel 文档中输入的随机注释。那么是什么原因呢?
这里有六种常见的、现实世界中的数据违规现象,你迟早都要面对。
1.行数比预期的多
我们希望每行有一条记录。在 95%的文件中,这就是你所拥有的。但是突然一个 join 给出了警告,你意识到还有多余的。为什么?可能是因为某人的查询构建得很差,或者您认为行是一回事,但它实际上是完全不同的东西。
案例研究:
我以为在住院医师资格表中,每个大学生占一行。事实上,每种状态占一行:一小部分学生在他们的大学生涯中有多种状态。这没有记录,当然,在这些状态上也没有标识符或时间戳。
策略:每当你加载数据时,聚集你认为唯一的行标识符,一边走一边计数,看看是否有任何行是> 1。然后你必须决定省略一些或者把它们合并在一起——或者改变你的分析,使之更复杂,以便两者都用。
2.随着时间的推移改变约定
在数据没有严格控制的情况下——也就是手动输入,没有什么指导原则——你可以在不同的时间或由不同的人使用不同的约定。缩写会改变。使用新的代码系统。日期格式改变。很烦。
有时,这些转变甚至有一个很好的理由,比如程序上的改变,或者意识到需要一个新的类别。当然,仍然应该有人清理旧的价值观——但是你对他们没有这样做感到惊讶吗?
案例研究:
我在分析接受高、中、低金额资助的人。当前的数据输入约定对每种类型使用三个字母的缩写,但是回顾四年前,我发现使用的是全名——大写和拼写差异很大;显然根本没有标准化。负责此事的员工后来都换了部门,你对此感到惊讶吗?
案例研究 2:
我过去分析国会数据,尤其是对候选人的捐款。然而,将投票记录或条款与捐款匹配起来并不容易,因为没有一致的 id 给国会成员,我不得不依靠他们的名字。不同的来源包括中间名和头衔,比如 Jr。最糟糕的是,数量惊人的政客有一个昵称——这就是国会官方网站上列出的!
策略:总是总结你的分类变量,即使只是得到所有唯一的值和它们的频率,并看着它们被排序。然后你可以合并等价的。对于姓名和其他字符串数据,如果有相当多但数量有限的情况,应该尽可能地进行抽查,最好使用正则表达式来分离出可以更可靠地匹配的字符串片段,比如全大写的姓氏。
3.不同的缺失值代码
我们都知道缺失值,以及如何处理它们,对吗?更讨厌的是多种表观缺失出现在同一个场的时候。它们应该被保留、抛弃还是合并?当然,这要看情况。
案例研究:
在人口统计数据中,我检查了性别一栏(被误标为“性别”),这一栏表面上只包含男性或女性的值。有正常的缺失数据,给定为零…但也有空白值,有些“未提供”,最糟糕的是“999”对于不同的集合或编码协议,这些都意味着相同的东西吗,或者在每种情况下意味着不同的东西吗?一些真的意味着,例如“不适用”而不是“不可用?”我们是猜测,还是能发现?
策略:如上,检查你的范畴值,以及你的数字范围。任何超出预期范围的都应该检查出来。
我见过-1、0 和 9 的字符串被用作需要重新编码的特殊代码(可能在不同的列中)。我见过在同一个文件中使用的各种丢失的字符串,它们都意味着丢失,因为协议不同,包括空格、NA、NIL、*。,-,还有很多。
要处理这些情况,首先您只需了解用于获取和记录数据的协议。这可能需要(恐怖!)与一个活生生的人交谈——他现在在另一个部门工作,目前正在度假——因为,当然,它从未在任何地方被记录下来。
4.无意义的时间线
如果您有日期或时间列,请检查它们是否有意义。通常情况下,其中一些不会,因为一个事件应该总是先于另一个事件。
案例研究:
我下载了课程注册的数据,并将它们加入到学生详细信息表中,比如专业。我感兴趣的是,根据一个学生获得学位需要多少个学期,课程量会有什么变化。看资料发现,学生在被录取前都在上课!
问题的根源:录取日期只是最近的学位,一些学生被多次录取,例如,一个硕士项目或做学士后工作。我(从一个中心办公室)获得的数据摘录隐藏了这个细节,会导致一些非常错误的结论。
策略:核对所有日期。找出任何违反假定关系或超出预期范围的情况。通常,一些额外的数据被隐藏在某个地方,如在我的例子中,或者与日期相关联的事件没有我们期望的确切定义——是当用户点击按钮结账时记录的“购买”时间戳,还是当他们的卡运行时记录的时间戳等等。通常只是垃圾数据,日期转换不正确(众所周知,在一些平台上很难处理)或输入格式错误:“10/12”是指 12 月 10 日还是 10 月 12 日?每个人都收到备忘录了吗?
5.键入错误的数字
当你手工输入一些数据时,不可避免地会输错一些。常见的错误是重复的数字——尤其是在一串零、丢失的数字和换位中。
案例研究:
我当时在协助一个大型调查,收集某个部门员工的工资。大约 30%的受访者使用网络界面手工输入数据,而不是上传电子表格。(一些电子表格可能也是手工输入的。)
我们进行了标准的异常值检查,以寻找数量级过大或过小的值。通常问题是输错了零:120,000 会被输入为 12,000 或 1,200,000。(web 字段中没有显示逗号,这可能会有所帮助。)
但是我在详细检查记录时注意到了其他错误的值(另一个原因):数字被调换了,例如 57000 换成了 75000。这比一个数量级的变化要小得多,并且会被我们的常规检查所忽略。这些误差到底有多大?我在 R 中运行了一些模拟,发现如果发生在前两位,换位通常会导致数字过大或过小三倍。通过与期望值进行更具体的比较,这也是可以通过编程进行检查的事情(对极端情况进行相当多的手动审查)。
策略:当然是做标准的异常值检查;但是这首先需要知道什么是正常的——或者合理的。我在以前的工作场所发现的另一个问题是,我们的异常值检查将值与平均值进行比较——这本身就非常容易受到异常值的影响。运行更多的模拟,我发现一个大的异常值(由重复的零产生)极有可能夸大均值/标准差,以至于*看起来不再像一个异常值。*我们需要转向不太敏感的指标,比如中位数和 MAD。当然,历史和领域知识也影响了我们的预期。
6.神秘失踪的数据
让带有“NA”的单元格告诉您数据丢失是一回事;对于行来说,神秘地不导出是另一回事。我们必须记住的一件事是我们的数据系统的局限性,尤其是在寻找旧数据的时候。
案例研究:
我使用一个庞大而笨拙的报告系统为一项纵向研究寻找数据。各种预构建的查询允许我指定所需群组的年份或季度。我照做了,并下载了 CSV。
分析进行到一半时,我意识到随着时间的推移,数据越来越少。结果是,不管指定的日期是什么,报告中只包括了当前活跃的用户。是的,这是非法的。我必须找到数据的替代来源(不容易)。
策略:和目前为止的每一项一样,汇总你的变量,包括日期,然后看看你有多少个案例。这种变化方式很奇怪吗?另外,随机或从有代表性的班级中抽出几个人,通过数据追踪他们。他们出现在应该出现的地方,而不是不应该出现的地方吗?
结论
从这六个项目和案例研究中可以得出两大主题。一个在你的控制之下,一个不在:
检查你的数据。在它上面聚集。列出你对它们的假设,并明确检查它们是否成立——这包括非常基本的、看起来愚蠢的假设,因为其中一些不可避免地会被违反。
糟糕的文档是你的敌人。缺少元数据的导出。记录不良或根本没有记录的查询。只存在于某人头脑中的定义——而且他们正在休假。我们知识中的这些漏洞隐藏着重大和微妙的问题;尤其是当它们与我们自己的常识、假设和专业判断相抵触时——因为其他人有不同的想法,或者根本不思考。你能做的最好的事就是意识到你所不知道的,提防麻烦。
六个适马工程师使用 R 进行数据分析的必备工具
r 代表工业工程师
探索“六西格玛”R 包
在 Unsplash 可用的谷仓图像
数据分析图表
图表的开发是 DMAIC(定义、测量、分析、改进、控制)周期每个阶段的六个适马项目的重要组成部分。他们的主要目标是通过描述性分析支持数据的解释。虽然二维图表可以用作更复杂表示的基础,但多维数据可以通过这些图表的扩展来显示。
数据的图形表示有助于更好地理解给定的过程。在分析的早期阶段,当工程师需要进行推测、找出关系和计划进一步的研究时,它们是很有帮助的。因此,选择适当类型的图表是有效交流进展和建议的关键任务;糟糕的图表可能会毁掉项目期间完成的重要的好工作。
在本文中,我们将通过一个简单的案例研究来解释和说明六个适马项目中一些最重要的数据分析图表。有关在六个适马和质量保证项目中使用的附加工具的更多信息,请参考 7 质量基本工具。
条形图
条形图是最简单的图表类型。每个条形代表一个正在测量研究变量的因子。条形的高度代表给定数量或度量(如缺陷、项目、产品)的频率。条形图是计数的最佳图形表示。
对于这个例子和下面的例子, ss.data.pc 数据集(一个用于打印机墨盒例子的数据集,随 SixSigma 包提供)将用于生成一个特定的图表。
我们来看看 R 代码生成柱状图!
运行图表
运行图是二维图表,其中 x 轴代表时间线,而在 y 轴上绘制了被监控的变量。通常在运行图中画一条中线,它可以代表目标值、数据平均值或任何其他值。
当在 x 轴上有时间刻度时,这些图表也被称为时序图。运行图对于检测可以指示过程中的变化(即可变性)的模式是有用的。周期、趋势或转变的发现应触发过程评审,以采取进一步的措施来提高质量。
我们来看看 R 代码生成运行图!
分层图表
当每次运行有一个以上的观察值时,使用分层图。它们有助于在单个图表中同时显示短期变化和长期变化。短期变化由每个亚组内的变化表示,而长期变化由所有组之间的变化表示。
要创建分层图,在从较高值到较低值的每个游程的位置绘制垂直线。然后,将单个值绘制成点或水平线段。
让我们来看看生成层图的 R 代码!
盒须图
也称为盒图,盒须图用于以图形方式总结连续变量的分布。方框的两边是第一和第三个四分位数(分别是第 25 和第 75 个百分位数)。50%的数据位于盒子内部。穿过方框的线对应于中间值,极端晶须值可以是数据的最大值和最小值,或者是数据被认为是异常值的其他界限。极限值通常取为:
其中 Q 1 和 Q 3 分别是第一和第三个四分位,IQR 是四分位区间( Q 3 — Q 1)。
箱线图有助于直观显示分布是否居中或有偏差(即相对于其余数据的中间值的位置),是否存在异常值(即触须之外的点),或者数据是否接近中心值(即小触须或盒子)。此图表在比较各组和检查它们之间是否有差异时非常有用。
让我们来看看生成盒须图的 R 代码!
团体图表
分组图主要用于图形化显示多个点所属的分组。在六适马环境中,当测量的特性由不同的过程流产生或在不同的位置测量时,它们很有用。每组的最大值和最小值通常由线连接。
我们来看看 R 代码生成组图!
多元图表
多元图表主要用于以图形方式识别影响特定结果的因素(即质量关键(CTQ)特征)。一旦确定了这些因素,就可以提出并执行变更,以实现期望的目标。
对于以下示例,将使用扩展版本的 ss.data.pc.big 数据集来生成多元图表。数据集包含 72 个观察值,对应于 4 个不同因素的所有可能组合:颜色(2)、操作者(3)、填充剂(3)和批次(4)。我们来看看 R 代码生成多元图表!
总结想法
过程改进、质量保证和六西格玛工程师必须能够使用贯穿本文的概念来构建最合适的图表来表示数据。同样,发展和强化图形分析技能将带来更好的解释(即更容易识别周期、变化或趋势),这将有助于制定更有效的行动计划,以提高业务交付成果的质量。
正确选择图表将简化结果交流和对所传达信息的理解。本文并不打算说服读者在开发这些图表时严格使用 R for,而是介绍如何用几行代码在免费的开源软件中开发这些图表。
—
如果你觉得这篇文章有用,欢迎在 GitHub 上下载我的个人代码。你也可以直接在 rsalaza4@binghamton.edu 给我发邮件,在LinkedIn上找到我。有兴趣了解工程领域的数据分析、数据科学和机器学习应用的更多信息吗?通过访问我的媒体 简介 来探索我以前的文章。感谢阅读。
——罗伯特