核密度估计(Kernel Density Estimation, KDE)是一种非参数统计方法

一、核密度估计

核密度估计(Kernel Density Estimation, KDE)是一种非参数统计方法,用于估计随机变量的概率密度函数。它通过将每个数据点周围的核函数叠加,生成平滑的密度曲线。以下是其核心要点:

1. 基本概念

  • 非参数方法:无需假设数据分布的具体形式。
  • 核函数:常用的有高斯核、均匀核等,决定每个数据点对密度估计的影响。
  • 带宽(Bandwidth):控制核函数的宽度,影响估计的平滑度。

2. 数学表达

给定样本 X 1 , X 2 , … , X n X_1, X_2, \ldots, X_n X1,X2,,Xn,核密度估计公式为:

f ^ ( x ) = 1 n h ∑ i = 1 n K ( x − X i h ) \hat{f}(x) = \frac{1}{n h} \sum_{i=1}^{n} K\left(\frac{x - X_i}{h}\right) f^(x)=nh1i=1nK(hxXi)

其中:
- f ^ ( x ) \hat{f}(x) f^(x)是在点 x x x处的密度估计。
- K ( ⋅ ) K(\cdot) K()是核函数。
- h h h是带宽参数。
- n n n是样本数量。

3. 核函数选择

常见的核函数包括:

  • 高斯核 K ( u ) = 1 2 π e − 1 2 u 2 K(u) = \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}u^2} K(u)=2π 1e21u2
  • 均匀核 K ( u ) = 1 2 I ( ∣ u ∣ ≤ 1 ) K(u) = \frac{1}{2} \mathbb{I}(|u| \leq 1) K(u)=21I(u1)
  • Epanechnikov核 K ( u ) = 3 4 ( 1 − u 2 ) I ( ∣ u ∣ ≤ 1 ) K(u) = \frac{3}{4}(1 - u^2) \mathbb{I}(|u| \leq 1) K(u)=43(1u2)I(u1)

4. 带宽选择

带宽 h h h的选择至关重要,常见方法有:

  • 规则选择:如Silverman规则。
  • 交叉验证:通过最小化均方误差选择最优带宽。

5. 应用场景

  • 数据可视化:生成平滑的密度曲线。
  • 异常检测:识别低密度区域的异常点。
  • 模式识别:发现数据中的多峰分布。

6. 优缺点

  • 优点
    • 无需假设数据分布。
    • 能生成平滑的密度估计。
  • 缺点
    • 计算复杂度较高。
    • 带宽选择对结果影响大。

7. 实现工具

  • Pythonscipy.stats.gaussian_kdeseaborn.kdeplot
  • Rdensity() 函数

示例代码(Python)

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde# 生成样本数据
data = np.random.normal(0, 1, 1000)# 核密度估计
kde = gaussian_kde(data)
x = np.linspace(-5, 5, 1000)
y = kde(x)# 绘制结果
plt.plot(x, y, label='KDE')
plt.hist(data, bins=30, density=True, alpha=0.5, label='Histogram')
plt.legend()
plt.show()

核密度估计是一种灵活且强大的工具,适用于多种数据分析和可视化任务。合理选择核函数和带宽是获得准确估计的关键。

二、常见核函数及选择方法

选择合适的核函数是核密度估计(KDE)中的重要步骤,虽然核函数的选择对结果的影响通常不如带宽选择显著,但在某些情况下,核函数的选择仍然会影响估计的平滑度和准确性。以下是选择适当核函数的一些指导原则和方法:

1. 常见核函数及其特性

不同的核函数具有不同的形状和特性,常见核函数包括:

  • 高斯核(Gaussian Kernel)
    • 公式: K ( u ) = 1 2 π e − 1 2 u 2 K(u) = \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}u^2} K(u)=2π 1e21u2
    • 特点:无限支撑,平滑性好,适用于大多数情况。
  • 均匀核(Uniform Kernel)
    • 公式: K ( u ) = 1 2 I ( ∣ u ∣ ≤ 1 ) K(u) = \frac{1}{2} \mathbb{I}(|u| \leq 1) K(u)=21I(u1)
    • 特点:简单,但不连续,适用于离散数据。
  • Epanechnikov核
    • 公式: K ( u ) = 3 4 ( 1 − u 2 ) I ( ∣ u ∣ ≤ 1 ) K(u) = \frac{3}{4}(1 - u^2) \mathbb{I}(|u| \leq 1) K(u)=43(1u2)I(u1)
    • 特点:有限支撑,计算效率高,平滑性较好。
  • 三角核(Triangular Kernel)
    • 公式: K ( u ) = ( 1 − ∣ u ∣ ) I ( ∣ u ∣ ≤ 1 ) K(u) = (1 - |u|) \mathbb{I}(|u| \leq 1) K(u)=(1u)I(u1)
    • 特点:有限支撑,平滑性介于均匀核和高斯核之间。

2. 选择核函数的原则

  • 平滑性需求:如果需要高度平滑的密度估计,高斯核是一个不错的选择。如果对平滑性要求不高,可以选择Epanechnikov核或三角核。
  • 计算效率:有限支撑的核函数(如Epanechnikov核、均匀核)在计算上通常比无限支撑的核函数(如高斯核)更高效。
  • 数据特性:根据数据的分布特性选择核函数。例如,对于具有明显边界的数据,有限支撑的核函数可能更合适。

3. 实际选择方法

  • 默认选择:在许多情况下,高斯核是默认选择,因为它具有良好的平滑性和数学性质。
  • 交叉验证:可以通过交叉验证的方法来选择核函数。具体步骤如下:
    1. 将数据分为训练集和验证集。
    2. 对每个候选核函数,使用训练集进行密度估计。
    3. 在验证集上评估密度估计的准确性(例如,使用对数似然或均方误差)。
    4. 选择在验证集上表现最好的核函数。
  • 经验法则:根据经验或领域知识选择核函数。例如,在金融领域,高斯核常用于估计资产回报率的密度。

4. 示例代码(Python)

以下代码展示了如何使用交叉验证选择核函数:

import numpy as np
from scipy.stats import gaussian_kde
from sklearn.model_selection import KFold
from sklearn.metrics import log_loss# 生成样本数据
data = np.random.normal(0, 1, 1000)# 定义候选核函数
kernels = {'Gaussian': lambda x: gaussian_kde(x, bw_method='scott'),'Epanechnikov': lambda x: gaussian_kde(x, bw_method='scott')  # 此处仅作示例,实际需实现Epanechnikov核
}# 交叉验证
kf = KFold(n_splits=5)
results = {}for name, kernel in kernels.items():log_likelihoods = []for train_index, test_index in kf.split(data):train_data = data[train_index]test_data = data[test_index]kde = kernel(train_data)log_likelihoods.append(-kde.logpdf(test_data).mean())results[name] = np.mean(log_likelihoods)# 选择最佳核函数
best_kernel = min(results, key=results.get)
print(f'Best kernel: {best_kernel} with log likelihood: {results[best_kernel]}')

选择适当的核函数需要综合考虑数据的特性、平滑性需求和计算效率。高斯核通常是默认选择,但在特定情况下,其他核函数可能更合适。通过交叉验证和经验法则,可以更科学地选择核函数。

三、无限支撑与有限支撑核函数

在核密度估计(KDE)中,“无限支撑”(Infinite Support)和“有限支撑”(Finite Support)是用来描述核函数定义域的概念。具体来说:

1. 无限支撑(Infinite Support)

  • 定义:一个核函数如果在整个实数轴(即从负无穷到正无穷)上都有定义且非零,则称该核函数具有无限支撑。

  • 例子:高斯核(Gaussian Kernel)是一个典型的无限支撑核函数,其公式为:
    K ( u ) = 1 2 π e − 1 2 u 2 K(u) = \frac{1}{\sqrt{2\pi}} e^{-\frac{1}{2}u^2} K(u)=2π 1e21u2
    高斯核在所有实数 u u u上都有定义且非零。

  • 特点

    • 平滑性好:无限支撑的核函数通常能生成非常平滑的密度估计。
    • 计算复杂度高:由于核函数在整个实数轴上都有定义,计算时需要考虑所有数据点的影响,计算量较大。

2. 有限支撑(Finite Support)

  • 定义:一个核函数如果只在有限的区间内定义且非零,而在该区间外为零,则称该核函数具有有限支撑。

  • 例子:Epanechnikov核和均匀核都是有限支撑核函数。Epanechnikov核的公式为:
    K ( u ) = 3 4 ( 1 − u 2 ) I ( ∣ u ∣ ≤ 1 ) K(u) = \frac{3}{4}(1 - u^2) \mathbb{I}(|u| \leq 1) K(u)=43(1u2)I(u1)
    其中 I ( ∣ u ∣ ≤ 1 ) \mathbb{I}(|u| \leq 1) I(u1)是指示函数,当 ∣ u ∣ ≤ 1 |u| \leq 1 u1时为1,否则为0。因此,Epanechnikov核只在区间 [ − 1 , 1 ] [-1, 1] [1,1]内有定义且非零。

  • 特点

    • 计算效率高:由于核函数只在有限区间内非零,计算时只需考虑该区间内的数据点,计算量较小。
    • 平滑性较差:有限支撑的核函数生成的密度估计可能不如无限支撑核函数平滑。

3. 选择无限支撑还是有限支撑核函数

  • 无限支撑核函数(如高斯核)适用于需要高度平滑密度估计的场景,尤其是在数据分布较为复杂或需要精细分析时。
  • 有限支撑核函数(如Epanechnikov核)适用于计算资源有限或数据量较大的场景,因为它们计算效率更高。

4. 示例代码(Python)

以下代码展示了无限支撑(高斯核)和有限支撑(Epanechnikov核)的核密度估计:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde# 生成样本数据
data = np.random.normal(0, 1, 1000)# 高斯核(无限支撑)
kde_gaussian = gaussian_kde(data)
x = np.linspace(-5, 5, 1000)
y_gaussian = kde_gaussian(x)# Epanechnikov核(有限支撑,此处使用自定义实现)
def epanechnikov_kernel(u):return np.where(np.abs(u) <= 1, 0.75 * (1 - u**2), 0)def kde_epanechnikov(data, x, h):n = len(data)y = np.zeros_like(x)for xi in x:y += epanechnikov_kernel((xi - data) / h)return y / (n * h)h = 0.5  # 带宽
y_epanechnikov = kde_epanechnikov(data, x, h)# 绘制结果
plt.plot(x, y_gaussian, label='Gaussian KDE')
plt.plot(x, y_epanechnikov, label='Epanechnikov KDE')
plt.hist(data, bins=30, density=True, alpha=0.5, label='Histogram')
plt.legend()
plt.show()

“无限支撑”和“有限支撑”描述了核函数的定义域范围。无限支撑核函数(如高斯核)在整个实数轴上都有定义,适合需要高度平滑的密度估计;有限支撑核函数(如Epanechnikov核)只在有限区间内定义,计算效率更高。根据具体需求选择合适的核函数。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator&#xff0c;点击Environment&#xff0c;再点击new(new是我下载anaconda的文件夹名称)&#xff0c;然后点击创建 点击绿色按钮&#xff0c;并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具&#xff0c;在上篇…

【WPS】【WORDEXCEL】【VB】实现微软WORD自动更正的效果

1. 代码规范方面 添加 Option Explicit&#xff1a;强制要求显式声明所有变量&#xff0c;这样可以避免因变量名拼写错误等情况而出现难以排查的逻辑错误&#xff0c;提高代码的健壮性。使用 On Error GoTo 进行错误处理&#xff1a;通过设置错误处理机制&#xff0c;当代码执行…

2023-2024 学年 广东省职业院校技能大赛(高职组)“信息安全管理与评估”赛题一

2023-2024 学年 广东省职业院校技能大赛(高职组“信息安全管理与评估”赛题一&#xff09; 模块一:网络平台搭建与设备安全防护第一阶段任务书任务 1&#xff1a;网络平台搭建任务 2&#xff1a;网络安全设备配置与防护DCRS:DCFW:DCWS:DCBC:WAF: 模块二&#xff1a;网络安全事件…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 9.1 检查点&#xff08;Checkpoint&#xff09; 9.1.1 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我…

docker一张图理解

1、push 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。参数说明&#xff1a; –disable-content-trust : 忽略镜像的校验,默认开启 # 上传本地镜像myapache:v1到镜像仓库中。 docker push myapache:v1 1.2、search 从Docker Hub查找镜像。参数说明&#xff1a; –…

以太网实战AD采集上传上位机——FPGA学习笔记27

一、设计目标 使用FPGA实现AD模块驱动采集模拟电压&#xff0c;通过以太网上传到电脑上位机。 二、框架设计 数据位宽转换模块&#xff08;ad_10bit_to_16bit&#xff09;&#xff1a;为了方便数据传输&#xff0c;数据位宽转换模块实现了将十位的 AD 数据转换成十六位&#…

【进程与线程】进程的状态

在操作系统中&#xff0c;进程是执行中的程序实例。进程在其生命周期中会经历不同的状态&#xff0c;操作系统根据进程的执行情况和资源调度&#xff0c;将进程划分为多个状态。 这些状态帮助操作系统更加高效地管理 CPU 和系统资源。 进程的状态&#xff1a;就绪态&#xff0…

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

数字人助力企业出海增长,魔珐科技亮相2025晋江跨境电商峰会

近年来&#xff0c;越来越多中国企业纷纷投身于跨境电商行业&#xff0c;推动其规模实现了跨越式的发展。如今&#xff0c;跨境出海仍在加速的过程中&#xff0c;其中蕴涵了巨大的潜力和机遇。 1月3日&#xff0c;“跨境新域 聚势发展——2025晋江跨境电商年度发展峰会暨晋江市…

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置&#xff1a;Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考&#xff1a;使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面&#xff0c;生成了证书&#xff1a; 5.给浏览器安装Jmeter代理的证书…

【Kotlin】上手学习之类型篇

一、类型 1.1 基本类型 主要分为 数字及其无符号版布尔字符字符串数组 1.1.1 数字 整数类型 Kotlin 提供了一组表示数字的内置类型。 对于整数&#xff0c;有四种不同大小的类型&#xff0c;因此值的范围也不同&#xff1a; 类型大小&#xff08;比特数&#xff09;最小…

Android 高版本如何获取App安装列表?

有个需求需要获取App内的安装列表,但是现在在高版本Android中,只能获取到一部分App效果,我获取的代码如下: val calendar Calendar.getInstance()val packageManager context.packageManagerval usageStatsManager context.getSystemService(Context.USAGE_STATS_SERVICE) …

BIO、NIO、AIO

第一章 BIO、NIO、AIO课程介绍 1.1 课程说明 ​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通信架构存在一些缺…

VUE学习笔记4__安装开发者工具

https://chrome.zzzmh.cn/index 安装后需要关闭所有浏览器并重启 再次打开检查会看到vue标签&#xff0c;方便调试修改 如果安装后找不到vue标签&#xff0c;请尝试下载历史版本&#xff0c;这里用的是6.4.5 <!doctype html> <html lang"en"> <head&…

GitLab集成Jira

GitLab与Jira集成的两种方式 GitLab 提供了两种 Jira 集成&#xff0c;即Jira议题集成和Jira开发面板集成&#xff0c;可以配置一个或者两个都配置。 具体集成步骤可以参考官方文档Jira 议题集成&#xff08;极狐GitLab文档&#xff09;和Jira 开发面板集成&#xff08;极狐G…

深入理解计算机系统阅读笔记-第十二章

第12章 网络编程 12.1 客户端-服务器编程模型 每个网络应用都是基于客户端-服务器模型的。根据这个模型&#xff0c;一个应用时由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源&#xff0c;并且通过操作这种资源来为它的客户端提供某种服务。例如&#xf…

用css和html制作太极图

目录 css相关参数介绍 边距 边框 伪元素选择器 太极图案例实现、 代码 效果 css相关参数介绍 边距 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;}div{width: …

C++算法第十六天

本篇文章我们继续学习动态规划 第一题 题目链接 978. 最长湍流子数组 - 力扣&#xff08;LeetCode&#xff09; 题目解析 从上图可见其实有三个状态 代码原理 注意&#xff1a;我们在分析题目的时候分析出来的是三个状态&#xff0c;分别是上升、下降、平坦&#xff0c;但是…

基于YOLOv8与CGNet的鸟类智能识别系统 深度学习图像分类 鸟类目标检测与分类 图像特征提取 模型优化与应用 数据可视化(源码+指导+定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

qml LevelAdjust详解

1、概述 LevelAdjust 是 QML&#xff08;Qt Modeling Language&#xff09;中的一个类型&#xff0c;用于调整源组件的每个色彩通道的颜色级别。通过 LevelAdjust&#xff0c;可以实现对源项目对比度的调节和色彩平衡的改变。LevelAdjust 类型继承自 Item&#xff0c;并提供了…