Python相关矩阵教程(使用Pandas)

2023-10-24

在本博客中,我们将介绍一个重要的多变量数据描述性统计量,称为相关矩阵。我们将学习如何在 Python 中使用以下命令创建、绘制和操作相关矩阵Pandas.

我们将讨论以下主题:

 

 

什么是相关矩阵?

相关矩阵是表示给定数据中变量对之间的“相关性”的表格数据。

我们将在本博客结束时构建这个相关矩阵。

每一行和每一列代表一个变量,这个矩阵中的每个值都是相应行和列所代表的变量之间的相关系数。

相关矩阵是一个重要的数据分析指标,通过计算来汇总数据,以了解各种变量之间的关系并做出相应的决策。

这也是机器学习管道中重要的预处理步骤,用于计算和分析需要对高维数据进行降维的相关矩阵。

我们提到相关矩阵中的每个单元格都是“相关系数' 在对应于单元格的行和列的两个变量之间。

在我们继续之前,让我们先了解什么是相关系数。

什么是相关系数?

相关系数是表示两个变量之间关系强度的数字。

相关系数有多种类型,但其中最常见的是皮尔逊系数,用希腊字母 ρ (rho) 表示。

It is defined as the covariance between two variables divided by the product of the standard deviations of the two variables.

Where the covariance between X and Y COV(X, Y) is further defined as the ‘expected value of the product of the deviations of X and Y from their respective means’.
The formula for covariance would make it clearer.

So the formula for Pearson’s correlation would then become:

The value of ρ lies between -1 and +1.
Values nearing +1 indicate the presence of a strong positive relation between X and Y, whereas those nearing -1 indicate a strong negative relation between X and Y.
Values near to zero mean there is an absence of any relationship between X and Y.

求给定数据的相关矩阵

让我们生成两个变量的随机数据,然后为它们构建相关矩阵。


import numpy as np
np.random.seed(10)
# generating 10 random values for each of the two variables
X = np.random.randn(10)
Y = np.random.randn(10)
# computing the corrlation matrix
C = np.corrcoef(X,Y)
print(C)  

Output:

Since we compute the correlation matrix of 2 variables, its dimensions are 2 x 2.
The value 0.02 indicates there doesn’t exist a relationship between the two variables. This was expected since their values were generated randomly.

在这个例子中,我们使用了 NumPy 的`corrcoef`方法来生成相关矩阵。
然而,这种方法有一个局限性,它只能计算两个变量之间的相关矩阵。

因此,继续,我们将使用数据框存储数据并计算它们的相关矩阵。

绘制相关矩阵

为了进行解释,我们将使用一个不仅仅具有两个特征的数据集。

我们将使用乳腺癌数据,这是机器学习入门课程中使用的一种流行的二元分类数据。
我们将从 scikit-learn 加载此数据集dataset module.
它以 NumPy 数组的形式返回,但我们将将它们转换为 Pandas DataFrame.


from sklearn.datasets import load_breast_cancer
import pandas as pd
breast_cancer = load_breast_cancer()
data = breast_cancer.data
features = breast_cancer.feature_names
df = pd.DataFrame(data, columns = features)
print(df.shape)
print(features)  

Output:

There are 30 features in the data, all of which are listed in the output above.

我们现在的目标是确定每对列之间的关系。我们将通过绘制相关矩阵来实现这一点。

为了简单起见,我们将仅使用前六列并绘制它们的相关矩阵。
为了绘制矩阵,我们将使用一个流行的可视化库,称为海博恩,它是建立在 matplotlib 之上的。


import seaborn as sns
import matplotlib.pyplot as plt
# taking all rows but only 6 columns
df_small = df.iloc[:,:6]
correlation_mat = df_small.corr()
sns.heatmap(correlation_mat, annot = True)
plt.show()  

Output:

The plot shows a 6 x 6 matrix and color-fills each cell based on the correlation coefficient of the pair representing it.

Pandas 数据框corr()方法用于计算矩阵。默认情况下,它计算皮尔逊相关系数。
我们还可以通过向参数传递适当的值来使用其他方法,例如 Spearman 系数或 Kendall Tau 相关系数'method'.

我们用过seaborn的heatmap()绘制矩阵的方法。参数‘annot=True' 显示每个单元格中相关系数的值。

现在让我们了解如何解释绘制的相关系数矩阵。

 

解释相关矩阵

Let’s first reproduce the matrix generated in the earlier section and then discuss it.

You must keep the following points in mind with regards to the correlation matrices such as the one shown above:

  1. 网格中的每个单元格代表两个变量之间的相关系数的值。
  2. (a,b)位置的值表示a行和b列的特征之间的相关系数。这将等于位置 (b, a) 处的值
  3. It is a square矩阵——每一行代表一个变量,所有列代表与行相同的变量,因此行数 = 列数。
  4. It is a 对称的矩阵——这是有道理的,因为 a,b 之间的相关性与 b, a 之间的相关性相同。
  5. All 对角线元素为 1。由于对角线元素表示每个变量与其自身的相关性,因此它始终等于 1。
  6. 轴刻度表示每个轴代表的特征。
  7. 较大的正值(接近 1.0)表示强正相关,即,如果其中一个变量的值增加,另一个变量的值也会增加。
  8. 较大的负值(接近 -1.0)表示很强的负相关性,即一个变量的值随着另一个变量的增加而减小,反之亦然。
  9. 接近 0 的值(正值或负值)表示两个变量之间不存在任何相关性,因此这些变量彼此独立。
  10. 上述矩阵中的每个单元格也由颜色的深浅表示。这里颜色较深的阴影表示较小的值,而较亮的阴影对应较大的值(接近 1)。
    该比例是在图右侧的颜色条的帮助下给出的。

 

向绘图添加标题和标签

我们可以调整生成的相关矩阵,就像任何其他 Matplotlib 图一样。让我们看看如何向矩阵添加标题并向轴添加标签。


correlation_mat = df_small.corr()
sns.heatmap(correlation_mat, annot = True)
plt.title("Correlation matrix of Breast Cancer data")
plt.xlabel("cell nucleus features")
plt.ylabel("cell nucleus features")
plt.show()  

Output:

If we want, we could also change the position of the title to bottom by specifying the y position.


correlation_mat = df_small.corr()
sns.heatmap(correlation_mat, annot = True)
plt.title("Correlation matrix of Breast Cancer data", y=-0.75)
plt.xlabel("cell nucleus features")
plt.ylabel("cell nucleus features")
plt.show()  

Output:

对相关矩阵进行排序

如果给定的数据具有大量特征,相关矩阵可能会变得非常大,因此难以解释。

有时我们可能想要对矩阵中的值进行排序,并以升序或降序查看各个特征对之间的相关性强度。
让我们看看如何实现这一目标。

首先,我们将给定的矩阵转换为一维系列值。


correlation_mat = df_small.corr()
corr_pairs = correlation_mat.unstack()
print(corr_pairs)  

Output:

The unstack method on the Pandas DataFrame returns a Series with MultiIndex.That is, each value in the Series is represented by more than one indices, which in this case are the row and column indices that happen to be the feature names.

现在让我们使用以下命令对这些值进行排序sort_values()Pandas 系列的方法。


sorted_pairs = corr_pairs.sort_values(kind="quicksort")
print(sorted_pairs)  

Output:

We can see each value is repeated twice in the sorted output. This is because our correlation matrix was a symmetric matrix, and each pair of features occurred twice in it.

尽管如此,我们现在已经拥有所有特征对的排序相关系数值,并且可以相应地做出决策。

 

选择负相关对

我们可能想要选择具有特定范围的相关系数值的特征对。
让我们看看如何从上一节中生成的排序对中选择具有负相关性的对。


negative_pairs = sorted_pairs[sorted_pairs < 0]
print(negative_pairs)  

Output:

选择强相关对(幅度大于 0.5)

让我们使用相同的方法来选择强相关的特征。也就是说,我们将尝试过滤掉那些相关系数值大于0.5或小于-0.5的特征对。


strong_pairs = sorted_pairs[abs(sorted_pairs) > 0.5]
print(strong_pairs)  

Output:

将协方差矩阵转换为相关矩阵

We have seen the relationship between the covariance and correlation between a pair of variables in the introductory sections of this blog.

Let us understand how we can compute the covariance matrix of a given data in Python and then convert it into a correlation matrix. We’ll compare it with the correlation matrix we had generated using a direct method call.

首先,Pandas 没有提供计算所有变量对之间协方差的方法,因此我们将使用 NumPy 的cov() method.


cov = np.cov(df_small.T)
print(cov)  

Output:

We’re passing the transpose of the matrix because the method expects a matrix in which each of the features is represented by a row rather than a column.

所以我们的分子是正确的。
现在我们需要计算一个 6×6 矩阵,其中 i、j 处的值是位置 i 和 j 处特征的标准差的乘积。

然后,我们将协方差矩阵除以该标准差矩阵来计算相关矩阵。

让我们首先构建标准差矩阵。


#compute standard deviations of each of the 6 features
stds = np.std(df_small, axis = 0) #shape = (6,)
stds_matrix = np.array([[stds[i]*stds[j] for j in range(6)] for i in range(6)])
print("standard deviations matrix of shape:",stds_matrix.shape)  

Output:

Now that we have the covariance matrix of shape (6,6) for the 6 features, and the pairwise product of features matrix of shape (6,6), we can divide the two and see if we get the desired resultant correlation matrix.


new_corr = cov/std_matrix  

我们已将新的相关矩阵(从协方差矩阵导出)存储在变量中new_corr.

让我们通过绘制相关矩阵并将其与使用 Pandas 方法直接生成的早期矩阵并置来检查是否正确corr().


plt.figure(figsize=(18,4))
plt.subplot(1,2,1)
sns.heatmap(correlation_mat, annot = True)
plt.title("Earlier correlation matrix (from Pandas)")
plt.xlabel("cell nucleus features")
plt.ylabel("cell nucleus features")
plt.subplot(1,2,2)
sns.heatmap(correlation_mat, annot = True)
plt.title("Newer correlation matrix (from Covariance mat)")
plt.xlabel("cell nucleus features")
plt.ylabel("cell nucleus features")
plt.show()  

Output:

We can compare the two matrices and notice that they are identical.

 

将相关矩阵导出到图像

在 Python 脚本中绘制相关矩阵是不够的。我们可能想保存它以供以后使用。
我们可以使用以下命令将生成的绘图保存为磁盘上的图像文件plt.savefig() method.


correlation_mat = df_small.corr()
sns.heatmap(correlation_mat, annot = True)
plt.title("Correlation matrix of Breast Cancer data")
plt.xlabel("cell nucleus features")
plt.ylabel("cell nucleus features")
plt.savefig("breast_cancer_correlation.png")  

运行此代码后,您可以在同一工作目录中看到名为“breast_cancer_correlation.png”的图像文件。

 

结论

在本教程中,我们学习了相关矩阵是什么以及如何在 Python 中生成它们。我们首先关注相关矩阵和相关系数的概念。

然后我们将相关矩阵生成为 NumPy 数组,然后生成 Pandas DataFrame。接下来,我们学习了如何绘制相关矩阵并操作绘图标签、标题等。我们还讨论了用于解释输出相关矩阵的各种属性。

我们还了解了如何对相关矩阵执行某些操作,例如对矩阵进行排序、查找负相关对、查找强相关对等。

然后我们讨论了如何使用数据的协方差矩阵,并通过将其除以各个特征的标准差的乘积来生成相关矩阵。
最后,我们看到了如何将生成的绘图保存为图像文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python相关矩阵教程(使用Pandas) 的相关文章

  • 在 multiprocessing.connection.Listener.accept() 给定时间后引发 TimeOutError

    我正试图打断multiprocessing connection Listener accept 但迄今为止尚未成功 由于它不提供timeout参数 我想也许我可以使用socket setdefaulttimeout 打断它 正如帖子中所建
  • 用于多输入图像的 VGG16 网络

    我正在尝试将 VGG16 网络用于多个输入图像 使用具有 2 个输入的简单 CNN 训练该模型给了我一个 acc 大约 50 这就是为什么我想使用 VGG16 这样的既定模型进行尝试 这是我尝试过的 imports from keras a
  • python 函数中的任意数量的参数

    我想学习如何在 python 函数中传递任意数量的参数 所以我以递归方式编写了一个简单的 sum 函数 如下所示 def mySum args if len args 1 return args 0 else return args 1 m
  • 为什么playsound函数无法在python中播放我的mp3文件

    所以基本上我试图创建一个音乐播放程序 可以在您要求时播放音乐 我只是想让歌曲播放部分实际工作 所以我编写了一个超级简单的代码来测试它 import playsound playsound sample mp3 This was done i
  • Python 列联表

    作为我正在编写的项目的一部分 我正在生成很多很多列联表 工作流程是 获取具有连续 浮点 行的大型数据数组 并通过分箱将其转换为离散整数值 例如 结果行的值为 0 9 将两行切片为向量 X 和 Y 并生成列联表 https en wikipe
  • Python/pandas:从两个数据帧中查找匹配值并返回第三个值

    我有两个不同的数据帧 df1 df2 具有完全不同的形状 df1 64 6 df2 564 9 df1 包含一列 df1 objectdesc 其中的值 字符串 也可以在 df2 df2 objdescription 的列中找到 由于两个数
  • 如何获取类变量和类型提示?

    假设我定义一个类 其中包含带有类型提示的类级别变量 例如新的 python 3 7dataclasses class Person name str age int def parse me self what do I do here 我
  • PyCharm 虚拟环境和 Anaconda 环境有什么区别?

    当我在 PyCharm 中创建新项目时 它会创建一个新的虚拟环境 我读到 当我执行Python脚本时 它们是使用此环境中的解释器而不是系统环境来执行的 因此 如果我需要安装一些软件包 我只能将它们安装在这个环境中 而不是在系统环境中 这很酷
  • buildozer android NDK 未下载 Ubuntu

    我使用的是 Ubuntu 16 04 LTS 操作系统 我已经在 python2 和 python3 中安装了 buildozer android sdk 已安装 但 buildozer 在下载 android NDK 时显示错误 请帮我解
  • Python 中函数未定义错误

    我试图在 python 中定义一个基本函数 但当我运行一个简单的测试程序时 我总是收到以下错误 gt gt gt pyth test 1 2 Traceback most recent call last File
  • 后视模式无效

    为什么这个正则表达式在 Python 中有效 但在 Ruby 中无效
  • 尝试导入 cv2(opencv-python) 包时出错

    我正在尝试使用 cv2 opencv python 包访问我的网络摄像头 当我尝试导入它时 出现此错误 Traceback most recent call last File server py line 6 in
  • 无需重新计算即可获取字典键哈希

    有没有办法从字典中提取现有的密钥哈希 而无需再次重新计算它们 暴露它们并因此通过哈希而不是密钥访问字典会有什么风险 我认为 Python 的字典对象没有任何公共 API 可以让您查看存储其对象的哈希值 您无法在 Python 代码中直接通过
  • 跳过一个端点的 Flask 日志记录?

    我有一个 Python Flask 应用程序 有一项运行状况检查经常访问一个端点 但我不想在日志中看到它 如何仅禁用一个 GET 端点的日志记录 而保留其他所有端点的日志记录 艾蒂安 贝尔萨克为我指明了正确的方向 这就是我的实现方式 fro
  • 带有第二个 y 轴的 Seaborn 图

    i wanted to know how to make a plot with two y axis so that my plot that looks like this to something more like this by
  • 如何使用 RGB 元组列表在 PIL 中创建图像?

    假设我有一个像素列表 表示为具有 3 个 RGB 值的元组 列表如下list im getdata 像这样 0 0 0 255 255 255 38 29 58 如何使用这种格式的 RGB 值 每个元组对应一个像素 创建新图像 感谢您的帮助
  • 识别输入的数据类型

    我正在尝试打印用户输入的数据类型并生成如下表 ABCDEFGH String 1 09 float 0 int true bool etc 我正在使用 Python 3 2 3 并且我知道我可以使用type 获取数据的类型 但在Python
  • pandas 数据框中的 count 和 countif

    我有一个 DF 如下所示 trainee course completed days overdue Ava ABC Yes 0 Bob ABC Yes 1 Charlie DEF No 10 David DEF Yes 0 Emily D
  • 如何在Python中的滚动平均计算中忽略NaN

    对于时间序列销售预测任务 我想创建一个代表过去 3 天平均销售额的功能 当我想预测未来几天的销售额时遇到问题 因为这些数据点没有销售数据 NaN 值 Pandas 提供rolling mean 但当窗口中的任何数据点为 NaN 时 该函数会
  • 在 Pandas DataFrame 中拆分列表

    我有一个包含多列的 csv 文件 使用 pandas 我将此 csv 文件读入数据帧 并有一个日期时间索引和五六个其他列 其中一列是时间戳列表 下面带有索引的示例 CreateDate TimeStamps 4 1 11 Timestamp

随机推荐

  • Fedora 26 发布,新功能及升级步骤

    Fedora 26 发布 最终的 Fedora 26 已发布于2017 年 7 月 11 日 Fedora 26有各种软件升级 安全补丁 该版本将与 GENOME 3 24 一起发布 您可以从以下位置下载 Fedora 26 预发行版 Be
  • 如何重命名 SQL Server 数据库

    Microsoft SQL Server 为您提供了多种重命名数据库的方法 您可以使用 SQL Server Management Studio 或运行 SQL 查询来重命名数据库 在重命名数据库之前 请记住 它可能会中断使用当前数据库名称
  • 如何使用SCP命令安全传输文件

    SCP 安全复制 是一个命令行实用程序 允许您在两个位置之间安全地复制文件和目录 With scp 您可以复制文件或目录 从本地系统到远程系统 从远程系统到本地系统 在本地系统的两个远程系统之间 当传输数据时scp 文件和密码都经过加密 因
  • 如何在 CentOS 7 上安装 VMware Workstation Player

    VMware是一个成熟稳定的虚拟化解决方案 允许您在一台机器上运行多个独立的操作系统 您可以创建自己的虚拟机并评估许多软件供应商作为虚拟设备分发的软件 这些软件可从VMware 解决方案交流 本教程将指导您完成在 CentOS 7 上安装
  • 如何在 Ubuntu 18.04 上安装 Java

    Java 是世界上最流行的编程语言之一 用于构建不同类型的跨平台应用程序 本教程介绍如何在 Ubuntu 18 04 上安装各种版本的 OpenJDK 以及 Oracle Java 相同的说明适用于 Ubuntu 16 04 和任何基于 U
  • 如何在 Ubuntu 18.04 上安装 Apache Cassandra

    Apache Cassandra 是一个免费的开源 NoSQL 数据库 不存在单点故障 它提供线性可扩展性和高可用性 而不会影响性能 Apache Cassandra 被许多组织使用 包括 Apple NetFlix eBay 和 Easo
  • Linux 中的超时命令

    timeout是一个命令行实用程序 它运行指定的命令 并在给定时间段后终止该命令 如果该命令仍在运行 换句话说 timeout允许您运行有时间限制的命令 这timeout命令是 GNU 核心实用程序包的一部分 几乎所有 Linux 发行版上
  • 如何在 CentOS 7 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 在大多数情况下 当在虚拟机上运行 CentOS 时 不存在交换
  • 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机

    在本教程中 我们将提供有关如何在 Ubuntu 18 04 上设置 Apache 虚拟主机的分步说明 Apache 虚拟主机允许您在一台计算机上运行多个网站 使用虚拟主机 您可以指定站点文档根目录 包含网站文件的目录 为每个站点创建单独的安
  • 如何在 Ubuntu 20.04 上安装和配置 VNC

    虚拟网络计算 VNC 是一种图形桌面共享系统 允许您使用键盘和鼠标远程控制另一台计算机 它是 Microsoft 的开源替代品远程桌面协议 RDP 本文介绍如何在 Ubuntu 20 04 上安装和配置 VNC 服务器 我们还将向您展示如何
  • 如何在 Ubuntu 18.04 上禁用防火墙

    Ubuntu 附带了一个名为 UFW 简单防火墙 的防火墙配置工具 UFW 是一个用户友好的前端 用于管理 iptables 防火墙规则 其主要目标是使管理防火墙规则更容易 或者顾名思义 不复杂 强烈建议保持防火墙启用 但是 在某些情况下
  • 如何在 Debian 9 上安装 Jenkins

    Jenkins是一个开源自动化服务器 提供了一种设置持续集成和持续交付 CI CD 管道的简单方法 持续集成 CI 是一种 DevOps 实践 团队成员定期将代码更改提交到版本控制存储库 然后运行自动化构建和测试 持续交付 CD 是自动构建
  • 如何在 Debian 10 上配置 MySQL (MariaDB) 主从复制

    MySQL 复制是将数据从一台数据库服务器 主服务器 复制到一台或多台服务器 从服务器 的过程 MySQL 支持多种复制拓扑 其中主 从拓扑是最著名的拓扑之一 其中一台数据库服务器充当主服务器 而一台或多台服务器充当从服务器 默认情况下 复
  • 如何在 Ubuntu 18.04 上安装 Ghost

    Ghost 是一个构建在 Node js 平台之上的现代源代码发布平台 它完全可定制且易于使用 使您可以以几乎零的学习曲线发布内容 在本教程中 我们将向您展示如何使用 Nginx 作为代理 免费的 Let s Encrypt SSL 证书
  • 使用 NumPy 范数计算向量和矩阵范数

    在线性代数中 范数是为向量空间中的每个向量分配严格正的长度或大小的函数 它是矢量大小的度量 从数学上来说 对于一个向量x the p 范数定义为 x p sum xi p 1 p 在本教程中 我们将使用numpy linalg norm f
  • 在 Pandas query() 中使用字符串方法:数据帧过滤

    The Pandas 中的 query 方法允许您过滤数据帧 并且当与字符串方法结合使用时 可能性变得广泛 在本教程中 您将学习如何在query 功能来细化和过滤数据 目录 hide 1 检查子字符串 str contains 2 str
  • Seaborn histplot(用直方图可视化数据)

    Seaborn 是最广为人知的数据可视化库之一 运行在Matplotlib 通过 Seaborn 我们可以渲染各种类型的绘图 并提供简单 直观且高度可定制的 API 来生成数据可视化 如果没有丰富的可视化 就很难理解数据并与数据进行交流 想
  • Kivy 教程 – 使用 Python 构建桌面 GUI 应用程序

    Kivy 是一个开源 Python 库 您可以使用它在 Windows Linux macOS Android 和 iOS 上创建应用程序 我们将讨论如何使用 Kivy 按钮 标签 回收视图 滚动视图 Kivy Canvas 和其他小部件来
  • NumPy 矩阵乘法(从理论到实际示例)

    矩阵乘法是线性代数中的基本运算 它采用一对矩阵并产生另一个矩阵 用数学术语来说 给定两个矩阵 A 和 B 乘积 AB 是通过 A 的行与 B 的列的点积来计算的 本教程旨在深入了解矩阵乘法NumPy 目录 hide 1 逐元素与矩阵乘法 2
  • Python相关矩阵教程(使用Pandas)

    在本博客中 我们将介绍一个重要的多变量数据描述性统计量 称为相关矩阵 我们将学习如何在 Python 中使用以下命令创建 绘制和操作相关矩阵Pandas 我们将讨论以下主题 目录 hide 1 What is the correlation