基于核密度估计优化 PDF 近似的计算时间

Optimize computation time for PDF approximation based on Kernel Density Estimation

我有一个代码可以根据核估计公式找到向量的 pdf 近似值:
我在下面的代码中实现了这个公式(参见 )。但是,该代码需要很长时间才能 运行 (使用了两个循环)。你能看看下面的代码并帮助我让它更快吗?

这是代码:

function pdf_est=KDE()
close all;
%%Random values of 20 pixels, range=[1 256]
data=randi([1 256],1,20)-1; %// changed: "-1"

%% Estimate histogram%%%%% 
pdf_est=zeros(1,256);
z=256;

for i=0:z-1 %// changed_ subtracted 1 
    for j=1:length(data)
        pdf_est(i+1)=pdf_est(i+1)+Gaussian(i-data(j)); %// changed: "+1" (twice)
    end
end
%% Plot real histogram 1 to 256; binsize=1;
hold on
plot(0:255, imhist(uint8(data))./length(data),'r'); %// changed: explicit x axis
%% Plot histogram estimation
plot(0:255, pdf_est./length(data),'b'); %// changed: explicit x axis
hold off
function K=Gaussian(x)
   sigma=1; %// change? Set as desired
   K=1./(sqrt(2*pi)*sigma)*exp(-x^2./(2*sigma^2));

你可以摆脱这两个 讨厌的 nested loops 然后使用硬编码 sigma 来大幅减少 vectorized solution -

pdf_est = sum(1./(sqrt(2*pi))*exp(-bsxfun(@minus,[0:z-1]',data).^2/2),2)

或者,如果您想灵活地拥有 sigma,请使用此 -

sum(1./(sqrt(2*pi)*sigma)*exp(-bsxfun(@minus,[0:z-1]',data).^2/(2*sigma^2)),2)

仅此而已!

Quick tests 把这个放在加速原始代码 10x!