我正在使用高斯内核来估算基于等式的数据的pdf 其中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
答案 0 :(得分:3)
您有两个问题:
如何解决每个问题:
这是由于数据范围 0,...,255和索引间隔 1,...,256之间可能存在的混淆造成的。由于您的数据代表8位图像,因此值应为0,...,255(不是1,...,256)。您绘制的水平轴应为0,...,255。 i
行中的for
变量也是如此。然后,由于Matlab索引从1开始,因此在索引i+1
时应使用pdf_est
。
这是正常行为。您在内核中假设单位差异。要查看更高的蓝色尖峰,您可以减少sigma
以使内核更窄更高。但是,您永远不会获得与数据完全相同的高度(必要的sigma
取决于您的数据)。
实际上,你有{em>权衡高度和宽度,由sigma
控制。但重要的是区域对于任何sigma
都保持不变。所以我建议绘制CDF(区域)而不是pdf(区域密度)。为此,绘制累积的直方图和pdf(使用cumsum
)。
根据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));
根据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));