2014-01-14 67 views
7

我需要预先计算在MATLAB中使用LIBSVM的直方图相交核矩阵。如何在MATLAB中矢量化相交核函数?

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

我想要做的就像计算像计算两个矩阵之间的欧氏距离的核矩阵,如pdist2(A,B,'euclidean')。定义函数'intKernel'后,我可以通过调用pdist2(A,B,intKernel)来计算交集内核。

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

'repmat'可能不可行,因为矩阵非常大,让我们说,20000乘360000。

任何帮助,将不胜感激。

问候, 彭珮云

回答

2

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

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

为避免使用repmat确实存在内存消耗,您可以使用bsxfun对单数据维度上扩展的数据应用一些基本操作。在你的情况下,你可以做以下事情:

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

对列进行求和得到一个列向量作为输出。

然后只需拨打pdist2即可完成。

+0

我之前尝试过这种表达方式,但它会导致下标赋值尺寸不匹配的错误。例如,a = rand(1,10); b = rand(10,10); (b,x,Y),1)); – Peiyun

+0

我想通了。 distance_kernel应该是: distance_kernel = @(x,Y)sum(bsxfun(@min,x,Y),2),它将对列进行求和。 – Peiyun

+0

@Peiyun是的,你是对的,我编辑我的答案。 – Bentoy13