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

时间:2015-02-16 15:55:59

标签: matlab statistics vectorization kernel-density probability-density

我有一个代码可以根据内核估算公式找到pdf的矢量近似值: enter image description here
我在下面的代码中实现了这个公式(参见previous question)。但是,该代码需要很长时间才能运行(使用两个循环)。你能看到下面的代码并帮助我加快速度吗?

这是代码:

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));

1 个答案:

答案 0 :(得分:1)

你可以摆脱那些讨厌的 nested loops,然后使用硬编码的sigma来减少大量的vectorized solution -

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

或者,如果您希望能够灵活地使用sigma,请使用此< - p>

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

真的就是这样!

快速测试通过 10x 来加速原始代码!