TowardsDataScience 博客中文翻译 2021(七百二十三)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

关系数据库中的虚拟图

原文:https://towardsdatascience.com/virtual-graphs-in-a-relational-database-5813622a688?source=collection_archive---------30-----------------------

超图/关系数据库绝对有优势

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

同一型号的三视图。实体关系、图和对象-角色建模。图片作者。

我正在研究专用图形数据库如何处理关系/边上的唯一性约束,我的发现让我很惊讶…

假设我们有一个专用的图形数据库,其中有节点和节点,并且有一个模式,其中 人驾驶车 是一种关系类型。
在模式的图形数据库中,如何将人员节点限制为“驾驶”一辆汽车节点?

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

图表模式。图片作者。

我的研究表明,在一些专用的图形数据库中,当数据库执行约束时,你纯粹是运气不好。在创建新的关系之前,您必须以编程方式检查您选择的 Person 节点和 Car 节点之间是否存在关系……数据库不会自动检查关系类型的基数。

然后我发现了一个例子,有人试图用一个专用的图形数据库做一些事情,我认为这是非常了不起的。对我来说,这是一个试图把一个方钉装进一个圆孔的例子,超图/关系数据库肯定比一个专用的图形数据库有优势。让我们看看…

想象以下图表模式:

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

属性图架构。图片作者。

该模式用于有健康问题的人在医生诊所的预约。

发布问题的论坛上的人试图确定他们是否应该有用于查询目的的日期和时间的节点,并最终被推荐了一个复杂的模式映射关系(Person)-[ON _ Date]->(Date)->[AT _ Time]->(Time)->[TREATMENT _ FOR]->(Condition),并想知道他们将如何管理这样一个模式中各个节点之间的关系基数。尽管专用图形数据库中的(时间)->[治疗条件]->(条件)关系的益处值得怀疑。

再一次,当涉及到管理关系的唯一性时,共识是…这取决于数据库 用户 而不是专用的图形数据库。基本上这是一个令人费解的组合混乱,有更好的方法来处理管理关系基数的场景。

当您使用超图/关系数据库和对象-角色建模时,所有可能的图在一个模式下都是可能的

让我们用对象角色建模来重新审视这个问题:

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

对象-角色模型。图片作者。

人、日期、时间和条件之间的关系在约会中是唯一的,约会关系是多对多对多的关系。例如,一个人可能在许多日期和时间有关于条件的约会,但是每个约会都是唯一的。我们已经通过在多个/组合关系上具有唯一性约束解决了关系基数的管理。为了使生活变得更容易…让我们看一下与关系数据库的实体关系图相同的模式:

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

实体关系图。图片作者。

与我们的对象-角色模型类似,关系模型通过设计来管理关系的基数,其中约会的主键(标记为#)覆盖了 Person_Id、Date、Time 和 Condition_Name 之间关系的唯一性。

在我们的对象-角色模型中,对象类型,人、日期、时间和条件在约会事实类型下连接在一起,如 人在日期时间对条件 进行了咨询。

这种关系的表述被称为对象-角色建模(ORM)中的事实类型读取,ORM 的美妙之处在于可以创建与事实类型关联的对象类型集合的任何组合表现:

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

同一事实类型的各种事实类型读数。图片作者。

基本上,这导致,如果你有一个图形查询语言在你的超图/关系数据库上使用对象-角色建模主干,那么你可以把任何或所有的人、日期、时间和条件当作图形数据库中的节点。例如,您可以将图形查询表述为*:

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

FactEngine 中的图形查询。图片作者。

  • FactEngine 查询语言。有许多图形查询语言。

或者

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

FactEngine 中的图形查询。图片作者。

也就是说, 图查询 中的节点决定可能与 属性图模式 不同,当查询您的数据库时,这些有效节点有时由超图(其中对象角色建模被视为超图概念建模语言)处理更好,如果您有超图模式…默认情况下您有其相应的图模式。为什么?因为超图比属性图更具表达性,并且封装了所有信息来派生您的图模式。

同样,专用的图形数据库可能并不总是能够以您想要的方式被查询,在使用正确的工具时,数据库的超图处理为您提供了各种各样的查询选项。

考虑以下查询:

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

FactEngine 中的图形查询。图片作者。

该查询使用部分现存事实类型 Reading(Person Date at Time……)然后使用Person has AppointmentandAppointment for ConditionLink 事实类型进行非常自然的读取图形查询。Person(_Id),Date 和 Time 在我们的关系视图中是属性,但在查询时成为一个超图中的节点,解决了既有图查询又同时有关系基数约束的问题。

也就是说,关系数据库具有优势,因为它们用唯一索引管理关系基数,而用户不必编写额外的代码来检查关系基数约束是否被破坏。使用正确的工具,您可以在关系数据库上编写图形查询。

在本文中,我们介绍了:

  1. 您不一定需要专用图形数据库中的节点来使用这些概念节点对数据库进行图形查询。
  2. 对象角色建模中的对象类型可以被认为是超图数据库中的节点,而不管它们是相应属性图模式中的节点还是属性;和
  3. 关系数据库中的单个实体可能实际上是节点及其在相应超图模式中的关系的集合,用于查询目的,管理复杂的关系基数约束,以及关系数据库最擅长的……索引关系。

Hypergraph 数据库查询引擎正在开始改变数据库的面貌,而 FactEngine 只是一种新型的查询引擎。事实上,FactEngine 体系结构及其查询语言是数据库不可知的,因此没有提升任何特定的数据库,但第一个版本是基于关系数据库的,并将图形查询转换为结构化查询语言(SQL)。目的是通过比较编写 SQL 或使用标准图形查询语言,使查询数据库变得非常容易。你可以在这里阅读更多关于 FactEngine 架构的信息。

感谢您的阅读。我希望这有助于决定为您的下一个项目选择哪种类型的数据库,以及哪种查询语言会使工作更容易。如果时间允许,我会写更多关于图形/超图数据库、关系数据库和对象角色建模的文章。

— — — — —结束— — — —

数据科学家的虚拟演示技巧

原文:https://towardsdatascience.com/virtual-presentation-tips-for-data-scientists-d6ef4659024?source=collection_archive---------21-----------------------

如何有效地沟通你的工作

沟通是数据科学工作中最具挑战性的方面之一。以下是我的笔记…

互联网的想法

有一个古老的基于研究的格言,93%的交流是非语言的。你的交流 55%是肢体语言,38%是语气,7%是口语。

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

图 1:沟通障碍。图片作者。

视频通话中的肢体语言交流会发生什么?它通常会消失。

你应该试着弥补那 55%的损失,更加注重语气和话语。

一些有用的弥补肢体语言差距的技巧包括夸大声音的变化和改变音量。增加你的面部表情和手势也可以提高你的演讲的接受度。这可能看起来不自然,但是如果你记录下你的演讲并重新观看,你会惊讶于这些变化是多么的正常和有魅力。

另一个有趣的想法是内容、设计和交付框架— src

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

图 2:内容、设计、交付框架。图片作者。

后面两个,设计和交付,分别指的是极简的幻灯片设计和复杂主题的简单措辞。然而,内容部分真的很有趣。

简而言之,这篇文章假设你的听众只会从你的演讲中拿走一句话,所以要让它有价值。要做到这一点,你需要了解他们的技术水平、期望,以及项目的先验知识。如果你为你的听众量身定做你的演讲,你可以让那一句话有价值。

一个非常简单的技巧是整合组织中其他团队的视觉效果。例如,展示一段支持你观点的 UX 研究视频。通过利用以前的工作,您可以节省时间,创建引人注目的演示文稿,并在公司内部建立关系。

我的想法

尽管这些想法很棒,但互联网上的绝大多数信息都是常识。在这一部分,我们将重点关注不太明显的策略。让我们开始吧…

1——了解你的听众的想法

对于超过 10 人的会议,假设其中一人不想参加是安全的。他们和你一样,都是生活忙碌的人。

所以,试着去理解是什么让你的观众兴奋。兴奋是完成事情的动力。它让你的工作可见,从而有影响力。

虽然组织之间的角色差异很大,但大多数数据科学家都有一定的自由来选择和开发自己的项目。如果你的工作成功涉及利益相关者的认同,你必须让他们对项目感到兴奋。句号。

不幸的是,这样做没有明确的捷径,但这里有一些对我有用的方法:

  • 尽早、经常地将想法社会化。通过在整个项目过程中获得队友和利益相关者的反馈,你建立了兴奋感并产生了更有价值的最终项目。相信我,努力是值得的。
  • **了解你老板的老板关心什么。**知道什么会让上层管理兴奋,就知道什么会让下层管理兴奋。安排一次快速的一对一谈话,问一些好的问题。

通过将你的工作与令人兴奋的想法联系起来,你可以极大地增加你的演示的价值。

2 —提前结束会议

不必要的信息有害。你会认为展示你的步骤和假设会对你的听众有益。大多数情况下不是。

通过包含他们理解不必要的信息,你…

  • 增加 认知紧张 **。**这会缩短注意力持续时间,降低信任感,并经常导致你在演示过程中一心多用。
  • 下意识地偏向你的听众。每个人都有一种确认偏见,这种偏见会影响他们确认自己的信念。如果你给听众额外的信息,他们更有可能抓住有吸引力的想法而错过关键的结论。
  • 浪费时间和金钱。时间就是金钱。试试这个练习——把电话中每个人的时薪加起来。呈现不必要的信息代价很高。

一个简单而有效的方法是尝试提前结束会议。我的一个队友已经受到利益相关者和数据科学家的喜爱,因为他总是提前结束会议。这个规则显然有例外,但这些例外比你想象的要少得多。

如果你的目标是早点结束会议,你会被迫变得有条理、简洁和相关。

3 —大约 80/20 的小费

以上两个部分可能是劳动密集型的,所以这里有一些简单的提示,有希望让你在 20%的时间里得到 80%的结果。

  • 向你的沟通风格靠拢。如果你是一个正式的演讲者,就要正式地讲话。如果你讲笑话,就讲笑话。通过利用你自然说话的方式,你会变得更自信、更有亲和力,从而更有效率。
  • **以结论开始和结束。**以结论开始演讲,可以减轻认知负荷,让听众更深入地思考你的想法。通过在结尾重申结论,你促进了的心理分块,这促进了回忆并帮助他们利用新信息。
  • 少说“嗯”和“喜欢”。悲伤地重复说这些话会让你听起来更笨。抱歉。这是一个制作很差但免费的“um/like”探测器的一些基本代码。
  • 对于技术概念,就像黑匣子一样对待。大多数听众并不关心这个方法是如何工作的。他们关心它的作用。所以你要做的就是解释输入和输出。

感谢阅读!上面链接的所有资源对我和我的职业生涯都非常有影响。请分享你自己的。

VirtualDataLab:一个用于测量合成序列数据集质量的 Python 库

原文:https://towardsdatascience.com/virtualdatalab-a-python-library-for-measuring-the-quality-of-your-synthetic-sequential-dataset-b9d79f0e03c3?source=collection_archive---------34-----------------------

包括内置的开源数据集、合成数据生成器接口和准确性/隐私指标

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

美国传统巧克力Unsplash 上拍摄的照片

Gartner 估计,到 2022 年,40%的 AI/ML 模型将在合成数据上进行训练。[1]

事实上,合成数据越来越受欢迎——我在一家合成数据公司工作,每天都看到这种情况。如果你觉得是时候学习一些合成数据技能了,请继续读下去。我将告诉您一些基本知识,并向您介绍一个很酷的开源工具,您会发现它非常方便。开始吧!

所以,最基本的。用合成数据生成器创建合成数据。合成数据生成器或合成器获取其所谓的输入或目标数据,并返回包含与输入或目标数据相同的模式和统计关系的输出或合成数据。

合成数据生成器的范围从琐碎到复杂。一个简单的例子是返回目标数据的混合样本。这非常准确,但侵犯了隐私,因为它是目标数据的直接拷贝。深度神经网络就是一个复杂的例子。在这种情况下,我们牺牲一些准确性来保护隐私。

随着研究机构不断开发新算法,制作合成数据比以往任何时候都更容易,但我们如何决定哪个生成器是最好的*?*

选择合成数据生成器的最佳实践

衡量质量的典型方法包括查看汇总统计数据或在下游机器学习任务中使用合成数据。不幸的是,这些方法仅测量合成数据反映目标数据的程度。但是,在合成数据复制大部分原始数据的情况下,精确度太高也会带来严重的后果。合成数据的一个关键好处是保护原始数据中所有个人的隐私。因此,我们希望将生成器保护隐私的能力纳入我们的质量测量中。

在创建合成数据方面不缺乏工具或操作指南,但在如何准确衡量合成数据的效用/隐私方面却很少。一个这样的资源是SD gym——从麻省理工学院的数据到人工智能实验室。然而,我们发现我们想要比图书馆提供的更多的功能,所以我们创建了虚拟数据实验室。

介绍虚拟数据实验室
VDL 是一个 python 框架,用于在准确性和隐私性方面对顺序合成数据生成器进行基准测试。

我们希望它:

  • 与熊猫一起工作(Python 的数据帧库)
  • 使用任何可能的目标数据源进行生成
  • 提供一个通用界面来添加新的合成器
  • 创建填充了随机生成的数值类型和分类类型的虚拟数据
  • 使用顺序数据
  • 拥有直观的隐私指标
  • 提供一组真实世界的数据集进行基准测试

我在的团队主要是 AI 经常使用虚拟数据实验室来快速评估对我们合成数据生成器的修改。它使我们能够进行标准化的测试分析,从而节省了我们制作一次性报告的大量时间。按照这些思路,虚拟数据实验室的一个用例可以是为下游机器学习任务测试各种合成数据生成器。不用部署几个昂贵的用几个不同的合成数据集来训练机器学习模型,VDL 可以用作选择最接近原始数据集而不是太接近的数据集的代理。

里面有什么?

在当前版本中,包括三种不同的合成器。三个合成器中有两个是普通的,旨在作为指标的基线。一个合成器是在 PyTorch 中实现的简单可变自动编码器。你可以按照这些指令编写自己的合成器。

接下来,我们继续讨论准确性和隐私指标。要更深入了解,请查看 readme.md

精确度是通过计算各列之间经验分布的差异来衡量的。我们用最大误差或 L1 距离/总和(L1D)来总结误差。最大误差告诉我们在数据集上看到的最大误差是什么,而 L1D 提供了我们看到的误差的总体分数。观察经验分布让我们对合成数据从目标数据中捕捉统计趋势的能力充满信心。NIST 在他们的综合数据挑战赛中也使用了分布测量。

隐私是通过将目标数据分为参考集和维持集来衡量的。

从与维持集大小相同的合成数据中获取样本而不进行替换。使用两个基于最近邻的计算,将两个维持集与参考集进行比较。

到最近记录的距离(DCR)测量维持集中的点和参考集中的点之间的距离。坏的合成数据是当原始目标数据被噪声干扰时。DCR 就是要捕捉这样的场景。

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

可视化的 NNDR:作者的图像

最近邻距离比(NNDR)测量维持点的第一个邻居和第二个邻居之间的距离。点的 NNDR 范围可以从 0 到 1。接近 1 的值意味着该点可能位于聚类中。接近 0 的值意味着该点可能接近异常值。我们计算目标和维持集之间的每个点对的 NNDR,以获得 NNDR 分布。理想情况下,我们希望合成的 NNDR 分布与目标 NNDR 分布相匹配。通过测试其中的差异,我们可以确保合成数据不会比我们基于维持的预期更接近训练点。

这两个隐私指标旨在为数据集提供隐私保证。我们可以将这两个指标与差分隐私进行比较,差分隐私是一种流行的关于隐私损失量的数学限制。在算法的设计中必须建立不同的私有机制。然而,并不是所有的合成数据生成器都需要有差分隐私来生成高质量的私有数据。通过使用这两个度量,我们获得了在公平竞争环境下比较差分专用合成数据生成器与非差分专用合成数据生成器的能力。

您也不需要编写任何代码来生成合成数据。在 MOSTLY AI,我们发布了我们产品的社区版。合成数据就像将原始数据拖放到浏览器中一样简单。

代码演示

该代码也可以在一个谷歌 Colab 笔记本中找到。

使用 FlatAutoEncoderSynthesizer 生成合成数据

现在你知道了!生成合成数据并将其与原始合成数据进行比较,所有这一切只需不到 5 行代码。

分析结果

解释结果也同样简单。在这里,我们在 VDL 提供的 cdnow 数据集上查看 IdentitySynthesizer 和 FlatAutoEncoderSynthesizer 生成的比较结果。该表是使用 virtualdatalab . benchmark . benchmark 函数创建的。在这个 Google Colab 笔记本中可以找到这个函数在更多合成器+数据集上的例子。

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

汇总表:按作者分类的图像

所有标有 MAX 或 L1D 的列都是误差的量度。高精度对应于这些列中的低值。我们注意到 IdentitySynthesizer 的值接近于 0。这并不奇怪,因为 IdentitySynthesizer 只是返回目标数据的分割。然而,这也正是它未能通过两项隐私测试的原因。相比之下,FlatAutoEncoderSynthesizer 的误差稍大,但通过了两项测试。这是有意义的,因为 FlatAutoEncoderSynthesizer 正在生成全新的数据,但保持与目标数据的统计关系。

您是否使用特定的合成数据生成器技术的标准将基于哪些指标对您最重要。我们建议,如果您正在为隐私进行优化,那么要警惕任何未通过隐私测试的合成数据生成器方法。

自己试试

要开始使用虚拟数据实验室,请使用 repo 或尝试我们的 Google Colab 笔记本电脑!如果你有兴趣参与回购,请联系我!

致谢

这项研究得到了奥地利联邦气候行动、环境、能源、移动性、创新和技术部的“未来信息和通信技术”资助方案的支持。

[1]高德纳。2018.Maverick研究:使用模拟赋予机器想象力。*

机器学习的虚拟化

原文:https://towardsdatascience.com/virtualization-for-machine-learning-da11b7a59070?source=collection_archive---------16-----------------------

理解大数据行业笔记

了解如何托管机器学习(ML)应用程序,例如培训/测试管道、批处理/流预测作业、以业务为中心的分析应用程序等。,是机器学习工程师必备的技能维度。操作化 ML 模型有许多不同的部署可能性。就在几年前,可再现的 ML 环境还是一个需要解决的挑战性问题。在这种情况下,声明式公共云平台上的虚拟化尤为重要。此外,借助虚拟化,可以更轻松地实现快速资源扩展、在云提供商之间过渡部署环境,甚至将应用从内部迁移到云中。本文探讨了用于托管 ML 应用程序的虚拟化技术。注意,我们没有深入讨论,比如实现细节,这将在后续文章中讨论。

虚拟机 (VMs)和容器是在与底层硬件隔离的虚拟化环境中部署应用程序的最常见方式。这两种选择的主要区别在于隔离的程度。根据应用程序的要求,可能需要在使用虚拟机、容器或两者结合之间做出选择。我们将在下一节对这些方法进行概述。如果您熟悉这些概念,您可以跳到概述为 ML 应用程序使用虚拟化技术的部分。

常见的虚拟化技术

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

图 1:常见的虚拟化架构:(a)基于虚拟机和(b)基于容器。作者图。

虚拟机

虚拟机是托管在数据中心的物理服务器中的虚拟化服务。它提供了灵活性,允许团队托管应用程序,而不必担心如何获得或管理物理服务器。图 1(a)展示了虚拟机架构的概况。如图所示,在虚拟机内部运行的所有东西都在客户操作系统(OS)上,独立于主机操作系统,即虚拟机管理程序。为了启动虚拟机,管理程序启动一个进程来管理特定虚拟机的虚拟化进程,并且主机系统将其一些硬件资源分配给虚拟机。它在启动时引导一个专用的内核环境和一大组操作系统进程。这使得 VM 的大小比仅包含应用程序的典型容器大得多。

运行专用内核和操作系统有三个主要优势:

  1. **安全性:**没有办法从主机上知道虚拟机内部正在运行什么。
  2. **可移植性:**可以在每一个主要的操作系统上运行管理程序,也可以在一个虚拟机中运行任何类型的操作系统。
  3. 回滚:在一个给定的实例上创建一个虚拟机快照并在需要时回滚到那个实例是很容易的。这有助于处理数据损坏、安全漏洞和其他问题。

然而,虚拟机技术在托管现代应用程序方面有一个主要限制。由于虚拟机映像可能变得非常庞大,即它们可能具有数十千兆字节的大小,因此在没有很长停机时间的情况下,引导、更新和迁移这样大的映像是很难完成的。

容器

容器是关注完全解耦的应用的虚拟实体,例如,被称为微服务。如图 1(b)所示,容器仅包含必要的库和足以在给定操作系统(例如 Linux)上运行单元应用程序的其他系统依赖项。容器与主机系统中的其他容器共享相同的内核。Docker 是一个众所周知的集装箱化平台,能够广泛采用该技术。

容器技术具有以下优势:

  1. **开始时间:**与虚拟机相比,容器通常只需几秒钟就能启动,而虚拟机完成同样的任务需要几分钟
  2. **效率:**容器通常需要较少的计算资源,即 CPU 时间、RAM 和存储空间。因此,在同一基础设施中可以支持更多的应用程序。
  3. **许可:**用于容器的常用技术和库,如 DockerKubernetes 等。,都是开源的,可以免费使用。因此,采用这些技术没有许可成本。
  4. **重用:**容器是基于映像的,它包含容器运行给定应用程序所需的二进制文件和库。例如,使用 Dockerfiles 很容易构建 docker 映像。此外,可以使用容器注册中心共享和重用这些图像,容器注册中心基本上是托管容器图像的存储库。

然而,容器缺乏应用程序在虚拟环境中获得的更紧密的安全性。此外,容器与 OS 版本紧密耦合,这使得它们的可移植性较差。

Kubernetes 服务

Kubernetes (K8S)是一个通过提供以下功能来管理容器化应用程序的平台:

  1. ****自动化容器打包一组节点(如虚拟机)上的 K8S 可以根据给定的 CPU 和内存要求自动运行容器化任务,以充分利用计算资源。
  2. 故障鲁棒性: K8S 自动重启、替换和终止无响应的容器化任务,停机时间非常短。
  3. 灵活的存储协调: K8S 支持安装过多的存储系统,例如本地存储、网络文件系统、来自云提供商的 blob 存储等。,到集装箱化的任务。
  4. ****受控的部署和回滚:通过定义容器化任务的期望状态,K8S 支持以一种优雅的方式部署,这种方式支持众所周知的部署模式,例如 Canary release
  5. 服务发现和负载平衡: K8S 可以将使用服务名/地址的容器公开给外部服务和集群中部署的其他容器。此外,它将平衡副本集中容器之间的负载。
  6. 秘密和配置管理: K8S 以这样一种方式存储和管理密码、令牌和 SSH 密钥,使得这些敏感信息可以在不重建映像的情况下被动态更改。

使用 Kubernetes 服务虚拟部署 ML 应用程序

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

图 2:使用 Kubernetes 服务和容器部署 ML 应用程序

ML 应用程序

为了简化讨论,我们将 ML 应用程序分为两类:ML 管道应用程序,如图 2 中圆形的彩色方框所示。ML 管道(在图 2 中由浅绿色的方框描述)是用于训练和测试 ML 模型的工作流。ML 应用程序(在图 2 中用绿色、蓝色和橙色的实心方框表示)是使用 ML 模型的分析应用程序。图 2 显示了这样的应用。

为 ML 应用程序使用容器

**ML 管道中的任务可以在容器中编排。该容器将基于包含相关库和二进制文件的映像,如 PythonPySparkscikit-learnpandas 等。此外,负责数据争论、模型训练、模型评估等的应用程序代码。也可以安装在映像中,或者安装在运行时容器可以访问的文件系统中。我们姑且称这个图像为 ML 代码图像。如图 2 所示,深灰色方框代表这样的图像,由 ML 管道使用。

**像 ML 管道的容器一样,ML 应用程序的映像包括安装或挂载在本地文件系统中的库和二进制文件以及应用程序代码。此外,它或者包括在文件系统中本地部署的 ML 模型,或者可通过模型服务系统访问,该系统的访问信息被提供。我们姑且称这个图像为 ML 模型图像。如图 2 所示,浅灰色方框代表 ML 应用程序使用的图像。

图像中使用的库和二进制文件可能(大部分)是通用的。因此,它们都可以基于共同定制的基础图像,或者模型图像基于代码图像。

对于采用越来越多 ML 应用程序的现代组织来说,使用公共云提供商的 ML 平台是很常见的,如 AWS SagemakerAzure ML StudioGoogle Vertex AI 。所有这些系统都严重依赖于容器。

部署 ML 应用程序

想象一下 Kubernetes 服务,其中应用程序部署在虚拟机集群中。公共云公司提供这样的服务( Azure Kubernetes 服务Amazon Elastic Kubernetes 服务Google Kubernetes 引擎),不需要或只需要很少的管理开销。这样的服务将使用某种容器注册中心( Azure 容器注册中心Amazon 弹性容器注册中心Google 容器注册中心)。这些映像的创建和归档可以由持续集成和部署管道( Azure 管道AWS 代码管道谷歌云构建)来支持。查看这个指南,了解如何使用 Azure stack 实现这样一个管道的推荐方法。

图 2 提供了基于 Kubernetes 的 ML 应用程序部署的高级概述。应用程序包括三个领域:一个代表开发模型的团队,另外两个代表使用模型的团队。开发团队的应用程序由绿色方框表示,可以理解的是,涵盖了管道和应用程序类别。另一个团队,用蓝色和橙色框表示,只托管一系列使用该模型的应用程序。为了安全访问,不同团队的容器映像可能包含在不同的存储库中,这些存储库是用于控制对映像的访问的逻辑抽象。此外,一个图像可以被多个应用程序使用,这通过容器注册变得很容易。

这一思路引发了许多深层问题,包括但不限于:

  • 图像创建的实现
  • 对图像的访问管理
  • 映像的持续集成和部署管道的设计和实现
  • 向应用程序展示和回滚图像

笔记

如果你对这些类型的挑战感兴趣,可以考虑从事操作机器学习模型的工程职业,即机器学习工程。如果您不熟悉这些技术,可以考虑在云、虚拟机和容器技术领域进行学习。如果你已经在应对这些挑战,请分享。最后,如果你不同意任何观点,请批评性地评论。

用于股骨骨折分类的视觉转换器

原文:https://towardsdatascience.com/vision-transformers-for-femur-fracture-classification-480d62f87252?source=collection_archive---------15-----------------------

思想和理论

我两年主要博士研究的简要简历

目录

  1. 介绍
  2. 背景
  3. 我们系统的全部管道
  4. 结果
  5. 结论
  6. 参考

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

斯蒂夫·约翰森Unsplash 上拍照

1.介绍

自从我开始攻读博士学位以来,我一直与都灵(意大利)CTO(骨科创伤中心)的骨科团队合作,开发一种能够帮助医生进行骨折诊断的算法。我们选择股骨作为起点,因为它是最常见的骨折,其正确分类强烈影响患者的治疗和预后。我们从卷积神经网络(CNN)开始了我们的旅程,最近,在文献中第一次应用了视觉转换器 (ViT)来克服该主题中的艺术状态,并为专家提供基于深度学习的支持工具。

在这篇短文中,我将总结(尽可能以最简单的方式)并演示我们系统的有效性,这在 arXiv 原始论文中有更详细的描述。

2.背景

2.1 问题

肌肉骨骼疾病,尤其是髋部骨折,是全球范围内导致严重、长期残疾的最常见原因之一。由于人口的逐渐老龄化,脆性骨折的患病率和发病率正在增加,并且在未来将继续增加。

大致了解一下,2010 年,全球每年髋部骨折的估计发病率为270 万患者。这是一个非常庞大的诊断数量。

当然,医生在这方面负有很大的责任,他们每天要评估数十张 x 光照片。由于多种原因,他们很难评估 X 射线图像:

  • x 光可以隐藏骨骼的某些特性
  • 正确分类不同类型的骨折需要长期的经验
  • 医生经常不得不在紧急情况下采取行动,可能会受到时间和疲劳的限制

在这种情况下,在医生的工作流程中实施 CAD(计算机辅助诊断)系统可能会对患者的结果产生直接影响。

这个理念是我们工作的核心! 开发快速、直观、准确的股骨骨折分类系统,完全依靠 2D X 线。

为了建立一个监督分类器,第一个必要的步骤是理解你想要识别的特定类。在标准分类问题中,最终目标通常是训练一个至少和普通人一样好的网络(例如,几乎任何人都可以识别狗和猫)。不幸的是,这通常不适用于医学领域,尤其是骨折,这是非常棘手的评估,并且需要在该领域具有丰富经验的“非一般”人。那么,专家是如何对股骨骨折进行分类的呢?

2.2 AO 分类

其中一个答案是股骨近端的 AO/OTA 分类,这是一个等级,由骨折线的位置和结构决定。

它区分了三种主要的裂缝类型,命名为 ABC 。然后,根据骨折的复杂程度,考虑骨折线的数量以及碎片的位移,将每组分成不同水平的亚组。

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

作者图片

从上图来看,这似乎是一个非常简单的问题。但是我们来看一些真实的样品!

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

作者图片

两年后,我仍然很难用眼睛区分不同的小组。幸运的是,我们实现的网络比我聪明多了。

2.3 分级 CNN

2019 年,当我和我的研究小组开始这项工作时,我对这个话题完全陌生。所以第一件事是进行文献综述,然后我们在这里发表了。从我们的分析来看,我们想要解决的问题显然还没有解决。大多数现有的方法集中在断裂的未断裂的骨头之间的二元分类,不幸的是,这对于医生的诊断具有非常低的影响。只有两个研究小组试图将骨骼分为不同的亚骨折,但结果仍然不是最佳的。

我们尝试的第一种方法,在本论文中解释,提出了一种多阶段方法,将裂缝分为 5 类(当时,我们还没有获得 B 亚组的标签,并且 C 裂缝由于样本数量少而被排除在外,现在仍然如此),遵循 AO 分类的层次结构。原始 X 射线通过一种半自动方法进行裁剪,用于建立一个具有 2878 个样本的数据集,分为 A1A2A3B未中断类。分级方法由三个阶段的级联组成:第一个网络识别未破损破损骨骼,第二个网络将第一个网络预测为破损的图像分类为 AB、,第三个网络处理 A 亚组。然后将该方法与三个经典 CNN,即 ResNet50、InceptionV3 和 VGG16 进行比较。

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

作者图片

这种非常琐碎的方法超过了三个 CNN,但远非最佳。当视觉变形金刚出现时,我们正在努力改善这些结果!

2.4 视觉转换器

最近,一种称为 Transformer 的新范式(以前为自然语言处理(NLP)引入)已经在广泛的语言任务中表现出了示范性的性能。

Transformer 架构基于自我关注机制,该机制学习序列元素之间的关系,并且 1)可以处理完整的序列,从而学习长距离关系 2)可以轻松并行化 3)可以扩展到高复杂性模型和大规模数据集。

自然语言处理领域中变形网络的发现引起了计算机视觉界的极大兴趣。然而,可视数据遵循典型的结构,因此需要新的网络设计和训练方案。

因此,不同的作者提出了他们自己的应用于视觉的变压器模型的实现,但是 SOTA 仅由 视觉变压器 (ViT)实现,其特殊性在于聚焦于图像的小块,这些小块被视为令牌。

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

来自原始 ViT

关于自我关注和视觉转换的更深入的解释可以在我的第一篇关于媒介的文章中找到。

最后来讨论一下我们是如何利用 ViT 的超能力超越这个题目的艺术状态的。

3.我们系统的全部管道

预处理阶段与前一种方法非常相似,但有两个主要区别:裁剪阶段使用 YOLOv3 网络完全自动化,数据集中的样本现在是 4027 个,并分为 7 个不同的类别(出于同样的原因,仍然不包括 C 裂缝)。CNN 和分级 CNN(在第 1.3 节中讨论)用于比较 ViT 与两个基线的结果。在预训练 ViT 的最后,附加了两个密集层用于分类(关于架构的更多信息,我建议阅读 arXiv 上的论文)。

注意力图也被可视化以证明网络确实聚焦于骨骼的正确区域,并且执行聚类实验以观察 ViT 在特征提取中的能力。

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

作者图片

4.结果

从下表中可以看出,ViT 的表现超过了基线!要了解更多结果,您可以阅读(猜猜是什么?)arXiv 预印本。

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

4.1 聚类

我们对结果很满意,但我们也想证明网络确实擅长特征提取。为了证明这一点,我们转向了无监督学习:如果一个网络能够在没有标签的情况下识别不同的类别,那么提取的特征肯定是非常多样的。测试了三种聚类方法,结果如下所示:首先,使用卷积自动编码器(a)对图像的初始数据集进行聚类。在第二种情况下,卷积自动编码器被自动编码器代替,该自动编码器将 1024 个值的向量作为输入,一种情况下从 CNN (b)提取,另一种情况下从 ViT 编码器©提取。显然,ViT 是唯一一个能够提取有意义特征的,尽管可以理解它仍然在与亚断裂作斗争。

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

三个聚类的分布。聚类标签以边栏中显示的颜色显示。作者图片

4.2 可视化

我们还可视化了注意力地图,以突出网络在推理过程中关注的地方。专家对这些图进行了评估,确认了 ViT 定位骨折区域的正确方法。

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

作者图片

4.3 专家评估

最后,为了证明这种工具实际上可以用于医院的日常工作,我们请 7 名住院医生和 4 名放射科医生评估了 150 张没有网络预测的图像和(两周后)有网络预测的图像,平均改善了 29%

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

5.结论

这部作品带来了四个方面的新奇之处:

  1. 我们介绍了有史以来最大和最丰富的股骨骨折分类标记数据集,4207 张图像分为 7 个不同的类别;
  2. 我们首次为分类任务应用了视觉转换器(ViT),超越了经典 CNN 和分级 CNN 的两条基线;
  3. 我们可视化了 ViT 的注意力图,并对变压器编码器的输出进行了聚类,以了解这种架构的潜力;
  4. 我们进行了最终评估,要求 11 名专家通过在线调查的方式对 150 幅图像进行分类,有无我们系统的帮助。

就是这样!第一次,我们取得了非常好的结果,同时达到了 AO 分类的深层次。

该工具的主要局限性在于,在数据集中,某些类的代表性不足。出于这个原因,我们正在与生成对抗网络 (GANs)合作,以产生新的人工但可靠的样本。你能认出下图中的假货样品吗?

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

作者图片

都是假的!很神奇,不是吗?

6.参考

一张图片抵得上 16x16 的文字

股骨骨折分类视觉转换器

股骨近端 X 线影像分级骨折分类

如果你喜欢这个故事,你也可以看看我的第一篇关于媒体的文章,在那里我解释了一个最有趣和最新的视觉架构,CoAtNet!

https://medium.com/codex/coatnet-how-to-perfectly-combine-cnns-and-transformer-9632e187ecbf

PyTorch 中的视觉变形金刚

原文:https://towardsdatascience.com/vision-transformers-in-pytorch-43d13cb7ec7a?source=collection_archive---------7-----------------------

当回旋不再是一种趋势。

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

图片来自 Unsplash。

卷积神经网络(CNN)已经成为几乎所有用于计算机视觉和图像相关任务的网络的主要骨干,因为与传统的多层感知器(MLPs)相比,它们在 2D 邻域感知和翻译均衡方面具有优势。然而,随着最近在语言处理领域中用变换器代替递归神经网络的转变,人们可能会怀疑变换器在图像领域中的能力。

幸运的是,最近在 ICLR 2021* 发表的一篇论文已经探索了这种能力,并实际上提供了一种新的最先进的架构——视觉变压器——这与基于卷积的模型形成了鲜明对比。

本文深入探讨了变压器的概念,特别是视觉变压器及其与 CNN 的比较,并讨论了如何在 PyTorch 上整合/训练变压器,尽管训练这些架构很困难。

*边注:国际学习表示会议(ICLR)是一个顶级的知名会议,专注于深度学习和表示。

CNN 有什么好处?

为什么 CNN 在计算机视觉领域如此受欢迎?答案在于卷积的固有性质。内核或卷积窗口将附近像素的特征聚集在一起,允许在学习过程中一起考虑附近的特征。此外,当我们在图像中移动核时,图像上任何地方出现的特征都可以被检测到并用于分类——我们称之为平移等价。这些特征允许 CNN 提取特征,而不管特征在图像中的位置,因此在过去几年中鼓励了图像分类任务的显著改进。

但是如果 CNN 做了所有这些,变形金刚做了什么?

NLP 中的变压器

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

图一。原始变压器中的缩放点积注意机制和多头注意机制。来源:https://arxiv.org/abs/1706.03762

变形金刚最初是在自然语言处理领域的论文中提出的“注意力是你所需要的全部”。该领域的传统方法(例如,RNNs 和 LSTMs)在计算任何预测时考虑短语内邻近单词的信息。然而,由于当前状态(输入)需要计算所有先前的输入,所以该过程是顺序的,因此相当慢。

变形金刚利用注意力方案来计算最终的预测,在某种意义上,注意力方案实质上是矢量化单词之间的相关性。因为一个单词与其他单词的相关性独立于其他单词的相关性,所以同时计算是可能的,并且因此使得深度网络在这种情况下在计算方面更加合理。通过考虑所有的单词和相关性,结果实际上明显优于传统的递归方法。

此外,transformer 融入了多头注意力,它可以并行多次运行注意力机制,并将分离的向量连接到最终输出中。

转向视觉世界

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

图二。视觉转换管道。图像被分成小块,并被展平以模仿序列。来源:https://arxiv.org/abs/2010.11929

随着它给语言处理带来的成功,问题出现了:我们如何将技术从语言转移到图像?纸质视觉转换器提供了最直接的方法。它将图像分成小块,并进一步使用这些小块并将它们转换成嵌入,然后将它们作为等价于语言处理中的嵌入的序列来馈送,以找到彼此之间的关注点。

实验代码

在本节中,我们将探索经过良好预训练的视觉转换器,并在各种数据集上测试其功能。值得注意的是,在原始论文的广泛研究中,只有当预训练数据集达到非常大的规模时,vision transformers 才优于 CNN。因此,如果您的计算资源相当有限,那么最好不要自己训练它。

数据集

为了探索视觉转换器的功能和通用性,我们可能需要在多个数据集上进行测试。幸运的是, Graviti 的开放平台提供了计算机视觉领域众多著名数据集的链接和数据库。人们可以简单地选择他们的服务并直接找到数据集的链接。

如果你只关注推理而不是训练,你甚至可以使用他们目前开发的 API,这将简化数据组织和加载过程。

PyTorch 中的视觉转换器

如前所述,由于学习良好的特征提取需要非常大规模的数据,视觉变压器非常难以训练。幸运的是,现在许多 Github 库都提供预构建和预培训的视觉变形器。我们的教程将基于来自https://github.com/lucidrains/vit-pytorch的视觉转换器。

要导入他们的模型,需要通过 pip 安装,如下所示:

*pip install vit-pytorch*

确保 Pytorch 和 Torchvision 库也得到更新,以便版本相互一致。

然后,您可以使用以下内容初始化视觉转换器:

要进行推断,只需执行以下操作:

如果你真的想进一步训练你的视觉转换能力,你可以参考最近发表在这篇论文中的通过蒸馏进行数据有效训练。这种训练方法比直接训练视觉转换者要有效得多。代码也可以在上面提到的 vit-pytorch 库中获得。

结果

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

图二。视觉转换器在多个数据集上的结果。资料来源:https://arxiv.org/abs/2010.11929。

如果我们回头参考这篇论文,我们可以看到,当使用超大规模数据集进行预训练时,大型视觉转换器模型可以提供最先进的结果。然而,预训练要求这种模型具有相当大的训练能力来实现高精度。

超越视觉变形金刚

近年来,计算机视觉社区一直致力于改进变形金刚,以适应基于图像的任务,甚至 3D 点云任务的需要。最近的 ICCV 2021 论文如云变形金刚和最佳论文获奖者 Swin 变形金刚都显示了注意力机制的力量是图像任务的新趋势。

结论

原来就是这样!趋势变换及其在计算机视觉中的应用概述。

感谢您坚持到现在🙏 我会在计算机视觉/深度学习的不同领域发布更多内容,所以 加入并订阅 如果你有兴趣了解更多!

视觉变形器还是卷积神经网络?都是!

原文:https://towardsdatascience.com/vision-transformers-or-convolutional-neural-networks-both-de1a2c3c62e4?source=collection_archive---------7-----------------------

探索使用卷积神经网络和视觉转换器构建混合架构的各种方法

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

作者图片

计算机视觉领域多年来一直由卷积神经网络(CNN)主导。通过使用过滤器,这些网络能够通过创建突出最相关部分的特征图来生成输入图像的简化版本。这些特征然后被多层感知器用来执行期望的分类。

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

图片由作者使用 CNN 解说者创建

但是最近这个领域已经被视觉变形器(ViT)的架构带来了令人难以置信的革命,它通过自我关注的机制已经被证明在许多任务中获得了优异的结果。

在这篇文章中,视觉变形金刚的一些基本方面被认为是理所当然的,如果你想更深入地了解这个主题,我建议你阅读我以前的架构概述。

虽然变压器已被证明是 CNN 的优秀替代品,但有一个重要的限制因素使其应用相当具有挑战性,即需要大型数据集。事实上,CNN 甚至能够在相当少量的数据存在的情况下学习,这主要归功于归纳偏差的存在[1,8]。这些建议让模型更快地学习,更好地概括。具体而言,CNN 有两个与架构功能直接相关的偏见,即:

  • 图像中的相邻像素彼此相关;
  • 图像的不同部分必须以相同的方式处理,而不管它们的绝对位置。

然而,变压器架构中不存在这些偏差,因此他们需要更多数据来全面了解问题,但同时,他们能够以更自由的方式做到这一点。因此,可以说,变压器能够学习更多,但需要更多的数据,而卷积神经网络实现了对所处理的任务的较低理解,但也用较小的数据摩尔实现了这一点。

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

作者图片

**但是,难道没有一种方法可以从两种架构中获得最佳效果吗?**幸运的是,这两种架构基于两种截然不同的概念,可以以多种不同的方式结合起来,以获得能够利用两者优点的东西!

使用 CNN 作为补丁提取器

第一种可能的方法包括在将补片作为输入传递到视觉转换器之前,改变提取补片的方式。这些小块通常是通过将输入图像分成许多小部分而获得的。

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

图片由作者基于关于变形金刚、时间形成者和注意力

为了理解如何通过卷积网络从图像到补丁,观察其内部功能就足够了:

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

作者图片

当大图像作为 CNN 的输入时,通过卷积层,它从三通道 RGB 图像转换为 N 通道图像。同时,它的尺寸急剧减小,图像本身的内容也发生了变化。
如果在卷积过程结束时,N 通道图像被认为是一组 N 个小图像,我们就获得了视觉转换器所必需的补丁。因此,可能的卷积视觉变换器的新架构将如下构成:

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

图片由作者基于 结合 EfficientNet 和视觉变形金刚进行视频深度打假检测

这种技术已被证明在许多情况下特别有效,也可以使用预先训练的卷积网络(如 EfficientNet)作为补丁提取器来应用。这种方法的一个可能的应用已经被我和 Pisa 的 CNR 的研究人员应用于执行视频 deepfake 检测[2],如果你想了解它的更多信息点击这里

从自我关注到门控位置自我关注(GPSA)

为了能够利用变压器内的卷积网络,利用了自我关注层可以作为卷积层工作的直觉。我们之前已经指出视觉转换器没有感应偏差。因此,脸书研究人员的目标是修改架构,以引入软卷积电感偏差。必要时,新网络必须能够充当卷积网络。

为了实现这个目标,门控位置自我注意(GPSA) [1]被引入,一种带有额外参数λ的位置自我注意形式。该参数用于平衡该层作为卷积层或经典自关注层的功能。在训练期间,网络将校准该参数,并且如果必要的话,在过程结束时,这些层中的一些将充当卷积层。

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

图片由作者根据 ConViT 制作:利用软卷积电感偏置改进视觉转换器

除了在发生时用于捕获输入中的本地信息的 GPSA 层之外,还有形成网络的非本地部分的经典自我注意层。这种架构被称为卷积视觉转换器(ConViT)。

CMT:卷积神经网络遇到视觉变压器

另一个最近的提议来自华为的实验室,他们引入了一个比迄今为止看到的更先进的架构,提出了他们所谓的 CMT 块[3]。其中许多模块用于新的架构中,将自我关注机制与卷积机制相结合,还引入了一些性能优化。

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

图片由作者基于 CMT:卷积神经网络遇见视觉变形金刚

每个 CMT 模块由三个基本部分组成:

  • 局部感知单元:用于克服传统位置嵌入带来的限制,以及传统视觉转换器无法捕捉单个补丁内的局部关系和结构化信息。局部感知单元(LPU)通过简单的深度卷积提取局部信息。
  • 轻量级多头自我关注:为了减少关注度计算中的计算量,通过该组件,使用 K×K 深度方向与 K 步距的卷积来减少矩阵 K 和 V 的空间大小。这样,通过处理由卷积过程产生的更小的矩阵,减少了自关注计算的数量;
  • 反向残差前馈网络:这是每个块的最后一层,用一个扩展层取代了视觉变形器的经典多层感知器,之后是深度卷积和投影层。

因此,所得到的架构能够利用两种网络的优点,并且由于在不同层中引入的各种特性而有效地做到这一点。

结论

结合卷积网络和视觉转换器的想法不仅在许多方面可行,而且非常有效。迄今为止,这些变体在 ImageNet 等关键数据集上取得了优异的结果,就该数据集的准确性而言,CMT 目前是最先进的网络。似乎这还不够,进行的实验表明,这些网络也比完全基于卷积网络的经典方法和基于视觉变换器的方法轻得多,也小得多。

许多人将视觉变压器视为卷积神经网络的继任者,但今天看来,这两种方法的结合具有巨大的威力。

我们可以肯定地说:“ 团结就是力量!

参考资料和见解

[1]“达斯科利等人”。" ConViT:利用软卷积电感偏置改进视觉变压器"

[2]“cocco mini 等人”。结合 EfficientNet 和 Vision Transformers 进行视频深度打假检测

[3]《郭等人》。" CMT:卷积神经网络遇上视觉变形金刚"

[4]《大卫·柯考米尼》。“关于变形金刚,时间形成者和注意

[5]《大卫·柯考米尼》。在迪诺上,无标签自蒸馏

[6]《大卫·柯考米尼》。"注意力是你在《变形金刚》中真正需要的吗?

[7]《路易·布沙尔》。"变形金刚会取代计算机视觉中的 CNN 吗?

[8]《维克多·佩雷斯》。计算机视觉中的变形金刚:告别回旋!”

根据我的记忆训练的视觉人工智能

原文:https://towardsdatascience.com/visual-ai-trained-on-my-memories-a54c55967c28?source=collection_archive---------32-----------------------

#MERZmory:借助人工智能探索摄影

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

我的 MERZmory 实验的各种完成(StyleGAN +我的照片)//图片作者

我的父亲是一名职业作家和摄影记者。他记录了苏联和俄罗斯的生活和文化。当我们来到德国时,他没有停下来。直到生命的最后几天,他都在拍摄和记录德国。几年前他去世后,留给我一个巨大的照片档案。

重温他的照片档案,我意识到一件事:

摄影师拍下他或她当时经历的地方、人物和情景。这位摄影师与一位旁观者分享记忆,他将在未来的某个特定时间凝视这些照片。

共享的记忆。

大概父亲的职业成了我的困扰——我开始到处拍照——在家里,在工作中,在去日本的旅途中,我也想与世界分享我的记忆和经历——把它们发布在 Instagram 上。它们不仅仅是报道我的行踪的图片;我试图与世界交流我的想法和观点。

当我开始深入研究创造性人工智能时,对我来说最迷人的事情之一是一台机器对人类文化遗产的重新诠释。人工智能如何重建我们的想象、梦想和欲望?

已经让我大吃一惊了。

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

图片来自我的文章"BigGAN as a Creative Engine"//图片作者

随着 StyleGAN2 的出现,在海量数据库上训练(例如 FlickrFacesHQ 等。),我们已经进入了视觉创意的新领域。

但仍然有一件事让我很困扰。经常使用所有这些数据集(即 ImageNet 等。).但是我的摄影呢,我的内心世界——如果我在作品上训练人工智能,我会认出来吗?

我做到了。

我用我的记忆训练人工智能。

有多种方法可以在数据集上训练 StyleGAN2。幸运的是,对于我们中的非编码人员来说,有 RunwayML (它值得一篇特别的文章[稍后发布])。

在你的照片数据库上训练 AI 的工作流程很简单。你必须:

  1. 在一个文件夹中收集至少 500 张你想用来训练的图片 /我自己用了大约 3000 张 Instagram 图片
  2. 使用 RunwayML 上传它们
  3. 选择您的数据集
  4. 选择预先训练的模型和训练步骤

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

3)选择数据集(截屏来自 RunwayML,图片由作者提供)

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

4)选择预先训练好的模型(截图来自 RunwayML,图片由作者提供)

…然后运行它。

对于我的实验,我使用了各种设置和预先训练的模型。结果令人兴奋。这是我的发现。

实验一:抽象记忆

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

(截图来自 RunwayML,图片由作者提供)

首先,我采用了预先训练的 StyleGAN2 模型“Flickr Faces HQ”。即使我(最初)不想生成人脸,这种模型的好处是:它具有目前最好的分辨率(1024x1024),正在对来自 flicker 的大约 70k 高清人脸进行训练(你从“这个人不存在”中知道他们)

对于训练步骤,我选择了 4000 。我想在最初的实验中远离面部图像和特征,从语义上转向 Instagram 数据集的内容。

**这里有一个免责声明:**事情不是这样的。我的 Instagram 数据集由各种风格和流派的照片组成:风景、人像、实验、微距摄影等。StyleGAN2 无法将这种多样性概括为特定的类别。但这不是我想要的。

我想要的是体验,而不是具体的东西。

我已经得到了。

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

作者提供的图片

我有非常抽象的视觉效果和一些可识别的特征。取而代之的是“相同能量”倾向的新图像。

有趣的还有图像的词源考古学(在视觉模型的情况下,我们可以使用这两个术语来表示 寻找机器完成 背后的根源和原件)

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

左:AI 生成的图片/中+右:来自我的 Instagram 数据集的图片//所有图片由作者提供

或者一些微距摄影:

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

左:AI 生成的图片/中+右:来自我的 Instagram 数据集的图片//所有图片由作者提供

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

左:AI 生成的图片/中+右:来自我的 Instagram 数据集的图片//所有图片由作者提供

对于了解他的摄影的作者来说,这样的重新发现是鼓舞人心和令人着迷的。

RunwayML 的另一个伟大之处是矢量/潜在空间浏览器,在这里你可以精确地找到你要找的东西。通过改变“截断”和“采样距离”,您可以通过寻找具有稍微不同特征的特定图像来微调您的视觉搜索。

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

作者提供的图片

在 4000 步之后,我摄影的紧张和情绪战胜了人工智能预训练的模型。

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

我第一次实验的几张照片。//图片作者

这是我记忆中的视觉旅程,由人工智能创造:

(图片由我提供,音乐由 AI 模型点唱机创作,图片由作者提供)

因此,回顾我的实验,我回顾了我训练的某个地方600——预先训练的 StyleGAN2 模型的脸仍然出现在特征中。我的 Instagram 照片无法辨认。这样的面孔可以赢得每一场“被诅咒的形象”比赛。

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

作者提供的图片

但现在我看到了一种新的可能性:如果我在 Instagram 图片上稍微训练一下 StyleGAN2,让原始的 FlickrFaces 出现在开头的某个地方,会怎么样?扭曲,但不是令人毛骨悚然的方式?

我做到了。

实验二:记忆的面孔

我在我的 Instagram 照片上重新训练了 StyleGAN,采取了更少的步骤(大约 500)。

我所看到的出乎意料的好:

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

是的,的确,许多面孔仍然是你在梦里不喜欢遇到的样子,但许多面孔与 Instagram 数据集功能完美融合。

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

作者提供的图片

这种消失的个性的风格和主题,人工智能驱动的讲故事,以及人类驱动的解释,这种人机合作为美学和叙事带来了新的视角。

使用潜在空间浏览器,你可以找到最有趣的面孔:

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

RunwayML,作者图片

这里——动态:

实验三:你记忆中的物体

在面孔让我相信人工智能的创造力之后,我想在抽象艺术(实验 1 )和具体的面孔(实验 2 )之间找到一条中间道路。我选择了另一个数据集,针对不同的对象进行了预训练。

已经走了 500 步之后,我得到了各种各样的主题(即使汽车和其他交通工具应该是数据集中最常见的对象)。

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

作者提供的图片

这种模式的缺点是完成尺寸(512x512),但优点是图像的多样性。

提示:使用各种人工智能方法,你可以将图像放大到你需要的尺寸。

特别是在这里,你需要潜在的浏览器,以避免多余的汽车图像,寻找中间的珍珠和宝石(不是反对车辆,只是多样性是重要的):

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

作者提供的图片

这里有一些例子:

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

作者提供的图片

作为一个短的视觉和音乐装置(音乐是由人工智能模型自动点唱机产生的)

(视觉效果由我制作,音乐由 AI 模型点唱机创作)

结论

当然,在预先训练好的模型上进行训练并不是什么新鲜事。研究人员和艺术家已经用它进行了几十年的试验(即使机器学习的“几十年”意味着 1-2 年,因为发展正在迅速演变)。

但是仍然有太多的东西需要去发现,去重新诠释,去微调。毕竟,这与技术无关;这是关于我们的想象力。(这仍然可以通过技术来增强)。

是关于人机协作的。

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

作者提供的图片

混淆矩阵的可视化指南

原文:https://towardsdatascience.com/visual-guide-to-the-confusion-matrix-bb63730c8eba?source=collection_archive---------12-----------------------

入门

二元和多类混淆矩阵解释

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

(图片由作者提供)

我们已经建立了一个机器学习模型来分类病人是否感染了某种病毒。一个病人可能处于两种状态:他们要么有病毒,要么没有。

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

我们把病人描绘成一个圆圈。填了表示他们有病毒。未填充意味着它们没有。(图片由作者提供)

对于任何给定的患者,我们的模型产生 0 到 1 之间的分数。1 分意味着模型预测患者确实携带病毒,0 分意味着预测患者没有携带病毒。

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

预测分数用正方形表示。填的越多,分数越高。(图片由作者提供)

如果我们选择 100 名患者,其中一部分患者携带病毒,然后我们让模型为每个患者生成一个分数,我们如何评估模型的性能?

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

(图片由作者提供)

有许多不同的方法可以评估模型的分数与实际值的匹配程度。在这个例子中,我们将看一下混淆矩阵,其中我们使用一个网格来直观地评估结果。

阈值

为了确定这些分数是指对病毒的正面预测还是负面预测,我们需要决定在哪里设定阈值。我们可以通过选择一个值来做到这一点,其中大于该值的所有分数都被认为是正面预测,而小于该值的所有分数都是负面预测。

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

所有高于阈值(红线)的分数都被认为是病毒阳性。以下都被认为是负面的。(图片由作者提供)

我们放置这个阈值的位置决定了我们的模型对这两个类的偏向程度。低阈值导致偏向正输出,高阈值则相反。选择正确的阈值取决于您的模型的目标是什么以及如何使用它。不过现在我们将简单地选择 0.5 作为阈值。

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

(图片由作者提供)

比较实际与预测

既然我们已经将阈值应用于每个输出得分,我们可以将我们的输出与实际患者进行比较。

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

(图片由作者提供)

当我们比较结果时,出现了四个不同的组。

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

(图片由作者提供)

  • 真阳性(TP): 预测类别为病毒阳性,实际类别为阳性。
  • 假阳性(FP): 模型预测为阳性,实际类为阴性。
  • 假阴性(FN): 预测类为阴性,实际类为阳性。
  • 真阴性(TN): 病毒的预测类别为阴性,实际类别也为阴性。

第一个字是布尔型的,当预测值和实际值匹配时为,否则为。第二个词指的是类:在这种情况下,它可以是正的,也可以是负的。一个表现良好的模型主要会有真实的正面和真实的负面,我们可以在一个混淆矩阵中看到它们。

混淆矩阵

通过对四个类别中的每一个进行计数,我们可以在一个 2×2 的网格中显示结果。y 轴是实际值(患者及其阳性或阴性标签), x 轴是我们的预测值。这个网格的每个象限指的是四个类别中的一个,因此通过计算一个象限的结果,我们可以将值放在该单元格中。

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

每个象限代表四种可能性中的一种。(图片由作者提供)

用单元格值占该行中所有单元格的比例来给每个象限着色是很有帮助的。由于真正的正面和真正的负面是沿着从左上到右下的对角线,如果这条对角线被突出显示,我们可以假设模型运行良好。

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

(图片由作者提供)

如果模型表现不佳,很容易确定哪里出了问题,因为对角线上的一个单元格只会被稍微填充,而该行上的另一个单元格会被突出显示。对于上面的错误模型,假阳性的数量比真阴性的数量高得多,所以我们的模型过度预测了阳性类别(该模型预测患者有病毒,而他们没有)。

我们可以返回模型,并根据这些信息进行更改。也许我们改变我们训练它的方式,或者模型本身的架构。这也可能是将阈值更改为更高值的好时机,这样输出会偏向负类。像这样的二元类混淆矩阵可以帮助我们在建立分类模型时指导决策。

多类混淆矩阵

事业成功后,我们从医学界退休,并决定从事野生动物摄影这一爱好。为了帮助组织我们拍摄的照片,我们建立了一个分类器模型来标记照片中的动物。如何使用混淆矩阵来评估多类问题?

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

来自 Unsplash 的狮子图像由米卡·布兰特

像以前一样,我们仍然需要确定输出分数已经预测了哪个类。我们将选择概率最高的输出,并考虑模型预测的类别,而不是执行阈值处理。

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

突出显示的单元格是照片的最高预测分数。(图片由作者提供)

混淆矩阵的建立方式和以前类似,只是现在多了两个类。总体思路也是一样的:对于每个预测,我们将结果与我们正在评估的标记数据进行比较。如果我们的模型预测到大象并且图像确实包含一只大象,那就是正确的分类!然后,我们可以将结果添加到相关的单元格中。当我们的模型出错时也是如此,比如当预测的类是猴子但照片实际上包含了狮子

在将每个预测类与相关联的标签进行比较之后,混淆矩阵开始看起来类似于二元类的情况。此处的对角线是模型精确执行的位置,相对于同一行中的其他单元格,这些单元格将包含较高的值。

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

(图片由作者提供)

此外,我们仍然可以识别所有真阳性、假阳性、真阴性和假阴性相对于任何类的位置。假设我们对我们的模型在类 fish 上的表现感兴趣:

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

(图片由作者提供)

  • 真阳性(TP): 实际类是鱼时对鱼的一种分类。
  • 假阳性(FP): 鱼类的一个分类,但实际上是其他 3 类中的一类。
  • 假阴性(FN): 不是鱼的一个分类,但实际上是鱼。
  • 真否定(TN): 鱼以外的东西的一个分类,实际的类是鱼以外的东西。(预测类和实际类不必匹配,因为我们只关心 fish 类)。

当分类不正确时,我们可以直观地看到模型错误的确切位置。这里我们可以看到我们的模型将狮子归类为猴子:

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

(图片由作者提供)

希望这种模型不要部署在任何高风险环境中!

想支持更多这样的内容?使用此链接https://mlee-articles.medium.com/membership注册 Medium 的会员资格,您的一部分会员资格将用于未来内容的开发

折扣给齐柏林飞船上的基因组数据分析带来了火花

原文:https://towardsdatascience.com/visual-k-mer-analysis-with-zeppelin-b33af396a26?source=collection_archive---------15-----------------------

下一级 k-mer 分析教程

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

齐柏林飞艇上的折扣 k-mer 分析。(图片由作者提供。)

在生物信息学中,k-mers 是长度为 *k、*的序列片段,通常是 20 到 50 之间的一个小数字。K-mer 分析是许多其他分析的重要组成部分,包括宏基因组分类、基因组组装和序列比对。Jupyter 和 Zeppelin 等交互式笔记本正在成为数据科学家的重要工具,提供了相当大的功能和灵活性,我们可以混合和匹配语言、可视化和代码片段,与其他用户合作,以及版本控制更改。然而,直到现在,由于爆炸式的数据大小和高内存和 CPU 要求,k-mer 数据在这种笔记本电脑中一直难以处理。今年,我们发布了 Discount ,(分布式计数)一个在 Apache Spark 上推动 k-mer 分析艺术的工具。Discount 从根本上加快了数据分析和操作,如计数、排序和搜索 k-mers,从泛基因组数据到高度复杂的宏基因组数据集。通过在 Discount 和 Spark 的基础上构建 Zeppelin 笔记本,我们现在可以将这种能力用于交互使用,使笔记本中的 k-mer 分析变得微不足道。

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

在大肠杆菌短读数据集中计数 k-mers (k=28)。(图片由作者提供。)

在本文中,我将详细介绍如何在带有大肠杆菌数据的 Zeppelin 笔记本中使用 Discount。我们将在独立的机器上安装软件,但数据分析也可以在云中更快地进行,例如在 AWS EMR 上。

设置火花和齐柏林飞艇

首先,我们需要下载 Apache Zeppelin 版本 0.10.0(或更高版本)。有两个下载可用。较小的一个(zeppelin-netinst-0.10.0.tgz)将足以满足我们的目的。

Zeppelin 包含一个内置的 Spark 解释器,但是这里我们需要一个更新的版本。因此,我们还需要从 Spark 下载页面下载一个单独的 Spark 发行版。对于本文,我们使用的是 Spark 3.1。

最后,我们需要下载折扣 k-mer 分析工具。它可以从我们的 GitHub 库的版本页面获得。Discount 2.0.1 zip 包含 Discount jar(我们将把它放在 Spark 类路径中)以及一些必要的数据文件。我们提取这三个下载并从 Zeppelin 目录中启动 Zeppelin:

./bin/zeppelin-daemon.sh start

默认的 Zeppelin 端口(可以在conf目录中更改)是 8080,所以假设一切顺利,我们应该可以在 http://127.0.0.1:8080 上加载 Zeppelin 笔记本界面。

获取大肠杆菌数据

对于我们的例子,我们将从大肠杆菌菌株中寻找下一代测序(NGS)短序列。这是一个相对适中的数据集,可以快速分析。但是,您可以随意对您喜欢的任何数据尝试这些方法。登录号为 ERR022075 的数据集可以从NCBI 测序读取档案下载。由于 Discount 目前只接受 fastafastq 格式的文件,您可能需要使用 sratools 将下载的文件转换成 fastq 文件。

设置和数据加载

我们将使用的折扣演示笔记本的最新版本可从以下网址获得:https://raw . githubusercontent . com/jtnystrom/Discount/master/notebooks/Discount % 20 demo . zpln。这是一个 JSON 格式的导出笔记本。从 Zeppelin 的起始页,点击导入注释链接将允许您粘贴并导入该 URL。接下来,我们需要配置一些基本设置。

齐柏林笔记本分为。运行一个段落将执行里面的代码片段并显示结果。

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

在做任何事情之前,编辑 spark.jars 和 SPARK_HOME,如果您还没有在其他地方配置这个设置的话。段落可以通过按 shift+enter,或者点击右上角的“播放”按钮来运行。(图片由作者提供。)

编辑完“Spark settings”段落后,按 shift+enter 来“运行”该段落,让 Zeppelin 接受这些新设置。(如果您稍后再次更改这些设置,或者遇到问题,您可能需要重新启动 Spark 解释器,这可以从右上角的齿轮菜单中完成。)接下来,我们运行 Imports 段落,使一些折扣类可见。从这一点开始,这本笔记本中的代码大部分是用 Scala 语言编写的,但是如果你以前没有见过 Scala,请不要惊慌——它将非常简单,并且在这本笔记本中看起来很像 Python。

在“数据加载”中,我们将编辑一些与数据加载和缓存相关的设置。首先我们改变discountRootinput。前者应该指向提取折扣包的位置。后者应该指向输入数据文件,在本例中是 ERR022075.fastq,我们在上面下载了它。

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

数据加载段落定义了本笔记本中其余段落使用的主要数据集。必须在运行之前配置 discountRoot 和 input。(图片由作者提供。)

我们还将把val lowerBound = Some(2L)改为val lowerBound = None,因为我们希望看到所有的 k-mers,而不仅仅是出现至少两次的 k-mers。(2L 是 Scala 对长整数的语法。)我们还可以在这里做一些小的改动,比如把 k 的值从默认值 28 改变为 28。

这一段是声明和缓存几个数据集,例如val kmers = discount.kmers(input).cache。在本笔记本中,countsbucketskmers等数据集在本数据加载段配置一次,然后被下游段重复使用。缓存将使 Spark 在计算一次后存储数据供以后使用,而不是每次都重新计算。这些数据集代表输入数据的三种不同视图:分别是计数的 k-mer、k-mer 桶和未计数的 k-mer。一旦我们运行了这一段,所有后续分析的数据环境就已经配置好了。要在以后进行更改,您可以随时编辑并重新运行此段落。

当我们运行这一段时,Discount 将抽取文件的一小部分。这可能需要几分钟时间。

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

采样完成后,您将看到类似于(但可能不完全相同)如下的输出。Discount 对 10 mer 频率进行了随机采样,以获得最佳数据分布。(图片由作者提供。)

当数据加载完成时,我们将看到一些输出,这表明我们已经为下一步做好准备。

数据集摘要

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

此数据集中 k-mers 的统计概述。(图片由作者提供。)

此时,我们已经准备好分析数据。统计摘要段落可能是我们要查看的第一件事,因为它告诉我们数据集中有多少 k-mers,它们的平均丰度(它们被看到的次数),有多少不同的 k-mers,以及其他概述指标。我们第一次运行这一段可能需要几分钟,因为 Spark 将需要生成一次缓存数据集,但后续运行会更快。这些结果显示,k-mers 的总丰度约为 39 亿,平均丰度为 5.9。

K-mer 直方图

一个给定的数据集通常会被排序到某个深度,这意味着有意义的 k-mers 应该在某种程度上均匀地分布在平均值周围。丰度低的 K-mers 被认为是噪音。如果我们简单地按原样运行 k-mer 计数直方图段落,我们将看到看起来像一个空图,但实际上是一个高度倾斜的直方图。

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

k-mer 直方图。z.show()调用显示 Zeppelin 的表格/交互式图表小部件。该直方图看起来是空的,但实际上在计数= 1 时在左侧有一个显著的峰值。(图片由作者提供。)

在这一段中,读者可能会发现以z.show开头的一行。这就是允许 Zeppelin 显示从 Spark 提取的数据的魔力。z 是一个引用 Zeppelin 的特殊对象,show告诉它以多种方式显示一些数据。默认情况下,我们得到一个显示表格的可视化显示,但也允许我们显示各种类型的图,或者保存一个 JSON/CSV 文件。

通过手动检查表格模式中的数据,我们形成了假设,即 35 是一个有意义的临界值。于是我们把这一段稍微改一下说:z.show(histogram.filter($"value" > 35).limit(800))。这将从直方图中删除计数低于 35 的 k-mers。表达式$"value" > 35在 Spark SQL 中定义了一个条件,告诉它过滤名为value的列。最后,limit(800)在这里告诉 Spark,我们也不关心丰度非常高的 k-mers;我们只希望看到直方图中的前 800 行。

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

k-mer 丰度截止值为 36 的过滤 k-mer 直方图。在此范围内,k-mer 计数似乎围绕一个平均值均匀分布。(图片由作者提供。)

这张图片与最初的直方图非常不同,似乎证实了数据集的行为符合预期。在这一点上,我们可以执行进一步的过滤,当我们满意时,将选择的子集写入文件。

查询感兴趣的 k-mers

有时,我们可能希望检查特定感兴趣区域的 k-mer 计数。大肠杆菌基因组中的一个编码区是基因精氨酸脱羧酶编码序列可在欧洲核苷酸档案馆(ENA)找到。如果一切都做对了,我们应该能够在数据中找到这个序列。我可以简单地从编码序列中复制前两行,并将它们插入到主题段落中的 Find k-mers 中(注意将它们连接成一行):

val query = List(“ATGAAAGTATTAATTGTTGAAAGCGAGTTTCTCCATCAAGACACCTGGGTCGGTAACGCCGTTGAGCGTCTGGCAGATGCTTTAAGCCAGCAAAATGTTACCGTGATTAAATCCACCTCC”)

当我们运行该段落时,该序列将被分解成 k-mers,并将找到数据中的任何匹配。我们可以看到,数据中确实存在丰度相对较高的匹配。和以前一样,如果我们愿意,可以将结果保存到文件中。这一段使用了与前面相同的z.show()语句,但是结果现在以表格模式显示。

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

K-mer 计数精氨酸脱羧酶基因的匹配部分。正如注释掉的代码所示,也可以从提供的 fasta 文件中的序列进行查询。(图片由作者提供。)

更进一步

演示笔记本包含许多其他可以探索的例子,在不同的段落中注释了一些有用的变化。Discount 最新版本的 API 文档作为参考会很有用,有助于理解这些例子是如何工作的,以及看看还有什么是可能的。

不熟悉 Scala 的人可能会对单独的 k-mer counts 段落中的这段代码感到疑惑:z.show(counts.filter(_ > 5).withSequences).``_字符允许我们快速创建一个 lambda 函数,所以我们也可以编写:filter(x => x > 5),它具有相同的含义。

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

大肠杆菌数据集的堆积 k-mer 丰度直方图,k=28、35 和 45。该图是通过使用 Spark SQL 将不同的 k-mer 直方图表连接在一起而生成的。(图片由作者提供。)

通过多次加载相同的数据,我们还可以比较多个 k 值的结果,如上图所示。这最后一个例子不是演示笔记本的一部分,而是留给读者作为练习。

敬未来

Spark 为云环境带来了强大的抽象和类似 SQL 的查询语言(以及 Python、R、Scala 等通用语言),让我们——大多数时候——可以将一个可能有数百台机器的集群看作一个实体。在写这篇文章的时候,我是在一台机器上运行实验,但是我也可以在云中以同样的方式运行,这样会更快。通过突破性的新 k-mer 分布算法,Discount 首次允许我们以真正实用的方式将 Spark 应用于 k-mer 数据。通过在此基础上添加 Zeppelin 笔记本,我们能够以交互方式探索和询问基因组的各种子集和基因组读取,比传统命令行工具允许的自由和灵活性更大,即使是在非常大的数据集上。随着泛基因组学和宏基因组学增加了对数据分析的需求,由 Discount 等技术支持的交互式笔记本将把我们从笨重的管道中解放出来,并改变生物信息学家的日常工作体验。

机器人视觉伺服

原文:https://towardsdatascience.com/visual-servoing-part-1-of-3-cad49595564d?source=collection_archive---------6-----------------------

计算机视觉与机器人

使用摄像机传感器的路径规划

介绍

这个项目的目的是使用一个鱼眼镜头和一个带 ROS 的 Turtlubot3 实现一个端到端的视觉伺服项目。视觉伺服意味着,机器人将只使用一个传感器,即摄像头,实现自动驾驶!

  1. 第一个目标是将机器人从当前位置移动到目标位置。为了指定这些位置和它们的姿态,我们使用两个 Aruco 标记。
  2. 机器人的第二个任务是避开用红色指定的障碍物,我们用 A-star 路径搜索算法实现了这个任务。
  3. 最后,当机器人在目标位置时,我们必须“停车”,这意味着目标的位置姿态应该与机器人的姿态相同。

在这个报告之后,我们将分析数学理论背景和我们实现的代码实现。

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

位置之间的角度,作者的图像

ROS 是什么?

机器人操作系统(ROS)是一个开源中间件,它包含一组用于促进机器人应用程序开发的库、软件和工具。有太多的功能,从传感器驱动器到最先进的算法。作为中间件,它包含软件和硬件的特性,因此,它能够执行各种动作,如硬件抽象和低级控制。到目前为止,不同版本的 ROS 存在一些重要的差异,所以出于兼容性的原因,我们使用 Melodic release。

用于此场景的机器人——turtle bot 3

在这个项目中,使用的移动机器人是一个 Turtlebot3 汉堡。Turtlebot3 是一个紧凑、模块化和可编程的移动机器人。它使用 ROS,并且能够为培训研究和开发创建多个应用程序。

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

工作流程,按作者分类的图像

第一个目标—从当前位置移动到目标位置

1。摄像机校准

摄像机校准是这个项目不可或缺的一部分。在这一阶段,该项目使用 camera_calibration 包,它允许使用棋盘校准目标轻松校准单目摄像机。这些包使用 OpenCV 库,其中包含摄像机校准方法。

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

棋盘,作者图片

内在校准
正如我们前面提到的,它使用 camera_calibration 包。该套件可轻松校准单目或立体摄像机。棋盘是为了修复采集图像的 径向畸变 的工具。 径向或桶形失真 可以表示为:

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

x 失真,图片由作者提供

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

y 变形,图片作者

以同样的方式,因为成像镜头没有完全平行于成像平面对准,所以出现切向失真。因此,一些图像看起来比预期的要近。切向变形量可表示如下:

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

x 失真,图片由作者提供

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

y 变形,图片作者

根据上面的等式,我们可以找到五个参数,称为失真系数

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

失真系数,图片由作者提供

此外,内在参数允许相机坐标和图像帧中的像素坐标之间的映射。它们包括像局部长度(fx,fy)和光学中心(Cx,Cy)这样的信息。

这些参数可以用摄像机矩阵表示:

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

相机矩阵,图片由作者提供

2。接收图像

下一步是通过订阅 ROS 主题“/camera/image_raw”接收图像帧,并将其转换为 NumPy 数组。然后我们需要根据我们的需要裁剪图像,通过指定我们需要工作的窗口。然后,我们使用摄像机矩阵和上一步接收到的失真系数对接收到的图像进行去失真处理。

3。检测标记

使用 OpenCV 库,我们可以检测放置在机器人顶部的两个 Aruco 标记,一个标记用于当前位置,一个标记用于目标位置。我们只需调用函数“cv2.detectMarkers ”,从该函数中我们可以接收每个标记的角,然后我们可以继续进行姿态估计。

4。姿态估计

下一步是估计当前和目标姿态,简单地调用姿态估计模块中的函数cv2 . estimateposesinglemarkers。从中我们接收每个标记的两个向量,一个平移向量[x,y,z]和一个旋转向量[x,y,z]。使用 ROS publisher,我们将这些向量发送给机器人控制器,后者负责以机器人应该能够移动的方式翻译这些矩阵。这是通过 ROS publisher 实现的

其中 current_position 是控制器将订阅的 ROS 主题,以获取我们创建的自定义消息Pose _ estimation _ vectors,以便发送这些向量。

该消息的结构如下:
几何 _msgs/Vector3 旋转
几何 _msgs/Vector3 平移

这是两种姿势的图像:

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

初始姿势,图片作者

5。控制器——将旋转和平移矩阵转换成齐次矩阵

齐次变换由外部参数 Rt 编码,并表示从世界坐标系 w 到摄像机坐标系 c 的基的变化。因此,给定点 P 在世界坐标 Pw 中的表示,我们通过下式获得 P 在摄像机坐标系 Pc 中的表示:

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

积分矩阵,作者图片

这种齐次变换由 3 乘 3 旋转矩阵 R 和 3 乘 1 平移向量 t 组成:

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

同质矩阵,作者图片

结合射影变换和齐次变换,我们获得了将世界坐标中的 3D 点映射到图像平面和归一化相机坐标中的 2D 点的射影变换:

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

同质矩阵,作者图片

控制器模块必须通过 OpenCV 函数使用 Rodrigues 变换将旋转矢量转换成旋转矩阵:

rotational_matrix, _ = cv2.Rodrigues(np.array([data.rotational.x, data.rotational.y, data.rotational.z], dtype=np.float32))

然后,我们将旋转矩阵与变换向量水平堆叠,并在末尾添加行[0,0,0,1]以获得齐次矩阵。

6。计算当前位置和目标位置之间的α角和距离ρ

我们从上一步获得的齐次矩阵描述了每个位置相对于摄像机框架的位置。我们需要将它们组合起来,以便从一个位置接收相对于另一个位置的位置。为此,我们将当前齐次矩阵的逆矩阵与目标齐次矩阵相乘,以获得组合的齐次矩阵(t):

t = np.matmul(np.linalg.inv(self.curr_homogeneous_matrix), self.target_homogeneous_matrix)

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

组合齐次矩阵,作者图片

接下来,我们需要计算机器人应该移动的角度(α)和距离(ρ):

我们从上面的矩阵中得到 dxdy :

dx = t[0][3]
dy = t[1][3]

然后我们用 dxdy 计算反正切:

self.alpha = math.atan2(dy, dx)

最后,我们通过应用欧几里德距离得到到目标的距离(rho ):

self.rho = math.sqrt(math.pow(dy, 2) + math.pow(dx, 2))

7。固定角度并将机器人移动到目标

现在,我们通过向 ROS 主题“cmd_vel”发布仅角速度来确定β角,并且当根据目标角度角度角度正确时,我们再次向同一主题发布仅线速度,直到到目标的距离接近于零。我们使用比例控制器,所以给机器人的速度乘以两个常数,一个是角速度,一个是线速度。

第二个目标——避开障碍

1.障碍物检测

障碍检测模块正在使用输入图像,并将其切割成与机器人大小相同的方块。这样,我们就有了一个数组,里面有机器人能完成的所有可能的动作。为了区分障碍物,这意味着如果图像中有一个障碍物——一个红色的盒子——机器人就不能移动到那里。

然后,我们对图像的每个框进行迭代,并将该框转换为 HSV。接下来,如果该框包含红色范围内的任何像素,我们将对图像进行遮罩,并对输出应用按位遮罩。如果盒子包含红色像素,我们假设它是一个障碍。

这一步的输出是一个长度等于盒子数量的单向数组,它包含 0(没有障碍物时)和 1(有障碍物时)。

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

障碍地图,作者提供的图像

2.使用 A-star 算法寻找最短路径

使用上一步的障碍地图阵列,我们实现了路径规划模块,以获得机器人应该移动的最短路径,从而更快地进入目标。

这是一个基于图的算法,使用启发式方法来获得更好的性能。其核心是 f = g + h,其中:

  • f 是总成本
  • g 是当前节点和起始节点之间的距离。
  • h 是启发式的,即从当前节点到结束节点的估计距离。

阅读下面的文章了解更多信息。

3.估计中点姿态

最短路径包含一些中间点,机器人应该在不与障碍物发生任何碰撞的情况下更快地找到目标位置。

这里,我们面临一个问题,因为我们只有这些中间点的索引。因此,我们决定根据我们的框式框架将这些索引转换成像素。使用它们的角,我们计算它们的姿态,就像我们使用函数cv2.aruco.estimatePoseSingleMarkers计算 aruco 标记的姿态一样。

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

中点姿势,作者图片

4.绘制最短路径

然后,我们查看障碍地图,并在图像上画出我们在前面步骤中计算的最短路径的每个中点。

这是最终的地图,其中蓝色的零表示机器人有有效的移动,浅蓝色的 X 表示有障碍,橙色的圆圈表示最短的路径,粗体白色的 S 和 G 分别表示路径的起点和目标点。

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

最终地图,图片由作者提供

5.在每个中间点上移动

每次执行on_receive_image回调时,我们的控制器都会接收当前的姿态向量。如前所述,它计算齐次矩阵,并将其保存为类变量self.current_homogeneous_matrix

对于每个中间点,控制器接收相同的向量并更新列表target_position_path类变量。当这个列表没有值时,机器人不会移动,因为它不知道去哪里。当接收到一些值时,它计算这个特定中点的齐次矩阵,并将其保存为类变量self.target_homogeneous_matrix

通过固定角度,然后移动到中点,机器人现在可以在target_position_path列表中指定的每个中点上移动。当机器人接近中点并且距离误差很小时,我们得到列表的下一个元素(中点),并继续移动直到列表为空!

第三个目标——停车

1.计算β欧拉角

在控制器move_robot上,有两个循环用于执行前面的步骤(固定角度,向前移动)。出于停车的目的,我们需要添加另一个循环,该循环仅在机器人位于目标位置时执行,该循环的目的是固定相对于指定目标姿态的最终角度。

我们需要额外代码很简单:

rotational_matrix = np.array([
            [t[0][0], t[0][1], t[0][2]],
            [t[1][0], t[1][1], t[1][2]],
            [t[2][0], t[2][1], t[2][2]],
        ])

r = R.from_matrix(rotational_matrix)
self.beta = r.as_euler('XYZ', degrees=False)[2]

我们将旋转矩阵转换为欧拉角,我们接收一个向量[x,y,z]并得到第三个值,因为我们只需要 z 角,我们将它保存为类变量 beta。

2.移动机器人以修正角度误差

最后,我们公布所需的角速度,机器人确定β角!

演示

执行 Roscore:

roscore

启动摄像机

roslaunch ueye_cam rgb8.launch

远程监控,了解更多详情点击此处:

ssh ubuntu@192.168.0.200

关于 turtlebot 运行,更多详情请点击此处:

roslaunch turtlebot3_bringup turtlebot3_robot.launch

在远程计算机上启动我们的实现:

roslaunch visual_servoing visual_servoing.launch

项目的 GitHub 链接

我的 LinkedIn 账户

Python 和数据科学的 Visual Studio 代码?你必须拥有的前 3 个插件

原文:https://towardsdatascience.com/visual-studio-code-for-python-and-data-science-top-3-plugins-you-must-have-c39bb6ed8355?source=collection_archive---------5-----------------------

是 Python 和数据科学最好的代码编辑器吗?

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

照片由克里斯蒂娜·莫里洛佩克斯拍摄

您是否正在努力寻找一个适合 Python 编程和数据科学的最佳代码编辑器?你并不孤单。有大量的选项可供选择——既有免费的也有付费的——今天我将向你展示我最喜欢的免费选项。

这是 Visual Studio 代码——微软的一个完全免费的代码编辑器。这是迄今为止我发现的最灵活、功能最丰富的代码编辑器。它甚至比 PyCharm 社区有更多的功能,py charm 社区应该是一个专业的 IDE。甚至不要让我开始使用 Jupyter——这可能是写笔记本的最好方法,但是对于数据专业人员来说,光有笔记本是不够的。

今天,您将看到我为 Python 编程和数据科学设置 VSCode 的常用方法。我们将从安装开始,从那里开始浏览插件。

不想看书?请观看我的视频:

下载并安装 Visual Studio 代码

前往 code.visualstudio.com下载 VSCode。网页会自动检测你的操作系统,所以你只需要点击蓝色的下载按钮:

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

图片 1 — Visual Studio 代码主页(图片由作者提供)

在 Mac 上,它会下载一个 ZIP 文件,你可以提取并拖动应用程序到应用程序文件夹。在 Windows 上,我假设您需要打开。EXE 文件,然后点击几次 Next,对于 Linux,它可能是一个终端命令或 DEB 文件。

一旦启动它,您应该会看到以下内容:

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

图片 2 — Visual Studio 代码(图片由作者提供)

您可以通过打开机器上的任何文件夹,右键单击左侧边栏并选择新文件来创建 Python 文件。我在桌面上创建了一个文件夹,里面有一个main.py文件:

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

图 3-在 VSCode 中创建 Python 脚本(图片由作者提供)

默认情况下,您不会有最好的调试选项,也不会有智能感知。您也无法选择虚拟环境。解决这个问题又快又简单。你只需要安装一个插件。但是让我们先解决一些更紧急的事情。

下载主题(可选)

在 VSCode 中,我喜欢做的第一件事是更改主题。与 Python 和数据科学无关,所以你要么跳过这一节,要么把它当作加分项。

默认的主题对我来说太微软化了。要更改它,你可以点击扩展标签并搜索主题。我特别喜欢 One Dark Pro 主题,它是免费的,尽管上面写着 Pro :

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

图 4 —一个深色专业主题(图片由作者提供)

点击主题并点击安装按钮。默认皮肤对我来说有点太浅了。在 Mac 上,你可以按 CMD+K CMD+T 打开主题下拉菜单。我最喜欢的是 One Dark Pro Darker :

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

图 5 —使用自定义主题(作者图片)

好多了,不是吗?接下来让我们处理扩展。

官方 Python 扩展

如果你想使用 Python,这是必须的。再次进入扩展选项卡,搜索 Python 。您应该安装微软的官方扩展:

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

图片 6-官方 Python 扩展(图片由作者提供)

现在,编写 Python 文件将变得更加容易。您现在还可以选择一个虚拟环境,这是您每天都要做的事情。点击左下角的文本 Python 3.9.7 64 bit (至少在我的机器上)并选择你想要的任何环境:

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

图 7 —选择虚拟环境(图片由作者提供)

你知道最棒的是什么吗?您可以立即开始使用 Jupyter 笔记本电脑工作!创建一个.ipynb文件来验证——它可能会提示您安装一些额外的依赖项,所以只要同意所有的东西就行了。

安装后,您可以在单元格中输入 Python 代码来验证一切正常:

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

图 8 —测试 Jupyter 笔记本电脑(图片由作者提供)

就这样——您现在已经安装了基础,因此您可以通过脚本或笔记本使用 Python。接下来让我们添加一些额外的功能。

Python 文档字符串生成器

编写好的 Python 代码的一个基本技巧是文档。VSCode 可以帮你做到这一点。你需要做的就是安装Python Docstring Generator扩展。

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

图片 9 — Python 文档字符串生成器扩展(图片由作者提供)

让我们看看它是如何工作的。您将编写一个对两个整数求和的虚拟 Python 函数:

def add(a: int, b: int) -> int:
    return a + b

main.py里面写函数:

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

图 10-虚拟 Python 函数(图片由作者提供)

现在,您可以通过在函数声明下面写三个双引号并选择生成文档字符串选项来添加文档字符串:

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

图 11 —文档字符串生成器(图片由作者提供)

它会立即为您编写样板文件:

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

图 12 — Docstring 样板文件(作者图片)

您现在所要做的就是编辑描述和每个参数的作用:

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

图 13 —编辑文档字符串(作者图片)

这比从头开始编写所有内容要容易得多。也许你看不到好处,因为我们只有一个函数,但是想象一下你有多个 Python 模块,每个模块有几十个函数——那么这个扩展是一个巨大的时间节省。

蟒蛇绒

最后,我想讨论一下林挺。您可以在 VSCode 中启用林挺来自动告诉您是否没有遵循 Python 约定。它会告诉您是否有未使用的导入、变量,或者您的代码中是否有需要改进的地方。

首先,打开命令调色板(设置—命令调色板…或按 SHIFT + CMD + P)并输入 Linter 。选择选择棉绒选项:

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

图 14-选择 Python linter(图片由作者提供)

PyLint 是最受欢迎的一个,点开就行了:

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

图 15 —棉绒选项(图片由作者提供)

如果还没有安装 PyLint,它会要求您安装它。您必须对每个虚拟环境重复这一过程,因此请记住:

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

图 16 —安装 PyLint(图片由作者提供)

现在让我们删除add()函数,探索一下 PyLint 提供了什么。您将导入jsonrandom模块,并打印一个 1 到 100 之间的随机整数:

import json 
import random

print(random.randint(1, 100))

它应该是这样的:

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

图 17-警告信息(1)(图片由作者提供)

一旦保存文件,您就会看到警告消息。print语句报错是因为它后面没有新的一行,但这是一个快速解决方法——只需在行尾按 Enter 键。

顶部的 import 语句带有下划线,因为我们在顶部没有文件级的 docstring,所以让我们快速编写一个:

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

图 18-警告信息(2)(图片由作者提供)

如果保存文件,警告不会消失。它现在抱怨你已经导入了json,但是没有在文件中使用它:

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

图 19-警告信息(3)(图片由作者提供)

删除未使用的导入后,该消息将消失。

总而言之,linters 可以帮助您编写更好的 Python 代码,并确保您遵循所有的约定。如果 linter 向您发出警告消息,您的代码仍然会运行,但是查看这些消息很烦人,所以当它们出现时,您可能会处理它们。

今天就到这里。我在 VSCode 中的 Python 和数据科学设置有些简单,但它完成了工作。

你最喜欢的 Python 和数据科学的 VSCode 扩展有哪些?请在下面的评论区告诉我。

喜欢这篇文章吗?成为 中等会员 继续无限制的学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@radecicdario/membership

保持联系

Visual Studio 代码现在可以作为 Web 应用程序使用。你应该关心吗?

原文:https://towardsdatascience.com/visual-studio-code-is-now-available-as-a-web-app-should-you-care-eb0a7f2766e6?source=collection_archive---------3-----------------------

意见

这让 Python 程序员和数据科学家非常失望——原因如下

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

照片由韦斯·希克斯Unsplash 上拍摄

Visual Studio 代码是我最喜欢的 Python 编程和数据科学的代码编辑器。对于任何数据科学工作流来说,它都是一把瑞士军刀,因为它支持 Python 文件、笔记本、远程连接和几乎任何你能想象到的东西。此外,它是完全免费的。

微软最近决定把它带到网络上——这是一个大胆的举动,但我能看到开发者如何从中受益。对于数据科学家来说,这是一个完全不同的故事,因为它在当前的迭代中已经毫无用处。继续阅读,找出原因。

不想看书?请观看我的视频:

如何开始使用 VSCode Web

只需前往 vscode.dev 。一个熟悉的界面会立即出现:

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

图 1 — Visual Studio 代码 Web 界面(图片由作者提供)

在这里,您可以从您的机器上打开一个文件夹,也可以打开一个远程存储库。我在桌面上为这篇文章创建了一个专用的vscode_web文件夹,所以我选择第一个选项。

请记住 —你不能在 Safari 中打开本地文件夹,因为它还不被支持。一定要安装一个更消耗资源的网络浏览器。如果您发现另一个不受支持的浏览器,请告诉我。

假设您在受支持的浏览器中,您可以毫无问题地打开本地目录:

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

图 2 —在 VSCode Web 中打开本地目录(图片由作者提供)

好了,我们可以走了!在开始扩展之前,让我们创建一个 Python 文件。我给我的取名main.py:

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

图 3-在 VSCode Web 中创建 Python 文件(图片由作者提供)

这基本上涵盖了好的部分。对于 Python 程序员和数据科学家来说,事情从此开始走下坡路。

面向 Python 和数据科学的 VSCode Web 扩展

VSCode 就像没有扩展的记事本一样有用。目前,VSCode Web 的可用扩展数量令人失望。作为一名数据科学家,你可能找不到你想要的东西。

先说微软官方的 Python 扩展。您可以安装它,但它会立即警告您该扩展在 VSCode Web:

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

图片 VSCode 的 Python 扩展(图片由作者提供)

然而,你可以安装它没有任何问题。它增加了智能感知、林挺、代码格式化和任何你能想到的 web 应用。

如果你不会运行 Python 代码,那么写 Python 代码就毫无意义。 Visual Studio 代码 Web 不包终端支持。不容易消化但是可以理解。出于显而易见的原因,向 web 应用程序添加终端并不容易。

一个可能的解决方案是安装代码运行器扩展。它向 Python(和其他)文件添加了一个按钮,允许您运行代码。问题是——不支持扩展:

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

图 5 —不支持的扩展(图片由作者提供)

这意味着您被困在一个无法运行的 Python 文件中。您可以创建 Python 文件,并随意编辑它们,但仅此而已。

我现在看到的唯一选择是创建一个 Jupyter Notebook 并交互执行代码。我给我的取名为nb.ipynb。这又是一件令人失望的事情,因为你不能创建一个新的代码单元或者改变 Python 内核。猜猜为什么不支持 Jupyter 扩展:

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

图 6 —没有 Jupyter 支持(图片由作者提供)

总结一下,你能做的不多。在这一点上,我找不到任何值得谈论的好处。也许将来事情会有所改变,但不能保证。

我们可以花更多的时间来测试与远程机器的连接等等,但是如果连最基本的东西都不能用,那还有什么意义呢?

结论

如果您希望作为 Python 程序员或数据科学家使用 Visual Studio Code Web,您没有太多选择。您可以创建 Python 文件,并在适当的智能感知和林挺中享受,但这几乎概括了您的选择。您不能管理虚拟环境、调试代码、通过扩展或终端运行 Python 文件,甚至不能在 Jupyter 笔记本上运行代码。

简而言之,只需在本地安装 VSCode,目前使用 web 版本没有意义。也许未来的版本会扩展功能并增加对额外扩展的支持,但是谁知道呢。这肯定会是一个可喜的变化。

*你作为 Python 程序员或者数据科学家尝试过 VSCode Web 吗?你有什么想法?*请务必在下方评论区分享。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

https://medium.com/@radecicdario/membership

保持联系

可视化与熊猫和 Plotly 意甲(足球联赛)数据

原文:https://towardsdatascience.com/visualise-serie-a-football-league-data-with-pandas-and-plotly-3d26bcf26f2d?source=collection_archive---------28-----------------------

上次我用意甲数据比赛,试图了解更多关于米兰德比的信息。然后我想对数据做更多的探索,这样我可以更好地了解球队在意甲的表现。作为数据可视化的忠实粉丝,饼状图、树状图、线图和条形图都被采用。

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

托马斯·塞勒在 Unsplash 上的照片

先决条件—软件包

本次分析使用的包有:熊猫用于数据清洗; glob 用于数据合并; numpy 用于数据过滤和分组; plotly.express 用于数据可视化

import pandas as pd
import glob
import numpy as np
import plotly.express as px

步骤 1 获取数据、导入数据和合并数据

当前分析中使用的数据来自 ka ggle(https://www.kaggle.com/massibelloni/serie-a-19932017)。我下载了 1993 年到 2017 年的所有意甲数据,保存到本地文件夹。

path = r'....(your local folder)\SerieA'
all_files = glob.glob(path + "/*.csv")table = []for filename in all_files:
    data = pd.read_csv(filename, index_col=None, header=0)
    table.append(df)frame = pd.concat(table, axis=0, ignore_index=True)

由于分析仅使用了前七列的数据,因此选择了这些列:

df = frame.iloc[:,0:7]

现在数据帧看起来像这样:

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

图 1 :测向头(10)

步骤 2:根据可视化需要添加列

为了更好地显示,基于当前数据框添加了一些列:

### To identify the winner of each match: if "H"- the home team was the winner, if "A" the away team was the winner, else draw:df['Winner'] = np.where(df['FTR'] == 'H',df['HomeTeam'],
                          np.where(df['FTR'] == 'A', df['AwayTeam'], "Draw"))### To identify the result of each match: whether the home team won, the away team won, or drew:df['Result'] = np.where(df['FTR'] == 'H','HomeTeamWin',
                          np.where(df['FTR'] == 'A', 'AwayTeamWin', "Draw"))### To identify how many goals did the winner had:
df['Result'] = np.where(df['FTR'] == 'H','HomeTeamWin',
                          np.where(df['FTR'] == 'A', 'AwayTeamWin', "Draw"))### To get the "Year" of each match:
df['Year']=pd.DatetimeIndex(df['Date']).year### To get the total number of goals in each match and the goal differences:
df['TotalGoal'] = df['FTHG'] + df['FTAG']
df['GoalDif']= df['FTHG']- df['FTAG']

包含更多列的数据框如下所示:

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

图二:测向头(10)

视觉化

饼图 I

首先,我想知道的基本信息是,在意甲联赛中,赢一场比赛和平局的比例是多少;谁更有机会赢得这场比赛——主队还是客队:

为了获得这种可视化,在应用 plotly.express 之前,我首先对“结果”进行分组:

### Group the data by Result:
general = df.groupby('Result')['Result'].count().reset_index(name = "count")### Apply px.pie:
fig1 = px.pie(general, values ='count', names ='Result', title='Serie A - results from 1993 - 2017', color = 'Result',
             color_discrete_map={'HomeTeamWin':'royalblue',
                                 'AwayTeamWin':'orangered',
                                 'Draw':'lightgreen'})### Add text and define text information:
fig1.update_traces(textposition='inside', textinfo='percent+value')
fig1.show()

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

图 3 :饼状图一——赢/平比例

这张图表清楚地表明,近 70%的比赛都有赢家,而且主队比客场更有可能获胜——我认为这就是所谓的——主队优势

饼图 II

我真正感兴趣的另一件事是哪支球队赢得了最多的比赛,排名是怎样的:

### Group by Winner 
teamresult = df.groupby('Winner')['Winner'].count().reset_index(name = "Count")### Drop the results which were "Draw" as this data was not required for the visualisation
teamresult = teamresult[teamresult.Winner != 'Draw']### Visualisation
fig2 = px.pie(teamresult, values = 'Count', names = 'Winner', title = "Serie A Result from 1993 - 2017 - Most Win Team", color = 'Winner', color_discrete_sequence=px.colors.qualitative.Light24)
fig2.update_traces(textposition='inside', textinfo='percent+label')
fig2.show()

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

图 4 :饼状图一 I——最多胜队比例

有趣的是,尤文图斯比其他球队赢得了更多的比赛,紧随其后的是国际米兰。

旭日图

我在 PowerBI 可视化中经常使用的一种奇特的图表是旭日图。在这个想象中,我想知道从 2012 年到 2016 年,哪支球队每年赢得更多的比赛。

### To remove "draw" results and filter the year between 2012-16
sun = df[(df.Winner != 'Draw') & (df.Year.between(2012,2016))]### Group results by Year & Winner
sun1 = sun.groupby(['Year','Winner'])['Winner'].count().reset_index(name = "Count")### Sunburst chart visualisation
fig3 = px.sunburst(sun1, path=[ 'Year','Winner'], values='Count')
fig3.update_traces(textinfo = 'label + value')
fig3.show()

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

图 5 :旭日图——团队年度冠军

树形图

另一种形象化比例的方法是树形图,我发现这种方法非常方便且易于理解。下面是一个使用树形图直观显示团队获胜总数的示例:

### Remove the results which were "draw"
treemap = df[(df.Winner != 'Draw')]### Group data by Team
treemap1 = treemap.groupby('Winner')['Winner'].count().reset_index(name = "Count")### Visualise the data with treemap
fig4 = px.treemap(treemap1, path=['Winner'], values='Count'
            )
fig4.update_traces(textinfo = 'label + value')
fig4.show()

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

图六:树状图——最多获胜的队伍

如您所见,treemap 是一个非常好的图表,可以显示不同项目之间的比例和比较。尤其是当你比较许多项目时,饼图可能会受到文本/注释空间的限制,treemap 提供了一种更好的方式来呈现这些信息。

折线图

为了进一步探索这些数据,我想创建一个折线图,显示每年的总目标:

### Group total goals by year
total_goal =df.groupby('Year')['TotalGoal'].agg('sum').reset_index(name = 'Sum')### Remove the data for 1993 and 2017 as it seemed that the data for those years were not complate
total_goal = total_goal[(total_goal.Year != 2017) & (total_goal.Year != 1993)]### Visualise by line chart
fig5 = px.line(total_goal, x = 'Year', y = 'Sum', title = 'Total Goals by Year',
              line_shape = 'spline')
fig5.show()

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

图 7 :折线图——总目标

条形图

我想知道的另一件事是,作为主客场球队,球队的表现有什么不同。当他们是主队时,他们进了更多的球吗?

### Number of goals for hometeam
test1 = df.groupby('HomeTeam')['FTHG'].agg('sum').reset_index(name = 'HomeSum')
test1 = test1.rename(columns={"HomeTeam": "Team1"})### Number of goals for awayteam
test2 = df.groupby('AwayTeam')['FTAG'].agg('sum').reset_index(name = 'AwaySum')
test2 = test2.rename(columns = {'AwayTeam':'Team2'})### Merge two dataframe
result = pd.concat([test1, test2], axis=1)
dt = result.drop(['Team2'], axis=1)### Visualise the chart
fig6 = px.bar(dt, x = "Team1", y =['HomeSum','AwaySum'], title = 'Goals by Home & Away')
fig6.show()

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

图 8 :条形图——主场/客场进球

看起来球队在主场比赛时更有可能进球。

每个队的总目标是什么?

### Total goals by each team
dt['Total'] = dt['HomeSum']+dt['AwaySum']### Rename column
dt= dt.rename(columns={'Team1':'Team'})### Bar chart visualisation
fig6 = px.bar(dt, x='Team', y='Total', text = 'Total', color = 'Total',
              color_continuous_scale=px.colors.sequential.Viridis)
fig6.update_traces(textposition='inside')
fig6.show()

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

图 9 :团队总目标

令人惊讶的是,罗马在那些年里有超过 1500 个进球,尽管这支球队赢得了一次联赛冠军。

总而言之

我喜欢图表讲述意甲历史的方式!

用 Python 可视化全球人口数据集

原文:https://towardsdatascience.com/visualising-global-population-datasets-with-python-c87bcfc8c6a6?source=collection_archive---------17-----------------------

Python 实践教程

由面 shapefiles 限定的地理空间栅格和矢量数据集的汇总统计数据

这项工作完全使用公开可用的数据完成,并与Kai Kaiser合作完成。所有错误和遗漏都是作者的。

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

美国宇航局在 Unsplash 拍摄的照片

关于人口分布的地图信息对于地球上不同国家背景下的一系列公共政策问题至关重要。掌握人口的地理分布及其主要特征的能力是衡量遭受灾害和气候变化影响的程度以及获得健康、环境和土地使用压力等关键服务的机会差异的一个组成部分。无论是出于规划、预算还是监管目的,足够精细和及时的人口数据对于更加循证的决策都是必要的。

新一代高分辨率人口估计计数图层将对公共部门决策做出越来越大的贡献,特别是在发展中国家。制图层依靠非传统的数据收集方法,包括使用卫星图像。因此,他们可以提供分辨率低至 30 米的地球上任何网格单元的人口估计。他们的最新更新可以通过应用程序编程接口(API)在线访问,这使他们成为数据驱动型决策者潜在的非常有价值的资产。

这些高分辨率人口地图解决了传统行政或统计人口普查数据的一些关键局限性。人口普查数据通常缺乏频繁更新,大多数国家大约每十年才更新一次。它们通常以表格管理分类的形式呈现,与更细粒度的基于网格的层相比,这限制了分析和可视化选项。家庭一级的人口普查数据很少在地理参照的基础上收集,或在这一级披露。国家和国家以下各级政府维持的出生和死亡行政登记册也不总是可靠或更新的,特别是在低收入和中等收入国家。

脸书研究高分辨率定居层(HRSL)和 World Pop 等数据集采用新一代高分辨率人口估计技术,可随时用于一系列描述性和规范性分析。

WorldPop 项目于 2013 年启动,目标是提供人口和人口统计数据集的开放访问,以支持发展、灾难和健康应用。它整合了在小区域进行的邻里级微观人口普查调查以及国家级卫星图像和数字制图。简而言之,WorldPop 利用机器学习建模(随机森林)从相对稀疏的微观人口普查数据中推断出高分辨率的国家人口估计值(包括预测未调查地区的人口),并从 2000 年到 2020 年(截至 2020 年 11 月)每年提供**。网格化人口数据或光栅图像的空间分辨率详细到 3 弧秒(赤道约为100 米)。这种高分辨率人口统计估计数的时间可用性使得确定国家和区域两级的人口增长和动态更加容易。**

另一个这样的合作是脸书与国际地球科学信息网络中心(CIESIN)的合作,使用人工智能从卫星图像中识别建筑物,并以 30 米的分辨率估计人口。在国家一级也进行了调整,以使普查人口与联合国估计数相匹配。这些调整是为了配合联合国对 2015 年和 2020 年国家人口的估计。

在实践中,决策者可能还不太熟悉如何获取、分析、应用并最终采用这些数据来进行决策。更加熟悉也将有助于他们了解这些新数据资源的可能优势和应用,以及它们在决策方面的局限性。

为了支持基于数据和数据驱动的决策,在线 Jupyter 笔记本 Python 环境( JPNEs )允许以可访问和可复制的方式实现数据分析和可视化。

JNPEs 集成了编程代码、直观描述以及数字和视觉输出(cite)。当在线实施时,它们不需要用户安装或下载任何本地软件。JPNE 不仅在交付工作方面非常强大,而且最重要的是促进了领域和公共部门专家与数据科学家之间的密切合作。

在这篇博客中,我们用 Python 在一个 JPNE 中探索了 WorldPop 人口统计(以 tif 文件下载的 100m 分辨率的栅格格式)和来自脸书的高分辨率人口密度地图(矢量格式,以 30m 分辨率下载的 csv )并可视化了越南不同行政单位的人口统计。

为了提取不同行政单位的估计人口数量,我们还需要将越南的数字边界表示为 shapefiles(一种简单的非拓扑格式,用于存储表示为面或区域的要素的几何位置和属性信息)。

因此,这项分析需要三个数据集——来自 WorldPop 和脸书的人口数据,以及来自 GADM 的行政边界数据。分析包括 4 个步骤-

  1. GADM 加载并浏览行政边界数据
  2. WorldPop 加载、浏览和可视化人口数据
  3. 脸书加载、探索和可视化人口数据
  4. 比较和总结结果

从 GADM 加载并浏览行政边界数据

全球行政区域数据库 GADM是一个高分辨率的国家行政区域数据库,最新版本划定了 386735 个行政区域。越南的国家级数据已下载,并生成了一个具有以下结构的文件夹。

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

GADM 的文件夹结构(来源——作者)

文件的索引(0,1,2,3)表示边界可用的管理级别。

越南被划分为 58 个省和 5 个直辖市,由中央政府管理,总共有 63 个一级行政区。越南各省再细分为二级行政单位,即区、省辖市和区级城镇。城市又分为农村地区、区级城镇和城市地区,城市地区又分为选区。因此,GADM 的数据包括 686 个二级单位和 7658 个三级行政单位。

gadm 造型文件用 geopandas 读取。

vietnam_administrative_boundaries = geopandas.read_file('Data/gadm36_VNM_shp/gadm36_VNM_3.shp')vietnam_administrative_boundaries['NAME_0'].unique()
**> Vietnam**vietnam_administrative_boundaries['NAME_1'].nunique()
**> 63**vietnam_administrative_boundaries['NAME_2'].nunique()
**> 686**vietnam_administrative_boundaries['NAME_3'].nunique()
**> 7658**

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

越南一级、二级和三级行政单位(资料来源——作者)

从 WorldPop 加载和浏览人口数据

我们从 WorldPop 下载了光栅格式的越南人口每像素(PPP)数据,分辨率为 100 米,调整后与联合国国家估计值相匹配。我们使用 rasterio ,一个 GDAL 和基于 numpy 的 python 库来读取作为 tif 文件下载的栅格数据。

vietnam_worldpop_raster = rasterio.open('vnm_ppp_2020_UNadj.tif')

栅格数据是任何像素化(或网格化)的数据,其中每个像素都与特定的地理位置相关联。像素值可以是连续的(例如高程)或分类的(例如土地利用)。地理空间栅格与数字照片的唯一不同之处在于,它伴随着将数据与特定位置联系起来的空间信息。这包括栅格的范围和像元大小、行数和列数及其坐标参考系统(CRS)。栅格数据集包含一个或多个称为波段的图层。例如,彩色影像有三个波段(红色、绿色和蓝色),而数字高程模型(DEM)有一个波段(保存高程值),多光谱影像可能有多个波段。

print('No. of bands:',(vietnam_worldpop_raster.count))
**> No. of bands: 1**

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

WorldPop 栅格图层-越南(来源-作者)

**# Calculating total population of Vietnam**worldpop_raster_nonzero = vietnam_worldpop_raster_tot[vietnam_worldpop_raster_tot>0]population_worldpop = worldpop_raster_nonzero[worldpop_raster_nonzero > 0].sum()print(round(population_worldpop/1000000,2),'million')
**> 97.34 million**

栅格图层给出了越南总人口9734 万。然后,我们使用从 GADM 文件中提取的多边形来遮罩此栅格图层,以识别越南 63 个省和直辖市(一级行政单位)中每个省和直辖市的人口数量。以下函数返回 vector_polygon 中栅格图层的人口数。

来源—作者

该代码通过添加一个名为 population_count_wp 的列来创建以下结果,该列包含基于 WorldPop 栅格数据的 ADM 级别 1 的人口估计值。然后,我们使用下面的代码片段,使用 Plotly Choropleth map 来可视化种群数量。

来源—作者

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

越南各城市的百万人口(资料来源-作者)

加载并浏览脸书的人口数据

脸书人口地图估计了居住在越南 30 米范围内的人口数量,该地图可以以 tif 文件或 CSV 文件的形式在 HDX 下载。由于我们对 tif 格式的 WorldPop 数据进行了预处理,我们在这里演示了以下列格式下载的 CSV 文件。

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

2021 年 11 月 11 日从 HDX 下载的数据(来源——作者)

CSV 文件包含截至 2015 年和 2020 年的纬度、经度和人口估计值。脸书的数据估计越南总人口为 9816 万。

为了使用 WorldPop 数据演示的地理空间工具和技术,我们需要将此数据框架转换为包含几何字段的地理数据框架。

然后,我们使用带有面的矢量图层的掩膜函数获得每个行政边界的人口数。

然后我们使用下面的代码绘制 choropleth 地图

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

越南各城市的脸书人口以百万计(资料来源-作者)

结论

现在在 JPNE 中预览了两个地图图层,我们现在转向通过大多数决策者熟悉的更熟悉的管理定义镜头来比较结果。为了做到这一点,我们可以用下面的散点图来显示世界流行与脸书结果的比较比率。一条 45 度线意味着任何给定地点的结果都是相同的。

在省/市一级,世界人口普查和脸书的人口统计显示出高度的相关性。

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

在第二个行政级别,特别是在平阳和胡志明市,与世界人口普查相比,脸书的人口数量相对较少。这是否是一个问题最终取决于所提的问题。JPNEs 允许快速查看使用一个数据源而不是另一个数据源对当前问题产生实质性影响的程度。

脸书和越南 ADM 二级世界流行人口计数之间的相关性(来源-作者)

平台(如 JPNEs)和数据(脸书研究 HRSL 和 World Pop)方面的数字技术发展为解决一系列政策问题提供了强大的组合。但这些需要领域专家(例如,规划、金融或卫生领域的政府官员)以及数据科学家(工程师/程序员)之间的实际协作。

这位从业者的博客是作为针对越南的 颠覆性公共资产治理技术(DT4PAG) 项目的一部分而产生的,该项目由世界银行在越南发起,得到了 瑞士国家经济事务秘书处(SECO) 的支持。

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

DT4PAG 提倡使用基于云的开源平台和数据,以及从业者通过技能建设进行学习。更好地为绿色、可持续发展提供信息。本说明中表达的观点是作者的观点,所有剩余的错误和遗漏都是我们自己的。

本教程的完整代码可以在GitHub repo*中找到。*即使您不是 Python 程序员,我们也希望这篇文章能让您直观地感受到利用这类数据进行新一代决策支持的可能性和过程。

时间序列数据中的可视化模式:2D 叠加图

原文:https://towardsdatascience.com/visualising-patterns-in-time-series-data-2d-overlay-plots-fb8920139044?source=collection_archive---------23-----------------------

如何为具有周期性的时间序列数据集创建漂亮的绘图

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

艾萨克·史密斯在 Unsplash 上拍摄的照片

什么是 2D 叠加图?

存在许多不同种类的时间序列数据,选择正确的方式来可视化它们并不总是简单的。具有周期性的数据尤其难以可视化,因为在许多情况下,由于单个图上的数据量巨大,周期性会丢失。

考虑到大多数人会发现很难识别一维照片上的任何东西,像素显示在一行中,这并不奇怪。然而,一旦像素以正确的二维格式重新排列,这个问题就神奇地消失了!

类似地,对具有周期性的数据应用简单的变换以使其二维化,通过以有助于人类理解的方式呈现数据,可以在可视化数据中固有的复杂模式方面创造奇迹。

有意地,我不会给你一个什么是 2D 叠加图的定义,也不会在这一点上给你看。我要做的是通过下面的一个例子一步一步地让你理解。

示例中的数据可能具有日、周和年模式。我希望你在每个情节前停下来,问自己以下问题:

  • 这个情节传达的最重要的东西是什么?
  • 该图显示的日、周和年模式有多清晰?

数据集示例

我们获得了一个数据集,其中包含 2018 年 1 月 10 日至 2019 年 4 月 31 日之间的 10,080 条记录。根据元数据,我们可以推断出,这些是整个供暖季期间建筑物内每半小时的内部温度读数。

对数据的初步观察

我们的第一直觉很可能是绘制随时间变化的值的传统方式,这产生了下面的图:

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

第一直觉:内部温度时间序列图(图片由作者提供)

通过观察该图,我们可以看到一些周期性:存在具有相对低δT 的日周期和在某些天具有较大δT 的周周期。年度模式(例如,周低点的最小值)不是很清楚。

请注意,在这一点上,这是对数据固有模式的一种相当模糊且不太有用的描述。我们认为有日模式和周模式,但我们不知道它们是什么。然而,这给了我们足够的时间继续下去,并指导我们的第二个直觉:由于数据集的值是建筑物的内部温度测量值,并且似乎存在日/周模式,因此建筑物可能有一个适当的供暖计划。

假设:如果这个数据集背后有一个驱动建筑热行为的供暖时间表,我们应该致力于展示供暖时间表,因为这是一个非常简单的概念。

可视化昼夜模式

我们决定下一步把重点放在观察昼夜模式上。一种方法是绘制数据,x 轴是一天中的时间,而不是完整的时间戳,包括日期(这是我们在第一次直觉中所做的)。我们的绘图仍将是二维的(x:一天中的时间;y: value ),各个日期相互重叠。要做到这一点,我们需要两个简单的转换来预处理数据。

首先,我们需要透视数据,以便时间戳的日期部分保存在索引中(即一条记录保存一天的信息),时间戳的时间部分保存在标题中(即列名)。

第二,我们需要转置数据,因为默认情况下,单个字段会覆盖在图上,我们希望单个记录(即天数)被覆盖。

(您可能想知道,如果我们在接下来的步骤中需要转置数据,为什么要首先转置“错误的方式”。这样做的原因是为了遵守数据集结构的最佳实践:这样,如果我们向透视数据帧添加额外一天的测量值,我们将添加一条新记录,而不是一个新字段。)

支持 Matplotlib 的 Pandas 非常擅长制作简单的数据帧图,因此我们可以依靠它来制作我们的第一个尝试 2D 叠加图。

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

首次尝试显示日变化模式的 2D 叠加图(图片由作者提供)

让阿尔法正确

这看起来不太好,因为在图中有实心块,在那里不能跟随单独的线。这里的关键是向绘图传递一个自定义的透明度值,使单独的线条可见,并且在绘图变得非常繁忙时不会饱和。Matplotlib 使用 alpha 透明度,0.0 表示完全透明,1.0 表示完全不透明。在这种情况下,10%的 alpha 就很好了。

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

2D 叠加图显示自定义 alpha 的日变化模式(图片由作者提供)

整合领域知识

我们可以看到,从供暖系统的角度来看,18:00 对应于大多数日子的“供暖日”的开始。在这个时间之后的任何点,供暖系统可以决定开始预热建筑物,以在供暖计划的下一点达到所需的状态。

依靠我们的领域知识,我们正在将生成数据的系统的视角整合到我们希望查看者拥有的视角中。

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

2D 叠加图显示了以 18:00 作为“供暖日”开始的日变化模式(图片由作者提供)

添加更多模式与保持清晰

改变一天的开始时间对剧情的清晰度有很大的改善。然而,在这个情节上仍然有许多事情在进行,我们将努力使它变得更清楚。

这里我们要做一个重要的决定:我们要强调数据中的周和/或年模式吗?我们应该只选择周模式,原因如下:

  1. 供暖时间表每周确定一次
  2. 第一步的数据没有明确的年度模式
  3. 我们需要保持清晰:试图想象年度模式和周模式,我们会牺牲理解的容易性

抛弃这个维度伴随着责任:我们需要意识到这个决定,如果必要的话,我们必须能够在以后调查它。

可视化每日和每周模式

在对一周中的几天进行了几次颜色编码试验后,我们得出了下面的颜色方案。请注意,虽然我们保留了关于周模式的信息,但我们丢失了关于年模式的信息:例如,我们知道蓝线代表星期一,但我们不知道哪条蓝线对应于一年中的哪一个星期一。

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

每日和每周的模式清楚地描述了供暖时间表(图片由作者提供)

如果你认为这不再是 2D 的情节,因为我们使用颜色作为第三维度,你是非常正确的。这种绘图风格与我们通常认为的 3D 绘图是如此不同,以至于我可以称之为 2D 叠加图(有点欺骗)。

我认为我们已经成功实现了我们的目标:这张图片清楚地传达了以下供暖时间表:

  • 周日:未设定供暖时间表
  • 周一:与周二-周五相同,但预热时间更长
  • 周二至周五:09:00 至 18:00,21 摄氏度
  • 周六:14:00–16:00,21 摄氏度

此外,生成情节的代码非常简单:

摘要

  • 我们得到了一个数据集,乍一看,它显示了一些日周期和周周期。
  • 通过在预处理步骤中应用两个简单的变换,我们能够创建一个 2d 叠加图来呈现日变化模式。
  • 调整图的 alpha 值,并结合我们的领域知识来调整开始时间,使得图更加清晰。
  • 使用颜色,我们能够将每周的图案添加到可视化中。
  • 我们有意丢弃了关于年度模式的信息,但这是一个保持清晰的有意识的决定。

Github 示例

您可以在 github 上获得示例数据和示例笔记本:

https://github.com/czagoni/medium-visualising-patterns

感谢阅读!如果你喜欢这篇文章,你也应该看看:

https://medium.com/analytics-vidhya/data-driven-thermal-models-for-buildings-15385f744fc5

用交互式图形可视化相似性聚类

原文:https://towardsdatascience.com/visualising-similarity-clusters-with-interactive-graphs-20a4b2a18534?source=collection_archive---------2-----------------------

利用 Python、Plotly 和 NetworkX 创建交互式图形来查找相似性聚类

让我们假设,作为一个运行的例子,我的数据由英语的单词嵌入组成。我想获得关于嵌入空间中的单词分布的见解,具体来说,是否存在非常相似的单词的任何簇,是否存在与其余单词完全不同的单词,是否存在与每一个其他单词都非常相似的单词,等等。我想直观地获得这些见解,以便更容易理解并与同事分享。

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

互动工具,我们将创造这个职位。连接的节点表示样本相似度高于滑块值阈值。图片作者。

在这篇文章中,我将向你展示如何构建一个交互式可视化工具来获得关于你的数据相似性聚类的见解。有各种各样的问题需要对数据分布有直观的理解。以一种互动的方式(在这个例子中,关于样本相似性)可视化这种分布可以给你这种直觉。此外,它还是向他人展示结果的一个很好的工具

这是一篇非常实用的文章,因此,我将会更加精确地讨论构建细节。我提出的实现完全依赖于 PlotlyNetworkX

这篇文章分为四个部分:

  1. 样本相似性
  2. 图形构建
  3. 用 Plotly 绘制图形
  4. 交互实现

1)样本相似性

重要的事情先来。我们希望深入了解样本相似性聚类,因此,我们需要首先计算每个样本与其他每个样本的相似性

您可以使用任何最适合您的数据的相似性度量。ideia 总是相同的:具有非常相似的特征向量(在我的例子中是嵌入)的两个样本将具有接近 1 的相似性得分。这些向量越不同,相似性得分就越接近于零。对于我的运行示例,我将使用余弦相似度

从一个任意长度的 N 单词嵌入数组开始,我创建了一个维度为 N x N 的相似性矩阵,它指定了每对数据样本之间的相似性。在我运行的例子中,我有 78 个单词嵌入,每个对应一个不同的单词。

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

相似度得分热图:越亮得分越高(词对越相似)。图片作者。

2)图形构建

给定一个相似矩阵,使用 NetworkX 用图表示它是非常容易的。我们只需要将矩阵输入到构造函数中。

我们的图将有 N 个节点(每个节点对应于我们数据中的一个样本,在我的例子中是单词),以及 N * N 条边代表每对单词之间的相似度。有 N^2 是因为每对节点都有相似性得分,即使它非常接近于零。边权重表示相似度得分。

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

图 G 的可视化,包含相似性分数大于 0 的每对单词之间的链接。图片作者。

以静态方式形象化这个图表不是很有见地,主要是因为每一对单词都是相互关联的。我们可以做的第一件事是删除所有权重非常接近于零的边,并再次可视化图形。这显然不足以洞察相似性聚类。接下来我们可以做的是在区间[0,1]中迭代定义一个递增的阈值,移除所有权重低于阈值的边,并可视化该图。然而,以静态方式反复绘制这些图表在视觉上一点也不吸引人,而且会使事情更难理解。

接下来的部分将向您展示如何在一个单独的交互式图表中绘制所有这些增加阈值的图表,在底部有一个相似性得分滑块。能够自由操作该滑块非常有助于提供关于样本相似性和可能聚类的新见解

3)用 Plotly 绘制图形

Plotly 是我们将用来创建我们的互动情节的框架。然而,到目前为止,它还不支持即插即用风格的图形绘制。为了避免这一点,我们将使用两种散点图来绘制我们的图形:一种用于节点,另一种用于边。

节点的散点图

这是一个简单的程序。给定一个 NetworkX 图,我们遍历所有节点并收集它们的 x,y 位置、颜色和文本(用于鼠标悬停信息),这些都将在后面的部分中定义。然后,我们简单地使用这些信息,通过 Plotly 的接口创建一个散点图。在 Plotly 的语言中,散点图被称为轨迹,我们将其返回以备后用。

边缘散点图

事情在这里变得有点棘手。我们需要为图中的每一条边创建一个轨迹。将一条边想象成一个散点图,其中两个点由一条直线连接。

因此,对于 NetworkX 图中的每条边,我们获得其两点的位置,并创建一个连接这两点的线图。我们将这条边的轨迹添加到边轨迹列表中,并返回整个列表供以后使用。

4)交互实现

我们就要结束了。现在我们知道了如何使用 Plotly 绘制图表,我们可以创建一个交互式滑块来指定最小相似性阈值,这样权重低于阈值的边就不会显示。

虽然实现起来很长,但是概念上非常简单。基本上,对于每个滑块值(也称为步长),我们用上一节中定义的例程创建一个完整的图形。我们在这里所做的是“预加载”每个滑块步长的每一个单独的图。因此,在图形的交互部分没有任何魔法:我们只是让一个特定的图形图形可见,而所有其他的图形对于每个滑块都是不可见的,创造出我们想要的幻觉。也是在这里,我们指定节点位置、颜色和文本。

最后,以交互方式绘制相似性聚类!

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

上面代码片段的输出(重复上面的 gif)。图片作者。

此外,当悬停在节点上时,您可以很容易地看到哪些单词属于哪个簇。在底部图像上显示的阈值中,人们可以立即看到“sharp”(左上)与任何其他单词都不够相似,而“arriable”(左下的 cluster)与许多单词相似,因此与许多节点有联系。

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

每个节点都标有单词名称的图表。将鼠标悬停在您的地块上以查看相同的文本。图片作者。

这就是如何创建一个交互式可视化工具来深入了解数据样本的相似性聚类。在结论性说明中,需要注意的是,这并不是为了相似性而严格定义的。您可以使用这个工具来可视化实体之间的任何类型的关系,只要用图形来表示它是有意义的。一个简单的例子是文档语料库中的单词共现。最后,通用方法并不严格适用于绘制图表:您可以使用散点图、条形图、饼图以及您可以想象的任何其他图表来创建交互图。重要的是它提供的交互性和解释的简易性。

可视化星际迷航人物互动

原文:https://towardsdatascience.com/visualising-star-trek-character-interactions-b337c6ca0afb?source=collection_archive---------31-----------------------

使用 NetworkxPyvis 、&、 Streamlit 创建网络仪表板

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

每部《星际迷航》系列的主要角色互动的频率(图片由作者提供)

你可能遇到过交互式网络图(如果没有,我会推荐 José Manuel Nápoles Duarte 使用这个应用程序)。你可能也遇到过总结电视/电影角色之间互动的网络图(一个例子是最近在 r/dataisbeautiful 上发布的)。但是你见过互动人物互动图形(ICIG)吗?嗯,我制作了这个仪表板,其中包含《星际迷航》系列中每一部的 ICIGs,本文的其余部分将解释关键步骤。

1.找到数据

经常检查别人是否已经为你做了工作

所有数据科学项目都是从数据采集开始的。经过一番搜索,我找到了一个网站,上面有我需要的东西,每一集《星际迷航》的脚本(不包括最近的系列),格式一致:

更重要的是,我甚至不用写脚本就可以从这个网站下载所有这些脚本。原来有人已经这样做了,并把它们都放在 Kaggle 上的 JSON 中:

https://www.kaggle.com/gjbroughton/start-trek-scripts

2.处理数据

总是检查你的输出是否通过常识测试

虽然《星际迷航》的每一个剧本都是伟大的文学作品,但我来这里只是为了冰冷的硬数据。我所关心的是两个字符有连续行的频率(这就是我如何定义这两个字符之间的一个“交互”)。

计算这个需要使用一些选择正则表达式来解析所有的抄本。这里有相当多的普通步骤,所以我只挑选几个处理步骤的几个例子:

从原始脚本到场景列表

又走了几步,我找到了一个包含每一行对话的数据框架,然后它可以被转换成一个包含每集角色之间互动次数的表格:

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

《星际迷航:原始系列》第一集的台词和互动

但是在我得到这个最终输出之前,我的解析代码经历了几次迭代。每次迭代之后,我都会看着输出,问自己一些问题,比如:

q)为什么有些剧集只有 30 行对白?(答:解析代码中有一个错误,需要更新)。

q)为什么有那么多场景只有 1 行对白?(答:解析代码中有一个错误,需要更新)。

问:为什么有少数几集的对话行数是平均水平的两倍?(答:部分笔录为两集)。

当输出看起来很奇怪时,大多数时候是代码有问题。

3.创建交互图

Networkx:自 2005 年以来创建 Python 网络图

现在我们有了数据,是时候开始制作交互图了。据我所见, Networkx 提供了用 python 定义图形的最直接的方法。

在下面的代码片段中,我们遍历每个字符,设置节点的属性以匹配我们希望该字符的节点如何显示。然后我们遍历交互表中的每个条目:

制作网络图

4.让它互动

Pyvis:用几行代码制作互动网络

没有理由不尝试 Pyvis(即使您和我一样,更熟悉 Networkx ),因为 Pyvis 可以直接从 Networkx graph 对象中读取。无论您向 Networkx 节点添加什么属性,都将被转移到这个 Pyvis 图中。值得一读的是 Pyvis 文档,看看所有可以设置的属性,尤其是关于物理引擎的。

一旦有了 Pyvis 对象,就可以直接生成一个在应用程序中使用的 HTML 文件(我已经使用过 Streamlit,下面会详细介绍):

Networkx -> Pyvis -> HTML

5.部署应用程序

Streamlit:将数据科学家转变为应用开发者

应用程序部署的平台即服务已经存在一段时间了(如 HerokuFirebase ),但是 Streamlit 使得构建和部署一个简单的单页应用程序变得非常快。对于想要成为应用程序开发人员但无法理解 Flask 的数据科学家来说,这是一个完美的解决方案!

Streamlit 提供了几个小部件,如选择框、复选框和滑块,可用于让用户轻松定制选项:

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

Streamlit 小部件:选择框(左),复选框和滑块(右)(作者图片)

这些小部件中的每一个都可以用一行代码添加(在下面的代码片段中,每个部件都被添加到侧边栏,因此使用了 st.sidebar ):

真的就这么简单!

最重要的是,Streamlit 将免费托管您的应用程序(前提是您乐于公开您的代码),这就是所需的全部内容:

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

Streamlit 应用部署流程(图片由作者提供)

最终的应用程序看起来像这样(并且包含一个额外的牛郎星)时间序列):

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

最终的应用仪表板是什么样子的(图片由作者提供)

看一下源代码

星际迷航互动角色互动图应用的完整代码可以在这个库中找到(其中包括一些额外的 HMTL 版本的互动图,每个图节点都是那个角色的图像):

用 Python 可视化 Dash 中的生命体征

原文:https://towardsdatascience.com/visualising-vital-signs-in-dash-with-python-978462b1fa1e?source=collection_archive---------26-----------------------

从表格到交互式图表

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

照片由马泰奥·富斯科Unsplash 拍摄

我清楚地记得我在 IC 部门担任 MD 期间,病人生命体征的图表。生命体征的图形表示有助于更好地了解幕后发生的事情。与其他工作环境中的生命体征快照相比,这些图表通常能更深入地了解患者的健康状况。

Dash 是一个 python 模块,正受到越来越多的关注。用<100 lines of code you can make remarkable beautiful and interactive charts. Dash creates a local server on your computer and the application you build can be accessed via your browser. By doing so you have a graphical user interface (GUI) that you can interact with within your browser. This saves you time in writing a whole user interface to control the functionality of a script or software package. Dash also has a steep learning curve, understanding how to get things done doesn’t take much time. Dash seems to be the perfect python package for data visualisations.

Let’s see if we can create a graphical user interface of the vital signs of a 模拟病人。实现这一目标的工作流程包括三个步骤。你得到数据,清理数据,然后展示金光闪闪的东西。由于 Dash,最后一个是最容易的,中间一个是最难的。完整代码在我的 Github 上。

我们使用 selenium 模块从虚拟患者那里获取数据,并创建了一个熊猫数据框架:

结果应该是这样的:

清洁

垃圾进,垃圾出。所以这里有几件重要的事情:

  • 我们不能在图表中使用血压测量值中的不适用值(例如— / -)。
  • 血压测量值中有文本(如 r.a. =右臂)。
  • 存在与正常值的偏差(饱和度 20 和呼吸频率 95 在第 5 行(索引 4)中切换)。`
  • 有错别字:372.0 应该是 37.2,问题是在患者档案中输入时使用了逗号而不是圆点。此外,第 6 行(索引 5)中的 7.4 可能代表 37.4。

我们用下面一行使用正则表达式的代码来解决(1)和(2)。关于正则表达式的更多信息,请参见科里·斯查费的教程:

对于血压列,唯一要做的是制作两个单独的列,一个用于舒张压,一个用于收缩压,这样我们就可以在图表中处理它们:

如果你打印出来,这个表看起来会像这样。您可以看到末尾有两个新列,仅显示数值:

第三点第四点,去除异常值,可以通过屏蔽和使用一些合理的值作为过滤器来实现。

你也可以考虑使用数学上更复杂的滤波器,例如 Savitzky-Golay 滤波器,来平滑数据,但在我们的例子中,这不是我们想要的:数据中的异常通常是警报信号,而不是噪音。

(英)可视化(= visualization)

我们用可视化软件包 plotly 创建一个图形对象:

为了在 Dash 中以图形显示我们的生命体征,我们需要安装一些软件包:

  • pip 安装仪表板
  • pip 安装仪表板-核心-组件
  • pip 安装仪表板-html-组件

我们通过使用 dash 核心组件“graph”来绘制图形。为此,我们提供上一节中的 graph 对象作为图形的变量:

结果如下图所示。现在,让我们想象患者在 2 月 7 日接受了美托洛尔(降压药),我们现在可以在图中看到,在 2 月 8 日收缩压有所下降,脉搏也从大约 90 次/分钟下降到 70 次/分钟,因此看起来干预起作用了:

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

在随叫随到的轮班期间,许多电话都集中在根据特定的温度是否隔离病人的问题上。如果您取消选择右侧的所有生命体征,只保留列表中的温度,您将更深入地了解温度随时间的变化。在 2 月 4 日,确定零下温度(= 37.5-38.4)变得很容易。这似乎可能是正常生理节律(生物可变性)或错误测量(测量可变性)的结果,因为在后续测量中,温度在正常范围内。像这样的可视化可以使围绕 covid 相关咨询的决策变得更容易。

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

这是一个快速简单的生命体征数据可视化。这当然只是一个例子。在像这样的东西在日常工作环境中可用之前,还有很多工作要做,但是我希望我已经向您展示了 Python 和 Dash 这两个兄弟是未来工作的两个很好的候选人…

Python 中的可视化和交互式仪表盘

原文:https://towardsdatascience.com/visualization-and-interactive-dashboard-in-python-c2f2a88b2ba3?source=collection_archive---------0-----------------------

我最喜欢的 Python Viz 工具——holo Viz

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

图片经许可来自 datashader.org

令我惊讶的是,许多数据科学家不知道 HoloViz 。HoloViz 是我最喜欢的 Python viz 生态系统,它由七个 Python 库组成——Panel、hvPlot、HoloViews、GeoViews、Datashader、Param 和 Colorcet。

我为什么爱 Holoviz?

HoloViz 允许用户用超级简单灵活的 Python 代码构建 Python 可视化和交互式仪表盘。它提供了在几个 API 后端中进行选择的灵活性,包括 bokeh、matplotlib 和 plotly,因此您可以根据自己的喜好选择不同的后端。另外,它是 100%开源的!

与其他 python viz 和 dashboarding 选项不同,HoloViz 非常认真地支持您可能想要使用 Python viz 或 app 工具的每一个合理的上下文:

  • 一本 Jupyter 笔记本,
  • 一个 Python 文件,
  • 生成 pdf 或 SVG 或 png 或 gif 的批处理作业,
  • 作为自动报告的一部分,
  • 作为独立的服务器,
  • 作为独立的。网站上的 html 文件。

每一种替代技术都很好地支持了其中的一些情况,但却忽略了其他情况。HoloViz 最大限度地减少了在所有这些环境之间切换的摩擦和成本,因为这是任何科学家或分析师的现实——只要你发布它,人们就希望改变!一旦你有了 Dash 应用程序;这就是你所拥有的一切,但是一旦你有了一个面板应用,你可以在第二天回到 Jupyter,从你离开的地方开始。

七个套餐是什么?

  • 面板 构建交互式仪表盘和应用。就像 R 闪亮,但更强大。我无法表达我有多爱 Panel。
  • 根据我的经验,hvPlot 比其他任何绘图库都容易,尤其是如果你喜欢绘制熊猫数据帧的话。只需一行代码,hvPlot 将为您提供一个包含所有您想要的内置功能的交互式绘图。
  • HoloViews 是通过可视化进行数据探索和数据挖掘的伟大工具。
  • GeoViews 绘制地理数据。
  • Datashader 处理大数据可视化。使用 Numba (Python 编译器)和 Dask(分布式计算),Datashader 可以非常快速地创建大型数据集的有意义的可视化。我绝对喜欢 Datashader,喜欢它所产生的美丽的情节
  • Param 创建声明性用户可配置对象。
  • 颜色创建颜色图。

我的 HoloViz 工作流程是什么?

我通常从熊猫数据帧或 Dask 数据帧开始。对于地理数据,我使用 GeoViews。大多数时候,我只用 hvPlot。然后,如果我需要绘制大数据(数百万/数十亿个数据点),我就用 Datashader 如果我需要不同的定制,我使用 Holoviews。然后,我可以在 Panel 中构建我的仪表板/应用程序。

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

HoloViz 工作流程(图片由作者提供)

一个非常简单的例子

正如您在下面看到的,通过几行代码,您可以获得一个交互式仪表板,它带有一个下拉菜单和一个用于绘图的滑块。

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

对于部署,我要么将仪表板直接输出为嵌入的 HTML 文件jupyter nbconvert YOUR_NOTEBOOK.ipynb --to html --no-input --no-prompt --stdout > output.html

或者我运行panel serve YOUR_NOTEBOOK.ipynbpanel serve YOUR_PYTHON_FILE.py将应用程序部署到服务器上的某个地方。

我希望 HoloViz 可以做得更好的事情有哪些?

我唯一希望 HoloViz 能做得更好的是图形设计。说实话,开箱即用的设计没有 Plotly 和 R 闪亮那么好看。然而,有一些模板和主题有助于设计,你可以随时创建自己的主题。awesome-panel.org 展示了许多令人惊叹的使用面板的仪表板设计。

我在哪里可以找到支持?

HoloViz 团队非常积极地回应他们的 Github 页面(https://github.com/holoviz)上的问题和功能请求。我在他们的 Github 上提交了许多问题和功能请求。他们还提供 T21 咨询服务。事实上,HoloViz 的大部分工作都是由一些关键的公司和机构资助的,他们已经与这些公司和机构建立了长期的合作关系。

推荐的学习资源

Pyviz.org很好地总结了所有的 Python 可视化工具和前景。

如果你有兴趣了解更多关于 HoloViz 的知识,这里有一些我喜欢的教程和讲座:

希望你喜欢使用 HoloViz!

作者索菲亚·杨 2021 年 8 月 11 日

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值