7

我需要预先计算直方图交叉核矩阵以便在 MATLAB 中使用 LIBSVM。

假设 x, y 是两个向量。核函数是 K(x, y) = sum(min(x, y))。为了提高效率,大多数情况下的最佳实践是对操作进行矢量化。

我想要做的是计算内核矩阵,比如计算两个矩阵之间的欧几里得距离,比如 pdist2(A, B, 'euclidean')。在定义函数“intKernel”之后,我可以通过调用 pdist2(A, B, intKernel) 来计算交集核。

我知道函数“pdist2”可能是一个选项。但我不知道如何编写自定义距离函数。虽然,我不知道如何在一个浓缩表达式中对向量(1×M)和矩阵(M×N)之间的交集内核进行编码。

'repmat' 可能不可行,因为矩阵真的很大,比如说 20000×360000。

任何帮助,将不胜感激。

问候,裴云

4

1 回答 1

2

我认为pdist2是一个不错的选择,所以我帮助您定义距离函数。

根据文档,自定义距离函数必须有 2 个输入:第一个是 1×N 向量;第二个是 M×N 矩阵(注意顺序!)。

为了避免使用repmatwhich 确实是内存消耗的,您可以使用bsxfun对数据应用一些基本操作,并在单维维度上进行扩展。在您的情况下,您可以执行以下操作:

distance_kernel = @(x,Y) sum(bsxfun(@min,x,Y),2);

对列进行求和以获得列向量作为输出。

然后只需打电话pdist2,你就完成了。

于 2014-01-14T13:35:06.820 回答