当前位置: 首页 > news >正文

核密度估计(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核)只在有限区间内定义,计算效率更高。根据具体需求选择合适的核函数。

相关文章:

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

一、核密度估计 核密度估计&#xff08;Kernel Density Estimation, KDE&#xff09;是一种非参数统计方法&#xff0c;用于估计随机变量的概率密度函数。它通过将每个数据点周围的核函数叠加&#xff0c;生成平滑的密度曲线。以下是其核心要点&#xff1a; 1. 基本概念 非参…...

【k8s面试题2025】2、练气初期

在练气初期&#xff0c;灵气还比较稀薄&#xff0c;只能勉强在体内运转几个周天。 文章目录 简述k8s静态pod为 Kubernetes 集群移除新节点&#xff1a;为 K8s 集群添加新节点Kubernetes 中 Pod 的调度流程 简述k8s静态pod 定义 静态Pod是一种特殊类型的Pod&#xff0c;它是由ku…...

栈溢出原理

文章目录 前言一、基本示例二、分析栈1. 先不考虑gets函数的栈情况2. 分析gets函数的栈区情况 三、利用栈1. 构造字符串2. 利用漏洞 前言 栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数&#xff0c;因而导致与其相邻的栈中的变量的值被改变。…...

Jmeter如何进行多服务器远程测试

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…...

2.slf4j入口

文章目录 一、故事引入二、原理探究三、SLF4JServiceProvider四、总结 一、故事引入 故事要从下面这段代码说起 public class App {private static final Logger logger LoggerFactory.getLogger(App.class);public static void main( String[] args ) throws Exception {lo…...

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…...

软件测试—接口测试面试题及jmeter面试题

一&#xff0c;接口面试题 1.接口的作用 实现前后端的交互&#xff0c;实现数据的传输 2.什么是接口测试 接口测试就是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换、传递和控制管理过程&#xff0c;以及相互逻辑关系 3.接口测试必要性 1.可以发现很…...

图论的起点——七桥问题

普瑞格尔河从古堡哥尼斯堡市中心流过&#xff0c;河中有小岛两座&#xff0c;筑有7座古桥&#xff0c;哥尼斯堡人杰地灵&#xff0c;市民普遍爱好数学。1736年&#xff0c;该市一名市民向大数学家Euler提出如下的所谓“七桥问题”&#xff1a; 从家里出发&#xff0c;7座桥每桥…...

嵌入式开发通讯协议大全(在写中)

目录 modbus RTU通讯协议&#xff1a; pmbus通讯协议&#xff1a; modbus RTU通讯协议&#xff1a; 主要应用功能&#xff1a; 规范了软件变量&#xff0c;访问功能码&#xff0c;给不同工程师开发的不同产品有统一的通讯标准 帧结构简单&#xff0c;占用带宽少&#xff0c…...

webpack 4 升级 webpack 5

升级至最新的 webpack 和 webpack-cli npm run build 报错&#xff0c; unknown option -p 解决方案&#xff1a; 改成 --mode production npm run build 报错 unknown option --hide-modules 解决方案&#xff1a;直接移除 npm run build 报错&#xff1a;TypeError: Cannot a…...

oneplus3t-lineageos-16.1编译-android9, oneplus3t-lineage-14编译-android7

oneplus3t-lineage-14编译-android7 1 清华linageos镜像 x lineage-14.1-20180223-nightly-oneplus3-signed.zip ntfs分区挂载为普通用户目录 , ext4分区挂载为普通用户目录 bfsu/lineageOS镜像 ts/lingeageOS镜像 oneplus3/lineage-build-simple-manual.md, manifest-p…...

HTML中最基本的东西

本文内容的标签&#xff0c;将是看懂HTML的最基本之基本 &#xff0c;是跟您在写文章时候一样内容。一般想掌握极其容易&#xff0c;但是也要懂得如何使用&#xff0c;过目不忘&#xff0c;为手熟尔。才是我们学习的最终目的。其实边看边敲都行&#xff0c;或者是边看边复制粘贴…...

<OS 有关>Ubuntu 24 安装 openssh-server, tailscale+ssh 慢增加

更新日志&#xff1a; Created on 14Jan.2025 by Dave , added openssh-server, tailescape Updated on 15Jan.2025, added "tailescape - tailscape ssh" 前期准备&#xff1a; 1. 更新可用软件包的数据库 2. 升级系统中所有已安装的软件包到最新版本 3. 安装 cur…...

神经网络常见操作(卷积)输入输出

卷积 dimd的tensor可以进行torch.nn.Convnd(in_channels,out_channels),其中nd-1,d-2对于torch.nn.Convnd(in_channels,out_channels)&#xff0c;改变的是tensor的倒数n1维的大小 全连接 使用torch.nn.Linear(in_features,out_features,bias)实现YXWT b,其中X 的形状为 (ba…...

25/1/16 嵌入式笔记 STM32F108

输入捕获 TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct; TIM_TimeBaseStruct.TIM_Period 0xFFFF; // 自动重装载值 TIM_TimeBaseStruct.TIM_Prescaler 71; // 预分频值 TIM_TimeBaseStruct.TIM_ClockDivision 0; TIM_TimeBaseStruct.TIM_CounterMode TIM_CounterMode_Up…...

mac 安装 node

brew versions node // 安装 node brew versions node14 // 安装指定版本 卸载node: sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.* sudo rm -rf /usr/local/include/node /Users/$USER/.npm su…...

mysql常用运维命令

mysql常用运维命令 查看当前所有连接 -- 查看当前所有连接 SHOW FULL PROCESSLIST;说明&#xff1a; 关注State状态列&#xff0c;是否有锁。如果大量状态是waiting for handler commit检查磁盘是否占满关注Time耗时列&#xff0c;是否有慢查询关注Command列&#xff0c;如果…...

正则表达式学习网站

网上亲测好用的网站&#xff1a; Regexlearn 这个网站可以从0开始教会正则表达式的使用。 mklab 包含常用表达式&#xff0c;车次&#xff0c;超链接&#xff0c;号码等提取。...

gradle,adb命令行编译备忘

追踪依赖(为了解决duplicateClass…错误) gradlew.bat app:dependencies > dep-tree.txt # 分析dep-tree.txt的依赖结构&#xff0c;找到对应的包&#xff0c;可能需要做exclude控制,或者查看库issueverbose编译(我一直需要verbose) gradlew.bat assembleDebug -Dhttps.pr…...

C++:工具VSCode的编译和调试文件内容:

ubuntu24.04&#xff0c; vscode 配置文件 C 的环境 下载的gcc&#xff0c;使用命令为 sudo aptitude update sudo aptitude install build-essential -f- sudo: 以超级用户权限运行命令。 - aptitude: 包管理工具&#xff0c;用于安装、更新和删除软件包。 - install: 安装指…...

SpringMVC Idea 搭建 部署war

1.创建 Idea项目 使用Maven模板 创建 webApp模板项目 2.导入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…...

YOLOv10-1.1部分代码阅读笔记-loaders.py

loaders.py ultralytics\data\loaders.py 目录 loaders.py 1.所需的库和模块 2.class SourceTypes: 3.class LoadStreams: 4.class LoadScreenshots: 5.class LoadImagesAndVideos: 6.class LoadPilAndNumpy: 7.class LoadTensor: 8.def autocast_list(source…...

Windows的Redis查看自己设置的密码并更改设置密码

查看密码 由于我的Redis安装很久了&#xff0c;所以忘记是否有设置密码&#xff0c;查看步骤如下&#xff1a; 启动redis&#xff0c;启动流程可以看这篇文章&#xff1a;https://blog.csdn.net/changyana/article/details/127679871 在redis安装目录下打开redis-cli.exe&…...

【Linux】sed编辑器二

一、处理多行命令 sed编辑器有3种可用于处理多行文本的特殊命令。 N&#xff1a;加入数据流中的下一行&#xff0c;创建一个多行组进行处理&#xff1b;D&#xff1a;删除多行组中的一行&#xff1b;P&#xff1a;打印多行组中的一行。 1、next命令&#xff1a;N 单行next命…...

docker 部署 Kafka 单机和集群

一、准备工作 安装 Docker 确保本机已安装 Docker。可以通过以下命令检查 Docker 是否已安装&#xff1a;docker --version如果未安装&#xff0c;可以访问 Docker 官网下载并安装 Docker Desktop&#xff08;Windows 和 Mac&#xff09;或使用包管理器安装&#xff08;Linux&…...

PHP语言的软件开发工具

PHP语言的软件开发工具 在当今数字化的时代&#xff0c;软件开发已经成为一种常见的职业。无论是企业级应用、网站开发还是移动应用&#xff0c;开发者们都需要用到各种各样的工具。PHP作为一种广泛使用的服务器端脚本语言&#xff0c;因其简单、灵活与强大的功能&#xff0c;…...

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一&#xff1a;使用 float 普通盒子实现横向布局 方法二&#xff1a;使用 display: inline-block 内联块级元素实现横向布局 方法三&#xff1a;使用弹性盒子 flexbox&#xff0…...

SQL语句IN和OR的区别

在SQL中&#xff0c;IN和OR都用于筛选条件&#xff0c;但它们的用途和性能上有一些区别。以下是两者的对比&#xff1a; 1. 语法 IN SELECT * FROM table_name WHERE column_name IN (value1, value2, value3);IN用于检查某列的值是否在一个给定的值列表中。 OR SELECT * FRO…...

OCP使用中的常见问题与解决方法

OCP的常见问题 页面卡顿&#xff1a; 遇到页面卡顿的问题时&#xff0c;首先需要区分是全局性的卡顿&#xff0c;即所有页面都出现延迟或响应缓慢&#xff0c;还是仅限于特定的监控页面。 监控数据看不到: 需要明确是全部数据都无法查看&#xff0c;还是仅限于特定集群的数…...

Git 版本控制:.gitignore 文件完全指南

.gitignore 文件是 Git 版本控制系统中的一个重要配置文件&#xff0c;用于告诉 Git 哪些文件和目录应该被忽略&#xff0c;不需要纳入版本控制。以下是关于 .gitignore 的完整笔记。 基本概念 .gitignore 文件可以放在项目的任何目录下&#xff0c;其作用范围包括所在目录及…...