为何Pandas相关系数计算结果偏低?求更优相关性分析方案
问题分析与解决方案
一、皮尔逊相关系数偏低的原因
- 皮尔逊相关系数本质是衡量线性相关性,但你的数据是高斯白噪声叠加极弱的正弦调制(幅度仅为0.002倍),整体无明显线性趋势,因此无法捕捉这种周期性关联。
- 噪声强度远高于信号幅度:高斯白噪声的方差通常远大于微弱正弦信号的能量,噪声会稀释皮尔逊系数的计算结果,导致数值偏低。
二、体现周期性高相关性的计算方法
1. 互功率谱密度(CPSD)
通过频域分析聚焦目标调制频率的相关性,若该频率处出现显著峰值,说明二者在该频率上高度关联:
import numpy as np import scipy.signal as signal # 替换为实际采样频率 sampling_freq = 1000 # 计算互功率谱密度 freq, cpsd = signal.csd( saved_data_DAQ.iloc[2500].values, sine_modulation(time_measurement, modulation_frequency_axion), fs=sampling_freq ) # 定位目标频率对应的CPSD值 target_freq_idx = np.argmin(np.abs(freq - modulation_frequency_axion)) target_cpsd = np.abs(cpsd[target_freq_idx])
2. 相位锁定值(PLV)
专注于信号的相位同步性,不受幅度差异影响,适合检测噪声中极弱的同频振荡:
from scipy.signal import hilbert # 希尔伯特变换提取解析信号 data_hilbert = hilbert(saved_data_DAQ.iloc[2500].values) sine_hilbert = hilbert(sine_modulation(time_measurement, modulation_frequency_axion)) # 计算相位差的平均余弦值(PLV) data_phase = np.angle(data_hilbert) sine_phase = np.angle(sine_hilbert) phase_diff = data_phase - sine_phase plv = np.abs(np.mean(np.exp(1j * phase_diff)))
PLV值越接近1,说明两个信号在目标频率上的相位同步性越强。
3. 时域互相关峰值检测
计算两个信号的互相关函数,零延迟处的峰值可反映同频同相信号的关联程度:
xcorr = np.correlate( saved_data_DAQ.iloc[2500].values, sine_modulation(time_measurement, modulation_frequency_axion), mode='full' ) lags = np.arange(-len(xcorr)//2, len(xcorr)//2) # 获取零延迟位置的互相关值 zero_lag_idx = np.argmin(np.abs(lags)) zero_lag_corr = xcorr[zero_lag_idx]
若零延迟处的互相关值显著高于随机噪声的互相关水平,说明目标信号存在关联。
三、检测噪声中振荡成分的指标
若0.23的皮尔逊系数是合理结果(因信号确实极弱),可通过以下指标检测振荡成分:
- 功率谱密度(PSD):直接观察目标频率处是否存在明显峰值,峰值显著高于噪声基底则说明存在该频率的振荡。
- 小波变换:可同时定位振荡成分的时间和频率分布,适合非平稳信号的检测。
- 同步似然性:衡量信号间的非线性同步性,能有效检测弱耦合的振荡成分。
- F检验(正弦模型拟合):将数据拟合为「噪声+正弦信号」模型,通过F检验判断正弦项是否具有统计显著性。
内容的提问来源于stack exchange,提问作者Juan Pablo Arcila
相关产品推荐
相关产品推荐

