【问题标题】:Creating a Radial basis function kernel matrix in matlab在matlab中创建径向基函数核矩阵
【发布时间】:2016-09-18 15:18:44
【问题描述】:

我从来没有用过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(核矩阵)的计算方式与核函数公式的相关性:

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

【问题讨论】:

标签: matlab matrix machine-learning


【解决方案1】:

整个技巧基于这样一个事实,即您希望以有效的方式计算矩阵 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));

【讨论】:

  • 只有一个(可能是愚蠢的)问题:为什么 ||x_i - x_j||^2 =
  • 这是规范||a||^2 = SUM_i a_i^2 = SUM_i a_i * a_i = &lt;a, a&gt;的(可能的)定义之一
  • 这个解决方案的奇怪之处在于他们消除了 /(2*sigma^2)) 部分......即使使用 sigma=1,它仍然是 /2,它不存在。好吧,无论如何很好的答案,谢谢:D
  • 他们假设 sigma 等于 1/sqrt(2)
猜你喜欢
  • 1970-01-01
  • 2010-11-03
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多