基于Parzen窗和kNN的概率密度函数非参数估计仿真系统
项目简介
本项目是一个基于MATLAB开发的概率密度函数(PDF)非参数估计仿真系统。项目旨在通过数值模拟验证非参数统计中两种经典方法——Parzen窗法(核密度估计)和k近邻法(kNN)的有效性与特性。系统能够生成服从正态分布和均匀分布的随机样本,并利用上述算法重构概率密度曲线,同时结合详细的可视化图表和均方误差(MSE)分析,探究窗宽参数 $h$、近邻数 $k$ 以及窗函数类型对估计精度的影响。
功能特性
- 多分布样本仿真:支持生成标准正态分布和均匀分布的随机样本数据作为测试基准。
- Parzen窗估计(核密度估计):
* 支持
高斯窗(Gaussian)和
方窗(Rectangular)两种核函数。
* 能够动态分析不同窗宽系数 $h$(如0.1, 0.4, 0.8)下的平滑效果与拟合程度。
* 直观展示窗函数类型对曲线平滑度和局部特性的影响。
* 实现基于第 $k$ 个最近邻距离的概率密度估计算法。
* 能够分析不同近邻参数 $k$(如10, 50, 100)对估计结果的影响。
* 提供理论真实分布曲线与估计曲线的同屏叠加对比。
* 自动计算并以柱状图形式展示不同参数设置下的均方误差(MSE),量化评估估计性能。
* 针对均匀分布特别展示了边界效应现象。
系统要求
- MATLAB R2016a 或更高版本(代码仅使用基础函数,无特殊工具箱依赖)。
使用方法
- 确保MATLAB当前工作路径包含项目文件。
- 在MATLAB命令行窗口输入
main 并回车,或直接运行主脚本。 - 系统将自动清除环境变量,设置参数,并弹出两个独立的图形窗口:
*
窗口1:正态分布概率密度估计分析。
*
窗口2:均匀分布概率密度估计分析。
详细功能与实现逻辑
本项目核心逻辑封装在 main 函数中,按以下步骤执行:
1. 系统初始化与参数配置
程序首先初始化仿真环境,设定样本总数 $N=1000$。定义了正态分布($mu=0, sigma=1$)和均匀分布($[-3, 3]$)的参数。设定了用于测试的算法参数集:Parzen窗宽 $h$ 集合
[0.1, 0.4, 0.8] 和 kNN近邻数 $k$ 集合
[10, 50, 100]。同时生成用于绘图的平滑网格点。
2. 正态分布仿真分析
- 数据生成:调用内部函数生成符合正态分布的随机数据,并计算理论真值。
- Parzen窗分析(不同窗宽):使用高斯窗函数,遍历不同的 $h$ 值进行估计。绘图展示当 $h$ 较小时曲线的波动性(过拟合)以及 $h$ 较大时曲线的过度平滑(欠拟合)。
- 窗函数对比:选取中间值的 $h$,在同一坐标系下对比方窗和高斯窗的估计结果,展示方窗带来的阶梯状不连续性。
- kNN分析(不同k值):遍历不同的 $k$ 值,计算并在图中绘制估计曲线,展示 $k$ 值对局部密度适应性的影响。
- 误差统计:计算上述所有情况下的均方误差(MSE),并通过柱状图进行横向对比。
3. 均匀分布仿真分析
逻辑与正态分布分析类似,但重点在于观察
边界效应。
- 数据生成:生成 $[-3, 3]$ 区间的均匀分布数据。
- Parzen窗与kNN估计:重复上述估计过程。
- 边界观察:在均匀分布的边缘(-3和3处),通过图形展示非参数估计方法通常会出现的“拖尾”或密度下降现象(因为窗函数或邻域跨越了边界)。
关键算法与函数说明
代码包含主流程及数个关键的内部子函数,具体实现细节如下:
数据生成与理论值
- generate_normal / generate_uniform:分别利用
randn 和 rand 生成指定数量 $N$ 的一维随机样本。 - theoretical_normal / theoretical_uniform:根据数学公式计算给定网格点 $x$ 处的真实概率密度值,作为对比基准(Ground Truth)。
Parzen窗估计算法 (parzen_window)
该函数实现了核密度估计的核心公式:
- 输入:样本数据、估计点向量 $x$、窗宽 $h$、窗类型
type。 - 实现细节:
* 遍历每一个估计点 $x_i$。
* 计算相对距离向量 $u = (x_i - text{data}) / h$。
*
高斯窗 (gaussian):应用标准正态分布公式 $frac{1}{sqrt{2pi}} e^{-0.5u^2}$ 计算核函数值。
*
方窗 (rect):判断条件 $|u| le 0.5$,满足条件的样本贡献为1,否则为0(即定义在 $[-0.5, 0.5]$ 范围,宽度为1)。
* 最终对核函数值求和并归一化:Mean($phi$) / $h$。
k近邻估计算法 (knn_estimate)
该函数实现了基于第 $k$ 近邻距离的密度估计:
- 输入:样本数据、估计点向量 $x$、近邻数 $k$。
- 实现细节:
* 遍历每一个估计点 $x_i$。
* 计算该点到所有样本数据的欧氏距离并利用
sort 进行排序。
* 提取第 $k$ 个最近的距离 $dist_k$。
*
体积计算:对于一维情况,包含 $k$ 个样本的最小区间长度(体积 $V$)被近似为 $2 times dist_k$。
*
密度计算:使用公式 $p(x) = frac{k}{N times V}$ 计算概率密度。代码中包含对 $dist_k approx 0$ 的微小量保护,防止除零错误。
误差计算 (calc_mse)
- 实现:计算理论值向量
y_true 与估计值向量 y_est 之间差值的平方的均值,用于量化评估拟合的好坏。