为什么pandas给出的这个相关系数低得不切实际?

问题描述 投票:0回答:1

我正在使用 python 进行编码,并将 pandas 中的一行(索引 2500)与我定义的正弦函数(sine_modulation)相关联。当我打印我通过使用获得的值时

row_correlation(saved_data_DAQ.iloc[2500].values, sine_modulation(time_measurement,modulation_frequency_axion))

其中 row_correlation(f,g) 只是定义为

np.corrcoef(f, g)[0, 1]
我得到 0.23。然而,如果我绘制这两个函数,我可以直观地看到极高的相关性(见图)。这是预期的,因为蓝色曲线只是随机白噪声(来自高斯分布)加上常数乘以正弦调制本身(蓝色 = 噪声 + C*红色,其中 C=0.002)

我想知道为什么这个函数计算出的相关性如此之低,但更重要的是,您对如何计算相关性有什么想法或建议,以更好地反映我的两个函数之间的高度相关性吗?

Visual inspection of both functions (row 2500 of dataframe and sine modulation)

您还可以在下面看到放大的效果

Zoom in showing also the cadence of the data points

注意,相关性也可能是正确的,并且为 0.23,那么我的问题如下: 我还可以计算哪些其他量来显示我的噪声是否具有振荡分量?我在评论中看到“同步”这个词,也许这是正确的计算量?

python pandas signal-processing correlation cross-correlation
1个回答
1
投票

我为您做了一个简短的示例,看看您在哪里获得了较低的 R 值。让我们考虑一个纯正正弦:

N = 2500 # number of samples
t = np.linspace(0,1, N) # time going to 1 seconds I guess
Fs = N/t[-1] # sampling rate
sine = (np.sin(4*np.pi*t-np.pi/2)+1)/2 # positive sine wave

由于您没有添加代码,我假设您的噪音看起来像这样:

noise = abs(np.random.normal(0,0.1,len(t))) # random 

最后,让我们定义与正弦波相乘的系数。让我们将其设置为在具有 100 个样本的线性空间中从 0.001 到 1:

C = np.linspace(0.001, 1, 100) # pure sine coefficient

如果我们循环这些值并使用

sineWithNoise = c*sine + noise
生成噪声信号,我们会得到以下结果:

oGIF

要了解

c
的实际值,请查看第三个子图(最右侧的轴)的 xlabel。

最重要的是,我认为您需要查看散点图,因为相关系数的计算依赖于将两个信号相互比较(图像来源):

pearson

并且不及时比较两个信号(图像来源):

correlate

要使用互相关,您可以使用:

from scipy.signal import correlate, correlation_lags xcorr = correlate(sine, sineWithNoise) # generated sineWithNoise = 0.2*sine + noise lags = correlation_lags(N,N)/Fs # get lags in seconds plt.figure() plt.plot(lags, xcorr) plt.grid() plt.xlabel("Lags (~s)") # xlabel plt.ylabel("Cross-correlation") # ylabel plt.axvline(0) # perfect scenario peak without any shift
得到以下结果:

crosscorr

要了解它们的同步程度,您需要查看最大值是否确实没有任何偏移:

idxMax = np.argmax(xcorr) # get arg of maximum print(lags[idxMax]) # print corresponding lag # 0.0008, almost zero
希望这对您有帮助

© www.soinside.com 2019 - 2024. All rights reserved.