我从未使用过MATLAB,我有一段关于核化局部敏感函数的代码。
我认为下面的代码试图创建一个RBF核函数的核化矩阵:
%demo script for KLSHX = 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
(核矩阵)的计算与核函数公式之间的关联:
你能帮我弄清楚K
是如何创建的(并解释上面的代码)吗?
回答:
整个技巧基于这样一个事实:你想以高效的方式计算矩阵 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,因此只需将它放在 exp 函数下,在之前的参数上加上括号,如下所示
Ks = exp(-(nms'*ones(1,n) -ones(n,1)*nms + 2*X*X')/(2*sigma^2));