Оптимизация времени вычислений для аппроксимации PDF на основе оценки плотности ядра

У меня есть код для поиска аппроксимации вектора в формате PDF на основе формулы для оценки ядра: введите описание изображения здесь
Я реализовал эту формулу в приведенном ниже коде (см. предыдущий вопрос). Однако этот код выполняется долго (используются два цикла). Не могли бы вы увидеть приведенный ниже код и помочь мне сделать его быстрее?

Это код:

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

person user3051460    schedule 16.02.2015    source источник
comment
возможный дубликат Оценить PDF вектора с использованием ядра Гаусса   -  person knedlsepp    schedule 16.02.2015
comment
Вы, вероятно, должны использовать фильтр вместо этого...   -  person knedlsepp    schedule 16.02.2015
comment
У вас нет настоящей математической формулы для этой задачи? Вышеупомянутое имеет серьезные проблемы...   -  person knedlsepp    schedule 16.02.2015
comment
@knedlsepp: Да. Но предыдущий ответ - это большое вычислительное время, о котором я упоминал в своем вопросе. Формула очень ясна. Вы можете найти в мире ключей оценки на основе ядра   -  person user3051460    schedule 16.02.2015
comment
Вы продолжаете заявлять, что ваши формулировки очень ясны, но ваш интеграл не является ни четко определенным непрерывным интегралом, ни x или z определенными.   -  person knedlsepp    schedule 16.02.2015
comment
Вместо этого вы можете изучить чистую версию: de.mathworks.com/help /stats/ksdensity.html   -  person knedlsepp    schedule 16.02.2015
comment
Благодарим Вас за отправку исправленного варианта. Исходная формула представляет собой непрерывный интеграл. Однако мы знаем, что для простой реализации можно использовать дискретную формулу. Я просто преобразую его в дискретный, чтобы упростить реализацию. У меня ошибка в формуле?   -  person user3051460    schedule 16.02.2015
comment
@knedlsepp: Давайте посмотрим на формулу (15) в статье dropbox.com/s/0tmr81rcv7z8afz/ . Я думаю нормализовать для x. z - номер бункера. Для изображения z 255   -  person user3051460    schedule 16.02.2015
comment
Из того, что я могу сказать, в статье говорится о 2D-интегралах, тогда как я не вижу этого в вашей «формуле». Так хорошо. Может и правильно, но кто знает...   -  person knedlsepp    schedule 16.02.2015
comment
@knedlsepp На самом деле это не дубликат, а скорее продолжение вопроса, на который вы ссылаетесь. Этот вопрос касался некоторых проблем с результатами, которые получал ОП. После того, как эти проблемы были решены в принятом ответе, ОП сказал, что хочет векторизовать код. Поскольку это другая проблема, и исходный вопрос был решен, я предложил опубликовать новый вопрос (этот)   -  person Luis Mendo    schedule 16.02.2015
comment
@knedlsepp: Давайте посмотрим на рисунок 6. Я думаю, что они рисуют одномерную гистограмму. Фактически приведенная выше формула аналогична формуле (15). мое обозначение x равно I(y) в (15). Они умножаются с помощью функции H, чтобы получить пиксели внутри и за пределами области и использовать пиксели для поиска pdf. это я понимаю   -  person user3051460    schedule 16.02.2015


Ответы (1)


Вы можете избавиться от обоих этих неприятных nested loops, а затем использовать жестко запрограммированный sigma, чтобы получить мегауменьшенный vectorized solution -

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

Или, если вы хотите иметь возможность иметь sigma, используйте это -

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

Это все действительно есть!

Быстрые тесты позволили ускорить исходный код на 10x!

person Divakar    schedule 16.02.2015
comment
Спасибо Дивакар. Очень очень быстро. - person user3051460; 16.02.2015