corrcoef函数python_⽤Numpy计算Python中的Pearson相关系
数
本⽂介绍了⽪尔逊(Pearson)相关系数,其⼿动计算以及通过Python numpy模块进⾏的计算。
线性关联。它的值可以这样解释:
⽪尔逊相关系数测量变量之间的线性关联
+1-完全正相关
+1-
+0.8-强正相关
+0.8-
+0.6-中等正相关
+0.6-
0-⽆关联
0-
-0.6-中度负相关
-0.6-
-0.8-强烈的负相关
-0.8-
-1-完全负相关
-1-
我们将说明相关系数如何随不同类型的关联⽽变化。在本⽂中,我们还将显⽰零关联并不总是意味着零关联。⾮线性相关变量的相关系数可能接近零。
⽪尔逊相关系数是多少?
σXY)是X X和Y Y之间的协⽅⽪尔逊相关系数也称为⽪尔逊积矩相关系数。它是两个随机变量X X和Y Y之间线性关系的度量。在数学上,如果(σXY
ρ可以由下式给出:
σX)是X X的标准偏差,则⽪尔逊相关系数 ρ
差,并且(σX
由于协⽅差总是⼩于各个标准偏差的乘积,因此ρ
linspace numpyρ的值在-1和+1之间变化。从上⾯我们还可以看到,变量与⾃⾝的相关性为1:
在开始编写代码之前,让我们做⼀个简短的⽰例,看看如何计算该系数。
⽪尔逊相关系数如何计算?
假设我们对随机变量X X和Y Y有⼀些观察。如果您打算从头开始实施所有⼯作或进⾏⼀些⼿动计算,那么在给定X X和Y Y时需要以下内容:
让我们使⽤以上内容来计算相关性。我们将使⽤协⽅差和标准偏差的有偏估计。这不会影响正在计算的相关系数的值,因为观察值的数量在分⼦和分母中抵消了:
使⽤Numpy的Python中的Pearson相关系数
⽪尔逊相关系数可以使⽤corrcoef()Numpy中的⽅法在Python中计算。
此函数的输⼊通常是⼀个矩阵,例如size mxn,其中:
每列代表⼀个随机变量的值
每⾏代表⼀个n随机变量样本
n 代表不同随机变量的总数
m 代表每个变量的样本总数
对于n随机变量,它返回⼀个nxn⽅矩阵M,其中M(i,j)指⽰了随机变量i和之间的相关系数j。由于变量与变量⾃⾝之间的相关系数为1,因此所有对⾓线项(i,i)均等于1。
简⽽⾔之:
注意,相关矩阵是对称的,因为相关是对称的,即中号(⼀世,Ĵ)=中号(Ĵ,⼀世)中号(⼀世,Ĵ)=中号(Ĵ,⼀世)。让我们以上⼀节中的简单⽰例为例,看看如何使⽤C要么[RCØËF()C要么[RCØËF()与ν⽶pÿν⽶pÿ。
⾸先,让我们导⼊该numpy模块以及pyplot Matplotlib中的模块。稍后,我们将使⽤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((al(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()
了解⽪尔逊的相关系数变化
只是为了查看相关系数如何随两个变量之间的关系变化⽽变化,让我们向上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 = al(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()
⼀个常见的陷阱:没有关联的关联
有⼀个普遍的误解,认为零相关意味着没有关联。让我们澄清⼀下,相关性严格衡量了两个变量之间的线性关系。
下⾯的⽰例显⽰了彼此⾮线性关联但具有零相关性的变量。
(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_p(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()
结论
在本⽂中,我们讨论了⽪尔逊相关系数。我们使⽤了corrcoef()Python numpy模块中的⽅法来计算其值。
如果随机变量具有较⾼的线性关联,则它们的相关系数接近+1或-1。另⼀⽅⾯,统计独⽴变量的相关系数接近零。
我们还证明了⾮线性关联可以具有零或接近零的相关系数,这意味着具有⾼关联性的变量可能不具有较⾼的Pearson相关系数值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论