TowardsDataScience 博客中文翻译 2020(一百五十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

简而言之,击败时间序列预测

原文:https://towardsdatascience.com/beat-the-time-series-forecasting-in-a-nutshell-62ba31a3d00b?source=collection_archive---------17-----------------------

揭示时间序列的正确预测方法,表示时间序列的特征,并使用零售数据作为示例代码预测其未来值

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

来源:科学软件

1.定义时间序列

时间序列是与时间相对应的一系列数值,这是 a 序列与其他截面数据的最大区别。

零售数据、每日温度、产量、需求、自然储量都是时间序列数据,因为当前值取决于其历史值。

2.构成时间序列

时间序列有 4 个组成部分:水平、趋势、季节性和噪声。

  • 水平:时间序列的平均值
  • 趋势:序列值从一个周期到另一个周期的移动
  • 季节性:可以多次观察到的序列的短期周期性行为
  • 噪声:测量误差产生的随机变化

我们并不总是能够注意到噪音中的前三个元素,因为如果我们不使用一些技术来定位它们,它们通常是不可见的。

为了观察和识别这些成分的存在,我们可以考虑。

  • 绘制时间序列图(这是检测序列特征的最佳方式)
  • 放大指定较短时间段
  • 更改系列的刻度,以便更清楚地观察趋势
  • 抑制季节性:将时间序列聚合到一个更大的时间尺度(从每小时到每天,从每月到每年,等等。)

我用一家零售店 3 年的每周销售额作为例子。

plt.plot("Date", "Weekly_Sales", data=Wal_sales);
plt.hlines(y=Wal_sales.Weekly_Sales.mean(), xmin=0,
           xmax=len(Wal_sales), linestyles='dashed');

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

根据该数据,很明显有两个峰值,这表示在年末(可能是圣诞节和新年期间)有非常明显的季节性。可能有其他季节性,但很难从图上观察到。自相关可用于确认季节性。

3.自相关

自相关描述了时间序列的值与其邻居之间的联系。因此,为了计算自相关,我们计算序列与其滞后版本的相关性。

通过将系列值向前移动 n 个周期,从原始数据集产生 Lag-n 版本。例如,lag-1 向前移动 1 个周期,Lag-10 系列向前移动 10 个周期。

通过观察序列及其滞后的相关性,我们可以确认序列的季节性。

计算和绘制自相关的代码

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

  • 从上面的自相关图判断,在 lag-52 和 lag-51 中都有很强的正自相关。这意味着在年底会有一个周期性的年度模式
  • 第二个强相关性是 lag-1,它意味着二月的第二周,或情人节期间。
  • 自相关揭示了正的和负的自相关,这意味着序列不是在同一个方向移动,而是上下波动。

我从头开始计算,但是自相关可以通过使用 Python 中的 pandas.plotting 中的自相关 _plot 函数或者 r 中的 tseries 包中的 acf 函数很容易地绘制出来

4.预测时间序列

预测时间序列有几种方法。

  • 基于模型的方法通过多元线性回归来探索序列与其他特征的相关性。与其他横截面数据一样,基于模型的方法计算时间序列对其他特征的依赖性,但另一方面没有考虑不同时期之间的时间序列值之间的依赖性。
  • 数据驱动方法,模型从数据本身学习模式,并根据其之前的值估计时间序列的下一个值。数据驱动方法在给定的时间序列环境中是重要的,相邻时段的值往往是相互关联的。这种相关性被表示为自相关
  • 结合基于数据的方法通过预测序列的未来值以及残差的未来值,然后将两次预测的结果结合在一起。残差预测作为对第一个预测的修正。
  • 系综法通过对多种方法进行平均来得到结果。

在本文中,我将介绍数据驱动的方法。

使用数据驱动方法进行预测:

ARIMA 模型是计算数据驱动预测最常用的选择。你可以在这个帖子中找到 ARIMA 模型的细节。在这里,我将对数据应用 ARIMA。

试试 Python 中 pmdarima 中的 auto_arimafunction 或者 r 中 forecast 包中的 auto.arima 函数很有用。

有一点需要注意的是,从上面的自相关来看,在滞后 52 时有一个明显的季节性,所以我们需要将其纳入 ARIMA 模型。

基于 AIC 分数定义最佳 ARIMA 模型的代码

该函数选择最低的 AIC 分数模型,并将其嵌入以供进一步的模型使用。

然后,分割训练测试集,训练模型并进行预测。

用 ARIMA 模型分割训练测试集、训练和预测时间序列数据的代码

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

  • 总的来说,该模型似乎在数据上表现一般,但仍有进一步改进的空间。
  • MAPE(平均绝对百分比误差)分数为 5.7%,不算太高,也不算太低。
  • ARIMA 模型似乎在早期预测值中表现良好,而在后期预测值中表现较差。

然而,一个问题出现了,这个模型真的捕捉到了时间序列数据的值吗?

看一下模型的残差(或者预测值与实际值的)是有帮助的。建议检查预测模型的残差,以评估指定模型是否充分捕捉了数据信息。这可以通过探索一个时期的残差与其他时期的残差的相关性来实现。

好的时间序列预测模型的残差具有以下性质:

  • 残差不相关
  • 残差具有零或接近零的平均值(这意味着模型在任何方向都是无偏的)
  • 残差应具有正态分布
  • 残差应具有恒定方差

如果结果缺少上述任何属性,预测模型可以进一步改进。

让我们计算残差自相关并判断结果。

计算和绘制残差自相关的代码

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

Residual mean: -6308833.905274585

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

让我们根据以下标准来判断残差的自相关性:

  • 残差不相关:。残差序列仍然被观察到与其滞后有一定的相关性。
  • 残差具有零或接近零的均值(这意味着模型在任何方向上都是无偏的):均值是-6308274585。所以不符合这个标准。
  • 残差应该是正态分布:不完全是正态分布
  • 残差应具有恒定方差:与均值一致不等于 0。

因此,预测模型有很大的改进空间,可以通过找到捕捉残差中相关性的方法,将当前留在残差中的值添加到预测中。

5.数据划分

时间序列区别于正常横截面数据的最大特征之一是未来值对其历史值的依赖性。因此,时间序列的数据划分不能随机进行,而是要将序列分成 2 个周期,前面的周期用于训练集,后面的周期用于验证集。

以下代码将有助于根据时间序列结构分割训练测试集。

分割时序数据的训练集和测试集的代码

销售不仅与自身的过去相关,还可能受到其他因素的影响,如特殊场合(如本数据集中的假日)、工作日和周末等。方法驱动的模型将在下一篇文章中介绍,包括特征提取和特征选择。

最初发表于【https://geniusnhu.netlify.com】

战胜股市

原文:https://towardsdatascience.com/beating-stock-market-8b33c5afb633?source=collection_archive---------57-----------------------

个人项目

或者试图这么做。

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

埃尔帕尔马(加的斯,弗龙特拉),西班牙,作者:埃斯特万·桑切斯

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

摘要

这是一个个人项目,在这个项目中,我试图使用机器学习工具开发一个交易应用程序。从数据建模以及基于分布和机器学习技术的分类开始,我为新手投资者开发了一个交易策略,以在该应用程序的帮助下产生低风险利润。

介绍

市场分析既有趣又复杂,从以下链接【1】中可以看出。然而,有几项与机器学习一起进行的工作试图阐明这一领域。

在这个作品中,我创建了一个由两个要点组成的应用程序:

  1. 可以在不同时间范围内分析股票市场指数的屏幕。这里可以找到一张烛台图;一张图来分析技术指标【2】;一个折线图显示了日内价格变化的百分比**,以及一个箱线图来表示这最后一个图表,以便理解这种分布。**
  2. 我开发的交易策略分析( Strategyone )可以在这个屏幕上完成。该策略分为两个不同的部分:第一部分包括通过机器学习对股票市场指数运动的预测,而第二部分包括当前数据向量预测和过去发生的事情之间的比较。选择的时间范围从 7 天、14 天、21 天到 28 天不等。

最后一节将在“如何战胜市场”和“交易策略”中详细解释

数据是通过 Alpha Vantage API【3】获得的,而一份股票市场指数列表是从 Finn hub API【4】获得的。

语境

作为一名物理学家,我一直对复杂系统世界着迷:某些公式如何应用于生物系统或金融系统,以及几个电子的组合,并产生有趣的结果。

同样,当在系统中研究时,对系统中某个元素的个别研究可能会导致不同的行为。

因此,这个项目产生于对股票市场的好奇,以及软件和智力的挑战,这意味着要理解市场这样一个复杂的系统。

该项目已经经历了三个阶段:这项工作的第一个版本是作为我在【5】参加的数据科学硕士学位的最终论文开发的,其目的只是创建分类模型,该模型可以使用机器学习来预测股票在市场上的未来。第二个版本是在主版本的基础上设计的,它试图改进第一个版本。最后,第三个版本是这里讨论的版本,它提供了一个重要的改进,即交易策略的发展。

如何战胜市场

为了使用分类模型来预测市场走势,我需要对数据进行分类。这些预测类别被称为“强势牛市”,即价格上涨显著的预测;“牛”,有涨价的时候;“保持”,价格不变;“熊”,价格上有所下降,而“强熊”,价格下降显著【6】

股市指数类别是如何选择的?

这是通过股票价格的百分比变化分布实现的。因为我们的目标是预测未来,所以在寄存器中,百分比变化列需要关于价格如何相对于我们想要预测的时间范围变化的每日信息

因此,将待分类的变化百分比与最近 4 个月的分布进行比较,并根据与该分布相关的百分点范围选择上述类别之一。

通过这种方式,我们可以在一个时间范围内对所有数据进行分类,这将永远是关于未来的。

分类完成后,下一步是了解应用更精确的分类算法的最佳方式。经过多次试验和不同的想法后,选定的流程是通过鲁棒缩放器技术和随机森林作为分类算法来缩放数据。这些是被选中的,因为它们在所有类别中提供了平均更高的精度。

只有遵循这些步骤,我们才能获得一个能够以 40 %的准确率预测“强牛”的模型。

交易策略

交易策略将基于过去发生的事情,以及假设我们赢了,我们猜对的想法,省略为了赢,我们还必须猜对预测的类别

也就是说,如果预测是“牛市”,我们进行多头操作,结果实际上是“强牛”,我们的预测将被认为是准确的。同样,如果我们预测“强势牛市”,结果是“牛市”,或者当预测是“强势熊市”时,我们进行空头头寸移动,结果是“熊市”,反之亦然。

如果没有发生上述情况,手术将被视为失败。

考虑到这一点, 策略将仅包括多头操作,并且当模型预测到“强势牛市” 时,假定它是来自分类模型的具有较高准确度的类别。

这个策略是如何运作的?

一旦鲁棒定标器应用于所有寄存器,类别被预测,实际分类,应用PCA将维数减少到 4,保持 95 %的数据可变性。因此,我们还有其他 4 个变量以及与寄存器及其实际类别相关联的预测。当预测与真实类别相关的事物时,可以知道变量如何,因此我们安排预测和类别,并且我们计算与每个轮廓曲线相关的中值,以了解如何描述每个轮廓曲线。

因此,我们将描述预测“强牛”的变量,以及实际结果是“强牛”或任何其他类别。

所有这些都将限于与预测日相关的最近 6 个月的数据,以避免旧的市场状态对策略的影响。获得的结果总结如下:

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

PCA 后每个预测类别的变量描述。

该表的解释是,在预测“强牛”和类别被猜对之前的最近 6 个月,主成分的变量曾作为中位数。

因此,为了执行操作,我们必须将我们正在进行预测的一天的数据应用于鲁棒定标器和 PCA,

如果得到的预测是“强牛”,我们就已经达到了进行操作的第一步。第二步是检查前面曲线的哪个轮廓与预测的数据更相似。这将使用余弦相似度来完成,这将允许我们观察与数据更相似的向量。如果它对应“强牛-强牛”,我们就有了执行更安全操作的钥匙。

遵循这个交易策略,我们将获得几乎 50 %的准确率,但是,正如开始提到的,猜对并不意味着也能猜到类别。

猜对并不意味着也要猜对类别

在我们的情况下,正确的猜测也将是“强牛”的预测,并获得“牛”作为最终结果。考虑到这一点,策略准确率达到 58 %。

结论

这项工作的目的是开发一种策略,允许初学者投资者在不遭受全部损失的情况下获得低风险利润。正如我所提到的,该策略确保了在所述条件下 58 %的准确度,但是,就个人而言,它不是一个自动实施的策略,因为假设的误差水平会上升到 40%。

然而,有趣的是,在执行的操作中,遵循仅基于数据的策略,并且对股票市场了解有限且最少,如何获得超过 50 %的准确度。

所有项目代码可在 GitHub/esan94/bsm03 上阅读

以下步骤

下一步可能的改进措施包括:

  • 数据模型的变化。
  • 分类算法的改进。
  • 这个项目增加了更多关于股票市场的知识。
  • 应用余弦相似性对主要成分赋值。

资源

可以在 LinkedInGitHub o Medium 上关注我。

帕洛玛·桑切斯·纳瓦埃斯翻译。

击败 ETF:使用 Python(…和一些线性代数)进行投资组合优化

原文:https://towardsdatascience.com/beating-the-etf-portfolio-optimisation-using-python-and-some-linear-algebra-e48d0e0e44f?source=collection_archive---------13-----------------------

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

这个故事涵盖:
1)什么是马柯维茨均值/方差优化投资组合
2)如何使用 Python(
GitHub提供源代码)来计算一个投资组合
3)如何根据一个已建立的市场交易基金来回溯测试你的策略

这个实验的目的是看看我们是否可以使用 1952 年的概念来创造一个被动的投资组合,这个投资组合会比今天表现最好的交易所交易基金做得更好。

免责声明:这仅仅是一个数字和计算练习,不应被视为投资建议或任何基础。

前言

为了找到一个有价值的竞争对手,我谷歌了“最佳被动技术 ETF”,跟随第一个链接选择了排名第一的基金——*我不知道我是否可以在媒体上引用它的正式名称——*让我们称它为基金 X 。基金 X 专门投资于在北美主要交易所上市的科技和软件行业股票,并(截至 2020 年 6 月 9 日)投资于 104 只个股。我已经从这里下载了所有美国股票的表现,由 Kaggle 社区提供,并过滤了基金的头寸。

从现在开始,我的目标是编写一个算法,遍历这些股票,分析它们的表现,并将它们组合成一个均值/方差最优的投资组合(……然后看看它的表现如何与专业资金经理的表现相比较)。

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

游戏开始了!

一些背景

1952 年,Harry Markowitz 博士写了他关于最优均值-方差投资组合的开创性论文——这项研究随后为他赢得了 1990 年的诺贝尔经济学奖。他的研究为现代投资组合理论(MPT) 奠定了基础,该理论的核心有一个相当违反直觉的想法。Markowitz 建议,当从两种资产(例如股票)中选择一种在风险调整后的回报方面明显更理想的资产时,投资者可能会更好地将都加入到他的投资组合中,如果它们提供了足够的分散化效应(想想像这样的风险分散化,不要把所有的鸡蛋放在一个篮子里)。

两种资产的简单示例可以扩展到更复杂的真实世界场景,涉及数十甚至数百个单个头寸。

但是首先……一点数学

这里我们将看到如何找到有效边界和切线投资组合。如果你只是来看结果的,请随意跳过这一部分,否则让我们直接进入:

在选择资产的最优组合时,MPT 指出,我们必须考虑资产的(历史)回报和成对协方差。目标是找到在给定的预期回报水平下,最小化预期投资组合方差的资产组合。数学上,这个目标函数是:

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

其中:
w —资产权重向量
𝜇 —资产收益向量
σ—资产协方差矩阵
π —投资组合收益的预期水平

我们构造一个拉格朗日函数并求偏导数:

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

省略重组,这可以在这里找到,我们得到一个将投资组合权重表示为投资组合预期回报的函数的函数:

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

权重向量,代表我们在有效边界的持有量(对于给定的π回报水平)

获得的表达式将为我们提供一个资产的相对权重向量,该向量将最小化任何目标回报水平的方差。计算每个回报水平的方差,并将结果绘制在图上,得到有效边界 (我们将在后面绘制)。

虽然边界本身是一个很好的视觉辅助工具,但我们如何知道选择曲线上的哪个点(风险/回报曲线)?这就是切线投资组合的用武之地。切线投资组合旨在最大化预期风险调整后的回报,位于资本分配线与我们的边界曲线*(同样,我们稍后将计算一个)*相切的点。

切线投资组合是通过最大化投资组合的(预期)夏普比率找到的。再一次,目标函数:

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

拉格朗日和导数;

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

再一次,一些重新安排沿着这条路走下去:

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

权重向量,代表我们在切线投资组合中的持股

完成推导后,我们可以直接开始实施策略。

必须指出的是,迄今为止以这种方式建立起来的实验,对 ETF 来说并不完全是“公平的”。我们的投资组合优化目标函数仅受权重相加必须达到 100%的约束(“无杠杆约束”)。为了与只做多的基金公平竞争,我们还必须实施禁止卖空约束——即限制所有权重为正值。然而,这将计算问题转化为非线性任务。稍后我们还将使用 Python SciPy 库来完成这项工作。

实验本身

让我简单解释一下我是如何设置数据的。

准备

从 Kaggle 下载的股票回报有直到 2017 年 11 月的数据——这是我的第一个限制。其次,为了获得某种程度的可靠性,最好只使用那些股票,因为我至少有几年的价格数据。经过一番思考,我决定只使用 X 基金的股票,我有 10 年的历史——7 年的训练和 3 年的测试。这使得最初的 104 只股票的投资组合减少到只有 35 只,但它们占了投资组合总价值的 60%以上,所以我对此很满意。

我们现在假设我们是一个投资者,在 2014 年 11 月坐在一堆现金上,手头有 7 年的股票数据表现,希望通过模仿臭名昭著的 Fund X 的策略来投资我们的储蓄:

多空优化

实验的第一部分(也是更容易的部分)包括盲目应用我们之前定义的公式。如果你想继续编码,可以从 这里 *(提供解释)*随意克隆这个库。使用 7 年的股票收益构建的有效边界看起来如下:

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

08 年危机后的科技行业…解释了约 50%的年化波动率

旁注 :如果你对金融市场没有太多经验,看到一个预期年回报率超过 75%的切线投资组合是而不是很平常的事情。巨大的预期回报和波动性可以解释为这是一个“多头/空头”投资组合,因此“有效边界”越向右上角移动,我们的“多头”和“空头”头寸就越大。此外,我们正在关注科技行业——通常是高贝塔股票——我们的数据来自一个动荡的后危机时期。

总的来说,MPT 的基本思想是:通过将资产组合成一个投资组合,我们能够“获得”比单独投资每只股票好得多的风险回报。让我们看看我们的“最优解”与基金 X 的构成和表现相比如何:

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

上图:每只股票的配置||下图:投资增长

正如所料,我们的多空投资组合的表现非常不稳定。从图表上看,在三年的大部分时间里,它的表现可能好于 ETF,但实际上,这要归功于其异常的波动性(我个人会将其归因于“幸运”的时机)。如果复制 代码 ,可以修改 training_period 参数,看看对性能的真正影响有多大。此外,这种“盲目”的解决方案导致我们的投资组合权重“激增”,在一只股票中达到+80%和-40%。

不太好。

因此,一个更现实的(也是对 ETF 更“公平”的)测试是将我们的头寸限制在仅做多。

仅长优化

为了将我们之前定义的目标函数限制为仅“接受”长位置,我们添加了一个约束,即权重向量中的每一项必须大于或等于 0。此外,共同基金的投资组合经理通常对单一基金的最大允许分配有限制。我决定将每只股票的权重限制在 10%以内。

使用 Python SciPy 库(和Broyden–Fletcher–gold farb–Shanno 算法,我们以同样的方式优化我们的函数:

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

切线投资组合:仅做多,<10% in a single stock

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

Performance and composition: long-only, <10% in a single stock

不做过多评论,但……:

两个观察*:
——我们可以看到,我们的股票权重变得不那么“爆炸性”,整体波动率也远低。
-所有股票都来自同一个行业,这意味着它们具有相似的风险/回报特征和高度的成对相关性。因此,我们的“解决方案”有许多权重绑定到 10%约束。*

金融书呆子统计

一些有趣的风险/回报指标:

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

上半部分:度量值越高,“越好”||下半部分:度量值越低,“越好”

摘要

也许正态分布回报的标准差并不是衡量投资组合“风险”的好指标。也许我们应该努力找到所有 104 只股票的数据。也许 X 基金经理坐在一个黑暗的、挂满布帘的房间里,手里拿着一个水晶球。不管怎样,我们的“快速而肮脏的”解决方案在竞争中表现不佳。

如果你复制了源代码,你可以尝试增加更多的股票,引入不同的风险措施,每年重新平衡投资组合或者做任何我没有做过的事情。

金融市场的博弈直到今天仍未解决。许多人尝试,许多人失败。欢迎大家下载资料一试身手:)

打甘游戏

原文:https://towardsdatascience.com/beating-the-gan-game-afbcce0a20be?source=collection_archive---------39-----------------------

开发“自切片面包以来最酷的东西”的技巧

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

“柏拉图的洞穴”作者 Jan Saenredam,之后是 Cornelis Cornelisz。范哈勒姆,1604 年。在公共领域下许可。

生成对抗网络(GANs)是深度学习中最令人着迷的发展之一。Yann LeCun 自己将 GANs 命名为“自切片面包以来最酷的东西”[1]。

这些架构正被应用于大量的问题。在从暗物质研究[2]到室内设计[3]的应用中获得成功。

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

GAN-build Mona Lisa,来自“现实神经说话头部模型的少数镜头对抗学习”,2019 年论文

看到如此广泛的令人着迷的应用,研究和开发 GANs 的愿望已经在我的脑海里发痒了很长时间。最近,我屈服了,决定是时候投入进去了。

我很快了解到甘人不容易驯服。正因为如此,我对第一次进入 GANs 的世界时常见的许多误解和错误有了新的体验。

我在本文中总结了我从中学到的错误,这些错误可能是 GAN 实施和融合中成功与失败的区别。

坦,不是乙状结肠

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

tanh v 形(逻辑)激活

在预处理图像数据时,我们应该将其归一化到-1 和 1 之间,而不是 0 和 1 之间[4]。

这也意味着我们在 G 中的最终层激活应该是tanh而不是sigmoid

255

这里需要注意的另一个重要的事情是后生成,不要忘记将值乘以 127.5,再加上 127.5,以返回到 0–255 的原始范围。

image_array = generated_tensor.numpy() * 127.5 + 127.5

不要过度使用过滤器

最初,当我的 DCGAN(深度卷积 GAN)在亮度变化中挣扎时,我认为生成器的转置卷积层只是缺乏复杂性。

所以,我加了更多的滤镜。事实证明,这与我本该做的事情完全相反。

减少过滤器的数量可以让生成器更好地表示值的范围。

以下是一些过滤大量生成的 MNIST 数:

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

发电机过滤器尺寸为:256 > 128 > 64 > 1

现在使用最少的过滤器:

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

发电机过滤器尺寸为:32 > 16 > 8 > 1(您也可以降低尺寸)

过多的过滤器会将发生器值推到极限。对于tanh来说,这是-1 或+1。导致生成的图像缺乏说服力。

稀疏渐变不好

稀疏梯度本质上是弱信号。或者具有非常低的值的信号。

这些低值信号的问题是,随着对它们进行许多数值运算,它们会变得越来越小。

熟悉 RNNs 的人无疑会遇到梯度消失的问题。这是完全一样的。

为了解决这个问题,我们可以将批量标准化添加到我们的网络中[5]。

需要注意的是,批量标准化应该发生在 s 形激活(tanh,sigmoid/logistic)之后**,非高斯激活(ReLU,LeakyReLU)之前【5】。**

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

泄漏激活

此外,对发生器和鉴别器*[4]始终使用leaky relu——除了最后一层,我们使用 s 形激活函数。

*最初的 DCGAN 在发生器中使用 ReLU 激活,在鉴别器中使用 leaky ReLU[3]

学习率

有时候我们需要在鉴别器和生成器之间找到一个更好的平衡。

最初,我的鉴别器学得太快了。实质上冻结了发电机,使其无法取得任何进展。

我们可以通过降低或提高双方的学习率来平衡这一点,让我们较弱的网络有更多的喘息空间。

从 MNIST 开始

我尝试做的第一件事就是创造这些复杂的艺术风格。当它不起作用时,我不知道为什么。图像太复杂了吗?我对它们的预处理正确吗?也许问题出在网络上,网络可能在任何地方。

因为我是从零开始构建的,所以没有其他实现可以比较和基准测试。最后,代码中出现了几个问题,但我只是通过为 MNIST 数据集重新构建代码来识别这些问题。

这允许您看到您的结果和代码与其他结果和代码的不同之处,因此问题更容易诊断。一旦您的网络产生了合理的输出,您也可以将质量与其他实现进行比较。

因此,在开始某个很酷但很复杂的项目之前,先尝试一下 MNIST(或另一个已建立的数据集)。

最后一个音符

最后,甘人并不像他们第一次看到的那样狂野。有了合适的资源,构建我们的第一个 GAN 是一个相当简单的过程。

但是每一个错误都会提高我们的知识,并使我们更接近驯服这些众所周知的困难的架构。

我在下面列出了我在研究和实现 GANs 时非常依赖的资源列表(用粗体)。我怎么推荐这些都不为过。

感谢阅读!

参考

[1] Quora 与 Yann LeCun 的会议 (2016),Quora

[2] M. Mustafa,D. Bard,W. Bhimji,Z. Luki,R. Al-Rfou,J. Kratochvil, CosmoGAN:使用生成对抗网络创建高保真弱透镜会聚图 (2019),计算天体物理学和宇宙学 6:1

【3】a .拉德福德,l .梅斯,s .钦塔拉, 深度卷积生成对抗网络的无监督表示学习 (2016),ICLR 2016

【4】s .钦塔拉, 如何训练一个甘? 、GitHub

【5】j . Brownlee, 深度神经网络批量归一化的温和介绍 (2019),machining Learning Mastery

如果你对其他机器学习项目感兴趣,你可能会喜欢我以前的项目,在那里我在复制斯多葛派哲学中使用递归神经网络进行文本生成:

[## 斯多葛派哲学——由算法构建

再现历史上最有权势的人之一所写的斯多葛派哲学

towardsdatascience.com](/stoic-philosophy-built-by-algorithms-9cff7b91dcbd)

战胜困难

原文:https://towardsdatascience.com/beating-the-odds-8d26b1a83f1b?source=collection_archive---------32-----------------------

利用数据科学发现 NBA 最伟大的超常球员

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

马库斯·斯皮斯克在 Unsplash 上的照片

这是我每周体育主题系列的第一部分。每周我将展示数据科学的应用,并寻求对我们喜欢看的比赛提供深思熟虑的分析和见解。

在这篇文章中,我确定了 NBA 历史上超水平发挥的球队。数字显示的球队应该不是很好,但仍然无视他们的统计优势。事不宜迟,让我们把这事捅出去。

使用运动参考 API 获取数据

首先,我们需要一些数据。谢天谢地,体育参考提供了一个免费使用的 python API ,可以轻松访问超过半个世纪的篮球数据。API 还可以用来访问足球、棒球、曲棍球和英式足球的数据集;对于几乎所有与体育相关的数据项目来说,这都是一个很好的起点。要开始使用 Sports Reference API,您需要像使用 pip 或 conda 的任何其他 python 包一样安装它。

安装了 sports reference API 之后,让我们从获取我们希望包含在分析中的球队的数据开始。我选择了从 1980 年到现在的所有球队。下面的代码使用 Sports Reference Teams 模块构建一个 pandas 数据帧,其中每行代表一个队的一个赛季。它还会将索引设置为一个名为“id”的列,这是团队缩写和年份的简单组合,作为唯一的标识符。这个“id”索引将在以后合并到其他数据帧时派上用场。

import pandas as pd
from sportsreference.nba.teams import Teamsyear = str(2020)
all_team_df = Teams(year = year).dataframes
all_team_df['id'] = all_team_df['abbreviation'].apply(lambda x: x + " 2020")
print(2020)for i in range(2019,1979,-1):
    year = str(i)
    temp_df = Teams(year = year).dataframes
    temp_df['id'] = temp_df['abbreviation'].apply(lambda x: x + " " + year)
    all_team_df = pd.concat([all_team_df, temp_df], axis = 0)
    print(i)all_team_df['year'] = all_team_df['id'].apply(lambda x: x.split(' ')[1])
all_team_df.set_index('id', inplace = True)

上面代码的结果是下面的 1134 x 47 数据帧。

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

使用命令all_team_df.columns显示我们必须处理的数据帧的所有列。

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

这里有很多有用的数据,但是我们仍然缺少一些重要的信息。这个数据框架不包含任何关于输赢的内容!由于一个团队成功的最终衡量标准是赢得比赛,我们必须收集这些数据,并将其加入到我们正在构建的数据集。为此,我们将使用运动参考时间表模块。因为我们需要为 1134 个团队中的每一个团队创建并迭代一个 schedule 对象,所以定义一个助手函数来完成这项工作会使代码更加简洁。

from sportsreference.nba.schedule import Schedule# helper function to pull wins
def get_wins(tid):
    abb = tid.split(' ')[0]
    year = int(tid.split(' ')[1])
    games = 0
    wins = 0
    playoff_games = 0
    playoff_wins = 0

    # Create schedule object for team and iterate through every game
    for game in Schedule(abb, year = year):
        if game.playoffs == False:
            games += 1
            if game.result == 'Win':
                wins += 1
        elif game.playoffs == True:
            playoff_games += 1
            if game.result == 'Win':
                playoff_wins += 1

    return wins, games, playoff_wins, playoff_games# create dictionary and populate with team records for every year
total_wins_dict = {}for y in range(1998, 1979, -1):

    tids = all_team_df[all_team_df['year'] == str(y)].index

    wins_dict = {'id': [], 'wins': [], 'games': [],
                 'playoff_wins':   [], 'playoff_games': []} for i, tid in enumerate(tids):
        wins, games, playoff_wins, playoff_games = get_wins(tid)
        wins_dict['id'].append(tid)
        wins_dict['wins'].append(wins)
        wins_dict['games'].append(games)
        wins_dict['playoff_wins'].append(playoff_wins)
        wins_dict['playoff_games'].append(playoff_games)

    total_wins_dict[y] = wins_dict
    print(y)# concatenate all team record data into one dataframe
total_wins_df = pd.DataFrame(total_wins_dict[2020])for key in list(total_wins_dict.keys())[1:]:
    temp_df = pd.DataFrame(total_wins_dict[key])
    total_wins_df = pd.concat([total_wins_df, temp_df], axis = 0)total_wins_df.set_index('id', inplace = True)

完成团队记录的数据框架后,下一步是将其与我们的其他数据合并,并将结果保存到 csv 文件中,以便于以后访问。

all_data = pd.merge(left = all_team_df, right = total_wins_df,
                    how = 'inner', left_index = True,
                    right_index = True)all_data.to_csv('Data/all_team_data_1980-2020.csv')

线性回归

现在我们可以进入这个分析的有趣部分,使用收集的数据来识别 NBA 最伟大的超水平发挥的球队。这里的想法是建立一个模型来预测一支球队赢得的比赛数量,然后看看哪些球队的表现最好。虽然我们有大量的数据来建立一个模型,但我会保持简单,只使用一个单一的特征,平均胜利幅度(MOV)。显然,一支得分比对手多的球队往往会表现得更好。让我们首先打开一个新笔记本并导入数据集。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
import numpy as np%matplotlib inlinedata = pd.read_csv('Data/all_team_data_1980-2020.csv', index_col = 'id').drop('Unnamed: 0', axis = 1)

虽然我们的数据集中没有 MOV 的列,但是可以使用“points”、“opp_points”和“games”列轻松创建。我们还将为常规赛胜率创建一个列,用作我们的目标变量,这有助于考虑在停摆缩短赛季中比赛的球队。最后,我们将把数据分为特性和目标,将数据输入线性回归模型,并生成回归结果的汇总表。

data['MOV'] = [(points - opp_points) / games for points, opp_points,
               games in zip(data['points'], data['opp_points'],
               data['games'])]data['win_rate'] = [wins / games for wins, games in
                    zip(data['wins'], data['games'])]# create inputs
X = pd.DataFrame(data['MOV'])
X['intercept'] = [1 for x in range(data.shape[0])]y = data['win_rate']# create and fit linear regression model
model = sm.OLS(y, X)
fit = model.fit()
fit.summary()

这里生成的汇总表显示,这个极其简单的模型与我们的数据非常吻合,R 为 0.941。此外,该模型在获胜游戏数方面的平均绝对误差仅为 2.4 场。下面的代码生成了一个预测的和实际的 MOV 获胜的图形,以及一个模型残差的分布图。

# create predictions for every team
preds = fit.predict(X)# create a dataframe to hold all results
results = pd.DataFrame({'id': data.index, 'prediction': preds})# merge with input data and actual results
merge_cols = ['MOV', 'win_rate', 'wins', 'games', 'playoff_wins',
              'playoff_games']results = pd.merge(left = results, right = data[merge_cols],
                   how = 'inner', right_index = True,
                   left_index = True)# use predicted win rate to predicted integer number of wins
results['predicted_wins'] = [int(round((prediction) * games, 0)) for
                             prediction, games in
                             zip(results['prediction'],
                             results['games'])]# create error columns
results['error'] = [act - pred for act, pred in
        zip(results['win_rate'], results['prediction'])] results['game_error'] = [wins - pwins for wins, pwins in
                         zip(results['wins'],
                         results['predicted_wins'])]plt.figure(figsize=(15,6))plt.subplot(1,2,1)
sns.scatterplot(x = X['MOV'], y = y)
sns.lineplot(x = X['MOV'], y = preds, color = 'red')
plt.title('Margin of Victory vs Win Rate')plt.subplot(1,2,2)
sns.distplot(results['game_error'], bins = 21)
plt.title('Residual Distribution');

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

使用刚刚创建的结果数据框架,现在可以通过对“错误”列上的数据框架进行排序来轻松挑选出最优秀的学生。这些是根据他们的平均胜率预测赢得最多比赛的球队。这样做会产生以下结果:

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

具有讽刺意味的是,我们的分析刚刚确定了 1993 年的达拉斯小牛队,可以说是 NBA 历史上最差的球队之一,也是 NBA 历史上最伟大的超水平发挥的球队。这是一支输了 42 场 15 分以上,输了 26 场 20 分以上,输了一场 58 分的球队。除了输球,很难说这支球队在其他方面“超水平发挥”。这到底是怎么回事?为什么我们的模型产生了如此大的拟合,却导致了如此不合理的结果?

事实证明,这是一个很好的例子,说明为什么简单的线性回归永远不应该用来模拟比例。理论上,当比例被限制在 0 和 1 之间时,线性模型可以输出任何实数。如果 1993 年的小牛队公布了一个稍差的 MOV,我们的模型就会预测到一个负胜率!我们创建了一个模型,倾向于挑选非常差的团队作为优等生,非常好的团队作为劣等生。

逻辑回归

解决方法是使用逻辑回归而不是线性回归。不幸的是,sklearn 中方便的逻辑回归模块只适合分类数据,而不是实际比例。这意味着我们需要做一些额外的工作来将线性回归转换成逻辑回归。

逻辑回归的核心是对比例、概率或分类的对数优势进行线性回归。因此,第一步是定义函数,将我们的目标变量“win_rate”转换为 log-odds,然后再转换回来。这些函数通常被称为 logit 和 sigmoid 函数,可以在我们的 python 笔记本中轻松定义如下:

def logit(p):
    return np.log(p/(1-p))def sigmoid(x):
    return 1 / (1 + np.exp(-x))

然后,我们将重复我们用来产生线性回归的过程,只有一些微小的变化。

  1. 我们的目标变量“win_rate”使用 logit 函数转换为对数赔率。
  2. 使用具有单一特征“MOV”的常规线性回归来拟合目标,这与以前没有什么不同。
  3. 使用 sigmoid 函数,我们的线性回归预测(以对数赔率的形式)被转换为更熟悉的“胜率”。
# create inputs
X = pd.DataFrame(data['MOV'])
X['intercept'] = [1 for x in range(data.shape[0])]
y = data['win_rate'].apply(logit)# create and fit linear regression model
model = sm.OLS(y, X)
fit = model.fit()
fit.summary()# generate predictions
preds = [sigmoid(x) for x in fit.predict(X)]

正如预期的那样,这种逻辑回归模型对我们的数据产生了稍好的拟合,R 为 0.944,平均绝对误差仅为 2.3 场。虽然这只是比我们之前的模型稍微好一点,但是绘制结果显示更适合具有更极端的正或负 MOV 值的团队。这些图可以使用与以前几乎完全相同的代码生成。

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

NBA 最伟大的成功者是…

现在,我们实际上可以确定 NBA 最伟大的超水平球队。为了获得更有说服力的结果,让我们过滤输出,只包括至少赢得 4 场季后赛的球队。

overachievers = results[results['playoff_wins'] >= 4].sort_values(by = 'error', ascending = False)overachievers.head()

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

现在你知道了,NBA 最伟大的球员是 1987 年的金州勇士队。在乔·巴里·卡罗尔、斯里皮·弗洛伊德和克里斯·穆林的带领下,1986-87 赛季勇士队的 MOV 得分很低,只有 2.3。虽然这通常会导致一个令人失望的赛季,但 1986-87 年的勇士队获得了 42 场胜利,远远超过了他们预测的 34 场胜利,在西部联盟中排名第五。球队在两场控球比赛中取得了 63%的胜率,同时也在 30 场比赛中输掉了 10 分或更多。在季后赛中,勇士队在 5 场比赛中(3-2)击败了 4 号种子犹他爵士队,然后在 5 场比赛中(1-4)输给了被广泛认为是有史以来最好的球队之一的湖人队。

感谢你的阅读,我希望下周你能回来。

链接到 Github

用遗传算法打破俄罗斯方块世界纪录

原文:https://towardsdatascience.com/beating-the-world-record-in-tetris-gb-with-genetics-algorithm-6c0b2f5ace9b?source=collection_archive---------16-----------------------

使用 PyBoy 和 Python

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

你好,我是尼克🎞 on Unsplash

几周前,我发现了这个用 Python 写的支持人工智能/机器人的很棒的游戏模拟器。我非常兴奋,因为现在我可以使用我的机器学习知识来创建困扰我童年的游戏代理。

在本文中,我将展示我们如何使用遗传学算法和神经网络的简单实现来创建一个代理,它可以在 Game Boy 上非常好地玩原版俄罗斯方块,并能够打破根据twin galaxy创下的 999999 和 523 行的世界纪录。

俄罗斯方块是最畅销的视频游戏系列之一,是一款益智游戏,主要目标是通过清除俄罗斯方块(是的,这些方块就是这么叫的)的线条来获得尽可能高的分数。游戏的规则非常简单,然而,它实际上是一个 NP 完全问题[1]。这意味着编码一个基于规则的代理可能不是最明智的方法,启发式算法,如遗传算法,将是一个更好的选择。

遗传算法(GA)是一组受达尔文进化论启发的算法。这些算法用于解决优化问题。这意味着我们可以使用遗传算法来优化神经网络的权重(他们也可以做得很好)。在这篇文章中,我不会深入讨论什么是神经网络,因为已经有很多关于它的资源,比如这里的。

总的想法是,我们将创建一个神经网络(NN ),它将为代理所做的每个动作生成一个分数。对于每个新的 tetromino,代理将尝试所有可能的动作,并选择得分最高的动作。使用遗传算法,我们希望通过进化优化网络,使其收敛到最佳状态。

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

评估可能行动的网络

在 GA 中,我们有一些关键的概念:适应度精英主义交叉变异

  • 适应度是我们如何衡量网络的能力,以将其输出与移动的好坏相关联。
  • 精英主义是指一定比例的高性能网络被带到新一代。
  • 交叉是使用另外两个网络的基因(权重)创建新网络的过程。
  • 变异包括随机修改网络的权重。

步骤如下:

  1. 生成具有随机初始权重的神经网络群体。
  2. 对于每个网络,一直玩到游戏结束。
  3. 计算每个网络的适应度得分。
  4. 把表现最好的网络带给下一批人(精英主义)。
  5. 从当前群体中随机选择 2 个网络(父代)并执行交叉以产生一个新的网络(子代)。
  6. 以 x%的概率突变新的网络权重。
  7. 继续,直到我们达到所需的世代数。

像许多其他机器学习问题一样,我们需要做的第一步是收集数据,或者在这种情况下,从环境中收集状态数据。这里有一个快速的例子展示了如何快速初始化环境。

这个脚本本身是不言自明的。开发者通过tetris.game_area()很容易获得游戏的状态。然后,我们可以创建一个稀疏矩阵,其中 0 是空白瓦片,1 是碎片:

area = np.asarray(tetris.game_area())area = (area != 47).astype(np.int16)

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

棋盘的矩阵表示

使用上面的矩阵,我们可以定义许多特性,如[2]所示:

合计高度 计算所有列高度的总和。在上面的例子中,总和是 16。

孔数
棋盘上的孔数。下面的板上有 6 个孔:

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

至少有一个孔
的列数,在上例中为 5。

凹凸度 各列之间的绝对高度差之和。在下面的棋盘中,它是:1 + 0 + 2 + 2 + 0 + 0 + 1 + 0 + 0 = 7

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

行转换 每一行中从被占用到未被占用的瓦片的转换数量相加。下图中的每个红点算作一个过渡:

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

列转换
与上面类似,但按列进行。

凹坑数量
凹坑被定义为没有任何块的列。下面的板上有 3 个坑:

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

最深的井 一口井可以通过下面的图片得到最好的解释。在这种情况下,最深的井的高度为 2。

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

清除的行数 移动时清除的行数。

让我们使用矩阵表示来实现这些功能:

现在,让我们实现算法:

首先,我们为网络创建一个类

我们的模型是一个简单的网络,输入层大小为 9,输出层大小为 1。这个简单的网络将使我们能够轻松地解释权重,并且可以表示如下:

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

我使用 PyTorch 来创建网络,但是您可以随意使用任何其他库或实现您自己的库。利用这一点,我们可以创建一个实现了交叉和变异的种群类:

对于每一代新人,我们将带来前 20%的网络。

对于交叉,我们用从群体适应度产生的概率分布对父母进行采样(网络适应度越高,它被选择的可能性就越大)。每个体重都是随机选择的,父母双方各有 50%的机会。

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

交叉

随后,权重有 20%的机会随着乘以因子 0.5 的随机高斯噪声的增加而变异。

下一步是编写一些逻辑来玩这个游戏。首先,让我们定义一些助手函数来移动块:

对于每一个新的作品,我们会尝试所有可能的动作。我们需要检查的转身和横向移动的次数取决于积木的类型。我们可以使用这三个函数来确定它们:

现在我们有了开始模拟网络所需的一切。对于每一个新的棋子,我们将棋盘信息传递给get_score()以获得每个可能动作的网络输出。我们选择输出最高的动作。一旦游戏结束,我们返回网络的适应度也就是游戏的分数。

由于游戏的随机性,网络不会为每次运行产生相同的结果。我们可以通过run_per_child评估每个网络的多次运行,以更好地估计网络的适应性。

随着代理在游戏中变得更好,培训时间会变得更长。为了加快训练速度,我们在代理达到最高分数(999999)时停止游戏,并使用多重处理。生成多个进程来并行评估网络非常简单,如下所示:

现在你知道了,我们已经实现了一个遗传算法来创建一个可以玩俄罗斯方块的简单代理。这里有一个例子,在人口规模为 50 的情况下,仅经过 10 代就获得了最佳模型:

Scores: [999999.0, 999999.0, 729892.0, 372490.0, 999999.0, 296117.0, 299328.0, 533870.0, 282609.0, 525193.0]
Average: 603949.6Lines: [1031, 1002, 825, 415, 935, 393, 364, 622, 389, 582]
Average: 655.8

然而,由于代理的简单性,它肯定有一些限制。由于代理人只考虑当前的奖励,而忽略未来的奖励,这很可能会出现这样的情况:放置一个方块可以清除线,但会恶化棋盘的位置。此外,由于棋盘尺寸较小(18x10),如果代理连续获得多个坏块,则很有可能会输。这导致运行之间的标准偏差非常高,如上例所示,在最佳运行中,代理清除了 1031 行,在最差运行中清除了 364 行。

就这样,我希望你在阅读我对这个项目的方法时感到有趣。请随意查看完整的源代码,并根据您的意愿进行任何改进:https://github.com/uiucanh/tetris

参考资料:

[1]埃里克·德梅因、苏珊·霍恩伯格、戴维·李奔-诺埃尔。 俄罗斯方块比较硬,甚至可以近似

[2]雷南·萨缪尔·达席尔瓦,拉斐尔·存根帕皮内利。 玩原版游戏《男孩俄罗斯方块》用的是实数编码的遗传算法

Python 中漂亮而简单的绘图——熊猫+散景

原文:https://towardsdatascience.com/beautiful-and-easy-plotting-in-python-pandas-bokeh-afa92d792167?source=collection_archive---------9-----------------------

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

照片由乔伊·凯伯Unsplash 拍摄

创建从熊猫数据帧到散景的交互式绘图的一行代码

虽然 Matplotlib 可以满足我们在 Python 中想要绘制一些东西时的所有需求,但使用它创建一个漂亮的图表有时很耗时。嗯,有时我们可能想向老板展示一些东西,这样就可以有一些漂亮的互动情节。

有很多优秀的库可以做到这一点,Bokeh 就是其中之一。然而,学习如何使用这样的库可能也需要一些时间。其实已经有人替我们解决了这个问题。这里有一个叫Pandas-Bokeh的库,直接消费熊猫,用散景渲染数据。语法非常简单,我相信您很快就可以开始使用它了!

[## PatrikHlobil/Pandas-Bokeh

Pandas-Bokeh 为 Pandas、GeoPandas 和 Pyspark 数据帧提供了一个 Bokeh 绘图后端,类似于已经…

github.com](https://github.com/PatrikHlobil/Pandas-Bokeh)

条形图示例

让我用一个例子来演示这个库。

首先,我们需要使用pip安装库。

pip install pandas_bokeh

安装后,我们需要导入numpypandas,当然还有pandas_bokeh库。

import numpy as np
import pandas as pd
import pandas_bokeh

我想生成一些随机数据用于演示目的。假设我们有一个电子商务网站的数据集。该数据集包含三个类别从 2010 年到 2019 年的销售额。让我们使用 Numpy 生成这个数据集。

df = pd.DataFrame({
    'Year': np.arange(2010, 2020),
    'Category-A': np.random.uniform(9000, 15000, 10),
    'Category-B': np.random.uniform(9000, 15000, 10),
    'Category-C': np.random.uniform(9000, 15000, 10)
})

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

现在,我们的熊猫数据库里有了数据。在我们开始使用pandas_bokeh绘制数据之前,我们需要设置笔记本的输出,这将适用于 Jupyter/iPython 笔记本。稍后我会解释为什么我们需要这样做,因为pandas_bokeh支持其他输出位置。

pandas_bokeh.output_notebook()

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

好的。我们现在可以绘制数据帧。

df.plot_bokeh(
    kind='bar',
    x='Year',
    y=['Category-A', 'Category-B', 'Category-C'],
    xlabel='Category',
    ylabel='Annual Sales',
    title='Annual Sales by Category'
)

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

是不是比默认的matplotlib好看多了?让我们快速看一下参数:

  • 您想要绘制哪种类型的图表?目前,pandas_bokeh支持以下图表类型:折线图、点图、阶跃图、散点图、条形图、直方图、面积图、饼图和地图。
  • xy简单地传入熊猫数据帧的列名
  • xlabelylabelx 轴和 y 轴相对的标签
  • title图表的标题

所以,你已经看到了创造这样一个美丽的情节是多么容易。更重要的是,它是互动的。下面是 GitHub 官方回购的 GIF。

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

图片提供:https://github . com/PatrikHlobil/Pandas-Bokeh/raw/master/docs/Images/start image . gif

一些高级参数

当然,该库也支持许多高级参数,允许我们在必要时定制情节。

这是另一个使用相同数据集的示例,但使用折线图绘制数据。

df.plot_bokeh.line(
    x='Year', 
    y=['Category-A', 'Category-B', 'Category-C'],
    figsize=(900, 500),
    ylim=(5000, 20000),
    zooming=False,
    panning=False
)

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

请注意,这里我使用的df.plot_bokeh.line(...)相当于df.plot_bokeh(kind='line', ...)

  • figsize定义元组中绘图的大小(宽度,高度)
  • xlimylim分别定义 x 轴和 y 轴的默认范围。这里我只为 y 轴设置。
  • zooming启用/禁用缩放手势
  • panning启用/禁用平移手势

输出到 HTML

你记得我们已经把输出设置到笔记本了吗?

pandas_bokeh.output_file('chart.html')

除了 Jupyter 笔记本,我们还可以将输出设置为 HTML 文件。因此,图表将被保存并输出到一个可以持久化和分发的 HTML 文件中。

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

摘要

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

Kelly SikkemaUnsplash 上拍摄的照片

在本文中,我演示了如何使用pandas_bokeh库,用极其简单的代码绘制出您的 Pandas 数据帧,但它是一个具有交互特性的漂亮演示。

事实证明,当您有许多特殊的渲染要求时,该库可能无法满足您的所有需求,但当您只想为数据集构建一个典型的图表时,它是一个优秀的库。

[## 通过我的推荐链接加入 Medium 克里斯托弗·陶

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@qiuyujx/membership)

如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)

带有统计显著性注释的漂亮箱线图

原文:https://towardsdatascience.com/beautiful-boxplots-with-statistical-significance-annotation-e1b314927fc5?source=collection_archive---------10-----------------------

Python 中带重要性注记的箱线图超短教程

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

图由作者制作。

简介和动机

我总是记得自己阅读了一些很好的科学出版物,在这些出版物中,作者会创建一些带有统计注释的很好的箱线图。在大多数情况下,使用统计检验来确定不同组之间某一具体特征的平均值是否有统计学上的显著差异。

我现在已经成功地创建了一些定制的 python 代码来做这件事:生成集成了统计注释的漂亮的箱线图。在这篇短文中,我将展示如何用 Python 创建如此漂亮的方框图。

数据集

我们将使用 Iris 数据集,正如我们在我以前的所有帖子中所做的那样。数据集包含鸢尾属三个品种****(鸢尾属 setosa 、鸢尾属 virginica 和鸢尾属 versicolor )的 50 个样本的四个特征(萼片和花瓣的长度和宽度)。数据集通常用于数据挖掘、分类和聚类示例以及测试算法。****

作为参考,这里有三种花的照片:

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

图由作者制作。

对于这个简短的教程,我们将只使用 3 个类中的 2 ,即 setosaversicolor 类。这样做只是为了简单。

如果你想在交互式路线图和活跃的学习社区的支持下自学数据科学,看看这个资源:https://aigents.co/learn

Python 中的工作示例

步骤 1 :让加载数据并子选择所需的 2 个花类😗***

**from sklearn.datasets import load_iris
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np# Load the Iris dataset
X = load_iris().data
y = load_iris().target
feature_names = load_iris().feature_names
classes_names = load_iris().target_names# Use only 2 classes for this example
mask = y!=2
X,y  = X[mask,:], y[mask]# Get the remained class names
classes_names[[0,1]]
# array(['setosa', 'versicolor'], dtype='<U10')**

第二步 : 我们现在已经选择了 2 类的所有样品:setosa&versicolorflower class我们将把数据放入一个panda数据框架中,让我们的生活变得更轻松:

**df = pd.DataFrame(X,columns=feature_names)
df['Group'] = [i for i in y]
df_long = pd.melt(df, 'Group', var_name='Feature', value_name='Value') # this is needed for the boxplots later ondf.head()**

第三步:让我们检查数据帧:

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

如我们所见,我们有 4 个特征,最后一列表示相应样本的组成员。

统计测试

第四步 : 现在是做统计测试的时候了。我们将使用一个双样本 t 检验(因为我们组是独立的)来检验 如果这四个特征(即萼片长度、萼片宽度、花瓣长度、花瓣宽度)中的任何一个的**平均值在统计上不同** 花****的两个(********

#* Statistical tests for differences in the features across groups
from scipy import stats
all_t = list()
all_p = list()
for case in range(len(feature_names)):
    sub_df = df_long[df_long.Feature == feature_names[case]]
    g1 = sub_df[sub_df['Group'] == 0]['Value'].values
    g2 = sub_df[sub_df['Group'] == 1]['Value'].values
    t, p = stats.ttest_ind(g1, g2)
    all_t.append(t)
    all_p.append(p)

为了进行我们刚刚使用的统计测试:

t, p = stats.ttest_ind(g1, g2)

这里,我们将 g1(第 1 组:setosa)的平均值与 g2(第 2 组:versicolor)的平均值进行比较,我们对所有 4 个特征进行比较(使用 for 循环)。

但是我们如何知道 g1(第 1 组:setosa)的平均值明显大于或小于 g2(第 2 组:versicolor)的平均值呢?

为此,我们需要查看一下 t 值。

print(all_t)
[-10.52098626754911, 9.454975848128596, -39.492719391538095, -34.08034154357719]print(feature_names)
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']

释义:

  • 如果 t 值为 ( > 0),则 g1(第 1 组:setosa)的平均值明显大于 g2(第 2 组:versicolor)的平均值。
  • 如果 t 值为 ( < 0),则 g1(第 1 组:setosa)的平均值明显小于 g2(第 2 组:versicolor)的平均值

提醒 : feature_names = [‘萼片长(cm)’,‘萼片宽(cm)’,‘花瓣长(cm)’,‘花瓣宽(cm)’]。

  • 我们可以得出结论:只有 g1(杂色)的萼片宽度的平均值在统计学上大于 g2(杂色)的萼片宽度的平均值。

第五步 : 检查 t 检验结果

print(np.count_nonzero(np.array(feature_names)[np.array(all_p) < 0.05]))
# 4

解释:我们可以看到在 setosaversicolor 类之间所有 4 个特征在统计上有显著差异。

第六步:魔术来了。让我们创建一些漂亮的 箱线图并用估计统计 显著性对它们进行注释。

# renaming so that class 0 will appear as setosa and class 1 as versicolor
df_long.loc[df_long.Group==0, 'Group'] = classes_names[0]
df_long.loc[df_long.Group==1, 'Group'] = classes_names[1]# Boxplots
fig, axes = plt.subplots(2,2, figsize=(14,10), dpi=100)
axes = axes.flatten()for idx, feature in enumerate(feature_names):
    ax = sns.boxplot(x=”Feature”, hue=”Group”, y=”Value”, data = df_long[df_long.Feature == feature], linewidth=2, showmeans=True, meanprops={“marker”:”*”,”markerfacecolor”:”white”, “markeredgecolor”:”black”}, ax=axes[idx])
    #* tick params
    axes[idx].set_xticklabels([str(feature)], rotation=0)
    axes[idx].set(xlabel=None)
    axes[idx].set(ylabel=None)
    axes[idx].grid(alpha=0.5)
    axes[idx].legend(loc=”lower right”, prop={‘size’: 11})

    #*set edge color = black
    for b in range(len(ax.artists)):
        ax.artists[b].set_edgecolor(‘black’)
        ax.artists[b].set_alpha(0.8)

    #* statistical tests
    x1, x2 = -0.20, 0.20
    y, h, col = df_long[df_long.Feature == feature][“Value”].max()+1, 2, ‘k’
    axes[idx].plot([x1, x1, x2, x2], [y, y+h, y+h, y], lw=1.5, c=col)
    axes[idx].text((x1+x2)*.5, y+h, “statistically significant”, ha=’center’, va=’bottom’, color=col)fig.suptitle("Significant feature differences between setosa and versicolor classes/groups", size=14, y=0.93)
plt.show()

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

图由作者制作。

结论

从统计测试中我们可以看出,我们可以得出结论:只有第 1 组(setosa)的萼片宽度的平均值在统计上大于第 2 组(versicolor)的萼片宽度的平均值。

另一方面,组*的萼片长度、花瓣长度和花瓣宽度** 的平均值比杂色组的平均值***。******

这些观察结果也可以通过观察箱线图来验证。

那都是乡亲们!希望你喜欢这篇文章!

敬请关注并支持这一努力

如果你喜欢这篇文章,并且觉得它有用,那么关注我就可以看到我所有的新帖子。**

有问题吗?把它们作为评论贴出来,我会尽快回复。

最新帖子

*** [## 时间序列预测:用脸书的先知模型预测股票价格

使用可从《先知脸书》公开获得的预测模型预测股票价格

towardsdatascience.com](/time-series-forecasting-predicting-stock-prices-using-facebooks-prophet-model-9ee1657132b5) [## 用新冠肺炎假设的例子解释 ROC 曲线:二分类和多分类…

在这篇文章中,我清楚地解释了什么是 ROC 曲线以及如何阅读它。我用一个新冠肺炎的例子来说明我的观点,我…

towardsdatascience.com](/roc-curve-explained-using-a-covid-19-hypothetical-example-binary-multi-class-classification-bab188ea869c) [## 支持向量机(SVM)解释清楚:分类问题的 python 教程…

在这篇文章中,我解释了支持向量机的核心,为什么以及如何使用它们。此外,我还展示了如何绘制支持…

towardsdatascience.com](/support-vector-machines-svm-clearly-explained-a-python-tutorial-for-classification-problems-29c539f3ad8) [## PCA 清楚地解释了——如何、何时、为什么使用它以及特性的重要性:Python 指南

在这篇文章中,我解释了什么是 PCA,何时以及为什么使用它,以及如何使用 scikit-learn 在 Python 中实现它。还有…

towardsdatascience.com](/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e) [## 关于 Python 中的最小-最大规范化,您需要知道的一切

在这篇文章中,我将解释什么是最小-最大缩放,什么时候使用它,以及如何使用 scikit 在 Python 中实现它

towardsdatascience.com](/everything-you-need-to-know-about-min-max-normalization-in-python-b79592732b79) [## Scikit-Learn 的标准定标器如何工作

在这篇文章中,我将解释为什么以及如何使用 scikit-learn 应用标准化

towardsdatascience.com](/how-and-why-to-standardize-your-data-996926c2c832)

和我联系

美丽的代码

原文:https://towardsdatascience.com/beautiful-code-ad8a0c6b19?source=collection_archive---------16-----------------------

像电脑程序一样枯燥的东西能叫艺术吗?绝对的!

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

美有很多来源。谈到软件开发,美是由架构连贯性 e 赋予的,它们与应用于解决问题的 【功能精确性】 以及 创造力 携手并进。同样地, 编码风格 是代码优雅的一个组成部分,并且在改进开发团队的交流时不应该被低估。

让我们更详细地探索代码之美的概念,以及到底是什么让编程成为🅐🅡🅣!

在简单中寻找美

我最近读了《美丽的代码选集,《我从未写过的最美的代码,作者是乔恩·本特利,它基于一个首要原则,即“少即是多”,即一些明星开发人员一次又一次地进行重构,以精炼他们的代码并消除冗余,因此它尽可能简洁、易懂和简洁。从书中挑选出来的一些表达这种技能的格言如下:**

***📌 **A designer knows he has achieved perfection not when there is nothing left to add, but when there is nothing left to take away.**
— Saint-Exupéry📌 **The cheapest, fastest, and most reliable components of a computer system are those that aren’t there.**
— Bell📌 **If I had more time, I would have written you a shorter letter.**
— Pascal📌 **Simplicity does not precede complexity, but follows it.**
— Perlis***

换句话说,这是对简单的呼唤。

每一行代码都是必须调试、阅读和理解的代码,以后还需要支持。这是一种固有的成本!所以在保留功能的同时减少代码是一种高尚的努力。如果一个方法有 10 条语句,但是我们把它减到 5 条,问题的可能性减半,因为它出错、过于复杂或有问题的地方减少了。 源代码是负债,不是资产 !下次您使用 LOC(代码行数)作为生产力度量时,请考虑这一点!

三个相关的哲学是 YAGNI,干燥和亲吻。 你不需要它 暗示代码需要一个存在的理由,否则它必须被重构或删除。 不要重复自己 提出每一段代码在系统内必须有一个单一的、明确的目的和表示。最后, 保持简单愚蠢 ,很有描述性:保持事情简单!

讽刺的是,简单是一个复杂的主题!

在软件中,最漂亮的代码、最漂亮的功能和最漂亮的程序有时根本不存在。

质量设计是一个项目的灵魂

光是听“bug”这个词就让每个开发人员畏缩不前。人们普遍认为,好的程序员是那些写出无错误代码的人。尽管一个没有错误的程序是必须的,但是没有错误的代码编写不是必须的。我这么说的意思是,一些开发人员甚至在程序编译或执行之前就努力写出无错误的代码,更多地关注功能而不是设计。

在开发过程中忽视可维护性,为了功能性而忽视模式/标准**,是一个灾难的处方(也是一个昂贵的处方)。另一个问题是程序员会在错误的地方和错误的时间花太多的时间担心效率;过早优化相当于打开了工程上的潘多拉魔盒。**

好的设计就是让其他设计师觉得自己是白痴,因为这个想法不是他们的。

每个专业的软件开发人员都会写出有用的代码,但是在有用的代码和经得起时间考验的代码之间还是有一线希望的。一个可靠的设计保证了修复 bug 将是一件轻而易举的事情,因为 bug 将会出现在它们应该出现的地方!换句话说,当架构没有受到损害时,解决 bug 的成本更低,并且不会对技术债务产生太大影响。

所有的艺术都从一张空白的画布开始

开发人员将他们的想法转化为有形的东西的能力,就是创造性的定义。屏幕是一块空白的画布,等待着被代码填充并产生一个独特的解决方案——如果工作不是独特的,它将只是简单的“复制和粘贴”!没有两个程序员会写出完全相同的代码,即使他们的最终软件从表面上看是一样的。作为程序员,每个人都有自己声音的表达方式。这本身就很了不起!以我的经验来看,理解另一个开发者的代码,就像进入他们的思维,从他们的角度看世界。****

能够编码的兴奋是很难解释的。不仅仅是一行行的代码…我们可以想象我们慢慢构建的系统,当数据在其中流动时,它就变得真实了。这在智力上和情感上都是有益的,因为看到一件事情从构思到完成是一种成就。不管多小多大!

作为结束语,在我进入下一节之前,这里有一段摘自《计算机编程的艺术》系列的作者 Donald Knuth (对于非程序员来说,它就像是计算机科学的圣经)的摘录,当他被要求证明在书名中选择单词 art 的合理性时:

计算机编程是一门艺术,因为它将积累的知识应用于世界,因为它需要技巧和独创性,尤其是因为它产生美的物体。

算法的辉煌是终极的复杂

算法是使有效编程成为可能的配方。它们是编程的支柱,因为它们以系统的方式描述了解决问题的所有步骤。虽然逻辑和分析技能是左脑活动,但解决问题是使用我们右脑‘精神肌肉’的创造性过程。有效解决问题的秘诀是掌握复杂性,正如我们前面讨论的,复杂性会对我们的程序产生负面影响。

我设计、回顾或研究过的所有最好的算法都有一个共同点:它们依靠美好的想法来更有效地处理计算任务,同时避免不必要的细节和复杂性。举几个例子来说,对令人敬畏的代码库做出贡献的最基本的算法内部工作是:简化的布尔代数、创造性的组合学技术、数据结构的明智选择、正则表达式的简洁使用、良好的资源利用和对坚实原则的遵从。

这里有一个有趣的悖论,这使得算法的创建成为一项复杂的任务:

创造力没有算法——安迪·哈格里夫斯

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

编码风格很重要

到目前为止,我们研究了好的代码需要简单和良好的设计。我现在将转向编程的美学方面:代码布局。格式良好的代码的视觉外观与其质量密切相关,许多以自己的工作为荣的程序员从改进工作中获得极大的满足感,因为他们意识到程序员是因为他们的风格和纪律而被记住的,而很少是因为代码本身。

编写代码不仅是为了让机器执行,也是为了让其他程序员在试图检查、扩展、纠正、重构或调试代码之前阅读和破译。因此,代码的逻辑结构的准确和一致的表示是必不可少的。

缩进和空白空间的使用是这里的关键。类似地,最好的布局方案在代码修改下也能保持良好:修改一行代码不应该需要修改其他几行。也就是说,程序员交流的圣杯是自我记录代码,这意味着:足够的注释,有意义的命名约定,使用小的、容易测试的、纯粹的函数等等。

好的代码是它自己最好的文档

所以,漂亮的代码是清晰的,易于阅读和理解。它有一个平衡。它的结构、形状和建筑揭示了它的意图。每个部分都相对较小,且用途单一。这就像一个马赛克:所有的小代码片段完美地组合在一起,但同时当一个元素需要改变时,它们很容易分开!

资源

收场白

每次我们写代码,都是在走一条通向未知解的非确定性的道路;一个从未被创造过的东西!这是一次自我发现的旅程,也是我们智慧的表达。这就是到底什么是艺术!**

我们不是那种创造视觉愉悦供他人欣赏的艺术家。但是当我们爱一样东西时,我们会把美融入其中!

感谢阅读!

我经常在媒体上写关于领导力、技术&的数据——如果你想阅读我未来的帖子,请‘关注’我

R 中美丽的相关图——一种新方法

原文:https://towardsdatascience.com/beautiful-correlation-plots-in-r-a-new-approach-d3b93d9c77be?source=collection_archive---------9-----------------------

使用 plotly 以直观、互动的方式理解相关矩阵。

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

克林特·王茂林在 Unsplash 上拍摄的照片

每个从事数据工作的人都知道,美观和解释性的可视化是关键。毕竟,用图表讲故事比用普通的表格要容易得多。这在您创建报告和仪表板时尤其重要,这些报告和仪表板的目的是让您的用户和客户快速浏览有时非常复杂和庞大的数据集。

一种以解释性方式可视化的数据类型是相关矩阵。在这篇文章中,我们将看看如何使用 R 和 plotly 库把一个相关矩阵转换成一个漂亮的、交互式的和非常描述性的图表。

更新(2020-10-04):我不得不用静态图像替换一些链接图表,因为它们在手机上显示不正确。

1.介绍

数据

在我们的示例中,我们将使用 mtcars 数据集来计算 6 个变量之间的相关性。

data <- mtcars[, c(1, 3:7)]
corrdata <- cor(data)

这给了我们将要使用的相关矩阵。

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

mtcars 相关矩阵(图片由作者提供)

现在,虽然所有的信息都在那里,但一次消化所有的信息并不是特别容易。输入图表,特别是热图。

基本图表

作为起点,base R 为我们提供了 heatmap()函数,让我们至少可以更好地可视化数据。

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

base R 热图(图片由作者提供)

虽然这是朝着正确方向迈出的第一步,但是这个图表仍然不是非常具有描述性,最重要的是,它不是交互式的!理想情况下,我们希望将我们的最终产品包含在一个漂亮闪亮的仪表板中,并使我们的用户和客户能够与之交互。

Plotly 热图

Plotly.js 是一个 JavaScript 图形库,构建在 d3.js 和 stack.gl 之上,允许用户轻松创建交互式图表。它是免费和开源的,幸运的是,我们有一个 R 实现!

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

plotly 热图(图片由作者提供)

这又是一个进步。我们的相关性矩阵现在显示为一个交互式图表,并且我们有一个颜色条来指示相关性的强度。

然而,当你快速浏览图表时,会有什么发现呢?你能立即识别最强和最弱的相关性吗?大概不会!并且还显示了许多不必要的数据。根据定义,相关矩阵是对称的,因此每个相关矩阵包含两次。此外,变量与其自身的相关性始终为 1,因此我们的图表中没有必要出现这种情况。

改进的 plotly 热图

现在看看下面的图表,试着回答同样的问题。

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

改进的 plotly 热图(图片由作者提供)

好多了!图表是干净的,我们可以立即发现最强和最弱的相关性,所有不必要的数据都被删除,它仍然是交互式的,并准备好作为一个美丽的仪表板的一部分显示!

为了实现这一点,我们使用了散点图,并使方块的大小取决于相关性的绝对值。

你如何自己创建这样一个图表(用一点努力)?我们来看看吧!

2.履行

我们需要做的第一件事是转换我们的数据。为了创建适合我们需要的散点图,我们只需要一个网格。对于相关矩阵,x 和 y 值将对应于变量名,但我们真正需要的是等间距的数值来创建网格。我们的转换将相关性矩阵转换成一个包含 3 列的数据框:网格的 x 和 y 坐标以及相关的相关性。

#Store our variable names for later use
x_labels <- colnames(corrdata)
y_labels <- rownames(corrdata)#Change the variable names to numeric for the grid
colnames(corrdata) <- 1:ncol(corrdata)
rownames(corrdata) <- nrow(corrdata):1#Melt the data into the desired format
plotdata <- melt(corrdata)

您可能想知道为什么行名的数值在上面的代码中是颠倒的。这是为了确保生成的图具有从左上角到右下角的相关图的主对角线(不像上面的 base R 和 base plotly 示例)。

结果,我们得到一个类似这样的数据帧:

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

转换后的相关矩阵(图片由作者提供)

我们可以用下面的代码绘制它:

fig <- plot_ly(data = plotdata, width = 500, height = 500)
fig <- fig %>% add_trace(x = ~Var2, y = ~Var1, type = “scatter”,   mode = “markers”, color = ~value, symbol = I(“square”))

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

相关矩阵的初始散点图(图片由作者提供)

这是一个好的开始,我们已经正确地设置了网格,我们的标记也根据数据的相关性进行了着色。不可否认,我们真的不能正确地看到它们,它们都有相同的大小。我们接下来会解决这个问题。

#Adding the size variable & scaling it
plotdata$size <-(abs(plotdata$value))
scaling <- 500 / ncol(corrdata) / 2
plotdata$size <- plotdata$size * scaling

首先,我们定义一个大小变量作为相关性的绝对值。为了正确地确定方块的大小,我们需要将它们放大,否则我们只会得到小点,并不能告诉我们太多。之后,我们可以将尺寸添加到标记中。

fig <- plot_ly(data = plotdata, width = 500, height = 500)
fig <- fig %>% add_trace(x = ~Var2, y = ~Var1, type = "scatter", mode = "markers", color = ~value, marker = list(size = ~size, opacity = 1), symbol = I("square"))

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

散点图,带有按绝对相关性缩放的缩放标记(图片由作者提供)

再靠近一步!基本功能现在已经存在,我们的正方形与相关性一起正确缩放,并且与着色一起使我们能够一眼识别高/低相关性对。

接下来我们将执行一些清理工作。我们将正确命名我们的变量,删除所有网格线,并删除轴标题。为此,我们将设置自定义轴列表。我们也将中心色条。

xAx1 <- list(showgrid = FALSE,
 showline = FALSE,
 zeroline = FALSE,
 tickvals = colnames(corrdata),
 ticktext = x_labels,
 title = FALSE)yAx1 <- list(autoaxis = FALSE,
 showgrid = FALSE,
 showline = FALSE,
 zeroline = FALSE,
 tickvals = rownames(corrdata),
 ticktext = y_labels,
 title = FALSE)fig <- plot_ly(data = plotdata, width = 500, height = 500)
fig <- fig %>% add_trace(x = ~Var2, y = ~Var1, type = “scatter”, mode = “markers”, color = ~value, marker = list(size = ~size, opacity = 1), symbol = I(“square”))fig <- fig %>% layout(xaxis = xAx1, yaxis = yAx1)
fig <- fig %>% colorbar(title = “”, limits = c(-1,1), x = 1.1, y = 0.75)

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

初始清理后的绘图(图片由作者提供)

我们之前已经提到过,由于相关矩阵是对称的,所以在相关矩阵中显示了大量重复和不必要的数据。因此,我们可以在绘图中删除主对角线以上并包括主对角线的所有条目(因为主对角线中的所有条目根据定义都是 1)。最简单的方法是在应用变换之前,将原始相关矩阵中的这些值设置为 NA。因为这将导致图表的第一行和最后一列为空,所以我们也可以删除它们。

#do this before the transformation!
corrdata[upper.tri(corrdata, diag = TRUE)] <- NA
corrdata <- corrdata[-1, -ncol(corrdata)]

再次绘制我们的图表会产生以下结果:

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

移除值后的绘图(图片由作者提供)

快到了!最后一步是添加网格线,给我们的图一个漂亮的背景,并修正当鼠标悬停在方格上时显示的信息。

为了添加网格,我们将在绘图中添加第二条轨迹,这样我们就能够有第二组 x 轴和 y 轴。我们将使这条轨迹不可见,这样就不会有任何东西干扰我们的相关平方。由于我们使用单位值来放置初始网格,我们需要将它们移动 0.5 来创建网格线。我们还需要确保我们的轴绘制在相同的范围内,否则一切都会变得混乱。这听起来很复杂,但确实很简单。

因为我们已经走了这么远,下面是产生最终情节的完整代码。

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

最终相关图(图片由作者提供)

3.结论

在对如何创建显示相关性的更漂亮的图表进行了冗长的描述之后,我们终于得到了我们想要的结果。希望这篇文章能让你创造出令人惊奇的、互动的情节,快速洞察相互关系。

请务必让我知道,如果你有任何反馈或建议,以改善我在这篇文章中所描述的!

奖金

对于那些感兴趣的人来说,我已经把包括更多特性的完整代码作为一个 R 包提供,叫做

新增功能包括:

  • 根据地块大小自动调整比例
  • 颜色选项包括十六进制颜色、蓝色和绿色
  • 自动格式化背景、字体和网格,以适应不同的闪亮主题
  • 相关性随时间变化的动画(开发中)

此外,一定要看看我的帖子关于 3 个简单的技巧来改善你的图表,以进一步增强我们在这里所涵盖的内容!

用 Matplotlib 定制漂亮的彩色地图

原文:https://towardsdatascience.com/beautiful-custom-colormaps-with-matplotlib-5bab3d1f0e72?source=collection_archive---------11-----------------------

使用自定义的色彩映射表升级您的图表游戏,以匹配您的主题。

如果你的 Matplotlib 图表需要一个色彩映射表,而你没有使用一个内置的映射表,你可能会有一段不好的时间。我曾经害怕用 Python 编辑色彩映射表。我查看的每个帮助线程都显示了不同的方法,没有一个完全符合我的情况。这总是令人失望,因为色彩映射表可以极大地改变你用数据可视化发送的信息,甚至可以使你的图表无法使用。

不相信我?看看这个。

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

每个可视化显示相同的数据(澳大利亚地方政府区域的估计人口),但具有不同的色彩映射表。数据是连续的和积极的,这是通过仔细检查每个图例显示的。然而,彩色地图讲述了一个不同的故事,有点像金发姑娘的故事:

  1. 第一个图表使用顺序色彩映射表,其中亮度值始终单调变化(增加或减少)。如果观想中的细节很重要,那么顺序可能不是你的最佳选择,因为很难比较具有相似值的区域。
  2. 第二个图表使用了发散的颜色图。颜色越多,就越容易分辨出相似值之间的差异,但这也向观察者暗示了数据是以正常基线为中心的,比如零。如果我们对平均值的数据进行归一化,那么这个尺度是合适的,但是因为我们只是显示了一系列正值,所以它在这里不适用。
  3. 第三张图表恰到好处。这类似于顺序贴图,因为颜色在整个过程中逐渐变化,一端清楚地指示较高的值,另一端指示较低的值。然而,这张地图包括更多的颜色,这使得观众更容易比较小的差异。

这些只是一些你可以使用的色彩映射表的例子,更多细节和选项,请查看 Matplotlib 的指南。

如果你试图让一个颜色图适合一个主题,那么设计和创建这个颜色图会变得更加困难。例如,嵌入在仪表板或网站中的可视化,带有现有的配色方案。为一个完全专业的最终产品付出额外的努力是值得的,本指南将帮助你实现这一目标。

使用 Matplotlib 内置的色彩映射表

让我们创建一个测试图像,并关闭轴记号,使它看起来更好一些。

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

默认 matplotlib 色彩映射表。

现在让我们编辑图像,并测试 4 种不同的内置 Matplotlib 颜色映射。

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

四个内置 matplotlib 彩色地图。

创建您自己的色彩映射表

如果 Matplotlib 默认色彩映射表不符合您的需要,您可以随时创建自己的。在本教程中,我假设你有一些想在色彩映射表中使用的颜色。如果没有,向下滚动到底部的一些资源,以帮助选择你的颜色。

在不同的颜色格式之间转换

如果你有一套基于品牌或网站主题的特定颜色,它们很可能是十六进制格式的。首先,让我们定义一些函数,将十六进制转换为 RGB,将 RGB 转换为十进制(每个 RBG 通道的值在 0 到 1 之间)。

下面显示了我的十六进制颜色,以及它们的 RGB 等价物(我用来生成这个图像的代码是这里是)。

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

创建连续的色彩映射表

让我们创建一个包含以上所有颜色的连续色图。我们将使用名为 LinearSegmentedColormap 的 matplotlib.colors 函数。这个函数接受一个包含红色、绿色和蓝色条目的字典。每个条目应该是一个由 xy0y1 元组组成的列表,形成一个表中的行。所以,如果你想让红色在下半部分从 0 增加到 1,绿色在中间部分增加到 1,蓝色在上半部分增加到 1。然后,您可以使用:

cdict = {'red':   [(0.0,  0.0, 0.0),
                   (0.5,  1.0, 1.0),
                   (1.0,  1.0, 1.0)],

         'green': [(0.0,  0.0, 0.0),
                   (0.25, 0.0, 0.0),
                   (0.75, 1.0, 1.0),
                   (1.0,  1.0, 1.0)],

         'blue':  [(0.0,  0.0, 0.0),
                   (0.5,  0.0, 0.0),
                   (1.0,  1.0, 1.0)]}

迷茫?我也是。所以我写了一些代码(如下)来包装这个函数,让它更容易管理。下面的代码可以用来在列表中任意数量的十六进制颜色之间进行映射,它使用我们之前定义的函数将十六进制转换为十进制。

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

通过提供一个从 0 到 1 的浮动列表,我们还可以将颜色映射到颜色条上的特定位置,以便扩展地图某些部分的表示。

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

创建发散的色彩映射表

我们也可以使用这个代码来创建一个发散的颜色图,如果我们的数据要显示在某个中点附近,比如零,这是很有用的。如果数据不是以中点为中心,例如范围从-2 到 5,我们需要将色图的中心移动到数据的中点。下面的代码显示了如何通过使用 TwoSlopeNorm 创建一个范数来实现这一点,然后在 imshow 中使用该范数在映射到颜色之前将数据缩放到[0,1]范围。

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

为色彩图选择正确的颜色

请记住,虽然我不会在这篇文章中详细介绍,但你对颜色的选择不仅仅是美学上的,还有一整个领域致力于理解不同颜色和组合对人类理解的影响。还有一个要考虑的问题是色盲的人会如何看待你的色彩映射表。选择颜色时,你应该考虑这两个因素。

如果你在选择颜色时需要一些灵感,这里有一些我觉得有用的来源。

  • 酷派
    酷派是一款拥有如此多功能的神奇应用。出于创建连续色阶的目的,我更喜欢他们的颜色渐变生成服务,它有大量漂亮的调色板,可以很好地过渡到连续色阶,并可以调整以满足您的需求。
  • Gregor Aisch 的 Chroma
    Chroma 对优化你的调色板很有用。它可能有一点点问题,但它有助于您获得两种或更多种颜色,并生成中间值的完整范围。它还能告诉您您的电子秤是否色盲安全。
  • W3schools 调色板这有一些不错的调色板示例。W3 还提供了其他免费的服务来选择基于颜色理论的调色板,在不同的颜色格式(如 Hex,RGB 等)之间转换,以及许多其他有用的工具。
  • Hayk An 的色标生成器
    我在上一个项目中偶然发现了这个色标生成器。这是一个很好的资源,您可以在其中生成随机的、视觉上令人愉悦的色阶,然后调整它们的属性,包括添加更大范围的颜色以及调整饱和度和亮度等。

查看我的 GitHub 获取本教程的代码。

Beautiful-Head:追踪名降的演变及其在博客中的关系

原文:https://towardsdatascience.com/beautiful-head-tracing-the-evolution-and-associations-of-name-drops-in-blogs-c6764b3504ee?source=collection_archive---------36-----------------------

一种自然语言处理和网络科学的方法来可视化信息流中的命名人的动态(演示@beautiful-head.appspot.com

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

查看所有演示@【beautiful-head.appspot.com

介绍

指名道姓——利用他人的名字来维护自己的表达的丑陋、可悲的行为——已经成为一种指责,一种文化机制,立即将他人的表达贬低为仅仅是一种令人讨厌的借口。面对不断被点名的人,我们甚至可以假装不知道,做一个游戏。我们意识到,名字可能会被滥用。我们在正常的谈话中,在社交媒体上,在各种各样的作品中体验到这一点——无数的名字,从巨著到对作者来说有着神圣地位的默默无闻的人物。尽管韦氏词典将其定义为“经研究但看似随意提及的 杰出的 人物,以此来给其他人留下深刻印象”,我们可以想象,贬低名字可以延伸到任何名字,甚至是不那么杰出的名字,这对于我们的表达有某种实用功能,无论是增加我们的可信度、可联系性还是减少可能的批评途径。

然而,这个项目从这种可耻的对留名的指责转向了一个更宽容的角度,即留名可以被用来告诉我们一个作者随着时间的演变。在开始我如何操作这种方法之前,我先讨论激发这种分析的两个理论概念。即,

  1. 在动态文本流(即随时间变化的文本,如博客帖子、推文等)中(专有名词、命名实体,即人)的命名。)是一种独特的“向观众传达信息的手势”。(下面我会具体讨论我这么说的意思。)
  2. 所有的思想都是通过他人来思考的,因此名字可以被抽象为控制一个人知识领域的媒介。(这来自概念理论,即技术上没有真正的“原创”这种东西,而是一切都是混搭。)

这两个理论概念,再加上在公共环境中学习,可以被用来追踪一个作者的作品,基于作品中演变和形成关系的人名地址。虽然它可以扩展和测试各种各样的应用,这个项目试图展示我们如何去创造和说明这样一个进化和关联的过程。

然后我将展示 3 个视图——一个定制的动态网络动画,一个总结动态网络的交互式可视化,以及一个静态显示域名滴之间关联的矩阵。我将以一些评论来结束本文,这些评论是关于可视化如何为作者的作品提供一个(宏大的)“信息姿态”来提前告知,从而支持读者的解释以及增强作者的自我展示能力。最后,我展示了可视化信息流的额外演示——尽管它们偏离了这个项目的细节。

目录:

1 —动机(概述这种方法背后的理论的非正式文章——不感兴趣的读者可以跳过这一部分,可视化仍然有意义,尽管它们缺乏紧迫性。)

2 —操作化(数据收集和网络结构)

3-视图 X:动态网络动画

4-查看关联的 Y: A(汇总)图

5-视图 Z:名称下拉矩阵

6 —备注

7 —附加内容和其他演示

可视化演示:

查看 X 演示:奥斯汀·克莱恩的动态网络动画

查看 Y 演示:奥斯丁·克莱恩的关联图

查看 Z 演示:奥斯汀·克莱恩的姓名下拉矩阵

用作数据的信息流来自奥斯汀·克莱恩的博客*——我在动机部分解释了为什么我在这个项目中使用他的帖子。**

定义

  • 信息流: 随着时间的推移不断到达的一系列(相关)文档(文本)(新闻、博客、twitter 等。)
  • 指名-降将: 指称一个被指名的人
  • 动态网络: 随时间变化的网络(即由节点和边组成的图)

1 —动机

名称删除作为唯一的信息

Thorn-R. Kray 在他的论文中提到了一个“临界点”,即“对权威名字的合法引用……变成了令人讨厌的 冒名顶替 *”的现象。(*在他的语境中,他关注的是学术话语中的权威名称,但我们可以把讨论延伸到公共话语中,损失不大。)这意味着,域名删除(引用)机制在某个阈值处变得合适。Kray 进一步承认,很难将留名简单地归结为对权威的虚假诉求——这种行为有一些更特殊的地方,需要我们将其视为一种社会实践,而不是一种修辞逻辑手段。

他提到了高夫曼的经典研究日常生活中自我的呈现:

“当一个人出现在其他人面前时,他们通常会试图获取关于他的信息或利用已经拥有的关于他的信息。[……]关于个人的信息有助于确定情况,使他人能够预先知道他对他们的期望和他们可能对他的期望”(Goffman 1956)

在这种社会理论下,留名基本上仍然是“向观众表达的一种姿态”,但不一定(仅仅)包含“留下深刻印象”的险恶动机。抛名是一种礼貌的社交策略——一种提前向观众提供信息、设定期望的方式,是论文前的摘要。

(然而,这也是一场赌博——正如高夫曼所说的互动中的大多数其他台词——可以在对方心中产生各种各样的印象[“他很聪明!”,“哇,他自命不凡”,“但他读过德勒兹吗?”],导致的后果包括信任感、与人交往的能力,或者因输掉赌注而感到彻底的尴尬和羞愧。)

将指名道姓视为对观众的手势,意在提前告知(而不仅仅是为了留下印象或娱乐)给了我们最初的动机:如果在我们的分析中,我们赋予指名道姓一种独特的信息现象的功能,与其他文本现象相比,我们会对作者有什么样的看法?

名字滴作为一种媒介,随着时间的推移而构建

Kray 引入了一种信任/怀疑的紧张关系。一方面,无论是否为了给人留下深刻印象,指名道姓都是期望建立信誉,然而矛盾的是,有一种潜在的怀疑,认为一个人指名道姓只是为了建立信誉*。奇怪的是,如果有人认为这种对可信度的呼吁是为了掩盖不可信的东西,那么可信度的条件就会引起怀疑……这种矛盾的禁令来自科学话语本身的结构:*

“……年轻的科学家必须学会什么时候接受共识的权威,什么时候抵制它。”(奥灵顿,1977 年)

“这样的要求在本质上是自相矛盾的。新手必须学会遵循传统,同时对它保持足够的怀疑。每一次未能达到与之相关的期望都会立即被注意到。假笑和奇怪的微笑会引起一种不充分的感觉,这是对学徒错误的惩罚。然而,这种残忍似乎是一种不可避免的邪恶。要求学生“独立思考”,同时又要求熟悉一种高度排他性的话语,这种话语本应指导学生“如何思考”,这是一种迂回的双重约束
—克雷

我们可以再一次将科学的形象延伸到更广泛的公众中。从学术界到推特回复中出现的游击战,我们被“独立思考”的社会指令轰炸,‘批判性思考!’同时期望展示我们的凭证(通常以通过*说出我们在想谁的形式出现)。*尽管这可能有些自相矛盾,但这同时也承认了为什么我们无法克制自己不去取名字:

"…放弃名字是一种无法避免的做法,因为它将我们与我们学科历史的知识遗产联系起来。就像任何好的仪式一样,把过去的想法转化为现在的想法,这就是抛名字的作用。”
— Kray

艾伦·雅各布斯在他为普通读者写的书《如何思考》中更进一步,声称“独立思考是不可能的”。虽然克雷最终框定了一种不可避免地存在且必须通过经验来导航的信任-怀疑主义紧张关系,但雅各布斯将这一概念引向了其逻辑结论——命令“为自己着想”通常意味着“与我想通的人一起思考,而不是与你想通的人一起思考”。对于雅各布斯来说,认为有一种“思想”会不受智力联想的影响而来到我们身边是愚蠢的。为了更进一步,雅各布斯还大胆地声称,为自己思考不是不可能的,而是不可取的。

脱离他人独立思考是不可能的,即使可能,也是不可取的。思考是必然的、彻底的、奇妙的社会性。你所想的一切都是对别人所想所说的回应。当人们称赞某人“独立思考”时,他们通常意味着“不再听起来像我不喜欢的人,而开始听起来更像我喜欢的人。”
—艾伦·雅各布斯

思考是一种社会行为,不管是对死去的人还是对坐在我们身边的人——没有人能保证(而且不断有证据表明这一事实),我们甚至能在一个与联想网络脱节的想法中找到乐趣。当然,这并没有直接转化为姓名丢弃的现象,但它确实开辟了将姓名视为定向媒介的可能性——也就是说,这些媒介构建和塑造其内容,而不仅仅是使其可见。

作为媒介,名字可以成为动态网络的“锚”——随着时间的推移,稳定我们知识领域中的各种概念和主题,以及构建我们如何感知和呈现它们。本质上,这给了我们第二个动机。大多数网络分析都试图不偏爱一种文本现象或引入层次结构(让数据说话而不受理论干扰的更大概念的一部分),但如果名称确实有特权(作为管理所有其他概念的媒介),则网络分析技术很大程度上依赖于计数、聚合、求和等。可能不会暴露他们的特殊身份。

因此,将名字滴概念化为锚定概念的媒介,加上高夫曼将名字暗示为独特的信息社交策略,为这个项目提供了潜在的驱动力——这是尝试将动态信息网络可视化,将名字滴作为上述的媒介。

作为偷窃的好方式的抛名(像一个艺术家)

虽然我们有自己的动机,但我想用这一部分来提醒大家,虽然这是一种“赞美降名”的项目,但我并没有排除错误或粗俗的使用给我们带来烦恼的可能性。我确实同意 Klay 的评估,当我们给一些东西贴上抛头露面的标签而不仅仅是引用的时候,就有一个“引爆点”。然而,我对我们在这一点上的决定提出质疑——具体而言,指控某人诽谤似乎与诽谤的实际行为具有同等的险恶用心。

看起来,区分令人讨厌的留名现象和不那么令人讨厌的事情的真正原因是我们对留名者阴暗而深刻的意图的判断——他们是在用这个名字来打动我们,还是更像是向他们正在思考的思想家致敬?事实上,除去任何庸俗的渴望来打动自己非凡的外表,但保持或多或少相同的机制(即暗指别人,为你的表达提供某种功能),降名的行为被减少到比平庸的“表达样板”多一点——我们可以称之为“给予信任”、“引用”或“引用来源”。然而,它是我们乐于在社会中容忍的样板,因为它提供了安全,避免了更深不可测的剽窃。

因此,我感觉到了一种同样矛盾的紧张关系,即在社交中,放弃名字是一种耻辱…一方面,我们被要求提交参考文献以保护自己免受剽窃的犯罪,另一方面,有一种“提交我们自己的想法”的溢出压力,以及“抛头露面与智力不安全感相关联”的恐惧。事实上,如果艾伦·雅各布斯是对的,为自己着想是不可能的,也是不可取的——我倾向于认为他是对的——这个问题可以从根本上转变为‘为什么我们不把的名字写得更像’(在一定的抄袭和知识产权概念下)。

勒撒姆在他辉煌的散文 影响力的狂喜中,大胆地承认了这种紧张,并主张采取激进的拥抱,认为否认抄袭活动的必然性是一种“来源伪善”。我直接引用他的断言,担心我不能公正地间接讲述它:

任何文本都是完全由引用、参考、回声、文化语言编织而成的,它们在一个巨大的立体声系统中贯穿始终。构成文本的引用是匿名的,不可追踪的,然而已经阅读了*;它们是没有引号的引用。核心,灵魂——让我们进一步说,所有人类话语的实质、主体、实际和有价值的材料——是剽窃。因为基本上所有的想法都是二手的,有意识或无意识地从一百万个外部资源中汲取,并且每天被收集者骄傲和满足地使用,这种骄傲和满足来自于他发明了这些想法的迷信;然而,除了从他的精神和道德素质以及他的气质中得到的一点点变色之外,他们在任何地方都没有一点独创性,这一点在措辞的特点中表现出来。新旧构成了每一刻的经纬。没有一根线不是由这两股线拧成的。出于需要、癖好和高兴,我们都引用。神经学研究最近表明,记忆、想象和意识本身是缝合、缝合和模仿的。如果我们剪贴自己,难道我们不能原谅自己的作品吗?*

这种想法,奥斯汀·克莱恩通过他的项目像艺术家一样偷窃*(在我的阅读中,它超越了他的书,扩展到他的虚拟身份)为这种创造性和构思的“剪切-粘贴”方法提供了实用的指导方针。他在一个好盗窃/坏盗窃的比较中简洁地概述了这一点😗

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

*从这个意义上来说,指名道姓几乎是一种礼貌——这不仅是一种相当有信用的方式,也是向你的“英雄”致敬的一种方式。(注意,在这个项目的名字掉落的概念化中,他们不一定是“英雄”——作为灵媒,他们可能是反英雄,习惯性的批评对象,等等。).到目前为止,你会注意到我提到了一种留名的形式,有些人可能倾向于将其视为简单的引用,但引用更接近于正式引用的概念,而不是像留名这样非正式、随意、善意的提及。正如 Kleon 强调的那样:“*如果你觉得它廉价或错误,它很可能就是。我提倡对自己的作品进行一次“电梯内脏检查”:如果你在一部停着的电梯里遇到了你要偷的艺术家,他们会和你握手或打你的脸吗?把这个建议运用到抛名本身的张力上,并不太难。

因此,通过勒撒姆的文章和克里昂的作品(在艺术家、作家等中非常流行)中概述的观念。),我们还可以观察到个人的理论框架——支配着某人的作品和其他产出——刺激着名字的删除。这增加了将域名抢注作为分析对象的支持,也为我们提供了一个这样的分析可以蓬勃发展的环境:一个在公共场合学习的环境。公共学习是一个松散的术语,我用它来描述博客和微博(社交媒体)记录一个人的学习(以及他们学习的媒介)的增长趋势。Kleon 引用 C.S. Lewis 的话,将这一过程归因于他的在线成果:

“我为不学无术的人写一些我自己都不知道的东西……经常发生这样的事,两个学生能比老师更好地为彼此解决工作中的困难……我以业余爱好者的身份给另一个学生写信,谈论我遇到的困难或我获得的光明……
——c . s . Lewis

“这是我一直试图在舞台上写作、教学或演讲的方式:不是作为一名专家,而是作为一名同学。T5 我在努力学开*。我让别人看着我,而我在想办法。”
—克莱恩*

“在开放中学习”的驱动力,加上我们对善盗和影响力的讨论,提供了一个很好的背景,在这个背景下,对姓名删除的分析既可以是可访问的作者受到激励,在他们的帖子中删除姓名并列出他们的媒介有意义的对这些媒介的分析反过来将有助于理解作者作品和思想的演变

这也让我选择使用奥斯汀·克莱恩的博客作为可视化的数据集。

连接到信息流的一般研究

Kleinberg 的 在线信息流的时间动力学 是一篇优秀的调查论文,研究了我们在处理信息流时遇到的各种问题(通过信息网络的视角)。正如 Kleinberg 所展示的,随着时间的推移,跟踪主题的演变,识别流中的“事件”,以及信息可视化都是该领域的重要方面——本项目略微触及了所有这些方面。如前所述,从根本上说,这项工作更接近于提供一种可能的信息可视化形式——一种在信息网络中赋予姓名特权的形式。虽然肯定不接近正式研究的形式——我并不真正“测试”任何东西——但这是一种非正式的探索,探讨如果我们通过社会理论而不是完全面向数据的方法来可视化,一种方法可能会是什么样子——及其结果的有趣性。

“处理信息流的时间动态的正确技术是什么?在新闻和电子邮件的典型例子中,可以看到这些信息流中固有的一些复杂性。每一个都为读者提供了一系列文件,展示了一个编织的和情节性的特征:编织,在某种意义上,许多平行的,主题连贯的流被合并和交织成读者看到的单一流;从某种意义上来说,主题通常在一段时间内变得越来越强烈,然后又逐渐消失。然而,尽管有这两个复杂性来源,这些原始形式的信息流缺乏任何明确的组织结构,超出了单个文章或消息的粒度。因此,处理此类信息流的第一步是定义适当的结构,抽象出它们相互交织的主题、它们的多次突发事件以及它们的长期趋势。
—Kleinberg, 在线信息流的时间动态

2 —操作化

生成该分析涉及许多步骤,每个步骤都需要复杂的技术参数调整才能获得有意义的结果。因为我在这里并没有开发任何新的东西——只是简单地剪切和粘贴各种数据挖掘、信息可视化和网络科学技术——所以我将只讨论高层次的技术步骤。

这个项目的数据以时间戳文档流的格式出现。具体来说,我抓取了 Austin Kleon 的博客站点以获取每篇博客文章(我们称之为文档)及其发表时间。

***Data Time Range:** 2006-06-14 - 2020-01-08
*I filter out a few of his earlier posts as noisy***Total Posts:** ~2000, before filtering*

提取域名和内容 为了获得我们的分析单位,我将每个文档通过一个解析器、带标签的位置和一个页面排名算法,得到如下结果:

  • 所有被命名的实体都是人(我们将称之为人名地址栏)
  • 所有其他名词和专有名词(我们称之为内容)
  • 权重以上每个人在帖子中的作用有多重要——为了获得合理的结果,这涉及多个步骤,包括 td-idf 平衡以及检查每个单词的信息内容

生成初始网络 对于同一个文档中出现的每个名字拖放,我用两个术语的重要程度的相对权重来表示它们之间的联系。对每一对域名进行这样的操作会生成一个节点和边的网络。由于我对服务于最像媒体的角色的名字删除感兴趣,我测量了每个节点的信息中心性——相对于边权重计算——并提取了前 5%。据推测,这为我们提供了随着时间的推移发挥了最重要作用的姓名地址。

请注意,除了提取的 5%之外的名字删除将被视为内容。从本质上讲,这些其他的名字滴,虽然本身就是媒介,但还不足以为了这些视觉化而从内容中分离出来。

跟随媒介理论家马歇尔·麦克卢汉,我们也可以概念化为“任何媒介的‘内容’总是另一种媒介”。因此,我们实际上只是试图提取最相关的媒介——人名、名词、专有名词,在某种意义上都是媒介——并将其余的标记为“内容”。**

类似地,对于每一个时间步,我们根据名字和内容是否同时出现在博客文章中来建立它们之间的联系。这给了我们动态的网络。

3-视图 X:动态网络动画

演示:奥斯汀·克莱恩的动态网络动画

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

动态网络随时间变化的动画

我提出的第一个观点是半信息性的——它提出了一个故事,但不是无缝的,尽管我仍然包括它——也是半艺术性的。这里的想法是创建一个动画,强调随着时间的推移,姓名地址和内容网络的特定属性。

如何解读此观点:

  • ***布局:*有一个通过链接连接的分割视图——为了消除混乱,我只让最相关的链接可见。上面的半部分包含名称拖放节点,下面是内容节点。左上角包含播放动画和左右移动时间步长的按钮。你也可以用左右箭头键和空格键来控制动画的播放/暂停。
  • ***A——节点:*彩色节点代表名称下降,非彩色节点代表内容。颜色并不重要,但基本上是通过对节点进行聚类的方法,基于名字点的时间外观模式来分配的。可以点击任何节点来高亮显示它们,使它们在整个动画中更容易被跟踪。
  • ***B —状态栏:*可视化上方的栏表示每个时间步节点的总权重和平均熵。
  • ***C——节点高度:*节点的高度表示它们的累积权重,因此更高的名称-drop 使用得更多,类似地,更高的内容节点使用得更频繁。
  • *D — **内容特异性:*这是内容的熵度量。基本上,内容节点越靠右,就越被各种各样的名称下拉链接。例如,上图中的“艺术”此时链接到多个名称拖放,因此出现在屏幕的右侧。如果一个内容节点,在历史上,已经连接到几个名字点,它将出现在左边,表明一个高特异性的媒体管理它。
  • *E — **中等特异性:*name-drop 节点基于它们当时连接的内容节点左右移动。因此,如果在给定时间,名称删除节点 X 连接到历史上与多个其他名称删除节点链接的内容节点,节点 X 将出现在右侧。这表示名称拖放相对于其所连接的内容的唯一性,具有高媒体特异性的名称拖放出现在左侧,因为它们连接到未通过其他名称拖放引用的内容。

总的想法是当名滴出现时,根据它们的垂直位置和大小来可视化它们在作者文本中的权重,根据它们的水平位置来可视化它们与连接的内容* 的特异性。这就产生了一个动画,展示了以域名为媒介的故事*,在作者的知识领域和信息流中导航它们的位置,这取决于通过它们思考和呈现的内容。****

4-查看关联的 Y: A(汇总)图

演示:奥斯汀·克莱恩的关联图

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

名称拖放和内容之间关联的总结图—可以将鼠标悬停在每个节点上,以交互方式查看详细信息

如果我们从前面的视图中移除动画因素并总结关联权重,我们可以可视化一个总结图,该图可视化了名字点(作者的媒介)以及内容之间的影响和关联。

如何阅读此视图:

  • ***布局:*节点基于它们第一次与作者文本中的重要概念之一有联系而从左到右定位。本质上,左边的节点,不管它们是内容节点还是名称拖放,都是最先出现在作者的输出中的,而右边的节点出现在它们最近的历史中。
  • ***A-Name-drops:*位于视图底部的节点是 Name-drops。可以将鼠标悬停在这些图标上,查看它们的汇总关联。节点的大小代表了名字点在整个历史中的总权重。即较大的节点比其他节点被更有效地使用。与上一个视图一样,颜色是根据名称拖放的时间模式分配的。
  • ***B —内容:*非彩色节点是一群内容节点。这些节点也是按照它们第一次出现的顺序排列的,它们的大小代表了它们在作者作品中的全部意义。我们可以有把握地假设,位于任何给定的名称拖放上方的内容节点在作者的历史中大约同时出现。如果这些节点直接连接到悬停在上面的名称拖放节点,它们就会亮起。

这个视图是交互式的,想法是将鼠标悬停在一个名字拖放节点上,以查看它过去或将来对其他名字拖放的影响**

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

交互性,以了解域名删除如何影响网络中的其他节点或受其他节点的影响

互动后如何阅读此视图:

  • ***布局:*当鼠标悬停在一个名字拖放节点上时,视图会改变以显示其关联和影响。右上角的面板控制过去或未来的影响是否可视化,以及是否显示或隐藏链接。总的想法是,越不透明的节点与所选择的名称下拉具有越强的连接(关联/影响)。
  • ***A —选择的名称:*用户悬停并选择的节点。
  • ***B —名字点之间的直接链接:*从所选名字到其他名字点的弧线表示直接连接。这意味着这两个名字一起出现在一篇文章中,因此在某种程度上,是相似内容的媒介。
  • ***C——高亮显示的内容节点:*当鼠标悬停在一个名称下拉菜单上时,任何内容节点都是彩色的,这意味着该内容和所选名称之间有直接的联系。内容节点的不透明性指示所选名称和内容之间的关联性的强度,不透明的内容节点指示与名称的高关联性。
  • D-其他名称-下拉:**根据所选选项,这些节点的不透明度表示它们对所选名称的影响强度。这种影响是基于它们与连接到所选名称的内容的关联性的重要性来计算的。本质上,如果这些节点是不透明的,这意味着它们已经显著影响了所选节点或受其影响——这取决于您是否在右上方的控件中选择了过去的或未来的影响
  • E——名称点和内容之间的非直接链接:**名称点和内容节点之间的直线连接线表示其他名称点如何影响所选名称或被所选名称影响。**即,当选择节点 Z 时,在名称-拖放 X 和内容 Y 之间的连接,而过去影响被选择,表明 X 在过去与 Y 相关联,因此影响 Z 和 Y 之间的连接——因此 X 通过 Y 影响 Z。**

一般来说,将鼠标悬停在一个名字删除节点 Z 上可以突出显示图中所有其他节点,这些节点在影响(未来)已经被节点 Z 影响(过去)。这种影响是通过与内容节点的连接计算的加权度量,考虑了作者作品中内容节点和名字删除的重要性。从理论上讲,这个视觉展示了媒体之间随着时间的推移而产生的影响——强调了塑造作者作品的影响的进程——以及被广泛讨论的大概念。****

5-视图 Z:名称下拉矩阵

演示:奥斯汀·克莱恩的名字-下降矩阵

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

奥斯汀·克莱恩博客的名降矩阵——每个单元代表名降之间的影响

最后,如果我们进一步总结总结图,我们可以从视图中删除内容节点,并简单地显示名称点之间的关联。这是最简单、可读性最强的视觉效果,它试图表达一个作者名字掉落的最快历史。矩阵,即使没有详细阅读,指出了作者如何通过他们的媒介工作的“直觉”。

如何阅读此视图:

  • ***布局:*这是一个通用的邻接矩阵表,横轴和纵轴代表域名。然而,请注意,根据作者信息流中的名字滴的总权重,的名字滴具有不同的代表区域。可以将鼠标悬停在矩阵中的任何单元格上,以确定它指向哪个姓名地址。
  • 单元格颜色和不透明度:**每个单元格的不透明度代表横轴名称拖放对纵轴名称拖放的整体影响强度。**
  • ***轴顺序:*水平轴和垂直轴(分别为从左到右/从上到下)上的所有名称-拖放按其第一次出现的时间排序。

一般来说,将鼠标悬停在某个单元格上可以突出显示该单元格所代表的关联的相关名称。实际上,查看横轴上给定域名称 X 的一列单元格,可以理解为“域名称 X 的过去连接对其他域名称未来连接的影响有多大”。相反,在纵轴上查看给定的名字滴 Y 的一行单元格读作“名字滴 Y 的连接受其他名字滴的过去连接的影响有多强”。(连接是指名称拖放和内容节点之间的链接,影响的衡量方式与之前的视图相同,即通过对共享内容节点的连接进行加权衡量)。从理论上来说,这种视觉效果既强调了主要的名字投放,也强调了名字投放在什么时候会产生影响。此外,由于矩阵是不对称的——域名称删除 X 对域名称删除 Y 的影响不等于 Y 对 X 的影响——该图描述了域名称删除和任何重大不平衡之间的相互影响。**

6 —备注

在这一节中,我想写下一些关于这种方法的局限性和这些可视化可以提供的见解的一般想法。

限制

  • 我通过令人眼花缭乱的分布“直观地”挑选了多个参数——选择多少个名字点,可视化“内容”的百分比,当帖子中的一个词被认为“重要”时,权重和计数的阈值,等等…这些可以通过更复杂、更系统的方法进行更严格的研究来确定。
  • 命名实体提取(确定什么是名称删除)本身并不完美,我做了大量的数据清理来连接各种专有名词,以确定它们实际上是相同的名称删除还是根本就是名称删除。尽管进行了清理,但有时还是会出现重复项,它们不会被识别为同一个实体——因为引用它们的方式略有不同。其他时候,某些实体根本无法识别,或者错误的名词被识别为人,这是非英语单词的一个长期问题。
  • 确定什么是真正最相关的“内容”需要更多的工作——对词汇、事件等的全面分析。正如克莱恩伯格在他的论文中提到的那样,这将是有益的,而不是简单地查看最相关的名词。与命名实体类似,我也做了一个非常简单的概念计数,如 1-gram,2-gram 名词,但还可以做更多的工作来将某些概念连接为一个相同的概念。
  • 我所表述的联系——名字和概念出现在同一篇文章中——对中等长度的文章很有效,但对较长的文章就不适用了。较长的帖子需要进行更深入的搜索,以找到单个帖子中的链接。(同样,对于像 Twitter 这样的小篇幅帖子或微博,要么需要大量数据,要么需要更复杂的方法来建立联系。)
  • 这种信息网络的结构赋予了点名的特权,但如果我们分析的帖子出于其他原因引用了许多名字,就会很快被打乱——例如政治新闻,它会引用多个政治候选人,而这些候选人可能不一定属于理论上的“点名”作为“信息手势”的概念。在这个项目中,通过特别关注在公共信息流中学习来缓解这个限制,在公共信息流中,名字丢弃通常属于我们的定义。
  • 请注意,这种分析不一定直接反映作者的“真实”影响和思想。虽然可能存在相关性,但我们可以严格地关注作者在这个项目范围内的作品——假设作者通过他们的作品展示了一个自我形象,不管这个形象有多“真实”。

可视化作为一种(宏大的)“信息姿态”

也许视觉呈现的直接效果直接源于动机——它们作为一种(宏大的)“信息姿态”,快速传播作者希望向读者描绘的自我形象。通过消除多余的连接,并缩小到可以安全可视化的范围,这个项目试图呈现信息流(在这种情况下,一个作者的博客)中的显著习惯性移动。通过以这种方式可视化习惯,读者可以使用这些可视化来快速衡量信息流的多个属性,包括:

  • 作者最不喜欢/最不喜欢哪个名字?琳达·巴里显然是克莱恩的代表)
  • 媒体是如何随着时间的推移而演变的——它们的使用何时开始或达到顶峰,它们何时被放弃,另一种媒体是否“接管”了现有媒体的领地?媒体使用的时间模式等。(例如。有趣的是,我们看到一些早期的名人开始影响克莱恩的未来作品,并受到其影响,直到梭罗,我们才看到另一个大“英雄”出现。这也表明克里昂不断地将他的讨论追溯到这些早期的英雄身上。)**
  • 作者影响力的多样性和扩散性——或者说缺乏——仅仅是看到不同博客的不同名字列表就可以帮助读者认识到他们可以期待的模式和阅读体验。
  • 一个名字掉落占据哪些概念的时空模式。
  • 广泛讨论的概念的可见性,以及它们如何与特定的名称下拉联系起来(特别是对于视图 Y)。
  • 等等等等等等。

考虑到以上这些特性和许多其他难以列举的特性,结合 Kray 和 Goffman 的理论概念——名字掉落是提前告知的信息手势,我们可以将可视化概念化为一个大信息手势。作为一种宏大的姿态,可视化通过对域名争议历史的汇总视图,告知观众他们可以提前预期的信息,并为他们做好准备。请注意,这种姿态并不一定依赖于读者对人名的了解——日常对话中很少出现人名——而是呈现了作者的“形象”(戈夫曼的自我呈现理论)。这个图像本身是一种媒介,通过它我们可以感知作者的信息流——作为一个粗糙、直观的例子,看到一个具有影响力扩散的各种有分量的名字滴的矩阵与一个影响力很小的单个高分量的名字滴的矩阵,可以立即给我们一个不同的想法,我们可以从作者的文本中期待什么。此外,这些可视化(尤其是矩阵和总结图)显示了定位作者讨论的“锚”系统的结构——在这个意义上,我们可以感知主题如何随着时间的推移在信息流中重复出现。

进一步的假设可能会出现,我们可以预期,如果我们大规模地观察多个域名删除网络,我们可以提取模式并对信息流的各种属性进行分类。我们甚至可以设想找到名降动态网络属性的比率、阈值和平台,通过观察可以将信息流聚集成不同的类型,或者可能将它们建模以预测信息流。

这些可视化——尤其是矩阵——也可以作为博客摘要。其他尝试——博客天线(Blog Antenna)——试图通过自相似性主题分析,用视觉来总结个人博客,但同样,优先命名可能是一个更合理的理论结构。

7 —附加内容和其他演示

【beautiful-head.appspot.com】其他演示可查看@T5

漂亮的头像参考

Beautiful-Head 这个名字是指贝宁格演唱的民族歌曲《Beautiful Head》:

“重新定义你自己
设计你自己
你永远不会看着我
得到你的关系图
一个策略
你在权衡你的选择
你会拿我换什么?
你最近在测量我
我可以告诉你
我可以告诉你我在减肥
你最近在测量我

你在给我穿衣服 ——国民,美丽的头第二节

不可思议,不是吗?我建议从信息网络的角度来听整首歌,以此来阐明名字掉落在戈夫曼的自我呈现社会理论中的作用。

可视化其他博客——政治和哲学

尽管这种分析对新闻和/或较小的信息流有局限性——正如我在限制一节中解释的那样——我仍然出于兴趣在一些其他作者和博客上运行它——只是为了看看。

亚历山大·加洛威——媒体研究,偶尔发表中大型文章

***Data Time Range:** 2014-10 to 2020-01
**Total Posts:** ~150, before filtering*

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

其他视图:盖洛威的演示可视化

沙迪·哈米德 —政治、中篇专栏、帖子和文章

***Data Time Range:** 2009-12 to 2020-01
**Total Posts:** ~250, before filtering*

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

其他视图:沙迪·哈米德的演示可视化

伊丽莎白·布鲁尼格 —政治/社会学、文化、中篇文章

***Data Time Range:** 2017-12 to 2019-10
**Total Posts:** ~100, before filtering* Due to the few posts - I only used her articles on Washington Post) -, I loosened my filtering criteria.*

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

其他视图:伊丽莎白·布鲁尼格的演示可视化

可能是因为职位数量少,但有一个非常明显的不对称性,表明除了少数关键候选人(伯尼,沃伦等。),旧域名会影响未来的域名,但很少有反向引用。这可能是文化/观点写作的结构属性,其中信息流不断地处理当前事件,因此通常在不改变过去观点的情况下前进(不像在公共博客中学习)。

可视化微博

这个项目是为博客帖子定制的,但我在一些 twitter 账户上运行它是为了好玩——我认为——在某种程度上在公共环境中使用它们的提要(混合了宗教(伊斯兰教)、哲学和政治的内容)。 注意,由于 Twitter 数据收集的限制,这不是一个用户的完整历史,而是最近约 3200 条推文/RTs +回复。

***Accounts**: [Evollaqi](https://twitter.com/Evollaqi) & [IbnMaghrebi](https://twitter.com/IbnMaghrebi)*

Evollaqi 的演示可视化

IbnMaghrebi 的演示可视化

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

我自己的推特表现…

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

Twitter 上公共学习的可视化

最后,我展示了我自己的 Twitter 的名字删除矩阵——与这篇文章中的其他人相比,这是一个非常尴尬的自我形象…(我当然不总是以一种公众学习的方式使用 twitter,但我最近开始更多地使用了)。

这个矩阵肯定包含了我在 Twitter 上的所有主要名字,它准确地反映了我后来的变化,即在矩阵的右下角有更强的关联,表现得更有联系,更有学习力。

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

感谢您的阅读。如果你有任何想讨论的问题或想法,请随时在 Twitter 上联系我。

如果你认为有另一个博客或信息流可以通过这个项目有趣地可视化,让我知道,我会看看我能做什么!

美化冠状病毒条形图

原文:https://towardsdatascience.com/beautify-coronavirus-bar-charts-ac636d314d98?source=collection_archive---------51-----------------------

超越 Matplotlib 基础的 5 个步骤

当你刚接触 matplotlib 的时候, plt.show() 的结果并不是特别令人印象深刻。当然,它对传达信息很有用,但它不是那种可以放在文件夹里或向朋友炫耀的图表。

五个关键调整可以将基本图形转换为漂亮的图形。美丽在这里并不意味着无关紧要。当谈到图形数据时,漂亮包括正确的背景、方向、大小、颜色和标签,以提供一个有吸引力的、清晰的和信息丰富的图形。

在本文中,我们加载冠状病毒数据,准备用于绘图的数据,使用 matplotlib 绘制基本条形图,并使用 5 个键调整将绘图转换为漂亮的图形。本文假设读者对熊猫有基本的了解。

加载冠状病毒数据

首先,我们需要一些数据。以下代码将约翰·霍普斯金冠状病毒 Github 数据集分配给变量 url 。该文件是一个 CSV 文件,并且在靠近末尾处提供了日期。该日期可由用户更新以获得最新的冠状病毒信息。数据集每天更新。

接下来,导入熊猫,然后使用 pd.read_csvdf.head() 读取并显示数据帧。

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

从最后一栏可以看出,数据是按城市和国家提供的。该数据集包括所有国家。要仅绘制来自国家/地区的数据,我们可以通过列*‘国家/地区’进行分组。我们选择*‘sum’聚合来获得除纬度和经度之外的所有数字列的精确计数。

最后,我们只选择提供关于冠状病毒的数字信息的列,即*、、【死亡】、、【恢复】、、【活动】、*。

现在开始制图。

准备用于打印的数据

matplotlib 很容易生成一个图。在条形图的情况下,您只需要 x 值,即您想要比较的类别,以及 y 值,即比较的列。我们将比较每个国家的恢复病例数。

创建一个包含数百个类别的条形图是不可行的。在冠状病毒数据的情况下,类别是国家,由列为我们的组之后的索引。我们将只选择前 10 个国家。

首先,使用 sort_values 方法,通过选取 10 个最高回收数量的国家来分割数据框架。结果可以存储在新的数据帧中,如下:df _ Recovered = df . sort _ values(by =‘Recovered’,ascending=False)[:10]

接下来,使用索引上的 to_series 方法将索引转换为序列。这种转换的原因是在绘图时使用列是标准的,实际上是熊猫系列。这些指数,通常是你在 T4 分组之后想要的类别,必须被转换。以下代码将索引国家转换为序列:x _ vals = df _ recovered . index . to _ series()

我们还设置了*y _ vals = df _ recovered[’ Recovered ']*来选择“Recovered”列作为我们的 y 值。

以下是分割数据帧并设置 x 和 y 值的步骤。

使用 Matplotlib 的基本条形图

条形图是许多 matplotlib 图中的一种。导入 *matplotlib,*之后,您决定想要绘制的绘图类型,在我们的例子中是条形图,然后您插入 x 和 y 值,后面跟着 plt.show() ,如下所示。

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

这是我电脑上的图表。它捕捉到了关键信息,但是国家名称连在一起,太小了,不美观。

现在,让我们使用相同的信息和 5 个关键的调整来创建一个美丽的条形图。

调整一:进口海博

seaborn 是 matplotlib 的一个很好的补充。我一直使用 seaborn ,因为我更喜欢带有网格线的灰色背景,我发现 seaborn 中的许多图形选项,如线性回归,更容易使用,更美观,并提供更多信息。

下面的代码将 seabornmatplotlib 一起导入,并将背景设置为漂亮的深色网格。

调整 2:水平前进

我们已经有了数据集, df_recovered 。上面给出的 x 值和 y 值的信息可能保持不变,只有一个例外:将它们转换为水平条形图。

水平条形图更容易阅读,因为 x 轴上的间距不再杂乱。当订购垂直堆叠时,水平条形图也提供了很好的美感。

以下是切换 x 和 y 的代码。注意,在条形图函数中设置参数 orient=‘h’ 也可能有效。

调整 3:改变体形大小

这是一个大的。我不确定为什么默认的 matplotlib 图这么小。增加尺寸总是一个好主意。你可以看到更多的细节,图形不那么拥挤,它们占据了更多的屏幕空间。

您可以使用 plt 上的fig的方法,然后在括号内设置 figsize 的尺寸。注意尺寸是(水平,垂直)。这里有一个大尺寸的作品。根据自己的喜好调整数字。

调整 4:使用调色板

漂亮的颜色真的让图表很突出。当使用一种颜色时,考虑将透明度包含在 alpha 参数中。对于条形图,调色板是理想的。调色板甚至可以颠倒,这样最深的颜色就在最上面,这取决于你想讲的故事。

值得尝试用你的颜色讲一个故事。由于从冠状病毒中恢复是一件好事,绿色可以用作积极的颜色,恢复最多的国家显示在顶部,作为最暗的绿色阴影。将最深的颜色放在最上面通常需要将’_ r【T3]'字符串连接到调色板的末尾来颠倒顺序。

找到所有调色板选项的一个有趣的方法是在代码中插入一个调色板错误!正确的选项会显示在 Colab 笔记本中。或者,标准调色板可以在的 Python 图库中找到。我更喜欢错误的方法,因为我可以留在我的笔记本上,它告诉我一切。

调色板可在 sns.barplot 内设置,连同 x 值和 y 值如下。

调整 5:使用有尺寸的标签

不言而喻,应该为图使用标签并确定其大小。所有的图表都应该有标题,标题的大小可以增加,直到你喜欢为止。

seaborn 的情况下,x 轴和 y 轴默认使用 index 和 columns 提供的标签,这里就不加了。

下面是给你的图加标题和调整标题大小的代码。

把所有的放在一起

剩下的就是保存剧情,展示出来。保存您的绘图总是值得的,因为在您的计算机上的输出会比在 Jupyter 或 Colab 笔记本上,甚至在使用第三方软件的 Medium 等网站上看起来好得多。一个简单的策略是将 dpi(每英寸点数)设置为一个较大的数字,比如 300。

这里是所有的代码一起创建和显示一个美丽的冠状病毒水平条形图。

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

如你所见,通过 5 个关键调整,新图表值得与朋友分享或放入你的作品集。这个图表很简单,但是信息丰富而且很漂亮。它在我的电脑上更清晰,在你的电脑上也会如此。

现在你已经学会了 5 个关键的调整,使你的条形图美观,享受这个数据集和其他创建和显示新的信息列的乐趣。

编码快乐!

科里·韦德(Corey Wade)是伯克利编码学院 的主任 Python 工作坊 的作者,伯克利独立研究数学系主任。2020 年夏天,他正在为青少年在线举办一个机器学习& AI 夏令营。更多信息参见berkeleycodingacademy.com

BebopNet:爵士乐即兴创作的神经模型

原文:https://towardsdatascience.com/bebopnet-neural-models-for-jazz-improvisations-4a4d723d0b60?source=collection_archive---------20-----------------------

使用人工智能生成(个性化)Bebop 即兴创作

Shunit Haviv Hakimi、Nadav Bhonker 和 Ran El-Yaniv

更新(2020 年 10 月): 我们关于 BebopNet 的论文刚刚发表在 ISMIR 2020
在 ISMIR 2020 中查看我们的论文、海报和视频:https://program.ismir2020.net/poster_6-08.html
我们还上传了我们的**代码、一个经过训练的模型、一些样本、**和补充材料:
https://shunithaviv.github.io/bebopnet/

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

图片来源:https://www.pexels.com/@victorfreitas

创作音乐和爵士乐即兴创作绝对不像看起来那么容易。事实上,即使对最好的音乐家来说,这也是一项艰巨的任务。我们甚至能准确地定义和理解爵士乐即兴演奏吗?不幸的是,在很大程度上,这仍然是一个难以捉摸的幻想。

每个人都同意的是,爵士乐即兴创作是一种符合固定的重复和声进行的旋律独奏的自发发明。当独奏与和声、与其他演奏者、与独奏本身对话时,一场伟大的爵士乐表演就诞生了。当然,个人发明本身不是随机的,它应该遵循一些非常难以精确确定的复杂规则。在我们看来,爵士乐独奏一代的这种固有的难以捉摸性,回避了机器学习技术的挑战,机器学习技术原则上可以从示例中学习。

作曲的计算机程序

自从电脑出现以来,人们就一直试图用电脑来创作音乐。考虑到各种类型的音乐中出现的模式和数学关系,这也许并不奇怪(例如,考虑一下巴赫的螃蟹佳能,它神奇地将同一旋律向前和向后结合)。大多数计算机音乐生成的最初尝试是基于规则的,这意味着他们试图显式地编码语法音乐规则(希勒,1957 )。随着机器学习的进步和更强大的计算机的出现,马尔可夫模型被用来生成音乐。马尔可夫模型本质上回答这样的问题:“给定音符 C、E 和 G 的序列,下一个音符的概率分布是什么?”

模型是如何产生这些概率的?最简单的形式是,马尔可夫模型“扫描”一个由许多音乐作品组成的语料库,并计算它在序列“C,E,G”之后找到的所有音符。然后,它通过出现的总次数来标准化这个计数量的向量,以获得概率分布(所有数字都是非负的,并且总和为 1)。这就是所谓的马尔可夫链的最大似然估计。基于马尔可夫链的模型,更一般地说,基于可变阶马尔可夫建模(可以考虑更长的上下文),可以产生令人惊讶的令人印象深刻的结果(例如,参见这个这个)。
然而,使用有界阶马尔可夫模型存在一个问题,即:当增加用于预测的上下文的长度时,很快就会达到这样一个点,即在训练集中不会出现这样大小的训练序列。换句话说,对于大订单建模,模型遭受统计稀疏性,因此它不能考虑长期依赖性。

然而,这些年来,算法越来越好,计算机越来越强,总体上遵循摩尔定律和库兹韦尔定律(你知道库兹韦尔是第一个建造作曲的 T2 计算机的人吗?).这些发展为深度神经网络(机器学习的一个新旧子领域)走向舞台中央铺平了道路,推动了许多不同领域的科学和技术,包括音乐创作、图像识别、自动翻译、语音到文本、文本到语音等。

今天,利用马尔可夫模型和深度神经网络,模型和大型音乐语料库正被用来制作越来越令人愉快的音乐。一些令人印象深刻的结果由洋红色开放式展示。

在这里,我们向您展示了我们使用机器学习所取得的成就。

我们开始尝试创作令人愉悦的爵士乐即兴作品,将独奏的产生视为一个模仿学习的问题。我们有意决定简化事情,将重点放在由单声道乐器(而不是复音乐器,如钢琴)在一个狭窄的爵士乐流派中创作的独奏上。我们选择的乐器是萨克斯管,流派是 Bebop。因此,我们想训练一个神经网络通过学习模仿著名萨克斯管 Bebop 演奏者的即兴演奏来即兴演奏爵士乐独奏。我们设计了 BebopNet 来学习预测下一个要演奏的音符,给定一些过去的音符和过去的和声级数以及即将到来的和声(下一个音符应该在其上演奏)。一旦经过训练,模型应该能够在任何期望的和弦进行上创建独奏,而不一定是出现在训练集中的那些。为了判断我们的成功,请听一段由 BebopNet 为查理·帕克的“Mooche”创作的独奏。

为“ Moose The Mooche ”即兴创作。即兴表演在 00:34 开始。

BebopNet 还可以应用于创建其他(非爵士)音乐类型(如当代流行歌曲)的和弦进行独奏。例如,听一段由生成的独奏。

利佐为“果汁”即兴创作。

模仿学习:注意到注意

对于即兴创作音乐的神经网络来说,除了理解音乐理论之外,它还需要能够捕捉主题和音乐思想。这意味着神经网络必须能够捕捉音乐数据集的长期特征。此外,任何人类爵士乐演奏者都知道,神经网络必须知道每个时刻的和声环境,即节奏部分演奏的和弦。

由于音乐和语言有许多相同的特性,我们最初将 BebopNet 基于一个可以生成语言句子的语言建模神经网络。我们训练了 BebopNet,一个长短期记忆 ( LSTM )模型,根据之前的音符预测下一个要演奏的音符。

使用递归神经网络的优势在于其捕捉重复和长期模式的能力。随着基于注意力
模型在语言建模中变得流行,我们用 transformer-xl 代替了我们的神经网络。

正如在马尔可夫模型中所做的,我们通过反复要求网络预测一系列音符和和声之后的下一个音符来训练我们的网络。我们使用的方法与 Andrej Karapathy 的著名博文中描述的方法非常相似。

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

下一个音符预测(GIF)

然而,与自然语言处理的神经网络不同,神经网络的输出是下一个单词的一个概率向量,我们的输出是两个概率向量:一个是下一个音符的音高持续时间

训练后,在使用模型生成独奏时,我们在每一步都有两个选择:要么贪婪地选择最可能的音符,要么将输出视为分布向量并对下一个音符进行采样。后者保证了我们的可变性,并允许我们产生不同的即兴创作。

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

下一个字符预测的简化网络结构。每个音符由音高和持续时间表示。输入还包括上下文和弦。

资料组

我们的数据集由从saxsolos.com购买的 XML 文件形式的爵士独奏转录组成,包括以下爵士即兴演奏:
-查理·帕克(1920–1955)
-炮弹·阿德利(1928–1975)
-桑尼·斯蒂特(1924–1982)
-菲尔·伍兹(1931–2015)
-索尼·罗林斯(1930-)
-史坦·盖兹(1985)

笔记表示法

为神经网络选择正确的输入表示方法对于其功能性至关重要,并且会极大地影响性能。从原始音频波形、MIDI 格式到活页乐谱,音乐表现方法种类繁多,因此选择一种最适合的方法极具挑战性。

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

BebopNet 基于符号音符表示,非常类似于音乐家用于交流音乐的标准音乐符号系统。使用这种表征可能有助于学习节拍和旋律中的模式和重复。每个对象代表一个音符及其音高、持续时间、小节内的偏移以及和声上下文。和声环境包括当前和弦的四个音符。我们使用上面的音高表示方法,并连接所有四个音高来表示一个和弦。

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

音乐符号中的度量及其转换为神经网络输入的示例

创造了一个模型,我们的即兴创作在艺术上还不错吗?

任何爵士乐即兴创作以及任何艺术的一个主要成功标准是创造力。如何评估爵士乐独奏的创意水平?嗯,定义创造力一直是人类长期争论的难题之一。我们不想深入讨论这个问题,所以我们决定解决创造力的一个非常适度但可量化的方面,并通过他们的“抄袭水平”来评估爵士乐独奏的原创性。

利用这种独创性的概念,我们可以观察到几个有趣的事实。例如:在 Bebop 巨人中,桑尼·斯蒂特是模仿者的“国王”(双关语)。他从史坦·盖兹和桑尼·罗林斯那里抄袭了许多短语。另一个有趣的事实:令人惊讶的是,使用几个抄袭指标,我们训练的模型看起来像任何专业爵士乐手一样原创。

剽窃

我们定义的度量是最大公共子序列中音符的数量。作为一个基线,我们在我们的数据集中寻找这个特征:爵士乐巨人在多大程度上“复制”了彼此的音乐句子?

注意,我们将这种比较定义为对音高移位不变:两个相同的序列将包含相同的音高间隔和相同的持续时间。

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

表中的每个元素是艺术家 A 的独奏(行名)中在艺术家 B 的任何独奏(列名)中找到的平均最大子序列。

将我们的爵士乐即兴学习模型生成的爵士乐独奏池与数据集进行比较,结果是平均最大的公共子序列 4.4 音符,这意味着我们在这个特征上与任何爵士乐巨头没有太大区别。

但是让我们看看更短的序列。为了做到这一点,我们计算一个艺术家和数据集的其余部分之间长度为 n 的共同序列的百分比。一定长度的序列 n 在语言建模中被称为 n 元语法。

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

长度 n 的常用短语的百分比——克长。我们的爵士款是黑色的(仿款)。

正如所料,长度为 1 的大多数序列也可以在数据集中的某个地方找到,而 n 越大,出现的百分比就越小。对于任何 n ,模仿学习模型不超过最大出现百分比。

*我们计算了曲线下的面积实现了对抄袭的归一化测量:
-炮弹 0.704
-戈登 0.746
-格茨 0.745
-帕克 0.693
-罗林斯 0.718
-斯蒂特 0.680
-伍兹 0.714
-阿蒙斯 0.718

  • 我们的模型 0.713【t24*

让我们把它私人化

所以,现在我们有了 BebopNet,但是它能创造出个性化的爵士乐独奏吗?我们所说的“个性化”是指 solo 经过优化,能够让特定用户感到满意!为此,我们试图训练一个个人偏好模型,捕捉特定用户的口味。这个个人模型应该优化从模仿模型生成的独奏,以匹配特定用户的音乐品味。在本节中,我们将演示我们是如何做到这一点的。查看 solo over the jazz standard "【芝士蛋糕】* *,为本帖作者之一优化。

为“芝士蛋糕”的个性化即兴创作。即兴表演从 01:02 开始。

个性化内容无处不在。亚马逊、网飞和 Spotify 等科技巨头将现有内容定制为客户的个性化体验。例如,Spotify 内容的个性化是基于完整歌曲的一般“低分辨率”特征。在我们的例子中,我们试图在非常高的每个音符“分辨率”上实现个性化,这意味着我们为给定的独奏创建的个性化分数不是一个数字,而是一个完整的序列。

我们的个性化过程以这样一种方式操纵生成模型,它产生匹配个人偏好的优化代。我们的个人偏好模型可以被训练以匹配任何特定用户的口味。用于训练该模型的数据集直接从用户输入组装。

个性化流程有三个步骤:

1.组装:组装一个音乐序列和相应用户评分的小数据集。

2.训练:训练一个用户评分模型,预测用户对每个音乐序列的评分。

3.生成:使用用户评分模型结合波束搜索,生成尽可能符合用户偏好的即兴创作。

步骤 1:组装用户偏好数据集

为了构建数据集,我们收集了不同背景下的爵士乐即兴演奏:

  • 来自我们一般数据集的爵士乐即兴演奏
  • 爵士乐即兴创作产生于我们一般数据集中的和弦进行
  • 爵士乐即兴创作产生于和弦进行之上,这在我们的一般数据集中是不存在的

在听爵士乐即兴演奏时,每个用户用一个节拍标记他们的偏好。该仪表基于 CRDI (连续响应数字接口)装置的理念。

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

受 CRDI 启发的仪表(图片来自 https://github.com/Andrew-Shay/python-gauge

我们的(虚拟)计量器被限制为五个不同的级别,标签被标准化为-1 和 1 之间。
最终的数据集被分割成音乐序列,其中每个序列在序列的末尾都标有用户的乐谱。

步骤 2:训练用户评分模型

对于用户评分模型,我们使用类似于上述音符到音符预测模式的模型,但是用户评分模型被训练来预测给定序列中每个音符的用户分数。用户评分模型还包括一个额外的注意力层,输出是一个介于-1 和 1 之间的浮点值。

步骤 3:生成用户优化的即兴创作

有了经过训练的用户评分模型,我们在音符到音符预测模型上使用 波束搜索 。波束搜索使用用户评分模型的评分标准。

波束搜索通常用于生成式语言模型,并被 Google Translate 等系统大量使用。这些模型通常包括单词到单词的预测模型。

使用波束搜索,我们可以增加搜索范围,以最大化某个期望的目标。这意味着,在每一步,搜索将考虑下一个笔记的各种选项,并做出更好的选择,使目标最大化。对于我们的个性化生成,波束搜索优化了用户在生成的即兴方法上的得分。

使用贪婪方法,搜索在每一步选择最可能的音符,目的是增加生成序列的分数。

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

波束搜索——贪婪方法

然而,有可能在某个步骤选择一个不太可能的音符将导致更多可能的后续音符和整个生成句子的更高分数。增加每一步生成序列的长度允许我们深化搜索

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

波束搜索—更长的序列

即兴创作示例

我们现在呈现由我们最终的深度学习模型生成的爵士乐标准的即兴创作。每一次即兴创作都以特定的“头”为条件——特定爵士乐标准的旋律和和弦。我们发现了一个有趣的方法,通过在一个新的头上测试来确保我们的模型学会随机应变。也就是说,我们在一个模型在训练过程中从未见过的和弦进行上测试了它。我们甚至在非爵士乐的例子中也这样做了。

以下所有样本都是使用我们的系统生成的。生成的音符用 MIDI SoundFont 播放,并与使用乐队在一个盒子里(BIAB)创建的背景音乐混合。

大多数样本包括头部的旋律,然后是生成的即兴创作。

创作了超越爵士乐标准的爵士乐即兴作品

在流行歌曲上即兴创作爵士乐

根据耶胡迪特·拉维兹创作的以色列歌曲《拉卡塔和迪雅·贝亚德查》即兴创作了爵士乐

最后的想法

一个理想的音乐创作应该满足几个条件。例如,一个人可能期望爵士乐独奏是和谐的、有创造性的、令人愉快的、有趣的和有意义的。然而,当考虑计算机化分析和 jazz 生成时,问题是这些属性中的大多数没有数学定义。
因此,基于这些概念的明确表述,创造一个能产生高质量音乐的计算机程序超出了我们的能力。

在许多情况下,如果有足够大的训练序列,用于顺序预测的 ML 技术可以绕过这些障碍。我们确实有很多音乐实例可以学习,通过使用先进的预测技术,我们可以乐观地希望我们的模型将学会忠实地模仿优秀的爵士乐独奏。然而,话虽如此,我们还有一个内在的问题:我们如何评估性能?

虽然用户研究可能有助于评估一些对音乐质量的平均感知,但评估旨在取悦特定人以满足主观偏好的个性化内容是具有挑战性的。

在我们找到有效的评估方法之前,很难在这一领域取得持续的进展,尤其是在创作主观音乐内容方面。在这篇博文中,我们描述了我们为实现这一目标而迈出的一小步。我们提出了一种方法来客观评价主观内容。一路上,我们不得不克服极度嘈杂和不一致的人类反馈。我们的技术依赖于由每个用户提供的足够大的标记样本,这对于用户来说是相当大的努力。

我们预计,引出主观用户反馈的问题将在未来以完全不同的方式得到解决,例如,通过不引人注目地监控用户满意度,例如,使用照相机、EEG,或者甚至直接的脑-机连接。

这种评价只是超越爵士乐和其他音乐流派的一个障碍。为了制作计算机生成的人类水平的爵士乐独奏,我们将不得不解决几个与创造力相关的大问题。例如,我们能够客观地判断一个计算机程序是否有创造性吗?

创造性表现的一些主要属性是创新和“开箱即用”的模式的产生;即超出观察分布的异常模式的外推。然而,目前的最大似然法主要能够处理插值任务,而不是外推。有可能了解异常值的模式吗?

在计算机程序能够像熟练的人类艺术家一样表演之前,有许多问题、障碍和巨大的差距需要弥合。但与此同时,小步骤可以带来有用的音乐生成能力,人工智能可以成为创作过程的一部分。与任何数字乐器一样,音乐家可以使用人工智能探索新的想法、主题和声音,创造出前所未有的令人兴奋的新音乐。

这篇博文总结了以色列理工学院计算机科学系 Ran El-Yaniv 的深度学习实验室进行的研究。

联系人:
舒尼特·哈维夫·哈基米—shunithaviv@gmail.com
纳达夫·蓬克—nadavbh@gmail.com
冉·埃尔-亚尼夫—拉尼@cs.technion.ac.il

通过深度学习成为更好的自行车手

原文:https://towardsdatascience.com/become-a-better-cyclist-321a209d78d8?source=collection_archive---------37-----------------------

使用 YOLOv5 识别伦敦骑自行车者的危险因素

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

循环包含许多社会利益。它影响着一个社区的安全、经济、环境、公平和健康。道路上骑自行车的人数很大程度上受到他们对安全的看法的影响。要确定道路安全,最基本的是要有一个共同的衡量标准,以便确定和比较风险因素。使用谷歌街景(GSV)图像是分析城市环境的一种经济有效的方法。由于提取准确结果需要大量图像,因此使用了自动检测对象和结构的模型。

该项目的目的是使用对象检测和图像分割模型从伦敦的 GSV 图像中提取骑自行车者的道路风险因素。这涉及汇编道路安全指标和风险因素;在使用 YOLOv5 和 PSPNet101 这两个最先进的工具分别探测物体和分割图像之前,分析 GSV 数据集,并进一步分析其结果;确定 YOLOv5,PSPNet101 的局限性,并提出使骑自行车者的安全评估更准确的方法。

在图像数据集中的 50 万幅图像中,识别了大约 200 万个物体,标记了 2000 亿个像素。平均而言,每个下层超级输出区域(LSOA)有 108 个图像。使用 YOLOv5,在 LSOA 水平上直接识别出以下风险因素的分布:高车辆速度、电车/火车轨道、卡车流通、停放的汽车和行人。发现汽车 x 公共汽车、汽车 x 骑自行车者和汽车 x 人(最强)之间存在统计上显著的负相关。以及人 x 公交和人 x 自行车的正相关(最强)。重型车辆数量呈长尾分布。使用 PSPNet101,建筑物(27%)、天空(22%)和道路(22%)像素是最常见的。因此,在这些区域中的任何一个中的物体都可以被同等地检测到。所有的结果和实现都可以在项目的中获得。

未来的发展包括提高 GSV 图像的可用性和分辨率。用包含更多类别的更大数据集训练 YOLOv5 和 PSPNet101。定义安全度量以同时考虑检测到的对象和分割的结构。

介绍

骑自行车对社会有很多好处。它影响我们的安全、经济、环境、公平和健康[1]。虽然在有些国家,大部分的日常通勤是通过自行车来完成的,但在另一些国家,人们很少使用自行车。

在实际的新冠肺炎疫情环境中,政府正在推广骑自行车作为驾驶甚至拥挤的公共交通工具的替代方式。众所周知,污染较重的地区不仅会给当地居民带来额外的感染风险,而且在公共交通工具上也很难保证社会距离。出于这些原因,英国政府正在用一个 20 亿英镑的一揽子计划来推动这种可持续的交通方式。

道路上骑自行车的人的数量很大程度上受到他们对安全的看法的影响[4]。要确定道路安全,最基本的是要有一个明确的通用指标,以便确定和比较风险因素。

谷歌街景(GSV)图像是公开可用的,此外,它覆盖了大多数发达国家(图 1) [5]。因此,这是一种分析城市环境的经济有效的方法。

由于提取准确结果需要大量的图像,数据集和在其上训练的模型用于自动检测存在的对象和其他结构。为此,使用对象检测(OD) [6]和图像分割(IS) [7]工具。

该项目的目标是根据具体的安全指标,如事故、伤害和死亡率,编制一份与伦敦骑自行车者最相关的风险因素清单。使用 GSV 影像数据集,通过 OD 和 IS 模型提取大伦敦地区已识别的风险因素。在较低层的超级输出区(LSOA)层面,研究不同的安全系数如何在伦敦分布。以识别大多数检测到的对象之间的相关性。在单独分析来自所有 LSOAs 的图像后,检测两种算法最常见的错误分类,并提出减轻错误分类的方法。最后,根据本项目的经验,为 OD 和 IS 模型如何检测额外的道路安全风险因素提供新的指南。

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

图 1 GSV 世界报道。改编自[5]。

在下一节中,将介绍对于理解该项目的目标和结果至关重要的概念。

背景

首先介绍骑行的好处。然后,探讨道路安全指标,然后确定伦敦骑自行车者的风险因素,并定义如何使用 OD 和 IS 方法捕捉这些因素。详细介绍了 YOLOv5 (OD)和 PSPNet101 (IS)模型及其各自用于训练它们的数据集。

骑自行车的好处

本节概述了与骑自行车相关的最重要的社会效益。它们可以分为五个主要领域:安全、经济、环境、公平和健康[1]。

在美国,年轻人死亡的主要原因是交通事故。占 15 至 24 岁年龄组死亡总人数的 41%(CDC)。在欧盟,过去 10 年中,骑自行车者的死亡率保持不变,而汽车司机和乘客的死亡率下降了 24%。行人中下降了 19% [8]。英国是仅有的 3 个行人死亡率上升的欧盟国家之一,每年上升 1.3%。欧盟平均每年下降 2.6%。在英国,骑自行车者的死亡人数下降了 1.3%,年平均下降率排名第 13 位。鉴于 99%的行人被机动车撞死,1%的行人被自行车撞死,显然有必要提高骑自行车者的安全,并增加他们在街上的数量。同时,这也促进了数量上的安全:如果骑自行车的人越多,他们就越安全。驾驶员通过更频繁地与骑自行车的人接触而形成的意识是根本原因。

推广步行和骑自行车作为替代交通方式,对个人、公司和社区都有很多经济效益。根据 2015 年城市交通记分卡,2014 年美国的拥堵成本为 1600 亿美元。估计每人每年需要 960 美元。这些值考虑了时间和燃料费用。据计算,2018 年在美国拥有一辆汽车的成本是 8849 美元,而自行车是 308 美元,步行被认为是免费的。2018 年基准报告补充说,自行车旅游在全球多个地区具有积极的经济影响。受保护的自行车道意味着商业报告显示了骑自行车对商业的积极影响。研究发现,平均而言,骑车上班的人比开车上班的人花更多的时间,去公司的次数也更多。此外,在 2011 年的一项研究中,政治经济研究所(Political Economy Research Institute)发现,在自行车专用项目上投资 100 万英镑,平均创造了 11.41 个就业岗位,而在公路专用项目上投资相同金额,平均创造了 7.75 个就业岗位。

减少对不可再生资源的依赖是自行车运动的积极方面之一。据美国环境保护署估计,交通运输部门排放的温室气体最多,占 28%(在美国)。其中,乘用车和轻型卡车占整个运输行业的 60%。此外,众所周知,道路和停车场等结构会显著增加城市洪水、暴雨径流和城市热岛效应的可能性(由于城市中缺少阴影和裸露的土地,它们通常比周围环境的温度更高,这是空气湿度低的结果)。推广自行车将减少对原有基础设施的需求,并减轻一些负面影响。

在一个国家推广骑自行车可以促进公平。由于拥有汽车的高成本,当一个城市优先考虑这些车辆的道路基础设施时,它会给负担不起的低收入家庭带来更高的风险。这在低收入社区尤为重要,据一份缩小差距简报估计,低收入社区只有 50%的道路有人行道,而高收入社区有 90%的人行道。这导致行人和骑自行车的人面临更大的威胁。《新的多数:骑自行车实现平等》报告称,26%的有色人种愿意骑自行车,但出于安全考虑而不骑,相比之下,白人受访者中这一比例为 19%。

体育活动,如骑自行车和散步,对身心健康有许多好处[9]。疾病控制和预防中心报告说,如果公民更加积极,十分之一的过早死亡、八分之一的乳腺癌、八分之一的结肠直肠癌、十二分之一的糖尿病患者和十五分之一的心脏病是可以预防的。它还可以降低冠心病、中风和许多呼吸系统慢性疾病的风险,这些疾病与空气质量密切相关[9]。2018 年空气状况报告指出,超过 1.339 亿美国人生活在臭氧和/或颗粒污染水平不健康的县。这是一个受社区内交通模式影响很大的因素。因此,车辆是美国环境保护署的主要贡献者之一。由于所有这些好处,在人群中提倡较少久坐的生活方式的重要性变得显而易见。

通过促进骑自行车者的安全,整个社会受益。骑自行车的人和行人会更安全。司机将减少他们的通勤时间,并将其转化为社会收益,如降低污染水平和经济损失。

道路安全指标

道路安全指标对于决策至关重要。根据欧洲道路安全宪章,它们使我们能够评估道路的当前状况,观察干预后对事故率的影响,监控其随时间的进展,并预测进一步的发展。

要发挥作用,道路安全指标应符合几个标准:

1.与道路安全的某些方面有关,如道路事故的原因或后果;

2.以可靠的方式衡量;

3.随着时间的推移可以监测;

4.允许道路安全工程师或公共卫生专家设定目标;

5.有助于建立不同安全性能的比较和基准。

所有指标共有六个方面:地理范围、时间跨度、数字格式、表示/可视化、可靠性、准确性、代表性和道路安全的具体“水平”。第一个包括测量发生的地方:组织、城市、地区、国家、欧洲或全球。第二个与分析的时间框架有关:日、周、月、季度、年、十年或更长时间。测量单位由第三个特征表示。它们可以是一个比例、一个百分比或一些其他明确定义的比率。表示描述了数据呈现的方式,例如,以地图、图形或表格的形式。可靠性、准确性和代表性与测量系统的设计和实施相关联。最后,该指标的“级别”因是否考虑以下因素之一而有所不同:碰撞的影响、碰撞后反应、碰撞结果、碰撞原因和预测因素、道路安全政策和措施或安全文化和安全系统。

碰撞结果,包括死亡率、重伤/轻伤率和事故率等指标,是选择下一节介绍的风险因素时考虑的因素。

引入了道路安全指标,以便对最相关的骑自行车者的风险因素进行明确排序

危险因素

为了列出和排列伦敦骑自行车者最相关的风险因素,考虑了事故、伤害和死亡率。在伦敦,骑自行车者的死亡率相对较低(图 2),因此,优先考虑另外两种更具歧视性的骑自行车者。在设计图 3 图表时,事故率和受伤率用于对所有风险因素进行排序。注意,一旦没有找到所有风险因素的通用安全指标,这些排名也有很强的定性和基于经验的成分。

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

图 22010 年至 2017 年大伦敦地区骑自行车者死亡人数。数据来自[10]。

影响骑自行车者安全的前三个最相关的因素是自行车道的存在、道路速度限制和道路车道宽度。接下来,提供支持图 3 中定义的排名的统计数据。请注意,只有少量涉及骑自行车者的事故被报道[11],因此,以下段落中的统计数据可能无法完全反映真实情况。

自行车道和停放的汽车

自行车道可以分开,也可以位于道路上。

当一辆汽车试图超过一名骑自行车的人时,或者在摔倒的情况下,被撞上时,物理上分离的车道减少了撞车的可能性。骑车人受伤的一个主要原因是糟糕的路面质量导致的摔倒[12] [13] [14]。由于周围没有汽车停放,这些车道将骑车人受伤的风险降低了一半。[15]出于所有这些原因,没有考虑与高速公路限制、狭窄的自行车道宽度、路面质量和停放的汽车相关的风险。

与无车道相比,在道路自行车道的情况下,车辆速度往往较低,且与骑车人之间的相互作用较少[16]。

这使得第一种情况最安全,其次是公路和无自行车道。

自行车道的存在被认为是最具决定性的因素,因为它可以预防许多以前发现的风险。它被认为是风险因素排名中的第一位。

车速

研究发现,在大约 10%的事故和 30%的致命事故中,速度是主要因素之一。车祸中车辆的速度是决定受伤严重程度的唯一最重要的因素。[17]

考虑速度时有两个明显的因素。众所周知,不仅更高的速度会导致事故率、伤亡率的增加,而且速度差异也很大。高速变化的道路更不可预测,一旦它们有利于相遇的次数和超车操作次数的增加。因此,降低速度限制有时可能只会导致车辆平均速度的降低,而不是其变化。[18]

车辆高速行驶所带来的危险的核心是制动距离的增加以及从车辆传递给骑车人的动能。一旦两者都随着速度的平方增加,避免或幸存下来的可能性就会平方减少。[18]

从生物学角度来看,众所周知,在碰撞中,人体只能抵抗有限的动能转移。[19]这一数额因身体部位、年龄组和性别而异。考虑到设计最好的汽车,如果车辆超过 30 km/h,就可以超过这个极限。[20]研究还表明,如果汽车以低于 30 公里/小时的速度行驶,行人在撞车事故中幸存的可能性高于 90%。当以 45 公里/小时的速度被汽车撞上时,生还的几率降低到 50%。[21]或者,当一辆汽车的速度从 30 公里/小时上升到 50 公里/小时时,在撞车事故中幸存的可能性降低了 8 倍。[22]

这被认为是第二个最相关的因素。在靠近低速限制道路的道路自行车道的情况下,与平行交通相关的风险因素被认为是可以忽略的,无论车道的宽度如何。

车道宽度

在英国,推荐的自行车道宽度为 2 米。最低要求是 1.5 米。所有低于 1.5 米的值都被认为太窄,几乎没有余地绕过障碍物,如:碎片、坑洞和排水器。人们经常说,没有自行车道比太窄的自行车道更安全,因为驾车者往往会直接开到车道线上,而骑自行车的人则太靠近路缘。

在道路限速之后,自行车道宽度被认为是以下最重要的因素。每当它被认为是广泛的,交通风险因素没有被考虑。不管道路自行车道的宽度如何,低速限制足以排除所有与交通相关的风险因素。

路灯

排在前 3 位之后,路灯被认为是决定道路安全的最相关的标准。众所周知,它会影响驾驶员和骑车人的反应时间,并使骑车人不容易被注意到,尤其是在不使用任何反光或发光装置的情况下。此外,从骑车人的角度来看,他们不太了解与路面质量相关的其他道路风险。预计它不会在伦敦遇到很多照明不足的道路,因此,它被排在第四位。

路面质量、电车/火车轨道和排水器

正如文献中经常提到的,路面质量是评估安全性时要考虑的一个关键因素。[12] [13] [14]路面质量是指没有自行车道时的道路质量,或自行车道存在时的道路质量。除了排水器和小径的存在,这些是以下最重要的风险因素。这是放置在路灯下一次,有足够的亮度和循环速度适中,它应该不会构成重大威胁。

路口数量和路口可见度

大多数自行车和汽车事故发生在十字路口。在[23]中,报告的百分比是总碰撞数的 60%。此外,作为同一项研究的一部分,街道不以直角相交的十字路口给骑自行车的人带来了额外的危险。在这些地区发生的撞车事故对骑车人造成严重伤害的可能性增加了 31%。主要原因是路口能见度降低。

货车和其他大型车辆

近年来,随着经济发展和消费者需求的增加,城市中的卡车数量也在增加。[24] [25]虽然骑自行车也有同样的趋势,但它们之间的相遇次数却大大增加了。例如,在纽约市,15%的自行车网络与 11%的卡车网络重叠。[26]遭遇次数的增加导致卡车事故和死亡率的增加。卡车-自行车事故通常比其他类型的事故后果更严重。[27] [28] [29] [30]在一些欧盟国家,30%的骑自行车死亡事故与卡车有关。[31]过去 20 年的研究表明,在伦敦,卡车是导致骑自行车者死亡的最常见的交通工具。[28] [32] [33]

提前停止线

比利时、丹麦和英国等几个欧洲国家都有这种线路,当交通信号从红色变为绿色时,允许某些类型的车辆(即自行车)先行。这有几个好处。首先,线后的驾驶员可以清楚地意识到他们周围有骑自行车的人,并采取正确的预防措施来避免危险的操作。第二,对于一个骑自行车的人来说,向左转弯以避免与后面的车相撞变得更加安全。在事故、伤害或死亡率的统计数据方面,没有发现任何问题。

弯道能见度

几个来源确定弯曲是一个风险因素。弯道和十字路口通常被认为对骑自行车的人构成类似的危险。在骑自行车的人看来,低能见度会造成通常不会出现的危险情况——突然出现行人或侵入的植物。从驾驶员的角度来看,这可能会使骑自行车的人不被注意到,从而成为易受攻击的因素。[12]没有明确的统计数据显示弯道如何影响骑自行车者的事故、伤害或死亡率。

行人

在所有年龄组中,与 15 至 64 岁或 65 岁以上的成年人相比,行人死亡事故最常发生在 14 岁以下的儿童身上。从性别来说,男性比女性的风险更大。[34]由于这些原因,符合这些标准的人口高度集中的地点(例如学校地区)面临额外的风险。然而,在无车区,行人和骑自行车的人之间的事故极其罕见,而且几乎从不严重。[35]这被认为是最不重要的风险因素。

考虑图 3,从图的左到右,风险因素的数量减少。最不安全的情况是没有自行车道。第二,在公路场景中窄车道的高速度限制。第三,高速限制,但车道更宽。第四,无论道路上的车道是宽还是窄,都要限速。最后,物理隔离车道被认为是最安全的场景。

在接下来的两节中,我们将介绍用于从影像中捕捉对象和结构的工具。

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

图 3 确定了伦敦道路上 5 种情况下骑自行车者的风险因素。

目标检测

OD 是一种与图像处理和计算机视觉领域密切相关的计算机技术。它用于图像注释、活动识别、人脸检测、人脸识别、视频对象共同分割和对象跟踪等任务[36]。

每个对象都有一组特殊的特征,有助于将其分类为属于特定的类。例如,当寻找圆形或矩形时,在角上弯曲或垂直的物体被搜索[36]。

用于 OD 的方法属于这两类中的一类:基于机器学习或深度学习的方法。在第一种情况下,最相关的特征列表被先验地定义*。支持向量机是一个可能的例子。相反,在深度学习方法中,可以在不指定相关特征的情况下执行端到端 OD(yolov 5)。卷积神经网络是典型的例子[36]。*

YOLOv5

YOLOv5 是 YOLO 的最新版本,最初由 Joseph Redmon 开发。第一个版本运行在一个名为 Darknet 的框架中,这个框架是为了执行 YOLO [37]而特意构建的。

版本 5 是第二个不是由原作者开发的模型(在版本 4 之后),也是第一个在最先进的机器学习框架中运行的模型——py torch[6]。

YOLOv5 GitHub 储存库包含 MS Coco 数据集中的预训练模型。此外,在相同数据集上进行基准测试(图 4 ),以及关于如何使用不同数据执行或重新训练的详细文档。

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

图 4 最新的 YOLO 车型是版本 5(2020 年 7 月)。发布时有 4 组不同的砝码,精确度和存储要求各不相同。 EfficientDet (最精确的 OD 模型)的出现凸显了 YOLOv5 的检测速度,同时保持了同样的高精度[6]。

在表 1 中,对每套 YOLOv5 砝码的精度、速度和存储要求进行了比较。

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

表 1yolov 5 发布的所有砝码组的规格。通常,随着平均精度的提高,需要 GPU 执行更多的处理能力。改编自[6]。

YOLOv5 的架构由三个重要部分组成,就像任何单级物体探测器一样:模型主干、颈部和头部。第一种用于提取给定输入图像的主要特征。在版本 5 中,使用跨级局部网络。这些研究表明,使用更深的网络,处理时间有了显著的改善。模型颈部面板用于获得特征金字塔,并有助于在对象缩放上概化模型。最终的检测部分由模型的头部执行(与 YOLOv3 和 YOLOv4 中相同)。它在要素上应用锚框,并生成输出向量,包括类别概率和边界框。

每个潜在的检测都有一个相关的置信度得分。这表明模型对边界框内对象的存在有多确定,同时,该框是否正确地捕捉了它。

由于 YOLOv5x 的高精度和高速度,选择该模型来处理 GSV 数据集。

图象分割法

在计算机视觉和图像处理中,是指将数字图像分割成多个像素段或像素组的过程。目标是将图像表示简化到可以轻松检索多个结构的程度。更准确地说,这是给图像中的每个像素分配一个标签的过程,并且具有相同标签的像素共享一些特征。因此,这种方法提供了关于某些结构的存在、它们在图像中的形状和位置的信息[38]。

PSPNet101

金字塔场景解析网络(PSPNet)是最精确的信息系统模型之一。它赢得了 ImageNet 场景解析挑战赛 2016、PASCAL VOC 2012 基准测试和 Cityscapes 基准测试。它在 PASCAL VOC 2012 上达到了 85.4%的 mIoU 准确率,在 Cityscapes 上达到了 80.2%的 mIoU 准确率[7]。从那时起,细分模型的准确性在过去的两年里达到了一个稳定的水平(图 5)。

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

图 5 信息系统模型随时间的演变。自 2017 年以来,平均 IoU 的增幅非常小[39]。

在接收到输入图像后,PSPNet 执行卷积神经网络(CNN)以从最后的卷积层提取特征图。然后,金字塔解析模块用于获取不同的子区域表示,接着是上采样和级联层,以创建最终的特征表示。这携带了本地和全局上下文信息。在最后一步中,该表示被送入卷积层,并获得最终的每像素预测。

由于 IS 模型的执行时间很长,所以它被选为速度最快、精度最高和文档最好的模型。

训练数据集

有多个带有标记对象和分割图像的可用数据集。对于 OD 模型训练和基准测试,两个最常用且包含最多道路类别的是 MS Coco [40]和 Open Images V6 [41]。同样,对于 IS 来说,Cityscapes [42]和 ADE20K [43]是当前最先进的数据集。在表 2 中,所有 4 个项目被放在一起,并根据其相关类别进行比较,以评估骑自行车者的道路安全性。

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

表 24 个最大 OD 和 IS 数据集之间的比较,以及评估道路安全的相关数据。

一些道路安全对象可以直接提取,其他的可以间接提取。这同样适用于分段结构。表 2 中不带星号的特性代表其动态行为。因此,在同一地点,它们的数量会随着时间的推移而变化。

在 OD 类别中,确定了以下骑自行车者风险因素:汽车和停车计时器用于计算停放的汽车。行人专用区。卡车和公共汽车为卡车流通。数字自行车运动员的自行车。交通灯和停车标志的车速,一旦他们是交通平静的因素。最后,列车T3 因为有轨电车/火车的存在而产生了紧密的关联。对于 IS,道路、人行道和街灯分别用于检索道路和人行道宽度以及街灯。**

可可女士

Microsoft Coco 是用于 OD、分段和字幕的最大和最受欢迎的数据集之一。它包含 330K 个图像,其中 200K 被标记。存在 150 万个标记对象,分布在 80 个类别中。图 6 包含一些标记对象的例子。该数据集包含几类日常物品,从家用电器到道路上最常见的物品[40]。

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

图 6 (上)MS Coco 数据集中带注释的图像示例。(底部)每个图像中存在的对象[40]。

城市景观

Cityscapes 数据集侧重于对城市街道场景的语义理解。它包含了来自德国、法国和瑞士 5 0 个城市的 20 000 幅粗略的注释图像和 5 000 幅精细的注释。这些照片是在几个月(夏季、春季和秋季)、良好/中等天气条件下和白天拍摄的。共有 30 类结构(图 7) [42]。

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

图 7 城市景观中可用的三个分割图像示例【42】。

Coco 女士和 Cityscapes 数据集最具互补性,相关对象和道路结构的数量最多。在这两个数据集中预先训练的 YOLOv5 和 PSPNet101 模型分别用于检测对象和分割图像。

方法学

本节将详细介绍如何使用 YOLOv5 和 PSPNet101 模型存储和处理 GSV 影像数据集。各个参数的选择。另外,用来执行它们的软件和硬件。

GSV 影像数据集

没有考虑伦敦的道路安全分析,而是选择在 LSOA 层面进行。大伦敦可以分为多个更小的区域:输出区、中间层超级输出区和 LSOA。伦敦的每一个分区在地理尺度上都有所不同。从伦敦数据存储库获得了包含这些部门的多个 shapefiles 的 zip 文件夹。

Emily Muller 在这个项目开始之前使用 Google API 获得了 GSV 影像数据集。将每个图像标识与给定的伦敦 LSOA 相关联的单独文件也是可用的。

由于高内存需求,本项目中使用的所有图像都存储在帝国服务器中。使用 Globus 平台访问研究数据存储中的图像。

YOLOv5

为了执行 YOLOv5,使用了 Imperial 的高性能计算集群。它是使用 VPN 连接工具— Tunnelblick 远程访问的。

由于 YOLOv5 的执行速度,它使用了一个单独的 P1000 GPU。选择了最精确的砝码组— YOLOv5x。

定义每次检测的最小置信度为 0.5。高于标准值 0.4。仅保存包含检测到的对象和各自位置的文本文件。每一行包括每个对象的数字名称,用空格分隔的是检测框中心的坐标,以及矩形的宽度和高度的两个值。

使用 MatplotlibSeaborn Python 可视化框架,绘制了前 15 个最常检测到的对象的相关性矩阵。使用 SciPy pearsonr 函数获得 Pearson 相关因子和 p 值。

Pandas DataFrame 用于绘制前 15 个最常检测到的物体的相对和绝对分布直方图。

错误分类、局限性和未来方向分析侧重于以前确定的与道路安全相关的物体。此外,所有观察结果均来自对伦敦所有 LSA 的一幅图像的单独评估,以及整体项目经验。

PSPNet101

尽管 Esra Suel 已经提供了执行 PSPNet101 的初步版本,但仍进行了修改以克服与 TensorFlow 新版本的不兼容性。

通常,IS 方法比 OD 慢。最初它是用 Python 多处理工具来加速执行的。最后,原始 GSV 数据集被分成 13 批,在 13 个 P100 图形处理器上并行执行。通过这种方式,向 HPC 提交了 13 份工作。与其他可用的 GPU 相比,P100 因其对数值分析的高处理能力而被选中(表 3)。

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

表 3 帝国高性能计算集群上可用的 GPU 类型。在这个项目中使用了 P100。

GSV 数据集中的所有图像都被分割。之后,实现了两个 Python 函数。它生成一个字典,将每种 RGB 颜色链接到一个给定的对象类。另一个是接收分割图像的完整数据集作为输入,并输出每个类别的标记像素的总数。使用Pandas**data framePython 库分析并表示所有标签的相对和绝对分布。

错误分类、局限性和未来方向分析侧重于之前确定的与道路安全相关的结构。此外,所有观察结果均来自对伦敦所有 LSOAs 的一幅图像的单独评估,以及整体项目经验。

结果和讨论

在这一节中,结果与讨论一起呈现。首先,提供了伦敦所有 LSOAs 的 GSV 影像数据集的概述。然后,分析 OD 和 IS 输出。

GSV 数据集

GSV 数据集包含分布在大伦敦地区的 518 350 幅图像。有 512 812 张照片被认定为伦敦 LSOA。其中,478,724 个是独特的(表 4)。

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

表 4 并非 GSV 数据集中的所有图像都是 LSOA 识别的。因此,在分析中使用了一个较小的集合— 478 724。

对于每个数据点,有 4 个图像可用,范围从 0 到 360 度。有 119 681 个独特的 LSOA 识别点,每个点有四个 90 度图像(图 8)。

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

图 8 对于图 9 中的每个数据点,有 4 个相关的图像。每个捕捉周围环境的 90 度角。

伦敦市中心附近有更多可用的图像,向外围递减。在图 9 中,显示了一个 LSOA 地图集,以及所有图像各自的地理分布。

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

图 9 (左)也根据可用图像的数量进行着色。(右)同一组图像的地理分布(纬度和经度)。

数据点数量最多的 LSOA,211 个,位于伦敦市中心。平均而言,每个 LSOA 有 27 个数据点可用。数据集中有一个只有 1 的 LSOA(表 5)。图像数量的广泛分布损害了较少表示的 LSOAs 中对象和分割结构数量的估计精度。

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

表 5 伦敦所有 lso 数据集中 GSV 点的可用性。

物体检测| YOLOv5

图 10 提供了运行 YOLOv5 后的图像示例。图像中的所有汽车、卡车和人都以高置信度值被准确地检测出来。

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

图 10 执行 YOLOv5 后的 GSV 图像示例。

接下来,所有对象的相对和绝对分布在数据集级别呈现。

数据集对象分布

图 11 显示了前 15 个最常检测到的物体类别的相对分布。

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

图 11 在所有 LSOAs 中检测到的前 15 个对象的相对分布。

一旦数据集只包含街景图像,就有望检测到很大一部分汽车。伦敦是一个人口密度很高的城市,公共交通很普遍。这可以解释为什么有这么多的行人和公共汽车。盆栽植物检测与伦敦公园和绿地的数量密切相关。

表 6 包含在 GSV 数据集中检测到的前 15 个最常见物体的绝对数量。用绿色突出显示的是那些被认为对骑自行车者的道路安全有积极贡献的道路。红色的是负面因素。

除了表 6 中的彩色风险因素对象,还考虑了火车(657)和停车计时器(968)来提取图 3 中的风险因素。

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

表 6 前 15 个最常检测到的物体的绝对计数。用于提取骑自行车者道路安全系数的物体是有颜色的。

LSOA 物体分布

图 12 显示了与捕捉骑自行车者风险因素相关的物体的 LSOA 分布。

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

图 12 检测到伦敦所有 LSOAs 上的对象分布。另外,在每个图谱的底部有各自的分布直方图。

大多数自行车是在伦敦市中心被发现的。一旦这是一种短距离的交通工具,他们基本上是在这个地区被发现的。公共汽车在伦敦市中心比在外围地区稍微集中一些。远离市中心的卡车数量较多。对于市中心的许多道路,根据伦敦卡车控制计划,它们的流通是被禁止的。

公共汽车和卡车分布都是长尾分布,增加了意外发生的几率,使骑自行车的人面临更高的风险。

伦敦市中心以外的汽车分布密度要大得多。远离中心的道路有更多的车道,这可能意味着检测到这些物体的机会更高。市中心的停车计时器越少,这个地区的汽车数量就越多。在中心检测到的人数要多得多。尤其是在它所在的城市伦敦,它是历史中心和中央商业区。停止标志和交通灯基本上是在伦敦市中心之外发现的。两者具有非常相似的直方图分布。虽然,检测到的红绿灯数量几乎多了五倍。

相关矩阵

在道路安全方面,最强的正相关性是:人 x 自行车(0.52)、人 x 公共汽车(0.48)、公共汽车 x 自行车(0.25)和公共汽车 x 卡车(0.20)。负相关性最强的是:人 x 车(-0.23)和自行车 x 车(-0.20)(图 13)。

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

图 13 前 15 位检测到的对象关联矩阵。每个像元包含皮尔逊相关系数(顶部)和相关的 p 值(底部)。

就正相关而言,人 x 自行车高值表明行人和骑自行车的人在同一空间感到安全。

一旦公共汽车成为公共交通工具,预计周围会有很多人。因此,人员 x 公共汽车的皮尔逊系数相对较高。自行车 x 公交车和自行车 x 卡车的相关值有显著差异。

这可能表明骑自行车的人在公共汽车旁边比在卡车旁边感觉更安全。

一旦公共汽车司机在靠近易受伤害的行人时更有经验,这就不足为奇了。公共汽车和卡车之间相对较高的相关性,以及结构相似的事实表明,有时一个可能会被错误地归类为另一个。

对于负相关,人 x 汽车和自行车 x 汽车的具有统计显著性的皮尔逊系数表明,汽车高度集中的区域不利于骑自行车和步行。

一个不可忽视的因素是,较大的物体遮挡较小的物体可能导致较小的物体不易被探测到。因此,导致负相关。由于 GSV 图像是在离地面很高的地方拍摄的,这不太可能是经常发生的现象。

整体自行车安全指标

没有发现一种精确的度量来基于在伦敦道路上检测到的物体来估计骑车人的道路安全。虽然,根据图 12 中的对象分布,制定了一个正的和另一个负的组合安全措施。

影响骑车人安全的特征之一是周围其他骑车人的数量。发生这种情况是因为司机在大量出现时会更加意识到他们的存在。此外,绝大多数严重伤害是由车辆和骑自行车的人相撞造成的。人们发现,在汽车和人的存在之间存在着统计上显著的负相关关系。这样,行人越多,汽车越少。因此,骑车人受伤的风险更小。

**自行车在对每张图像中这些物体的平均数量求和后,合二为一,作为一种积极的安全组合措施。

如果汽车是伤害率的主要来源,那么在分析某个地区的死亡率时,重型车辆就显得尤为重要。

创建第二个 LSOA 地图,加入以下对象的每个图像的平均数量:公共汽车汽车卡车,作为安全性的负组合测量*。*

需要强调的是,我们无法从这两个生成的 LSOAs 中提取整体的安全性指标(图 14)。一个简单的例子是,骑自行车的人与交通隔离的道路不一定对骑自行车不安全。

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

图 14 (左)自行车人* LSOA 分布被组合成一个组合指标,反映了骑自行车者安全性的积极得分。(右)公交车小汽车卡车分布组合成最终的地图集,展示伦敦的交通。这与骑车人的安全成反比。*

限制和错误分类

所有检测到的道路安全物体都有很高的可信度(图 12)。YOLOv5 可以检测各种大小的物体,即使在部分遮挡的情况下也是如此(图 15)。此外,对象和背景之间的低对比度似乎没有导致大量的未检测。这方面的一个例子是,该算法检测到伦敦道路上的一辆汽车反射在窗户上(图 10)。然而,这被认为是一种分类错误——各种分类错误。

它汇编了一组 10 个随机物体检测图像,以便读者可以自己验证 YOLOv5 的准确性(图 15)。

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

图 15 来自不同 LSOAs 的十个随机选择的对象检测图像显示了在 MS Coco 类别中的高检测准确度。

图像分割| PSPNet101

图 16 提供了一个分割图像的例子。用检测到的结构的各自标签来识别它。

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

图 16 使用 PSPNet101 分割后的 GSV 图像。包括了像素标签。

下一节将详细介绍 GSV 数据集中的绝对和相对标注分布。

数据集像素标签分布

建筑物(27%)、天空(22%)、道路(22%)、植被(18%)和汽车(6%)覆盖了所有图像总面积的 95%(图 17)。在前四种结构的情况下,这是由它们的内在尺寸来解释的。一旦这个数据集只包含从伦敦的道路上获得的图像,它就会比任何其他对象找到更多的汽车。这个像素频率数不仅与它们的大小有关,还与它们在图像中的频率有关。这样看来,OD 和 is 似乎是一致的。

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

图 17GSV 数据集中执行 PSPNet101 后标记像素的相对分布。

跨不同类别的分割像素的相对分布还表明,不仅可以检测道路上存在的对象,而且可以检测周围环境中的对象,包括建筑物和天空中的对象。

虽然没有发现以下一些物体与道路安全有明显的相关性,但它们显示了使用 GSV 图像在广泛的位置检测结构的能力。嵌入建筑景观中的 2 750 个钟被错误地归类为碟形卫星天线。在同一地区,发现了 37 917 株盆栽植物。天空中发现了 234 架飞机。检测到大量标记为人行道的像素后,表明可能会捕捉到经常出现的对象(发现了 107 266 人,以及 5 013 条长凳和 1 168 个消防栓)。

表 7 中是由 19 个分段类别分布的所有像素标签的绝对计数。

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

表 7 在所有影像数据集中检测到的标记像素的绝对数量。

同样,从 IS 的角度来看,由于检测到的像素数量相对较高且形状一致,GSV 数据集似乎有助于估计道路和人行道的面积。这同样适用于路灯。尽管只有 3.03 亿像素被识别出来,但这个物体的尺寸表明,其中相当大一部分应该已经被探测到了。

在对完整数据集的每个 LSOA 的一个分割图像进行单独分析后,似乎可以准确地检索道路和人行道的面积和形状。

正如在简介中所指出的,最后这些属性与道路安全相关,因为它们允许计算道路和人行道宽度。街灯或电线杆的存在,正如他们在城市景观中所称的,是评估道路能见度的一个代理。

在图 18 中,这些概念连同侧面的说明性图像一起被举例说明。

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

图 18 信息图展示了提取道路和人行道宽度以及街灯的潜力。

限制和错误分类

由于某些结构的尺寸,PSPNet101 无法准确捕捉它们的形状。一个例子是极细,因此它们的检测受数据集中图像分辨率的影响很大。一旦对这些结构最重要的是它们的检测而不是捕捉它们的形状,这就不是特别大的问题。

就道路和人行道而言,有时堵塞似乎是一个问题。然而,通过考虑通常出现在这些区域中的对象,同时考虑它们的重叠区域似乎是一种有效的变通方法。具体来说,这是在路上的汽车和人行道上的人身上观察到的。通过这种方式,仍然可以提取这些结构的形状和大小的信息。

提取伦敦道路上这些建筑的绝对尺寸可能是一项艰巨的任务。根据拍摄图像的角度,标准可以有很大的不同。克服这个问题的一个方法是关注对象之间的相对维度(图 19)。

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

图 19 来自不同 LSOAs 的随机分割图像的小样本显示了在捕捉尺寸和形状时考虑结构遮挡的重要性。

未来方向

对于 OD 而言,在评估骑自行车者的道路安全方面向前迈出的一步是找到一个共同的道路安全指标,允许我们比较,例如,在事故或伤害率方面,物体如何不同地影响安全。在更大的数据集中训练 YOLOv5,并且比 Coco 女士有更多的对象类别。这将涉及注释额外的图像。关于如何训练 YOLOv5 的文档非常详细且易于掌握。静态图像不能捕捉几个特征。使用包括行人、骑自行车者和车辆运动在内的视频记录将允许捕捉受图像获取时间高度影响的变量。

就信息系统而言,这些模型可以专门用于检测新的物体。

自行车道的存在是决定骑自行车者道路安全的一个因素。没有找到任何包含这些内容的数据集。创建一个包括这一类别的对评估它们的安全性是非常重要的。

虽然我们没有发现人行道是否与骑自行车者的安全相关的证据,但在未来,证明存在关联,在城市景观中预先训练的 PSPNet101 将能够捕捉到它。

图 18 总结了可使用 PSPNet101 在 GSV 数据集中提取的所有道路安全信息(在本项目中确定)。

结论

该项目的目标是使用 OD,从大伦敦的 GSV 影像数据集中提取骑自行车者的道路风险因素。这包括对所有 LSOAs 的图像分布的研究。确定相关的道路安全指标,以确定骑自行车者的风险因素并对其进行分级。使用 YOLOv5 和 PSPNet101 检测物体和分割图像。分析不同类别之间的对象分布和相关性。最后,找出两种方法的常见错误分类和局限性,并提出推进道路安全评价的新方法。

在数据集中可用的 50 万幅图像中,识别了大约 200 万个对象,标记了 2000 亿个像素。平均每个 LSOA 有 108 张图片。使用 YOLOv5,在 LSOA 水平上直接确定了以下风险因素的分布:高车辆速度、电车/火车轨道、卡车流通、停放的汽车和行人。汽车(占所有物体的 84.5%)、人(6.01%)、卡车(3.92%)、公共汽车(0.60%)、交通信号灯(0.4%)、停车标志(0.07%)、停车计时器(0.05%)和火车(0.04%)计数用于识别先前的风险因素。伦敦市中心以外的道路交通流量较高。相比之下,该区域内骑自行车者和行人的比例更高。前者被定义为一个消极的组合安全措施,第二,积极的。研究发现,汽车与公共汽车、汽车与骑自行车的人以及汽车与人之间存在显著的负相关。人 x 自行车和人 x 公交车的正相关。重型车辆(公共汽车和卡车)数量呈长尾分布。使用 PSPNet101,建筑物(27%)、天空(22%)和道路(22%)像素是最常见的。因此,在这些区域中的任何一个中的物体都可以被同等地检测到。所有的结果和实现都可以在项目的中获得。

未来的方向包括提高 GSV 图像的可用性和分辨率。使用包含更多道路安全相关类别的数据集训练 YOLOv5 和 PSPNet101。定义一个安全度量来加权和组合(在道路级别)检测到的对象或分段结构。最后,实时处理街景图像或视频将允许更好地捕捉道路安全的动态(视频)。

YOLOv5x 实时执行。

文章 | GitHub 资源库

参考

[1]“pedbikeinfo”,行人和自行车信息中心,[在线]。可用:http://www.pedbikeinfo.org/.【Acedido em 2020 年 4 月 19 日】。

[2] C. Allan,“骑行英国的骑行统计”,2019 年 11 月。【在线】。可用:【https://www.cyclinguk.org/statistics. 【Acedido em 2020 年 8 月 19 日】。

[3]“20 亿英镑创造自行车和步行新时代”,英国政府,2020 年 5 月 9 日。【在线】。可用:https://www . gov . uk/government/news/20 亿包创造骑行新时代。【Acedido em 2020 年 8 月 19 日】。

[4] S. M. Balogh,“骑自行车者的感知安全性——道路属性的作用”,瑞典斯德哥尔摩 KTH 皇家理工学院,2017 年。

[5]“谷歌街景报道”,维基百科,2020 年 8 月 14 日。【在线】。可用:https://en . Wikipedia . org/wiki/Coverage _ of _ Google _ Street _ View。[2020 年 8 月 19 日]

[6] G. Jocher,“YOLOv5”,Ultralytics,2020 年 7 月 23 日。【在线】。可用:https://github.com/ultralytics/yolov5.【Acedido em 2020 年 7 月 23 日】。

[7] J. S. X. Q. X. W. J .赵恒爽,《金字塔场景解析网络》,em 计算机视觉与模式识别,2017。

[8] E. R. S .观察站,“2018 年交通安全基本事实”,欧洲委员会,2018 年。

[9]美国疾病预防控制中心营养部,“身体活动”,2019 年 2 月 4 日。【在线】。可用:https://www . CDC . gov/physical activity/about-physical-activity/pdf/healthy-strong-America-2019 02 _ 508 . pdf【Acedido em 19 April 2020】。

[10] T. f .伦敦,“伦敦之旅,报告 11”,2018 年。

[11]安全网,“行人和骑自行车者”,2009 年。【在线】。可用:https://EC . Europa . eu/transport/road _ safety/sites/road safety/files/specialist/knowledge/pdf/行人. pdf【Acedido em 13 May 2020】。

[12]“自行车设施”,iRAP,[在线]。可用:http://toolkit.irap.org/default.asp?page=treatment&id = 1。[2020 年 4 月 8 日]

[13]“道路安全委员会”,西澳大利亚政府,[在线]。可用:https://www . RSC . wa . gov . au/RSC/media/Documents/Resources/cyclers-INFO-sheet . pdf .【Acedido em 2020 年 4 月 8 日】。

[14]《自行车安全》,美国国家公路交通安全管理局,[在线]。可用:【https://www.nhtsa.gov/road-safety/bicycle-safety. 【Acedido em 2020 年 4 月 8 日】。

[15] K. T. e. al,“路线基础设施和骑自行车者受伤的风险:病例交叉研究”,《美国公共卫生杂志》,,第 102 卷,第 12 期,第 2336-2343 页,2012 年。

[16] L. Chen,C. Chen,R. Srinivasan,C. E. McKnight,R. Ewing e M. Roe,“评估纽约市自行车道的安全效果”,《美国公共卫生杂志》,第 102 卷,第 6 期,第 1120-1127 页,2012 年。

[17]“骑自行车——防止受伤”,维多利亚州政府,2013 年 11 月。【在线】。可用:https://www . better health . vic . gov . au/health/health yling/cycling-preventing-injury。【Acedido em 2020 年 5 月 7 日】。

[18]“速度和事故风险”,欧洲委员会,2020 年 5 月 8 日。【在线】。可用:https://EC . Europa . eu/transport/road _ safety/specialist/knowledge/speed/speed _ is _ a _ central _ issue _ in _ road _ safety/speed _ and _ accident _ risk _ en。[2020 年 5 月 8 日]

[19]“人体可以容忍哪些力量?,“欧盟委员会,流动性和运输,2020 年 5 月 9 日。【在线】。可用:https://EC . Europa . eu/transport/road _ safety/specialist/knowledge/vehicle/key _ issues _ for _ vehicle _ safety _ design/what _ forces _ can _ be _ tolerated _ the _ human _ body _ en。【2020 年 5 月 9 日 Acedido em】。

[20] C. a. H. N. Tingvall,“零视野——安全和机动性的道德方法”,em 第六届 ITE 国际道路安全会议&交通执法:2000 年以后,墨尔本,1999 年。

[21] E. Pasanen,“驾驶速度和行人安全”,1991 年。

[22] S. M. G. Ashton,“从车辆外部设计变化中获益”,em 汽车工程师学会会议录,密歇根州底特律市,1983 年。

*[23] V. S. M. R. e. a. Asgarzadeh M,“交叉口和街道设计对自行车-机动车碰撞严重程度的作用”,*伤害预防,第 23 卷,第 179–185 页,2017 年。

*[24] L. Dablanc,“欧洲大城市的货物运输:难以组织,难以现代化”,*运输研究 A 部分:政策与实践,第 41 卷,第 3 期,第 280-285 页,2007 年。

*[25] M. Jaller,j . hol guín-Veras e . s . Hodge,“城市中的停车:货运交通的挑战”,*交通研究记录:交通研究委员会杂志,第 2379 卷,第 46–56 页,2013 年。

*[26] A. Conway,N. Tavernier,V. Leal-Tavares,N. Gharamani,L. Chauvet,M. Chiu e X. Bing Yeap,“自行车友好城市中的货运”,*运输研究记录:运输研究委员会杂志,第 2547 卷,第 91–101 页,2016 年。

*[27] J.-K. Kim,S. Kim,g . f . Ulfarsson e . l . porre llo,“自行车-机动车事故中骑车人受伤的严重程度”,*事故分析&预防,第 39 卷,第 2 期,第 238-251 页,2007 年。

[28] J. Manson、S. Cooper、A. West、E. Foster、e . Cole e . n . r . m . Tai,“重大创伤和城市骑自行车者:生理状况和伤害概况”,《急救医学杂志》,第 30 卷,第 1 期,第 32–37 页,2012 年。

[29] S. Kaplan,k . Vavatsoulas e . c . g . Prato,“与丹麦骑车人伤害严重程度相关的加重和减轻因素”,《安全研究杂志》,第 50 卷,第 75–82 页,2014 年。

*[30]p . Chen e . qi . Shen,“在涉及汽车的自行车碰撞中,建筑环境对骑车人伤害严重程度的影响”,*事故分析&预防,第 86 卷,第 239-246 页,2016 年。

31 p . e . al,“交通研究程序”,第 25 卷,第 999-1007 页,2017 年。

*[32]m . McCarthy e . k . Gilbert,“1985-1992 年伦敦骑车人道路死亡:驾驶员、车辆、操纵和伤害”,*事故分析&预防,第 28 卷,第 2 期,第 275-279 页,1996 年。

*[33] A. S. Morgan,H. B. Dale,w . e . Lee e . p . j . Edwards,“伦敦骑自行车者的死亡:1992 年至 2006 年的趋势”, *BMC 公共卫生,第 10 卷,n . 669,第 1-5 页,2010 年。

[34] P. Tuckela,w . Milczarskib e . r . mais elc,“纽约州和加利福尼亚州与自行车碰撞造成的行人伤害”,《安全研究杂志》,第 51 卷,第 7-13 页,2014 年。

[35] D .杜福尔,“欧洲委员会——智能能源欧洲”,2010 年 2 月。【在线】。可用:https://EC . Europa . eu/energy/intelligent/projects/sites/iee-projects/files/projects/documents/presto _ fact _ sheet _ cyclers _ and _ 行人 _ en . pdf .【Acedido em 2020 年 5 月 11 日】。

[36]“对象检测”,维基百科,2020 年 7 月 24 日。【在线】。可用:https://en.wikipedia.org/wiki/Object_detection.【Acedido em 2020 年 8 月 19 日】。

[37] J. Redmon,S. Divvala,r . gir shick e . a .法尔哈迪,“你只看一次:统一的实时物体检测”,em 计算机视觉与模式识别,2016 年。

[38]“图像分割”,维基百科,2020 年 7 月 6 日。【在线】。可用:【https://en.wikipedia.org/wiki/Image_segmentation. 【Acedido em 2020 年 8 月 19 日】。

[39]“城市景观测试中的语义分割”,带代码的论文,[在线]。可用:https://papers with code . com/sota/semantic-segmentation-on-city scapes。[2020 年 8 月 18 日]

[40]m . m . s . b . l . b . r . g . j . p . p . d . r . c . l . z . p . d .宗-林逸,“微软可可:上下文中的公共对象”,em 计算机视觉和模式识别,2014 年。

[41]h . r . n . a . j . u . I . k . p .-t . s . k . s . p . m . a . k . t . d . v . f . a . kuznet sova,“开放图像数据集 V4:统一图像分类、对象检测和大规模视觉关系检测”,Resultados da procura Resultado da Web com liga es entre sites 国际计算机视觉杂志, 2020 年。

[42]m . o . s . r . t . r . m . e . r . b . u . f . s . r . b . s . m . Cordts,“语义城市场景理解的城市景观数据集”,em Proc .2016 年 IEEE 计算机视觉和模式识别会议

[43]海珠西航局,周,“通过 ADE20K 数据集进行场景解析”,em 计算机视觉与模式识别,2017。

[44]“概况介绍:骑自行车者的安全”,欧洲委员会,[在线]。可用:https://EC . Europa . eu/transport/sites/transport/files/themes/urban/doc/cycler _ safety _ one pager . pdf【Acedido em 2020 年 4 月 8 日】。

[45]“自行车骑手安全”,维多利亚州交通资源,[在线]。可用:https://www . vic roads . vic . gov . au/safety-and-road-rules/cycler-safety/bike-rider-safety。[2020 年 4 月 8 日]

[46]“驾驶和自行车安全”,伦敦交通局,[在线]。可用:https://tfl . gov . uk/travel-information/safety/road-safety-advice/driving-and-cycling-safety。[2020 年 4 月 8 日]

附录

YOLOv5 |检测到的对象

该项目的主要目标之一是展示街景图像的潜力。给定一个大型数据集,可以提取大量信息。

在分析所有处理过的 LSOAs 图谱时,发现了两个说明这种技术潜力的类别:飞机盆栽*(图 20)。*

在第一种情况下,在希思罗机场和伦敦金融城机场附近的区域,每幅图像中检测到更高密度的飞机。此外,所有检测到的平面都在这些结构的右侧。这种现象可以用风向西->东来解释,这使得飞机更倾向于从东->西着陆,而事实上着陆比起飞花费的时间要长得多。因此,只有右边拍摄的图像包含它们。最后,每个机场旁边的检测数量差异也很明显。由于希思罗机场的空中交通增加,大部分都在它的附近。

盆栽植物也经常被发现。这些主要出现在伦敦最大的公园附近的图像中。这一类别包括插在任何类型花盆中的所有植物。在执行 PSPNet101 后,植被是整个 GSV 数据集中第二大被标记的像素类型,因此捕获的盆栽植物(第四大被检测对象)的高水平就不足为奇了。

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

图 20 (左)在最近的伦敦机场附近拍摄的图像中,飞机密度与预期相符。(右图)同样,在最大的公园附近观察到盆栽植物的最大密度。

YOLOv5 |限制和错误分类

对于我们定义为与骑车人道路安全相关的对象,错误分类的数量非常少。这是因为定义了 0.5 的高阈值来计数为检测,并且在 MS Coco 训练数据集中,最常见的对象是我们感兴趣的对象。

尽管如此,还是有一些物品一直被错误分类。最常见的是被检测为时钟的碟形卫星天线。根据角度的不同,臂状碟形天线很容易像一个时钟指针。在完整的 GSV 影像数据集中检测到 2750 个时钟(图 21)。其他较少表现的物体也被错误地识别。有时是因为它们的形状,另一些是因为它们的质地。前者的一个例子是探测船只而不是建筑集装箱,后者是探测长凳而不是栅栏。

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

图 21 执行 YOLOv5 后发现的最常见的错误分类是检测到了时钟,而不是碟形卫星天线。

项目路线图

图 22 详细描述了这个为期 5 个月的项目中采取的所有步骤。

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

图 22 项目路线图从 3 月份开始,到 8 月份提交。

监督人

马吉德·埃扎提 | 里基·纳特瓦尼

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值