异步社区

异步社区是国内领先的IT专业图书社区,由人民邮电出版社主办,致力于优质学习内容的出版和分享。

34篇博客

使用正确的图表理解数据(七):绘制两个变量间的互相关图形

异步社区2018-12-28 14:00
7.8绘制两个变量间的互相关图形


互相关图形可以应用在以下场景:如果有从两个不同的观察结果得到的两个不同数据集合,我们想知道这两个数据集合是否是相关的。我们想把它们交叉关联来看其是否以某种方式匹配。或者,我们在一个较大的数据样本中寻找一个较小数据样本的模式,这个模式有可能不是一个简单或者明显的模式。


7.8.1 准备工作
我们将使用pyplot lab中的matplotlib.pyplot.xcorr函数。这个函数可以绘制两个数据集合之间的相互关系。通过这种方式我们可以看出绘制的值之间是否存在某个显著的模式。这里假设传入的x和y参数的长度相同。


如果传入的normed参数为True,可以通过零延迟(即没有时间延迟或者时差)的互关联对数据进行归一化。在内部,由Numpy的numpy.correlate函数来完成相关性计算。


通过参数usevlines(置为True),我们告诉matplotlib用vlines()而不是plot()绘制相关图形的线条。二者的主要区别是,如果使用plot(),可以使用标准的Line2D属性设置线条风格,该属性通过**kwargs参数传入matplotlib.pyplot.xcorr函数。


7.8.2 操作步骤
在下面的例子中,我们需要执行以下步骤。
(1)导入matplotlib.pyplot模块。
(2)导入numpy包。
(3)使用一个干净的数据集合,该集合是Google中对关键字flowers一年的搜索量趋势。
(4)绘制数据集合(真实的和仿造的)和互相关图表。
(5)为了标签和刻度有一个较好的显示效果使用紧凑布局。
(6)为了能更容易地理解图表添加恰当的标签和网格。


下面代码将会执行以上步骤。
import matplotlib.pyplot as plt
import numpy as np
# import the data
from ch07_search_data import DATA as d
total = sum(d)
av = total / len(d)
z = [i - av for i in d]
# Now let's generate random data for the same period
d1 = np.random.random(365)
assert len(d) == len(d1)
total1 = sum(d1)
av1 = total1 / len(d1)
z1 = [i - av1 for i in d1]
fig = plt.figure()
# Search trend volume
ax1 = fig.add_subplot(311)
ax1.plot(d)
ax1.set_xlabel('Google Trends data for "flowers"')
# Random: "search trend volume"
ax2 = fig.add_subplot(312)
ax2.plot(d1)
ax2.set_xlabel('Random data')
# Is there a pattern in search trend for this keyword?
ax3 = fig.add_subplot(313)
ax3.set_xlabel('Cross correlation of random data')
ax3.xcorr(z, z1, usevlines=True, maxlags=None, normed=True, lw=2)
ax3.grid(True)
plt.ylim(-1,1)
plt.tight_layout()
plt.show()


以上代码将生成图7-11所示的图表。


7.8.3 工作原理
我们使用了一个具有可识别模式(请参考图7-11,在数据集合上两个峰值以相似的方式重复)的真实数据集合。另一个数据集合仅是一些随机正态分布的数据,该数据和从公共服务Google Trends上拿到的真实数据有着相同的长度。


我们把这两个数据集合绘制在输出图表的上半部来对其进行可视化。使用matplotlib的xcorr函数,然后调用NumPy的correlate()函数,计算互相关性并把其绘制在图表的下半部。


NumPy中的互相关性计算返回一个相关系数数组,该数组表示了两个数据集合(如果应用在信号处理领域,通常指信号)的相似度。互相关图表,或者叫相关图是指通过相关值的高度(出现在某个时间延迟的竖线)表现,告诉我们这两个信号是否相关。我们可以看到有不止一条竖线(在时间延迟n上的相关系数)在0.5之上。


举个例子,如果两个数据集合在100s的时间延迟(也就是通过两种不同的传感器观察到的相同对象在相隔100s的两个时间点间的变化)上有相关性,则将在上图输出中的x=100的位置上看到一个竖线(表示相关系数)。

内容来源:异步社区;版权属【人民邮电出版社 异步社区】所有,转载已获得授权;未经授权,不得以任何方式复制和传播本书内容,如需转载请联系异步社区。