我有两个一维数组,我想看看它们之间的关系。我应该在numpy中使用什么过程?我使用的是numpy.corrcoef(arrayA, arrayB)
和numpy.correlate(arrayA, arrayB)
,它们都给出了一些我无法理解或理解的结果。
有没有人能解释一下如何理解和解释这些数值结果(最好是用一个例子)?
发布于 2012-11-18 22:28:18
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')
当两个数据集重叠时,这将返回一个带有最大值的comb/shah函数。由于这是一种自相关,因此在两个输入信号之间不会有“滞后”。因此,相关性的最大值是vector.size-1。
如果您只需要重叠数据的相关值,则可以使用mode='valid'
。
发布于 2016-06-18 01:05:55
目前我只能对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()
找出第二个峰值的指数。由此,您可以返回以找到频率。
first_min_index = np.argmin(hz_a_autocorrelation)
second_max_index = np.argmax(hz_a_autocorrelation[first_min_index:])
frequency = 1/second_max_index
https://stackoverflow.com/questions/13439718
复制相似问题