corrcoef函數python_用Numpy計算Python中的Pearson相關系數


本文介紹了皮爾遜(Pearson)相關系數,其手動計算以及通過Pythonnumpy模塊進行的計算。

皮爾遜相關系數測量變量之間的線性關聯。它的值可以這樣解釋:

+1-完全正相關
+0.8-強正相關
+0.6-中等正相關
0-無關聯
-0.6-中度負相關
-0.8-強烈的負相關
-1-完全負相關
我們將說明相關系數如何隨不同類型的關聯而變化。在本文中,我們還將顯示零關聯並不總是意味着零關聯。非線性相關變量的相關系數可能接近零。

皮爾遜相關系數是多少?
皮爾遜相關系數也稱為皮爾遜積矩相關系數。它是兩個隨機變量X和Y之間線性關系的度量。在數學上,如果(σXY)是X和Y之間的協方差,並且(σX)是X的標准偏差,則皮爾遜相關系數 ρ可以由下式給出:


由於協方差總是小於各個標准偏差的乘積,因此ρ的值在-1和+1之間變化。從上面我們還可以看到,變量與自身的相關性為1:

 

在開始編寫代碼之前,讓我們做一個簡短的示例,看看如何計算該系數。

皮爾遜相關系數如何計算?
假設我們對隨機變量X和Y有一些觀察。如果您打算從頭開始實施所有工作或進行一些手動計算,那么在給定X和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模塊以及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()

了解皮爾遜的相關系數變化
只是為了查看相關系數如何隨兩個變量之間的關系變化而變化,讓我們向上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()

一個常見的陷阱:沒有關聯的關聯
有一個普遍的誤解,認為零相關意味着沒有關聯。讓我們澄清一下,相關性嚴格衡量了兩個變量之間的線性關系。

下面的示例顯示了彼此非線性關聯但具有零相關性的變量。

(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()

結論
在本文中,我們討論了皮爾遜相關系數。我們使用了corrcoef()Pythonnumpy模塊中的方法來計算其值。

如果隨機變量具有較高的線性關聯,則它們的相關系數接近+1或-1。另一方面,統計獨立變量的相關系數接近零。

我們還證明了非線性關聯可以具有零或接近零的相關系數,這意味着具有高關聯性的變量可能不具有較高的Pearson相關系數值。
————————————————
版權聲明:本文為CSDN博主「白葯葫蘆」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_35643153/article/details/112537874


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM