3

Я использую гауссово ядро ​​для оценки pdf данных на основе уравнения где K (.) - гауссовское ядро, данные являются заданным вектором. z - бит от 1 до 256. Размер бункера равен 1.Оценить pdf вектора с использованием гауссовского ядра

Я реализовал код 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)); 

РЕЗУЛЬТАТ СИНИЙ мой результат и RED реален PDF enter image description here

+0

Я предполагаю, они нормализованы, не так ли? однако, формат pdf выглядит вполне корректно. –

+1

@AnderBiguri: Оба PDF разделены по длине (данные). Поэтому я думаю, что они уже нормализованы. – user3051460

ответ

3

У вас есть две проблемы:

  1. A 1-блок перемещения между синий и красный.
  2. Синие шипы шире и менее высоки, чем красные.

Как решить каждую проблему:

  1. Это вызвано возможной путаницей между данными диапазоном 0, ..., 255 и индексации интервалом 1, ... , 256. Так как ваши данные представляют 8-битное изображение, значения должны быть 0, ..., 255 (не 1, ..., 256). Ваша горизонтальная горизонтальная ось должна быть равна 0, ..., 255. То же самое относится к переменной i в строке for. И тогда, поскольку индексация Matlab начинается с 1, вы должны использовать i+1 при индексировании pdf_est.

  2. Это нормальное поведение. Вы принимаете единицу дисперсии в вашем ядре. Чтобы увидеть более высокие голубые шипы, вы можете уменьшить sigma, чтобы сделать ядро ​​более узким и высоким. Но вы никогда не получите ту же высоту, что и ваши данные (необходимый sigma будет зависеть от ваших данных).

    На самом деле, у вас есть компромисс между высотой и шириной, управляемый sigma. Но важно то, что область остается неизменной для любых sigma. Поэтому я предлагаю зарисовать CDF (область) вместо pdf (area densisty). Для этого нарисуйте накопленную гистограмму (используя 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

+0

Perfect. +1. Поблагодарите Луиса Мендо за ваше решение. – user3051460

+0

@ user3051460 Рад, что я мог бы с этим помочь! Это был интересный вопрос –

+0

Да. На самом деле, у нас есть функция, аналогичная идея в http://kr.mathworks.com/help/stats/ksdensity.html;jsessionid=1f5f20f4d8420e7ec67e6dc2a7a7. Однако в моем случае приведенная выше формула более проста и подходит для сегментации изображения. Но когда я запускаю код, это занимает много времени (потому что у нас есть два цикла). Не могли бы вы увидеть мою формулу и попытались оптимизировать для сокращения времени вычисления? – user3051460

Смежные вопросы