Я хочу попробовать svm-классификатор с использованием ядра пересечения гистограммы, для набора данных из 153 изображений, но это занимает много времени. Это мой код:Оптимизация ядра пересечения гистограммы в MATLAB
a = load('...'); %vectors
b = load('...'); %labels
g = dataset(a,b);
error = crossval(g,libsvc([],proxm([],'ih'),100),10,10);
error1 = crossval(g,libsvc([],proxm([],'ih'),10),10,10);
error2 = crossval(g,libsvc([],proxm([],'ih'),1),10,10);
Моя реализация ядра внутри функции proxm является:
...
case {'dist_histint','ih'}
[m,d]=size(A);
[n,d1]=size(B);
if (d ~= d1)
error('column length of A (%d) != column length of B (%d)\n',d,d1);
end
% With the MATLAB JIT compiler the trivial implementation turns out
% to be the fastest, especially for large matrices.
D = zeros(m,n);
for i=1:m % m is number of samples of A
if (0==mod(i,1000)) fprintf('.'); end
for j=1:n % n is number of samples of B
D(i,j) = sum(min([A(i,:);B(j,:)]));%./max(A(:,i),B(:,j)));
end
end
мне нужна оптимизация MatLab для этого кода!
Я не мог удалить петлю, но используя [bsxfun] (http://in.mathworks.com/help/matlab/ref/bsxfun.html), чтобы вычислить минуты, получилось значительное улучшение. finaly: D (i, j) = sum (bsxfun (@ min, a (i, :), b (j, :))). спасибо – jperezmartin
@ user3799302 Что значит, вы не могли удалить петлю? Код, посланный в этом ответе для вычисления D, является заменой двух вложенных циклов, которые у вас есть в ядре, с: 'для i = 1: m' и' для j = 1: n', являющимися двумя циклами. – Divakar
@ user3799302 Имел ли смысл мой предыдущий комментарий? – Divakar