corrcoef函数python_用Numpy计算Python中的Pearson相关系数

本文介绍了皮尔逊(Pearson)相关系数,其手动计算以及通过Pythonnumpy模块进行的计算。

皮尔逊相关系数测量变量之间的线性关联。它的值可以这样解释:

  • +1-完全正相关
  • +0.8-强正相关
  • +0.6-中等正相关
  • 0-无关联
  • -0.6-中度负相关
  • -0.8-强烈的负相关
  • -1-完全负相关

我们将说明相关系数如何随不同类型的关联而变化。在本文中,我们还将显示零关联并不总是意味着零关联。非线性相关变量的相关系数可能接近零。

皮尔逊相关系数是多少?

皮尔逊相关系数也称为皮尔逊积矩相关系数。它是两个随机变量XY之间线性关系的度量。在数学上,如果(σXY)是XY之间的协方差,并且(σX)是X的标准偏差,则皮尔逊相关系数 ρ可以由下式给出:

9e8bcdb5348336a09d1ae57d4f102543.png

由于协方差总是小于各个标准偏差的乘积,因此ρ的值在-1+1之间变化。从上面我们还可以看到,变量与自身的相关性为1:

40df4aa448450ac85ecd0f666326698c.png


在开始编写代码之前,让我们做一个简短的示例,看看如何计算该系数。

皮尔逊相关系数如何计算?

假设我们对随机变量XY有一些观察。如果您打算从头开始实施所有工作或进行一些手动计算,那么在给定XY时需要以下内容:

585d514c15b63c1285b7e53ad06b2736.png

让我们使用以上内容来计算相关性。我们将使用协方差和标准偏差的有偏估计。这不会影响正在计算的相关系数的值,因为观察值的数量在分子和分母中抵消了:

ec8d95b50d4ab24cc7e092d0410582bc.png

使用Numpy的Python中的Pearson相关系数

皮尔逊相关系数可以使用corrcoef()Numpy中的方法在Python中计算。

此函数的输入通常是一个矩阵,例如size mxn,其中:

  • 每列代表一个随机变量的值
  • 每行代表一个n随机变量样本
  • n 代表不同随机变量的总数
  • m 代表每个变量的样本总数

对于n随机变量,它返回一个nxn方矩阵M,其中M(i,j)指示了随机变量i和之间的相关系数j。由于变量与变量自身之间的相关系数为1,因此所有对角线项(i,i)均等于1。

简而言之:

814fb61ce537e9121871198475048de8.png

注意,相关矩阵是对称的,因为相关是对称的,即中号(一世,Ĵ)=中号(Ĵ,一世)中号(一世,Ĵ)=中号(Ĵ,一世)。让我们以上一节中的简单示例为例,看看如何使用C要么[RCØËF()C要么[RCØËF()与ν米pÿν米pÿ。

首先,让我们导入该numpy模块以及pyplotMatplotlib中的模块。稍后,我们将使用Matplotlib可视化相关性:

import numpy as np
import matplotlib.pyplot as plt

我们将从以前的示例中使用相同的值。让我们将其存储x_simple并计算相关矩阵:

x_simple = np.array([-2, -1, 0, 1, 2])
y_simple = np.array([4, 1, 3, 2, 0])
my_rho = np.corrcoef(x_simple, y_simple)

print(my_rho)

以下是输出相关矩阵。注意对角线上的那些,表明变量与自身的相关系数为1:

[[ 1.  -0.7]
[-0.7  1. ]]

正负相关示例

让我们可视化一些关系的相关系数。首先,我们将在两个变量之间具有完全正相关(+1)和完全负相关(-1)。然后,我们将生成两个随机变量,因此相关系数应始终接近零,除非随机性偶然具有某些相关性,而这种可能性极小。

我们将使用a,seed以便在RandomState从Numpy调用the时此示例可重复:

seed = 13
rand = np.random.RandomState(seed)

x = rand.uniform(0,1,100)
x = np.vstack((x,x*2+1))
x = np.vstack((x,-x[0,]*2+1))
x = np.vstack((x,rand.normal(1,3,100)))

第一次rand.uniform()调用会生成随机均匀分布:

[7.77702411e-01 2.37541220e-01 8.24278533e-01 9.65749198e-01
 9.72601114e-01 4.53449247e-01 6.09042463e-01 7.75526515e-01
 6.41613345e-01 7.22018230e-01 3.50365241e-02 2.98449471e-01
 5.85124919e-02 8.57060943e-01 3.72854028e-01 6.79847952e-01
 2.56279949e-01 3.47581215e-01 9.41277008e-03 3.58333783e-01
 9.49094182e-01 2.17899009e-01 3.19391366e-01 9.17772386e-01
 3.19036664e-02 6.50845370e-02 6.29828999e-01 8.73813443e-01
 8.71573230e-03 7.46577237e-01 8.12841171e-01 7.57174462e-02
 6.56455335e-01 5.09262200e-01 4.79883391e-01 9.55574145e-01
 1.20335695e-05 2.46978701e-01 7.12232678e-01 3.24582050e-01
 2.76996356e-01 6.95445453e-01 9.18551748e-01 2.44475702e-01
 4.58085817e-01 2.52992683e-01 3.79333291e-01 6.04538829e-01
 7.72378760e-01 6.79174968e-02 6.86085079e-01 5.48260097e-01
 1.37986053e-01 9.87532192e-02 2.45559105e-01 1.51786663e-01
 9.25994479e-01 6.80105016e-01 2.37658922e-01 5.68885253e-01
 5.56632051e-01 7.27372109e-02 8.39708510e-01 4.05319493e-01
 1.44870989e-01 1.90920059e-01 4.90640137e-01 7.12024374e-01
 9.84938458e-01 8.74786502e-01 4.99041684e-01 1.06779994e-01
 9.13212807e-01 3.64915961e-01 2.26587877e-01 8.72431862e-01
 1.36358352e-01 2.36380160e-01 5.95399245e-01 5.63922609e-01
 9.58934732e-01 4.53239333e-01 1.28958075e-01 7.60567677e-01
 2.01634075e-01 1.75729863e-01 4.37118013e-01 3.40260803e-01
 9.67253109e-01 1.43026077e-01 8.44558533e-01 6.69406140e-01
 1.09304908e-01 8.82535400e-02 9.66462041e-01 1.94297485e-01
 8.19000600e-02 2.69384695e-01 6.50130518e-01 5.46777245e-01]

然后,我们可以调用vstack()将其他数组垂直堆叠到该数组。这样,我们可以在同一个x引用中堆叠一堆类似于上面的变量,并顺序访问它们。

在第一个均匀分布之后,我们在垂直方向上堆叠了一些变量集-第二个变量与第一个变量具有完全正相关,第三个变量与第一个变量具有完全负相关,第四个变量是完全随机的,因此它应该具有〜0的相关性。

当我们有一个这样的x引用时,我们可以通过将其单独传递给来计算垂直堆栈中每个元素的相关性np.corrcoef()

rho = np.corrcoef(x)

fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(12, 3))
for i in [0,1,2]:
    ax[i].scatter(x[0,],x[1+i,])
    ax[i].title.set_text('Correlation = ' + "{:.2f}".format(rho[0,i+1]))
    ax[i].set(xlabel='x',ylabel='y')
fig.subplots_adjust(wspace=.4)    
plt.show()

c18df2eb7573f420c795dd4ce17414ff.png

了解皮尔逊的相关系数变化

只是为了查看相关系数如何随两个变量之间的关系变化而变化,让我们向上x一节中生成的矩阵中添加一些随机噪声,然后重新运行代码。

在此示例中,我们将向关联图缓慢添加不同程度的噪声,并在每个步骤上计算关联系数:

fig, ax = plt.subplots(nrows=2, ncols=4, figsize=(15, 8))

for noise, i in zip([0.05,0.2,0.8,2],[0,1,2,3]):
    # Add noise
    x_with_noise = x+rand.normal(0,noise,x.shape)
    
    # Compute correlation
    rho_noise = np.corrcoef(x_with_noise)
    
    # Plot column wise. Positive correlation in row 0 and negative in row 1
    ax[0,i].scatter(x_with_noise[0,],x_with_noise[1,],color='magenta')
    ax[1,i].scatter(x_with_noise[0,],x_with_noise[2,],color='green')
    ax[0,i].title.set_text('Correlation = ' + "{:.2f}".format(rho_noise[0,1])
                        + 'n Noise = ' + "{:.2f}".format(noise) )
    ax[1,i].title.set_text('Correlation = ' + "{:.2f}".format(rho_noise[0,2])
                        + 'n Noise = ' + "{:.2f}".format(noise))
    ax[0,i].set(xlabel='x',ylabel='y')    
    ax[1,i].set(xlabel='x',ylabel='y')
    
fig.subplots_adjust(wspace=0.3,hspace=0.4)    
plt.show()

6f531e1520220f344638c6e8db50fc24.png

一个常见的陷阱:没有关联的关联

有一个普遍的误解,认为零相关意味着没有关联。让我们澄清一下,相关性严格衡量了两个变量之间的线性关系

下面的示例显示了彼此非线性关联但具有零相关性的变量。

(y = e x)的最后一个示例具有约0.52的相关系数,这再次不反映两个变量之间的真实关联:

# Create a data matrix
x_nonlinear = np.linspace(-10,10,100)
x_nonlinear = np.vstack((x_nonlinear,x_nonlinear*x_nonlinear))
x_nonlinear = np.vstack((x_nonlinear,-x_nonlinear[0,]**2))
x_nonlinear = np.vstack((x_nonlinear,x_nonlinear[0,]**4))
x_nonlinear = np.vstack((x_nonlinear,np.log(x_nonlinear[0,]**2+1)))
x_nonlinear = np.vstack((x_nonlinear,np.exp(x_nonlinear[0,])))

# Compute the correlation
rho_nonlinear = np.corrcoef(x_nonlinear)

# Plot the data
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(16, 3))
title = ['$y=x^2$','$y=-x^2$','$y=x^4$','$y=log(x^2+1)$','$y=exp(x)$']
for i in [0,1,2,3,4]:
    ax[i].scatter(x_nonlinear[0,],x_nonlinear[1+i,],color='cyan')
    ax[i].title.set_text(title[i] + 'n' + 
                         'Correlation = ' + "{:.2f}".format(rho_nonlinear[0,i+1]))
    ax[i].set(xlabel='x',ylabel='y')
fig.subplots_adjust(wspace=.4)    
plt.show()

6734d05d5a2e5a5f7c3a4f058bd9c18b.png

结论

在本文中,我们讨论了皮尔逊相关系数。我们使用了corrcoef()Pythonnumpy模块中的方法来计算其值。

如果随机变量具有较高的线性关联,则它们的相关系数接近+1或-1。另一方面,统计独立变量的相关系数接近零。

我们还证明了非线性关联可以具有零或接近零的相关系数,这意味着具有高关联性的变量可能不具有较高的Pearson相关系数值。


版权声明:本文为weixin_35643153原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。