如何解释numpy.correlate和numpy.corrcoef值?

2024-05-16 22:38:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个一维数组,我想看看它们之间的相互关系。我在纽比应该用什么程序?我用的是numpy.corrcoef(arrayA, arrayB)numpy.correlate(arrayA, arrayB),它们都给出了一些我无法理解或理解的结果。有人能解释一下如何理解和解释这些数值结果吗(最好用一个例子)?谢谢。


Tags: 程序numpy关系数组例子数值correlatecorrcoef
3条回答

如果您对向量的np.correlate的结果感到困惑,可能是由于溢出所致:

>>> a = np.array([4,3,2,1,0,0,0,0,10000,0,0,0], dtype='int16')
>>> np.correlate(a,a[:4])
array([    30,     20,     11,      4,      0,  10000,  20000,  30000,
   -25536], dtype=int16)

这个例子还解释了correlate是如何工作的:

30=4*4+3*3+2*2+1*1
20=4*3+3*2+2*1+1*0
11=4*2+3*1+2*0+1*0

40000=4*10000+3*0+2*0+1*0
显示为40000-2**16=-25536

numpy.correlate只返回两个向量的互相关。

如果您需要了解相互关系,那么从http://en.wikipedia.org/wiki/Cross-correlation开始。

一个很好的例子可以通过查看自相关函数(一个与自身相关的向量):

import numpy as np

# create a vector
vector = np.random.normal(0,1,size=1000) 

# insert a signal into vector
vector[::50]+=10

# perform cross-correlation for all data points
output = np.correlate(vector,vector,mode='full')

Code graph

当两个数据集重叠时,这将返回一个最大值为comb/shah的函数。由于这是一个自相关,两个输入信号之间不会有“滞后”。因此,相关性的最大值是vector.size-1。

如果只需要重叠数据的相关值,可以使用mode='valid'

目前我只能对numpy.correlate发表评论。它是一个强大的工具。我用它有两个目的。首先是在另一个模式中找到一个模式:

import numpy as np
import matplotlib.pyplot as plt

some_data = np.random.uniform(0,1,size=100)
subset = some_data[42:50]

mean = np.mean(some_data)
some_data_normalised = some_data - mean
subset_normalised = subset - mean

correlated = np.correlate(some_data_normalised, subset_normalised)
max_index = np.argmax(correlated)  # 42 !

第二个用途(以及如何解释结果)是用于频率检测:

hz_a = np.cos(np.linspace(0,np.pi*6,100))
hz_b = np.cos(np.linspace(0,np.pi*4,100))

f, axarr = plt.subplots(2, sharex=True)

axarr[0].plot(hz_a)
axarr[0].plot(hz_b)
axarr[0].grid(True)

hz_a_autocorrelation = np.correlate(hz_a,hz_a,'same')[round(len(hz_a)/2):]
hz_b_autocorrelation = np.correlate(hz_b,hz_b,'same')[round(len(hz_b)/2):]

axarr[1].plot(hz_a_autocorrelation)
axarr[1].plot(hz_b_autocorrelation)
axarr[1].grid(True)

plt.show()

three hz and two hz with autocorrelation show beneath

找到第二个峰的指数。从这里你可以找到频率。

first_min_index = np.argmin(hz_a_autocorrelation)
second_max_index = np.argmax(hz_a_autocorrelation[first_min_index:])
frequency = 1/second_max_index

相关问题 更多 >