在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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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