通过修正带宽参数得到的可变带宽核密度估计matlab代码
以下是修正带宽参数得到的可变带宽核密度估计matlab代码:
function [f,xi] = variable_bandwidth_kde(x, h0, bwfunc, ngrid)
% x: 数据样本
% h0: 初始带宽参数
% bwfunc: 带宽函数,可以是一个函数句柄,也可以是一个字符串,表示内置的带宽函数
% ngrid: 密度估计结果的点数
if nargin < 4
ngrid = 1000;
end
if nargin < 3
bwfunc = 'normal';
end
if ischar(bwfunc)
switch bwfunc
case 'normal'
bwfunc = @(x) (4/3*std(x)/numel(x))^0.2; % Silverman's rule of thumb
case 'epanechnikov'
bwfunc = @(x) (15/16*std(x)/numel(x))^0.2;
case 'logit'
bwfunc = @(x) (0.9*min(std(x),iqr(x)/1.34)/numel(x))^0.2;
otherwise
error('Unknown bandwidth function: %s', bwfunc);
end
end
n = numel(x);
xi = linspace(min(x), max(x), ngrid);
f = zeros(size(xi));
for i=1:ngrid
h = h0*bwfunc(x-xi(i));
f(i) = sum(normpdf((x-xi(i))/h))/n/h;
end
end
使用方法:
% 生成正态分布样本
x = randn(1000,1);
% 使用初始带宽参数0.1,使用Epanechnikov内核函数
[f,xi] = variable_bandwidth_kde(x, 0.1, 'epanechnikov');
% 绘制密度图
plot(xi,f);
``
原文地址: https://www.cveoy.top/t/topic/ecBc 著作权归作者所有。请勿转载和采集!