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')
import numpy as np
import matplotlib.pyplot as plt
# 1. We make y1 and add noise to it
x = np.arange(0,100)
y1 = np.arange(0,100) + np.random.normal(0, 10.0, 100)
# 2. y2 is exactly y1, but 5 times bigger
y2 = y1 * 5
# 3. By looking at the plot we clearly see that the two lines have the same shape
fig, axs = plt.subplots(1,2, figsize=(10,5))
axs[0].plot(x,y1)
axs[1].plot(x,y2)
fig.show()
# 4. cross-correlation can be misleading, because it is not normalized
print(f"cross-correlation y1: {np.correlate(x, y1)[0]}")
print(f"cross-correlation y2: {np.correlate(x, y2)[0]}")
>>> cross-correlation y1 332291.096
>>> cross-correlation y2 1661455.482
# 5. however, the coefs show that the lines have equal correlations with x
print(f"pearson correlation coef y1: {np.corrcoef(x, y1)[0,1]}")
print(f"pearson correlation coef y2: {np.corrcoef(x, y2)[0,1]}")
>>> pearson correlation coef y1 0.950490
>>> pearson correlation coef y2 0.950490
5条答案
按热度按时间dhxwm5r41#
numpy.correlate
仅返回两个向量的互相关。如果您需要了解交叉相关性,请从http://en.wikipedia.org/wiki/Cross-correlation开始。
通过查看自相关函数(与自身互相关的向量)可以看到一个很好的示例:
当两个数据集重叠时,这将返回一个具有最大值的梳状函数。由于这是一个自相关函数,因此两个输入信号之间没有“滞后”。因此,相关的最大值为vector.size-1。
如果只需要重叠数据的相关性值,则可以使用
mode='valid'
。bn31dyow2#
目前我只能对
numpy.correlate
进行评论,它是一个强大的工具,我使用它有两个目的,第一个目的是在一个模式中找到另一个模式:我使用它的第二个用途(以及如何解释结果)是频率检测:
求出第二个峰值的指数。从这里你可以往回求出频率。
qrjkbowd3#
在阅读了所有教科书中的定义和公式后,初学者可以了解如何从一个向量推导出另一个向量。首先关注两个向量之间的成对相关性的简单情况。
家庭作业:
scipy.stats.pearsonr
对(数组A、数组B)的作用还有一个提示:请注意,在“valid”模式下,np.correlate在此输入上只是一个点积(与上面my_corrcoef的最后一行比较):
qco9c6ql4#
如果您对int向量的结果感到困惑,可能是由于overflow:
怎么会?
tp5buhyn5#
免责声明:这不会给出 * 如何解读 * 的答案,但两者有什么区别:
"它们之间的区别"
皮尔逊积矩相关系数(
np.corrcoef
)只是互相关(np.correlate
)(source)的归一化版本因此,
np.corrcoef
始终在-1..+1的范围内,因此我们可以更好地比较不同的数据。"让我举个例子"