在matlab中创建径向基函数核矩阵

时间:2016-05-21 11:22:20

标签: matlab matrix machine-learning

我从未使用过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');

您可以在here中找到整个代码demo.m,特别是此代码。

现在,我找不到计算K(核心矩阵)的相关性和核函数公式:

enter image description here

你能帮我弄清楚如何创建K(并解释上面的代码)吗?

1 个答案:

答案 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));