2016-05-21 2 views
1

Я никогда не использовал matlab, и у меня есть этот код около kernalized locality sensitive functions.Создание матрицы ядра матрицы радиальной матрицы в matlab

Я думаю, что следующий код пытается создать kernalized матрицу RBF kernel function:

%demo script for KLSH 
X = load('iris.mtx'); 
... 
[n,d] = size(X); 

%form RBF over the data: 
nms = sum(X'.^2); 
K = exp(-nms'*ones(1,n) -ones(n,1)*nms + 2*X*X'); 

Вы можете найти весь код here и, в частности, этот код в demo.m.

Теперь я не могу найти корреляцию как K (матрица ядра) вычисляется и функция ядра формулу:

enter image description here

Можете ли вы помочь мне понять, как K создается (и объяснить мне код выше) пожалуйста?

+0

родственный: http://stackoverflow.com/questions/17690132/what-is-the-algorithm-for-an-rbf-kernel-matrix-in-matlab –

ответ

5

Весь трюк основан на том, что вы хотите эффективно вычислить матрицу K_ij = K (x_i, x_j) = f (|| x_i - x_j ||^2). Матричные вычисления основаны на точечных произведениях, поэтому умножения, а не на норму разницы. Если вы не хотите использовать циклы (и на таких языках, как Matlab или R, которые вы не хотите), вам нужно выяснить, как выразить это || x_i-x_j ||^2 с использованием матричных операций, таким образом:

||x_i - x_j||^2 = <x_i - x_j, x_i - x_j> 
       = <x_i, x_i> - <x_i, x_j> - <x_j, x_i> + <x_j, x_j> 
       = ||x_i||^2 - 2<x_i, x_j> + ||x_j||^2 

, и это именно то, что реализуется

Сначала они берут квадрат ваших данных, так как || x_i ||^2 = SUM_a x_i_a^2

nms = sum(X'.^2); 

затем они используют умножение вектора единиц для вычисления суммы операции получения

nms'*ones(1,n) 

который является вектор || x_i ||^2, и аналогично вектор || x_j ||^2 является

ones(n,1)*nms 

и, наконец, они составляют, используя разложение Я уже писал, что

-nms'*ones(1,n) -ones(n,1)*nms + 2*X*X') 

просто матрица A_ij = - || x_i - x_j ||^2

в вашем случае, вы хотите иметь деление на 2sigma^2, таким образом, просто положить его под ехр, после принятия предыдущего arugment в Кронштейны, как

Ks = exp(-(nms'*ones(1,n) -ones(n,1)*nms + 2*X*X')/(2*sigma^2)); 
+0

Только один (вероятно, немой) вопрос: почему || x_i - x_j ||^2 = ? – justHelloWorld

+0

это (одно из возможных) определений нормы '|| a ||^2 = SUM_i a_i^2 = SUM_i a_i * a_i = ' – lejlot

+0

Странным в этом решении является то, что они устранили/(2 * sigma^2)) часть ... даже используя sigma = 1, она все еще/2, которой нет. Ну, в любом случае отличный ответ, спасибо: D – justHelloWorld

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