【问题标题】:How to vectorize the intersection kernel function in MATLAB?如何在MATLAB中对交叉核函数进行向量化?
【发布时间】:2014-02-02 13:38:12
【问题描述】:

我需要预先计算直方图交叉核矩阵,以便在 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。

任何帮助将不胜感激。

问候, 沛云

【问题讨论】:

    标签: matlab vector vectorization bsxfun


    【解决方案1】:

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

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

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

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

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

    然后只需拨打pdist2就可以了。

    【讨论】:

    • 我之前试过这种表达方式,但是会导致下标赋值维度不匹配的错误。例如,a = rand(1, 10); b = 兰德(10, 10); pdist2(a, b, @(x, Y) sum(bsxfun(@min, x, Y), 1));
    • 我想通了。 distance_kernel 应该是:distance_kernel = @(x, Y) sum(bsxfun(@min, x, Y), 2),它将对列求和。
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2011-12-10
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多