gpt4 book ai didi

matlab - 使用高斯内核估计向量的 pdf

转载 作者:太空宇宙 更新时间:2023-11-03 20:29:01 24 4
gpt4 key购买 nike

我正在使用高斯核来估计基于方程的数据的 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));

RESULT 蓝色是我的结果,红色是真实的 pdf enter image description here

最佳答案

你有两个问题:

  1. 蓝色和红色图之间有 1 个单位的位移。
  2. 蓝色的尖刺比红色的尖刺更宽,高度也更低。

如何解决每个问题:

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

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

    实际上,您有一个高度和宽度之间的权衡,由 sigma 控制。但重要的是 area 对于任何 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));

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

关于matlab - 使用高斯内核估计向量的 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28541384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com