Python 数学建模——高斯核密度估计

embedded/2024/9/22 14:17:36/

文章目录

    • 前言
    • 原理
    • 代码实例
      • scipy 实现
      • seaborn 实现

前言

  高斯核密度估计本是一种机器学习算法,在数学建模中也可以发挥作用。本文主要讨论用它来拟合变量的概率密度,获得概率密度函数 f ( x ) f(x) f(x)

原理

  已知一个连续型随机变量 X X X 的一系列观测值 X 1 , X 2 , ⋯ , X n X_1,X_2,\cdots,X_n X1,X2,,Xn,我们可以用高斯核密度估计来拟合出 X X X 的概率密度函数 f ( x ) f(x) f(x)

代码实例

scipy 实现

  先给出代码,后面慢慢解释。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde# 为测试 gaussian_kde 效果,当场生成1000个beta分布的随机数
np.random.seed(114)
info = np.random.beta(a=2, b=5, size=1000)# 根据一系列观测值 info,拟合出概率密度
# 这个 gaussian_kde 有个神奇的参数 bw_method,说是计算估计器带宽的方法,可以调一下
kde = gaussian_kde(info)
x = np.linspace(min(info), max(info), 1000)
pdf = kde.evaluate(x)# 开始作图# 指定楷体以显示中文字体
plt.rcParams["font.sans-serif"] = ['KaiTi']
fig = plt.figure()
ax1 = fig.add_subplot(111, label="1")
ax2 = fig.add_subplot(111, label="2", frame_on=False)# 100 指的是 100 个直方条
ax1.hist(info,100, color='r', alpha=0.4)
ax1.set_xlabel("观测值")
ax1.set_ylabel("观测频数")ax2.plot(x, pdf, c = 'b')
ax2.set_xticks([])
ax2.set_ylabel("拟合概率密度")
ax2.yaxis.tick_right()
ax2.yaxis.set_label_position('right')
plt.show()

  图画出来是这样的:

  • 6 − 7 6-7 67 行,按照 β \beta β 分布生成了一个含有 1000 1000 1000 个随机数的info。实际建模的时候,这个info应该是题目给我们的数据样本。
  • 11 11 11 行由info得到一个kde对象,kde.evaluate()实际上就是概率密度函数,传一个 x x x 就返回一个 f ( x ) f(x) f(x)
  • 12 − 13 12-13 1213 行是取了横轴上的一些数据点获取概率密度用于后续画图,如果把x记作 [ x 1 , ⋯ , x n ] [x_1,\cdots,x_n] [x1,,xn] 那么pdf就是 [ f ( x 1 ) , ⋯ , f ( x n ) ] [f(x_1),\cdots,f(x_n)] [f(x1),,f(xn)]
  • 18 18 18 行到最后都是在画图。

  如果你觉得拟合效果不佳,可以调整gaussian_kdebw_method参数。这个东西是采样宽度,换句话说它越大 f ( x ) f(x) f(x) 越粗糙,它越小 f ( x ) f(x) f(x) 更容易过拟合。比如我在上面的kde = gaussian_kde(info)中加入参数bw_method=0.1,画出来这样的图:

  明显有些过拟合,但是很多时候我们需要这种过拟合。

seaborn 实现

  Seaborn 作为一个强大的 Python 可视化库,也内置了高斯核密度估计的功能。Seaborn 只需要一行代码即可画出核密度估计图,但是它无法返回pdf或者kde等对象,也就是说我们只能看到 y = f ( x ) y=f(x) y=f(x) 的大致图像,却无法获取 f ( x 0 ) f(x_0) f(x0) x 0 x_0 x0 是某个具体值,比如 x 0 = 5 x_0=5 x0=5)的值。如果你的目的只是为了可视化,展示随机变量 X X X 的集中程度和均值情况,那么 seaborn 无疑是更方便的选择。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 为测试 gaussian_kde 效果,当场生成1000个beta分布的随机数
np.random.seed(114)
info = np.random.beta(a=2, b=5, size=1000)# seaborn 作图
sns.set_style("whitegrid") # 风格设置
sns.kdeplot(info,shade=True, color="g") # 概率密度函数底下填充绿色阴影
plt.show()

  画出来效果如下,该图象轮廓与上面的应该是一样的。如果有两个分布类似的样本,使用 seaborn 用不同颜色画出概率密度函数,将会对比鲜明,非常好看。

  除了kdeplot,seaborn 库里的distplot也可以进行高斯核密度估计,优点是它还能带上直方图。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 为测试 gaussian_kde 效果,当场生成1000个beta分布的随机数
np.random.seed(114)
info = np.random.beta(a=2, b=5, size=1000)# seaborn 作图
sns.set_style("whitegrid") # 风格设置
sns.distplot(info)
plt.show()

  你也可以调整distplot的参数,hist=False不画直方图,kde=False不画概率密度函数。


http://www.ppmy.cn/embedded/113144.html

相关文章

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图 Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验 绘图堆积条形图分组条形图 分类模型Logistic回归随机森林 import matplo…

JSP经典设计模式流程分析:JSP+JavaBean设计模式+MVC设计模式

JSP两种经典设计模式 Model1设计模式:JSPJavaBean 架构图 什么是JavaBean JavaBean是一种JAVA语言写成的可重用组件,它遵循特定的编程规范,如类必须是公共的、具有无参构造函数,并提供getter/setter方法等。这里的JavaBean不单单指的是实体…

ubuntu_如何解决apt install时报错:Waiting for cache lock: Could not get lock

当你在 Ubuntu 上运行 apt 时,遇到类似 Waiting for cache lock: Could not get lock 错误,通常是因为另一个进程正在使用 apt 或者类似的包管理器工具。你可以按照以下步骤来查找并解决这个问题: 1. 查询哪个进程正在使用锁 系统中的锁文件…

supermap iclient3d for cesium中entity使用

目标将西南石油大学部分区域围起来,然后引个标签显示名称,最后弄个飞机绕学校飞(这个时间有点晚了,明天弄) 围墙: wall:{positions:Cesium.Cartesian3.fromDegreesArrayHeights([104.173,30.822,500,104.178,30.837,500,104.19,3…

QEMU中指令添加相关(1):测试程序

QEMU中指令添加相关(1):测试程序 1、汇编.s入口汇编2、主程序3、Makefile文件 1、汇编.s入口汇编 #See LICENSE forlicense details. .section .text.init,“ax”,progbits .globl _start _start: csrr t0, mhartid # read…

房产销售系统|基于java和vue的房产销售系统(源码+数据库+文档)

房产销售|房地产|卖房系统 目录 基于java和vue的房产销售系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师,…

Spring Boot-缓存问题

Spring Boot 缓存问题分析与解决方案 Spring Boot 提供了强大的缓存支持,帮助提高应用性能和效率。在现代应用中,缓存的合理使用可以大大减少数据库查询次数和计算量。然而,缓存的引入也带来了一些复杂性和问题,尤其是在缓存不一…

pdf文件转图片,base64或保存到本地

pdf转图片&#xff0c;需要引入pdfbox依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> </dependency>RequestMapping("pdfToImg") public void …