2014-01-14 66 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