我从未使用过matlab,而且我有关于kernalized locality sensitive functions的代码。
我认为以下代码正在尝试创建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');
现在,我找不到计算K
(核心矩阵)的相关性和核函数公式:
你能帮我弄清楚如何创建K
(并解释上面的代码)吗?
答案 0 :(得分:7)
整个技巧基于以下事实:您希望以有效的方式计算矩阵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);
接下来,他们使用乘法与1的向量来计算求和的运算
nms'*ones(1,n)
是|| x_i || ^ 2&s的矢量,类似矢量|| x_j || ^ 2&s;是
ones(n,1)*nms
最后他们使用我之前写的分解来构成,因此
-nms'*ones(1,n) -ones(n,1)*nms + 2*X*X')
只是一个矩阵A_ij = - || x_i - x_j || ^ 2
在你的情况下,你希望除以2sigma ^ 2,因此只需将它放在exp之后,在括号中进行先前的调整,例如
Ks = exp(-(nms'*ones(1,n) -ones(n,1)*nms + 2*X*X')/(2*sigma^2));