5.1 相关性¶
通常来说,如果一个变量与另一个变量相关,那么意味着如果知道一个变量的值就可以得到另一个变量的一些信息。
我们有好几种方式来度量相关性,
其中最常见的一种是皮尔森相关系数(Pearson product-moment correlation coefficient),
记为: \(\rho\) 。对于两个均包含N个测量值的变量 x 和 y ,
\[\rho = \frac{{\sum\limits_i {({x_i} - {\mu _x})({y_i} - {\mu _y})} }}{{N{\sigma _x}{\sigma _y}}}\]
上式中的 \({\mu _x}\) 和 \({\mu _y}\) 是 x 和 y 的均值,
\({\sigma _x}\) 和 \({\sigma _x}\) 是它们的标准差。
皮尔森相关系数总是在[-1,1]的范围内,如果是正值,表示两个变量正相关,也就是说一个变量如果比较大,
那么另一个也趋向于变大,相反,如果是负值,那么表示两个变量负相关,也就是说一个变量如果比较大,
那么另一个会趋向于变小。
\(\rho\) 的大小表示两个变量之间的相关程度,越大就越相关。如果 \(\rho\) 是1或-1,
则说明它们是完全相关的,如果我们知道其中一个的值,就能准确预测出另一个值。如果 \(\rho\)
接近0,说明它们之间的相关性可能很弱,也就是知道其中一个的值,对于我们预测另一个的值来说没有什么意义。
这里,我用了“可能很弱”,是因为如果它们之间是非线性的关系,那么相关系数并不能很好的表征这种非线性关系。
在统计学中,非线性相关性也很重要,但是在信号处理中没有那么常见,因此这里我们先不考虑它。
Python中有很好几种方法来计算相关性。其中 np.corrcoef 可以计算多个变量两两之间的相关系数,结果用
一个 相关矩阵(correlation matrix) 来表示。
这里以两个变量为例,首先我构造了一个生成不同初始相位的正弦信号的函数,如下:
def make_sine(offset):
signal = thinkdsp.SinSignal(freq=440, offset=offset)
wave = signal.make_wave(duration=0.5, framerate=10000)
return wave
然后我们生成了两个不同相位的正弦信号:
wave1 = make_sine(offset=0)
wave2 = make_sine(offset=1)
图5.1 显示了这两个信号的前几个周期的波形。可以看到,一个信号的值比较大的时间,另一个的值也相对比较大,
感觉它们之间应该是相关的。
图5.1: 两个相位差1弧度的正弦信号波形
它们之间的相关系数计算如下:
>>> corr_matrix = np.corrcoef(wave1.ys, wave2.ys)
[[ 1. 0.54]
[ 0.54 1. ]]
结果是一个相关矩阵,每个位置的值都代表的是对应的行号和列号两个信号之间的相关系数。
例如,第一行第一列元素的值代表了 wave1 和自身的相关系数,同样第二行第二列的值代表了
wave2 和自身的相关系数。
其中非对角元素的值是我们所关心的,也就是 wave1 和 wave2 之间的相关系数0.54,
表明了它们之间有一定的相关性。
当它们之间的相位差增大时,它们的相关系数会减小,直到相位差为180°,这时相关系数为-1。然后,
随着相位差继续增大,相关系数值又会增大,直到360°,这个时候它们的相关系数为1.
图5.2 显示了它们之间的相关系数随相位差变化的情况。这个曲线的形状你应该很熟悉,它是余弦曲线。
图5.2: 正弦信号相关系数随相位差变化曲线
thinkdsp 中提供一个简单的方法来计算波形之间的相关性:
>>> wave1.corr(wave2)
0.54