我需要预先计算直方图交集核矩阵,以便在 MATLAB 中使用 LIBSVM。
假设 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 x 360000。
如有任何帮助,我们将不胜感激。
问候,佩云
我认为 pdist2
是一个不错的选择,所以我帮助您定义距离函数。
根据文档,自定义距离函数必须有 2 个输入:第一个是 1×N 向量;第二个是 M×N 矩阵(注意顺序!)。
要避免使用确实占用内存的 repmat
,您可以使用 bsxfun
对数据应用一些基本操作,并扩展到单例维度。对于您的情况,您可以执行以下操作:
distance_kernel = @(x,Y) sum(bsxfun(@min,x,Y),2);
对列进行求和以获得列向量作为输出。
然后只需调用 pdist2
即可。
我是一名优秀的程序员,十分优秀!