Python直方图:从核密度估计到高维空间解析

news2025/3/18 5:57:01

一、直方图的核心原理与数学本质

数据分布的视觉解码器

直方图(Histogram)是数据科学家的"分布显微镜",通过将连续数据划分为等宽区间(Bin),统计各区间的频数/频率,用相邻矩形条直观展示数据分布形态。其核心三要素:

  1. 区间划分:决定数据粒度的核心参数
  2. 统计方式:频数统计 vs 概率密度
  3. 归一化:数据标准化处理技巧

数学建模解析

直方图的矩形高度由以下公式决定:

h i = 频数 i 区间宽度 (概率密度模式) h_i = \frac{\text{频数}_i}{\text{区间宽度}} \quad \text{(概率密度模式)} hi=区间宽度频数i(概率密度模式)

当启用归一化(density=True)时,直方图总面积将归一化为1,此时可叠加理论概率密度曲线进行对比分析。

二、基础直方图绘制实战

快速入门模板

import numpy as np
import matplotlib.pyplot as plt

# 生成正态分布数据
data = np.random.normal(loc=0, scale=1, size=1000)

# 基础直方图
plt.figure(figsize=(10, 6))
hist = plt.hist(data, bins=15, 
                edgecolor='black', 
                alpha=0.7,
                color='#1f77b4')
plt.title('标准正态分布直方图')
plt.xlabel('数值区间')
plt.ylabel('频数')
plt.grid(axis='y', linestyle='--')
plt.show()

基础直方图示例

参数调优指南

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# 生成数据
data = np.random.randn(1000)  # 生成标准正态分布数据

# 高级参数配置示例
plt.figure(figsize=(10, 6))
plt.hist(data, 
         bins=np.arange(-4, 4.5, 0.5),  # 自定义区间边界
         density=True,                 # 启用归一化
         histtype='stepfilled',        # 填充样式
         color='#ff7f0e',
         edgecolor='black',
         linewidth=1.2,
         alpha=0.6,
         label='归一化直方图')

# 叠加理论曲线
x = np.linspace(-4, 4, 200)
plt.plot(x, norm.pdf(x), 'r-', lw=2, label='理论PDF')

# 添加标题和标签
plt.title('归一化直方图与理论正态分布曲线')
plt.xlabel('数值')
plt.ylabel('概率密度')

# 添加图例和网格
plt.legend()
plt.grid(True, linestyle='--', alpha=0.7)

# 显示图形
plt.show()

代码说明:

  1. 数据生成

    • 使用np.random.randn(1000)生成1000个标准正态分布的随机数据点。
  2. 直方图参数配置

    • bins=np.arange(-4, 4.5, 0.5):自定义区间边界,从-4到4,步长为0.5。
    • density=True:启用归一化,使直方图的面积总和为1。
    • histtype='stepfilled':设置填充样式为阶梯填充。
    • color='#ff7f0e':设置填充颜色。
    • edgecolor='black':设置边框颜色。
    • linewidth=1.2:设置边框线宽。
    • alpha=0.6:设置透明度。
    • label='归一化直方图':设置图例标签。
  3. 理论曲线叠加

    • 使用scipy.stats.norm.pdf(x)计算理论正态分布的概率密度函数值。
    • 使用plt.plot绘制理论曲线,并设置颜色、线宽和标签。
  4. 图表美化

    • 添加标题、坐标轴标签。
    • 使用plt.legend()添加图例。
    • 使用plt.grid()添加网格线,设置网格样式和透明度。

运行这段代码将生成一个归一化的直方图,并叠加理论正态分布的概率密度函数曲线,帮助直观比较数据分布与理论分布的差异。
在这里插入图片描述

三、多维数据对比分析

分布对比

import numpy as np
import matplotlib.pyplot as plt

# 生成三种分布数据
normal_data = np.random.randn(1000)  # 正态分布
uniform_data = np.random.uniform(-3, 3, 1000)  # 均匀分布
gamma_data = np.random.gamma(2, 1, 1000)  # 伽马分布

# 并排对比
fig, ax = plt.subplots(1, 3, figsize=(18, 6))

# 统一配置参数
config = {'bins': 30, 'edgecolor': 'black', 'alpha': 0.7}

# 绘制直方图
ax[0].hist(normal_data, **config, color='blue', label='正态分布')
ax[1].hist(uniform_data, **config, color='green', label='均匀分布')
ax[2].hist(gamma_data, **config, color='red', label='伽马分布')

# 统一坐标轴范围
for axis in ax:
    axis.set_xlim(-5, 10)  # 调整X轴范围以适应伽马分布
    axis.set_ylim(0, 100)  # 统一Y轴范围
    axis.grid(True)  # 添加网格线
    axis.set_xlabel('数值')  # 添加X轴标签
    axis.set_ylabel('频数')  # 添加Y轴标签
    axis.legend()  # 添加图例

# 添加标题
ax[0].set_title('正态分布')
ax[1].set_title('均匀分布')
ax[2].set_title('伽马分布')

# 显示图形
plt.tight_layout()  # 自动调整子图间距
plt.show()

代码说明:

  1. 生成三种分布数据

    • normal_data:标准正态分布数据。
    • uniform_data:均匀分布数据,范围为[-3, 3]。
    • gamma_data:伽马分布数据,形状参数为2,尺度参数为1。
  2. 并排对比

    • 使用plt.subplots(1, 3)创建一个1行3列的子图布局。
    • 使用ax[i].hist分别绘制三种分布的直方图,并传递统一的配置参数config
  3. 统一坐标轴范围

    • 使用set_xlimset_ylim统一设置X轴和Y轴的范围,确保图表之间的对比性。
    • 添加网格线、坐标轴标签和图例。
  4. 添加标题

    • 为每个子图添加标题,分别标注对应的分布类型。
  5. 调整布局

    • 使用plt.tight_layout()自动调整子图间距,避免标签或标题重叠。

输出结果:
运行这段代码后,你将看到一个包含三个子图的图表,分别展示了正态分布、均匀分布和伽马分布的直方图。每个子图的样式和坐标轴范围一致,方便直观对比不同分布的特征。
在这里插入图片描述

累积分布分析

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# 生成数据(例如标准正态分布数据)
data = np.random.randn(1000)

# 计算理论CDF曲线的x值范围
x = np.linspace(min(data), max(data), 1000)

# 绘制累积直方图(经验CDF)
plt.figure(figsize=(10, 6))
plt.hist(data, 
         bins=50,
         density=True,
         cumulative=True,  # 启用累积模式
         histtype='step',  # 使用阶梯样式
         linewidth=2,
         label='经验CDF')

# 绘制理论CDF曲线
plt.plot(x, norm.cdf(x), 'r--', linewidth=2, label='理论CDF')

# 添加标题和标签
plt.title('累积直方图与理论CDF曲线')
plt.xlabel('数值')
plt.ylabel('累积概率')

# 添加图例
plt.legend()

# 显示图形
plt.grid(True)
plt.show()

代码说明:

  1. 生成数据

    • 使用np.random.randn(1000)生成1000个标准正态分布的随机数据点。
  2. 绘制累积直方图

    • 使用plt.hist绘制直方图,并设置cumulative=True启用累积模式,从而绘制经验累积分布函数(CDF)。
    • 设置histtype='step'以阶梯样式显示直方图,便于与理论CDF曲线对比。
    • 设置linewidth=2增加线条宽度,使图形更清晰。
    • 添加label='经验CDF'为图例提供标签。
  3. 绘制理论CDF曲线

    • 使用scipy.stats.norm.cdf(x)计算理论CDF值。
    • 使用plt.plot绘制理论CDF曲线,设置颜色为红色、线型为虚线('r--'),并添加label='理论CDF'
  4. 图表美化

    • 添加标题、X轴和Y轴标签。
    • 使用plt.legend()添加图例。
    • 使用plt.grid(True)添加网格线,便于观察。

输出结果:
运行这段代码后,你将看到一个累积直方图(经验CDF)与理论正态分布的CDF曲线的对比图。经验CDF通过直方图的累积模式显示,而理论CDF曲线则以红色虚线叠加在图上,直观地展示了数据的经验分布与理论分布之间的差异。
在这里插入图片描述

四、进阶应用技巧

智能分箱算法

这段代码将展示不同分箱算法(autoscottfddoane)对直方图的影响,并为每种算法绘制一个子图。

import numpy as np
import matplotlib.pyplot as plt

# 生成数据(例如标准正态分布数据)
data = np.random.randn(1000)

# 定义不同的分箱算法
methods = ['auto', 'scott', 'fd', 'doane']

# 创建一个 2x2 的子图布局
plt.figure(figsize=(12, 8))
for i, method in enumerate(methods, 1):
    plt.subplot(2, 2, i)
    plt.hist(data, bins=method, 
             edgecolor='black',
             color=f'C{i}',  # 使用默认的颜色循环
             alpha=0.7)      # 设置透明度
    plt.title(f'{method} 分箱算法')
    plt.grid(True)           # 添加网格线

# 调整子图间距
plt.tight_layout()

# 显示图形
plt.show()

代码说明:

  1. 生成数据

    • 使用 np.random.randn(1000) 生成 1000 个标准正态分布的随机数据点。
  2. 分箱算法

    • 定义了四种分箱算法:autoscottfddoane
    • auto:Matplotlib 默认的分箱算法,会根据数据的分布自动选择合适的分箱数。
    • scott:基于数据的标准差和样本数量的分箱算法。
    • fd(Freedman-Diaconis):基于数据的四分位数间距(IQR)的分箱算法,对异常值不敏感。
    • doane:适用于正偏分布的分箱算法,适合小样本数据。
  3. 绘图逻辑

    • 使用 plt.figure 创建一个 12x8 的画布。
    • 使用 plt.subplot 创建 2x2 的子图布局。
    • 在每个子图中,使用 plt.hist 绘制直方图,并指定不同的分箱算法。
    • 设置 edgecolor='black' 为直方图的边框添加黑色边框。
    • 使用 color=f'C{i}' 为每个直方图指定不同的颜色。
    • 设置 alpha=0.7 为直方图添加透明度,便于观察重叠部分。
    • 使用 plt.title 添加每个子图的标题,显示所使用的分箱算法。
    • 使用 plt.grid(True) 为每个子图添加网格线。
  4. 调整布局

    • 使用 plt.tight_layout() 自动调整子图间距,避免标签或标题重叠。

输出结果:
运行这段代码后,你将看到一个 2x2 的子图布局,每个子图展示了不同分箱算法对直方图的影响。通过对比,可以直观地观察到不同分箱算法如何影响直方图的形状和细节。
在这里插入图片描述

二维直方图

import numpy as np
import matplotlib.pyplot as plt

# 生成二维相关数据
x = np.random.randn(10_000)
y = x * 0.5 + np.random.randn(10_000) * 0.2

# 绘制二维直方图
plt.figure(figsize=(10, 8))
hist = plt.hist2d(x, y, 
           bins=[np.linspace(-4, 4, 50), 
                 np.linspace(-3, 3, 50)],
           cmap='viridis',
           density=True)

# 添加颜色条
plt.colorbar(hist[3], label='概率密度')

# 添加标题和坐标轴标签
plt.title('二维直方图(热力图风格)')
plt.xlabel('X变量')
plt.ylabel('Y变量')

# 显示图形
plt.show()

代码说明:

  1. 生成数据

    • x 是标准正态分布数据。
    • y 是与 x 有一定线性相关性的数据,同时添加了一些随机噪声。
  2. 绘制二维直方图

    • 使用 plt.hist2d 绘制二维直方图。
    • bins 参数指定了 xy 方向的分箱边界,使用 np.linspace 生成等间距的分箱边界。
    • cmap='viridis' 设置颜色映射为 viridis,这是一个从浅黄到深蓝的渐变色。
    • density=True 将直方图归一化为概率密度。
  3. 添加颜色条

    • 使用 plt.colorbar 添加颜色条,并设置标签为“概率密度”。
  4. 添加标题和坐标轴标签

    • 使用 plt.title 添加标题。
    • 使用 plt.xlabelplt.ylabel 添加坐标轴标签。
  5. 显示图形

    • 使用 plt.show() 显示最终图形。

输出结果:
运行这段代码后,你将看到一个二维直方图,以热力图的形式展示了 xy 的联合分布。颜色条显示了不同颜色对应的概率密度值,帮助直观地理解数据的分布特征。
在这里插入图片描述

三维柱状图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.cm as cm
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 生成二维正态分布数据
x = np.random.randn(10000)
y = x * 0.5 + np.random.randn(10000) * 0.5

# 设置bin宽度
bin_width = 0.3
bins_x = np.arange(-5, 5, bin_width)
bins_y = np.arange(-5, 5, bin_width)

# 计算二维直方图
hist, x_edges, y_edges = np.histogram2d(x, y, bins=[bins_x, bins_y], density=True)

# 准备三维柱状图的数据
x_pos, y_pos = np.meshgrid(x_edges[:-1], y_edges[:-1], indexing='ij')
x_pos = x_pos.flatten()
y_pos = y_pos.flatten()
z_pos = np.zeros_like(x_pos)  # 柱子的底部高度为0
dx = dy = bin_width * np.ones_like(z_pos)  # 柱子的宽度和深度
dz = hist.flatten()  # 柱子的高度(密度值)

# 绘制三维柱状图
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 根据密度值设置颜色
colors = plt.cm.hot(dz / np.max(dz))

# 绘制柱状图
ax.bar3d(x_pos, y_pos, z_pos, dx, dy, dz, color=colors, shade=True)

# 设置标签和标题
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Density')
ax.set_title('三维直方图(密度表示)')

# 添加颜色条
# 创建一个ScalarMappable对象
m = cm.ScalarMappable(cmap=plt.cm.hot)
m.set_array(dz)  # 设置数据范围

# 明确指定ax参数
cbar = plt.colorbar(m, ax=ax, label='Density')

plt.show()

三维直方图

五、性能优化建议

  1. 大数据优化:当数据量超过百万级时,改用numpy.histogram预计算
  2. 动态渲染:对交互式可视化,可使用Bokeh或Plotly的WebGL加速
  3. 分箱策略:优先选择'auto''fd'算法处理复杂分布

结语

掌握直方图的深度应用,等于拥有了数据分布的万能钥匙。通过灵活运用Python生态中的Matplotlib、NumPy、SciPy等工具,我们不仅能快速生成标准直方图,更能实现多维对比、累积分布分析等高级功能。建议读者在实践中尝试不同的分箱策略和可视化参数,找到最适合特定数据集的展示方式。

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

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

相关文章

0基础 | 恒流源专题

目录 tip1:低端反馈​编辑 tip2: 恒流源电路的设计注意事项 tip3:三极管输出恒定电流受运放输出电流控制 tip4:高端反馈 基本逻辑: 当负端Vref不输入电压时, 当负端Vref输入电压时 tip1:低端反馈 判…

Webpack 前端性能优化全攻略

文章目录 1. 性能优化全景图1.1 优化维度概览1.2 优化效果指标 2. 构建速度优化2.1 缓存策略2.2 并行处理2.3 减少构建范围 3. 输出质量优化3.1 代码分割3.2 Tree Shaking3.3 压缩优化 4. 运行时性能优化4.1 懒加载4.2 预加载4.3 资源优化 5. 高级优化策略5.1 持久化缓存5.2 模…

【YOLOv8】YOLOv8改进系列(7)----替换主干网络之LSKNet

主页:HABUO🍁主页:HABUO 🍁YOLOv8入门改进专栏🍁 🍁如果再也不能见到你,祝你早安,午安,晚安🍁 【YOLOv8改进系列】: 【YOLOv8】YOLOv8结构解读…

【LangChain】理论及应用实战(7):LCEL

文章目录 一、LCEL简介二、LCEL示例2.1 一个简单的示例2.2 RAG Search 三、LCEL下核心组件(PromptLLM)的实现3.1 单链结构3.2 使用Runnables来连接多链结构3.2.1 连接多链3.2.2 多链执行与结果合并3.2.3 查询SQL 3.3 自定义输出解析器 四、LCEL添加Memor…

ai本地化 部署常用Ollama软件

现在用最简单的方式介绍一下 Ollama 的作用和用法: Ollama 是什么? Ollama 是一个让你能在自己电脑上免费运行大型语言模型(比如 Llama 3、Mistral 等)的工具。 相当于你本地电脑上有一个类似 ChatGPT 的 AI,但完全…

vllm部署QwQ32B(Q4_K_M)

vllm部署QwQ32B(Q4_K_M) Ollama是一个轻量级的开源LLM推理框架,注重简单易用和本地部署,而VLLM是一个专注于高效推理的开源大型语言模型推理引擎,适合开发者在实际应用中集成和使用。两者的主要区别在于Ollama更注重为用户提供多种模型选择和…

企业内网监控软件的选型与应用:四款主流产品的深度剖析

在数字化办公的时代背景下,企业内部网络管理的重要性愈发显著。对于企业管理者而言,如何精准掌握员工工作状态,保障网络安全与工作效率,已成为亟待解决的关键问题。本文将深入剖析四款主流企业内网监控软件,探讨其功能…

Qt窗口控件之字体对话框QFontDialog

字体对话框QFontDialog QFontDialog 是 Qt 内置的字体对话框,用户能够在这里选择字体的样式、大小,设置加粗和下划线并将结果作为返回值返回。QFontDialog 最好使用其提供的静态函数实例化匿名对象,并获取返回值最为用户选择字体设置的结果。…

Qt QML实现视频帧提取

## 前言 视频帧率(Frame Rate)是指视频播放时每秒显示的画面帧数,通常用fps(Frames Per Second)来表示。视频是由一系列静止的图像帧组成的,而视频帧率则决定了这些图像帧在单位时间内播放的速度。较高的视…

在 Ubuntu 服务器上使用宝塔面板搭建博客

📌 介绍 在本教程中,我们将介绍如何在 Ubuntu 服务器 上安装 宝塔面板,并使用 Nginx PHP MySQL 搭建一个博客(如 WordPress)。 主要步骤包括: 安装宝塔面板配置 Nginx PHP MySQL绑定域名与 SSL 证书…

有了大语言模型还需要 RAG 做什么

一、百炼平台简介 阿里云的百炼平台就像是一个超级智能的大厨房,专门为那些想要做出美味AI大餐的企业和个人厨师准备的。你不需要从头开始做每一道菜,因为这个厨房已经为你准备了很多预制食材(预训练模型),你可以根据…

【从0到1搞懂大模型】RNN基础(4)

先说几个常用的可以下载数据集的地方 平台:kaggle(https://www.kaggle.com/datasets) 和鲸社区(https://www.heywhale.com/home) 阿里天池(https://tianchi.aliyun.com/) 其他:海量公…

【第K小数——可持久化权值线段树】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 1e5 10;int a[N], b[N]; int n, m, len; int rt[N], idx; // idx 是点分配器struct node {int l, r;int s; } tr[N * 22];int getw(int x) {return lower_bound(b 1, b len 1, x) - b; }int bui…

本地部署Deep Seek-R1,搭建个人知识库——笔记

目录 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 2&#xff1a;部署DeepSeek - R1模型 3&#xff1a;安装Cherry Studio 二、构建私有知识库 一、本地部署 DeepSeek - R1 1&#xff1a;安装Ollama 1.打开Ollama下载安装 未科学上网&#xff0c;I 先打开迅雷再下…

【软考-架构】5.3、IPv6-网络规划-网络存储-补充考点

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 IPv6网络规划与设计建筑物综合布线系统PDS&#x1f4af;考试真题第一题第二题 磁盘冗余阵列网络存储技术其他考点&#x1f4af;考试真题第一题第二题 IPv6 网络规划与设计…

fastapi+angular外卖系统

说明&#xff1a; fastapiangular外卖系统 1.美食分类&#xff08;粥&#xff0c;粉&#xff0c;面&#xff0c;炸鸡&#xff0c;炒菜&#xff0c;西餐&#xff0c;奶茶等等&#xff09; 2.商家列表 &#xff08;kfc&#xff0c;兰州拉面&#xff0c;湘菜馆&#xff0c;早餐店…

鸿蒙路由 HMRouter 配置及使用 三 全局拦截器使用

1、前期准备 简单封装一个用户首选项的工具类 import { preferences } from "kit.ArkData";// 用户首选项方法封装 export class Preferences {private myPreferences: preferences.Preferences | null null;// 初始化init(context: Context, options: preference…

计算机视觉——深入理解卷积神经网络与使用卷积神经网络创建图像分类算法

引言 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称 CNNs&#xff09;是一种深度学习架构&#xff0c;专门用于处理具有网格结构的数据&#xff0c;如图像、视频等。它们在计算机视觉领域取得了巨大成功&#xff0c;成为图像分类、目标检测、图像分…

永磁同步电机无速度算法--拓展卡尔曼滤波器

一、原理介绍 以扩展卡尔曼滤波算法为基础&#xff0c;建立基于EKF算法的估算转子位置和转速的离散模型。 实时性是扩展卡尔曼滤波器的一种特征&#xff0c;所以它可实时跟踪系统的状态并进行有效的输出&#xff0c;同时&#xff0c;它可以减少干扰、抑制噪声&#xff0c;其效…

【CF】Day9——Codeforces Round 953 (Div. 2) BCD

B. New Bakery 题目&#xff1a; 思路&#xff1a; 被标签害了&#xff0c;用什么二分&#xff08; 很简单的思维题&#xff0c;首先如果a > b&#xff0c;那么全选a就行了&#xff0c;还搞啥活动 否则就选 b - a 天来搞活动&#xff0c;为什么&#xff1f; 首先如果我…