第3章-指标体系与数据可视化-3.1.2-Seaborn绘图库

目录

3.1.2 Seaborn绘图库

1. 带核密度估计的直方图

2. 二元分布图

一维正态分布

 联合分布函数

二元边际分布函数

二维正态分布

3. 热力图

附录

参考


3.1.2 Seaborn绘图库

        Seaborn和Matplotlib类似,也是Python数据可视化库。不过,它是基于Matplotlib的数据可视化库。比Matplotlib更强大。提供了用于绘制统计图形的高级界面。

        在使用Seaborn绘图库前,我们需要安装Seaborn库。可以在Pycharm上直接安装。点击Pycharm底部的Terminal终端,执行如下命令安装Seaborn,

pip install seaborn

如图:

结果发现,经常因为网络原因导致安装超时。下面使用国内清华大学开源软件镜像站来安装,地址如下:

https://pypi.tuna.tsinghua.edu.cn/simple

可以使用浏览器查看镜像站,如图:

下面使用镜像站来安装,执行如下命令:

pip install seaborn -i https://pypi.tuna.tsinghua.edu.cn/simple

 安装成功后,如图:

 以后安装库的时候,就可以使用这种方式来安装了。

1. 带核密度估计的直方图

       直方图通过分箱和计数可视化样例数据,直观展示近似的概率密度函数。Seaborn采用核密度估计概率密度函数。

        核密度估计(kernel density estimation)是在概率论中用来估计未知的概率密度函数,属于非参数检验方法之一,由Rosenblatt (1955)和Emanuel Parzen(1962)提出,又名Parzen窗(Parzen window)。

        关于核密度估计将放在后续章节,给予证明以及应用。下面我们使用Seaborn的displot()方法绘制直方图,并绘制出估计的概率密度函数。代码:

import matplotlib.pyplot as plt
import numpy as np
import seaborn as snsif __name__ == '__main__':np.random.seed(1)data = np.random.normal(loc=80, scale=20, size=200)print('data=', '\n', data)data_int = data.astype(int)print('data_int=', '\n', data_int)x = np.arange(30, 140, 10)  # 生成一个数组,开始是30,结束是140(不包括),步长10,sns.displot(data=data_int, bins=x, kde=True)plt.show()

bins表示分箱。

运行结果,如图:

使用同样的样例数据,生成的直方图,如下: 

2. 二元分布图

        在介绍二元分布图之前,我们先介绍概率统计中,随机变量的联合分布、边际分布的概念。然后以正态分布为例,从一维正态分布,再到二维正态分布,逐步介绍二元分布图的来龙去脉。

(1) 一维正态分布

一维正态分布的概率密度函数,含有一个随机变量x,均值为u,方差\sigma^2。 

正态分布的概率密度函数图像示意图,如下:

 关于均值u对称。当均值和方差取如下值时,正态分布变为标准正态分布。

标准正态分布的概率分布函数图像,如图: 

 图中绘制了,不同正态分布的概率密度函数曲线。

 (2)联合分布函数

当n=2,就是二元(维)联合分布函数。 后面仅讨论二元的情况。

注意:这里不是概率密度函数,而是分布函数。

(3)二元边际分布函数

 可以看到,边际分布可以从联合分布得到。例如随机变量X的边际分布,其实就是随机变量X的概率分布。

(4)二维正态分布

注:f(x,y)是概率密度函数,不是概率分布。

 下面我们将二维正态分布的概率密度函数转换成矩阵的形式:

 

         为了更直观理解,下面绘制二维正态分布概率密度函数图像。首先需要安装scipy库。命令如下:

pip install scipy -i https://pypi.tuna.tsinghua.edu.cn/simple

安装成功后,如图: 

绘制代码如下:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import multivariate_normalif __name__ == '__main__':plt.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文plt.rcParams["axes.unicode_minus"] = False  # 设置显示中文后,负号显示受影响,显示负号# 定义均值和协方差矩阵mean = np.array([0, 0])  # 均值.covariance = np.array([[1, 0.5], [0.5, 1]])  # 协方差矩阵.# 创建一个网格,x和y都是从(-3,3)范围,500个点.x, y = np.meshgrid(np.linspace(-3, 3, 500), np.linspace(-3, 3, 500))pos = np.dstack((x, y))# 计算二维正态分布的概率密度值pdf_values = multivariate_normal.pdf(pos, mean=mean, cov=covariance)# 绘制三维概率密度图像fig = plt.figure(figsize=(10, 8))ax = fig.add_subplot(111, projection='3d')ax.tick_params(axis="both", labelsize=12)ax.plot_surface(x, y, pdf_values, cmap='viridis')ax.set_xlabel('x', fontsize=13)ax.set_ylabel('y', fontsize=13)ax.set_zlabel('f(x,y)')ax.set_title('二维正态分布概率密度函数图像')plt.show()

 运行结果,如图:

        有了以上的知识储备,下面绘制二元分布图就容易理解多了。下面生成二元分布图的样例数据,代码如下: 

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as snsif __name__ == '__main__':plt.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文plt.rcParams["axes.unicode_minus"] = False  # 设置显示中文后,负号显示受影响,显示负号    np.random.seed(0)mean, cov = [0, 1], [(1, 0.5), (0.5, 1)]  # python可以一次给多个变量赋值,使用逗号隔开.data = np.random.multivariate_normal(mean=mean, cov=cov, size=200)df = pd.DataFrame(data=data, columns=['x', 'y'])print('df=', '\n', df)

 代码中,样例数据是使用

data = np.random.multivariate_normal(mean=mean, cov=cov, size=200)

二维正态分布生成的。总共生成200行2列数据,第一个列名x表示随机变量x,第二列列名表示随机变量y。

mean = [0,1],对应二维正态分布,u_1=0,u_2=1

cov =  [(1, 0.5), (0.5, 1)],对应二维正态分布\sigma_1=1,\sigma_2=1, \rho=0.5

运行结果,如图:

 可以如下绘制随机变量x和随机变量y的联合图,代码如下:

sns.jointplot(x='x', y='y', data=df)
plt.show()

 运行结果,如图:

 从图中可以看到,联合图有两部分组成:

(1)中间部分是一个散点图,描述了随机变量x和随机变量y之间的关系,

(2)散点图的顶部和右边是两个直方图,它们描述的是两个边际分布,顶部是二维正态分布的x的边际分布,右边是二维正态分布的y的边际分布。x的边际分布是一个u_1=0,\sigma_1=1的标准正态分布。y的边际分布是一个u_2=1,\sigma_2=1的正态分布。

如果不需要绘制边际分布,可以如下处理:

    sns.relplot(x='x', y='y', data=df)plt.show()

运行结果,如图:

绘制带核密度估计的二元分布图,代码如下:

    sns.jointplot(x='x', y='y', data=df, kind='kde')plt.show()

运行结果如下: 

3. 热力图

        热力图用于可视化变量之间的关系强弱。可以是多个变量。生成样例数据,代码如下:

    np.random.seed(0)data = np.random.uniform(low=-1, high=1, size=(7, 7))index = list('abcdefg')columns = list('ABCDEFG')df = pd.DataFrame(data=data, index=index, columns=columns)print('df=', '\n', df)

 运行结果:

从运行结果来看, 总共生成7行7列数据,a~g表示7个行变量,A~G表示7个列变量。数值表示行变量和列变量的相关性大小,例如g和G两个变量对应的值-0.369143,表示两个变量呈现负相关性。

代码中使用了uniform()方法,它是均为分布,什么是均匀分布呢?

        在概率论和统计学中,均匀分布也叫矩形分布(分布图形像矩形),它是对称概率分布,在相同长度间隔的分布概率是等可能的。均匀分布由两个参数a和b定义,它们是数轴上的最小值和最大值,通常缩写为U(a,b)。均匀分布的概率密度函数如下:

概率密度函数在(a,b)区间是一个常值1/(b-a),所以相同长度间隔t的分布概率都是t/(b-a),是可能的。

概率密度函数图像如下: 

样例数据使用的是np.random.uniform(low=-1, high=1, size=(7, 7)),表示a=-1,b=1,size=(7,7)表示7行7列矩阵,总共49个数。整行代码的意思是:生成一个服从均为分布的7行7列的矩阵,每个数据的范围在(-1,1)之间,且生成每个数据的概率是一样的。这里为啥选用(-1,1)之间呢,这样每个数据可以表示行和列的相关性。例如g和G对应的值为-0.369143,表示g和G两个变量呈现负相关性。直接从上面的样例数据来看,无法直观的看出哪两个变量的相关性更强或更弱。所以,下面通过热力图可视化这些变量的相关性强弱。

    plt.figure(figsize=(8, 6))sns.set(font_scale=1.5)# 解决title中文乱码问题,放在sns.set后面.plt.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文plt.rcParams["axes.unicode_minus"] = False  # 设置显示中文后,负号显示受影响,显示负号sns.heatmap(df)plt.xlabel('columns', fontsize=13)plt.ylabel('index', fontsize=13)plt.title('热力图')plt.show()

plt.title('热力图')使用了中文作为热力图的标题,可能会出现中文显示乱码问题,需要在sns.set()方法设置字体解决中文乱码问题:

plt.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文

 注意的是这行代码放在plt.figure(figsize=(8, 6))之前,并不能解决中文乱码。

运行结果,如图:

 从热力图来看,热力图右边显示的相关性数值和颜色的对照关系,颜色越深相关性数值越小,颜色越浅,相关性数值越大。从图中,很直观的看到b和B,f和D,c和G变量之间的相关性很强。

附录

        本节所有代码如下:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
from scipy.stats import multivariate_normalif __name__ == '__main__':# 带核密度估计的直方图np.random.seed(1)data = np.random.normal(loc=80, scale=20, size=200)print('data=', '\n', data)data_int = data.astype(int)print('data_int=', '\n', data_int)x = np.arange(30, 140, 10)  # 生成一个数组,开始是30,结束是140(不包括),步长10,sns.displot(data=data_int, bins=x, kde=True)plt.show()# 二维正态分布图像# 定义均值和协方差矩阵mean = np.array([0, 0])covariance = np.array([[1, 0.5], [0.5, 1]])# 创建一个网格x, y = np.meshgrid(np.linspace(-3, 3, 500), np.linspace(-3, 3, 500))pos = np.dstack((x, y))# 计算二维正态分布的概率密度值pdf_values = multivariate_normal.pdf(pos, mean=mean, cov=covariance)# 绘制概率密度图像plt.figure(figsize=(8, 8))plt.contourf(x, y, pdf_values, cmap='viridis')plt.colorbar()plt.xlabel('X')plt.ylabel('Y')plt.title('2D Gaussian Probability Density')plt.show()# 定义均值和协方差矩阵mean = np.array([0, 0])  # 均值.covariance = np.array([[1, 0.5], [0.5, 1]])  # 协方差矩阵.# 创建一个网格,x和y都是从(-3,3)范围,500个点.x, y = np.meshgrid(np.linspace(-3, 3, 500), np.linspace(-3, 3, 500))pos = np.dstack((x, y))# 计算二维正态分布的概率密度值pdf_values = multivariate_normal.pdf(pos, mean=mean, cov=covariance)# 绘制三维概率密度图像fig = plt.figure(figsize=(10, 8))ax = fig.add_subplot(111, projection='3d')ax.tick_params(axis="both", labelsize=12)ax.plot_surface(x, y, pdf_values, cmap='viridis')ax.set_xlabel('x', fontsize=13)ax.set_ylabel('y', fontsize=13)ax.set_zlabel('f(x,y)')ax.set_title('二维正态分布概率密度函数图像')plt.show()# 二元分布图np.random.seed(0)mean, cov = [0, 1], [(1, 0.5), (0.5, 1)]  # python可以一次给多个变量赋值,使用逗号隔开.data = np.random.multivariate_normal(mean=mean, cov=cov, size=200)df = pd.DataFrame(data=data, columns=['x', 'y'])print('df=', '\n', df)# 联合图,包含直方图sns.jointplot(x='x', y='y', data=df)plt.show()# 联合图,不包括直方图sns.relplot(x='x', y='y', data=df)plt.show()# 带核密度函数估计的二元分布图sns.jointplot(x='x', y='y', data=df, kind='kde')plt.show()# 热力图np.random.seed(0)data = np.random.uniform(low=-1, high=1, size=(7, 7))index = list('abcdefg')columns = list('ABCDEFG')df = pd.DataFrame(data=data, index=index, columns=columns)print('df=', '\n', df)plt.figure(figsize=(8, 6))sns.set(font_scale=1.5)# 解决title中文乱码问题,放在sns.set后面.plt.rcParams["font.sans-serif"] = ["SimHei"]  # 显示中文plt.rcParams["axes.unicode_minus"] = False  # 设置显示中文后,负号显示受影响,显示负号sns.heatmap(df)plt.xlabel('columns', fontsize=13)plt.ylabel('index', fontsize=13)plt.title('热力图')plt.show()

参考

Python数据处理之数据可视化(二维、三维)

机器学习算法(二十一):核密度估计 Kernel Density Estimation(KDE)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/142236.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

mlc-llm 推理优化和大语言模型搭建解析

0x0. 前言 本文解析一下mlc-llm(https://github.com/mlc-ai/mlc-llm)对大模型推理的流程以及使用的图优化,算子优化策略。mlc-llm的模型部署流程可以查看官方文档:https://mlc.ai/mlc-llm/docs/ ,也可以参考我前段时间…

如何计算3种卷积之后的尺寸(普通卷积,转置卷积,空洞卷积)

文章目录 前言一、普通卷积二、转置卷积三、空洞卷积 前言 三种卷积之后的feature map的尺寸如何计算。包括普通卷积,转置卷积,空洞卷积。可以在下面这个链接看到三种卷积的动态图。 卷积动态图 一、普通卷积 普通卷积比较简单了,其计算方式…

IEEE802.2之LLC(逻辑链路控制)

一、概念 IEEE 802.2 是一种用于局域网(LAN)和都会区域网(MAN)的数据链路层逻辑链路控制(LLC)的标准。它是 IEEE 802 系列标准中的一个组成部分,专门用于定义如何在数据链路层内进行帧的多路复用…

Edge 浏览器『版本回退』和『关闭更新』

前言 最近 Edge 浏览器又更新了,给整体浏览器页面布局进行大改动,之前苗条的标签页和收藏夹栏瞬间变得臃肿了,我实在无法忍受这种布局,所以我索性直接进行版本回退和设置永久关闭更新,详细步骤请看下文 Edge 浏览器版…

一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项

目录 1、求字符串长度函数 1.1、strlen 2、字符串拷贝(cpy)、拼接(cat)、比较(cmp)函数 2.1、长度不受限制的字符串函数 2.1.1、strcpy 2.1.2、strcat 2.1.3、strcmp 2.2、长度受限制的字符串函数 2.2.1、strncpy 2.2.2、strncat 2.2.3、strncmp 3、字符串查找函数…

20230919在WIN10下使用python3将PDF文档转为DOCX格式的WORD文档

20230919在WIN10下使用python3将PDF文档转为DOCX格式的WORD文档 2023/9/19 11:20 python pdf word https://blog.csdn.net/u013185349/article/details/130059657 Python实现PDF转Word文档 AcceptedLin 已于 2023-04-10 14:45:17 修改 1243 收藏 1 文章标签: pd…

RocketMQ —消费进度管理

Apache RocketMQ 通过消费位点管理消费进度,本文为您介绍 Apache RocketMQ 的消费进度管理机制。 背景信息​ Apache RocketMQ 的生产者和消费者在进行消息收发时,必然会涉及以下场景,消息先生产后订阅或先订阅后生产。这两种场景下&#x…

SpringBoot 学习(一)自动装配

本系列文章为【狂神说 Java 】视频的课堂笔记,若有需要可配套视频学习。 1.1 pom.xml (1) 父工程( spring-boot-starter-parent ) 核心依赖,静态资源过滤等配置。编写或导入 springboot 依赖时不需要指定版本号,继承…

MySQL中explain各字段详解及举例

MySQL版本:8.0.33 建表语句: DROP TABLE IF EXISTS actor; CREATE TABLE actor (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;INSERT INTO actor (i…

【Linux】网络原理

文章目录 📖 前言1. 计算机内部的交流1.1 计算机之间的交流: 2. 协议2.1 网络分层:2.2 以打电话为例:2.3 OSI七层模型:2.4 TCP/IP: 3. 操作系统与网络的关系4. 报头与解包4.1 报头的作用: 5. 局…

从中序遍历和后序遍历构建二叉树

题目描述 106. 从中序与后序遍历序列构造二叉树 中等 1.1K 相关企业 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1…

中国制造让苹果跪服,将再增加一家中国高科技供应商

日前产业链人士指出由于京东方的OLED面板有力地制衡韩国面板厂商三星和LGD,促使他们降价,而且技术也不错,因此正计划再引入一家中国OLED面板厂商,以进一步促进OLED面板的竞争。 早期苹果的OLED面板完全由三星供应,由此…

Go 语言史诗级更新-循环Bug修复

背景 前两天 Golang 的官方博客更新了一篇文章:Fixing For Loops in Go 1.22 看这个标题的就是修复了 Go 循环的 bug,这真的是史诗级的更新;我身边接触到的大部分 Go 开发者都犯过这样的错误,包括我自己,所以前两年我也…

Nginx的反向代理、动静分离、负载均衡

反向代理 反向代理是一种常见的网络技术,它可以将客户端的请求转发到服务器群集中的一个或多个后端服务器上进行处理,并将响应结果返回给客户端。反向代理技术通常用于提高网站的可伸缩性和可用性,并且可以隐藏真实的后端服务器地址。 #user…

笔试强训Day3

学了一坤时Linux,赶紧来俩道题目放松放松。 T1:在字符串中找出连续最长的数字串 链接:在字符串中找出连续最长的数字串__牛客网 输入一个字符串,返回其最长的数字子串,以及其长度。若有多个最长的数字子串&#xff0c…

VSCode『SSH』连接服务器『GUI界面』传输

前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型(pygame),但是我是使用 SSH 连接的,不能很好的显示模型训练的效果画面,所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注:我们…

Qt---day4---9.20

qt完成时钟&#xff1a; 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QtDebug> #include <QPainter> #include <QTimerEvent> #include <QTime>QT_BEGIN_NAMESPACE names…

Vue+iview 组件中通过v-for循环动态生成form表单进行表单校验

在做项目时&#xff0c;需要根据需要动态添加或新增表单&#xff0c;同时还需要对表单做校验。详情如下图&#xff1a; 刚开始做表单验证的时候&#xff0c;对于这个动态的表单验证有点难搞&#xff0c;试了好几种方法都没有搞定。最后按照下面这种方法实现了&#xff0c;以此…

【数据结构】顺序查找,折半查找,分块查找的知识点总结及相应的代码实现

目录 1、顺序查找 定义及步骤 代码实现 2、折半查找 定义及步骤 代码实现 折半查找判定树 3、分块查找 定义及步骤 1、顺序查找 定义及步骤 顺序查找的定义&#xff1a;从数据集合的起始位置开始&#xff0c;逐一比较每个数据元素&#xff0c;直到找到所要查找…

windows下实现mysql8的主从复制

1、下载mysql8的安装包 MySQL :: Download MySQL Community Server 2、放到指定目录进行解压&#xff0c;更改名称为mysql-8.1.0-winx64-master,并复制一份作为从数据库 3、在bin目录下创建一个my.ini文件 添加如下内容 [mysqld] basedir"D:/soft/mysql/mysql-8.1.0-win…