使用高斯核估计向量的pdf

时间:2015-02-16 12:23:51

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

我正在使用高斯内核来估算基于等式的数据的pdf enter image description here 其中K(。)是高斯核,数据是给定的向量。 z是从1到256的bin。bin的大小是1.

我是用matlab代码实现的。然而,结果显示我的pdf估计(蓝色)的幅度与实际的数据pdf不相似。你能看到我的代码并给我一些关于我代码的评论吗?

MATLAB代码

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

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

for i=1:z
    for j=1:length(data)
        pdf_est(i)=pdf_est(i)+Gaussian(i-data(j));
    end
end
%% Plot real histogram 1 to 256; binsize=1;
hold on
plot(imhist(uint8(data))./length(data),'r');
%% Plot histogram estimation
plot(pdf_est./length(data),'b');
hold off
function K=Gaussian(x)
   sigma=1;
   K=1./(sqrt(2*pi)*sigma)*exp(-x^2./(2*sigma^2));

结果 BLUE是我的结果,RED是真实的pdf enter image description here

1 个答案:

答案 0 :(得分:3)

您有两个问题:

  1. 蓝色和红色地块之间的1个单位位移。
  2. 蓝色尖刺比红色尖刺更宽,更低。
  3. 如何解决每个问题:

    1. 这是由于数据范围 0,...,255和索引间隔 1,...,256之间可能存在的混淆造成的。由于您的数据代表8位图像,因此值应为0,...,255(不是1,...,256)。您绘制的水平轴应为0,...,255。 i行中的for变量也是如此。然后,由于Matlab索引从1开始,因此在索引i+1时应使用pdf_est

    2. 这是正常行为。您在内核中假设单位差异。要查看更高的蓝色尖峰,您可以减少sigma以使内核更窄更高。但是,您永远不会获得与数据完全相同的高度(必要的sigma取决于您的数据)。

      实际上,你有{em>权衡高度和宽度,由sigma控制。但重要的是区域对于任何sigma都保持不变。所以我建议绘制CDF(区域)而不是pdf(区域密度)。为此,绘制累积的直方图和pdf(使用cumsum)。

    3. 根据1:

      修改的代码
      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));
      

      enter image description here

      根据1和2修改的代码:

      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, cumsum(imhist(uint8(data))./length(data)),'r'); %// changed: explicit x axis
                                                                  %// changed: cumsum
      %% Plot histogram estimation
      plot(0:255, cumsum(pdf_est./length(data)),'b'); %// changed: explicit x axis
                                                      %// changed: cumsum
      hold off
      function K=Gaussian(x)
         sigma=1; %// change? Set as desired
         K=1./(sqrt(2*pi)*sigma)*exp(-x^2./(2*sigma^2));
      

      enter image description here