散布矩阵,协方差和相关性解释

理解两个变量之间的关系是数据科学任务中常见的问题。我们主要用相关性来理解两个变量之间的关系。但我们也经常听说散布矩阵(也是散点图)和协方差。让我们来看看它们是什么,它们是如何计算的,以及它们各自的意义。我们还将实现它们中的每一个,并在另一个之上进行构建。

散布矩阵,协方差和相关性解释

用seaborn产生的散布矩阵

所有答案的问题是数据中的变量之间的关系是什么?

散布矩阵(Scatter Matrix ):

散布矩阵是协方差矩阵的估计,当协方差无法计算或计算成本很高时。散布矩阵也用于许多降维练习。如果有k个变量,散布矩阵将有k行k列即kxk矩阵。

散布矩阵,协方差和相关性解释

如何计算散布矩阵

在python中散布矩阵的代码:

#Create a 3 X 20 matrix with random values.

mu_vec1 = np.array([0,0,0])

cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]])

samples = np.random.multivariate_normal(mu_vec1, cov_mat1,20).T

#Compute the mean vector

mean_x = np.mean(samples[0,:])

mean_y = np.mean(samples[1,:])

mean_z = np.mean(samples[2,:])

mean_vector = np.array([[mean_x],[mean_y],[mean_z]])

#Computation of scatter plot

scatter_matrix = np.zeros((3,3))

for i in range(all_samples.shape[1]):

scatter_matrix += (all_samples[:,i].reshape(3,1) - mean_vector).dot((all_samples[:,i].reshape(3,1) - mean_vector).T)

print('Scatter Matrix:', scatter_matrix)

散布矩阵包含变量的每个组合,它们之间的关系。让我们观察以下矩阵的散布矩阵,Python代码如下:

arange = np.arange(0, 40)

samples = np.array([arange * 3 , arange * -1])

scatter_matrix = np.zeros((2,2))

for i in range(samples.shape[1]):

scatter_matrix += (samples[:,i].reshape(2,1) - mean_vector).dot((samples[:,i].reshape(2,1) - mean_vector).T)

print('Scatter Matrix:', scatter_matrix)

Output :

'Scatter Matrix:', array([[ 47970., -15990.],

[-15990., 5330.]])

如果我们通过将-1更改为1来调整矩阵生成:

arange = np.arange(0, 40)

samples = np.array([arange * 3 , arange * 1])

输出也会改变符号:

Output :

('Scatter Matrix:', array([[ 47970., -15990.],

[-15990., 5330.]]))

我们可以观察到,两个变量对的散布矩阵的符号表示一个变量随另一个变量的增加/减少而增加。

协方差矩阵:

协方差被定义为两个随机变量联合变化的度量。在计算散布矩阵的前提下,协方差矩阵的计算是直接进行的。我们只需要按n-1缩放散布矩阵的值来计算协方差矩阵。

这个我们可以验证一下,看看Python代码:

print('Covariance Matrix:'np.cov(samples))

print('Scatter Matrix:', scatter_matrix)

print('Unscaled covariance matrix which is same as Scatter Matrix:'np.cov(samples) * 39)

Output :

'Covariance Matrix:', array([[1230. , 410. ],

[ 410. , 136.66666667]])

'Scatter Matrix:', array([[47970., 15990.],

[15990., 5330.]])

'Unscaled covariance matrix which is same as Scatter Matrix:', array([[47970., 15990.],

[15990., 5330.]])

无论是散布矩阵还是协方差矩阵,都很难解释这些值的大小,因为这些值受变量大小的影响。要真正理解变量之间关系的强度,我们必须看一下相关性。

相关矩阵:

相关矩阵为我们提供了有关两个变量如何相互作用的信息,包括方向和幅度。常用的协方差基于Pearson相关系数 。我们计算相关矩阵的方法是将两个变量的协方差值除以两个变量的标准差的乘积。

Python实现如下:

print('Covariance Matrix:',np.cov(samples))

std_dev_of_x1 = np.std(arange * 3)

std_dev_of_x2 = np.std(arange * -1)

std_dev_products = np.array(

[[std_dev_of_x1 * std_dev_of_x1, std_dev_of_x1 * std_dev_of_x2],

[std_dev_of_x1 * std_dev_of_x2, std_dev_of_x2 * std_dev_of_x2]]

)

print('Covariance Matrix:', np.corrcoef(samples))

print('Std deviation products :', std_dev_products)

print('Covariance Matrix computed from covariance :', np.divide(np.cov(samples), std_dev_products))

('Covariance Matrix:', array([[1., 1.],

[1., 1.]]))

('Std deviation products :', array([[1199.25, 399.75],

[ 399.75, 133.25]]))

('Covariance Matrix computed from covariance :', array([[1.02564103, 1.02564103],

[1.02564103, 1.02564103]]))

来自numpy的相关矩阵非常接近我们从协方差矩阵计算得到的。

相关推荐