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

我从未使用过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(核矩阵)的计算与核函数公式之间的关联:

enter image description here

你能帮我弄清楚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));

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注