2014-01-14 10 views
7

Мне нужно предварительно вычислить матрицы ядра пересечения гистограммы для использования LIBSVM в MATLAB.Как векторизовать функцию ядра пересечения в MATLAB?

Предположим, что x, y - два вектора. Ядро-функция K (x, y) = sum (min (x, y)). Чтобы быть эффективными, в большинстве случаев наилучшей практикой является векторизация операций.

Я хочу сделать так, чтобы вычислить матрицы ядра, такие как вычисление евклидова расстояния между двумя матрицами, например pdist2 (A, B, 'euclidean'). После определения функции «intKernel» я смог вычислить ядро ​​пересечения, вызвав pdist2 (A, B, intKernel).

Я знаю, что функция 'pdist2' может быть вариантом. Но я не знаю, как написать самоопределяемую функцию расстояния. Хотя я не знаю, как закодировать ядро ​​пересечения между вектором (1-by-M) и матрицей (M-by-N) в одном конденсированном выражении.

«repmat» может быть невыполнимым, потому что матрица действительно большая, скажем, 20000 на 360000.

Любая помощь будет оценена по достоинству.

С уважением, Peiyun

ответ

2

Я думаю pdist2 это хороший вариант, поэтому я могу помочь вам определить вашу функцию расстояния.

Согласно документу, заданная функция расстояния должна иметь 2 входа: первый - вектор 1 на-N; вторая - матрица M-by-N (будьте осторожны с порядком!).

Чтобы избежать использования repmat, который действительно является потребляемой памятью, вы можете использовать bsxfun, чтобы применить некоторые основные операции с данными с расширением по размерности синглтона. В вашем случае, вы можете сделать следующее вещь:

distance_kernel = @(x,Y) sum(bsxfun(@min,x,Y),2); 

Суммирование производится по столбцам, чтобы получить вектор-столбец в качестве вывода.

Тогда просто позвоните pdist2, и все готово.

+0

Я пробовал это выражение раньше, в то время как это вызовет ошибку для несоразмерного несоответствия размеров подзаголовков. Например, a = rand (1, 10); b = rand (10, 10); pdist2 (a, b, @ (x, Y) sum (bsxfun (@min, x, Y), 1)); – Peiyun

+0

Я понял. Расстояние_квадрат должно быть: distance_kernel = @ (x, Y) sum (bsxfun (@min, x, Y), 2), и оно будет суммировать по столбцам. – Peiyun

+0

@Peiyun Да, вы правы, я редактирую свой ответ. – Bentoy13

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