RBF高斯徑向基核函數-svm

RBF高斯徑向基核函數(單值:兩個點相似性)


XVec表示X向量。||XVec||表示向量長度。

r表示兩點距離。r^2表示r的平方。

k(XVec,YVec) = exp(-1/(2*sigma^2)*(r^2))

= exp(-gamma*r^2)...... 公式-1

這裏, gamma=1/(2*sigma^2)是參數, r=||XVec-YVec||

實際上,可看作是計算2個點X與Y的相似性。很多參考書上,把YVec寫作XVec',即 k(XVec, XVec'),也是一樣的含義:兩點相似性。由於Matlab上面XVec'代表XVec的轉置向量(XVec)T,所以,爲規避歧義,我記作k(XVec,YVec)。如:LibSVM代碼,機器學習經典教材《Pattern Recognition and Machine Learning -Bishop》P312.(三大牛人鉅著: Michael I. Jordan,加州大學伯克利分校計算機系/Jon Kleinberg,康奈爾大學計算機系/Bernhard Schlkopf德國蒂賓根馬普所)。

r是半徑(radial),這也是徑向基核函數(radial basis function)名稱的由來。


很容易,寫出高斯RBF matlab代碼:

r = norm(XVec-YVec, 2); % L2範數嘛

或者: r = sum((XVec-YVec).^2)^(1/2);

k = exp(-gamma*r^2);


假設X與Y矩陣的每一行是一個樣本,如何求得K(X,Y)?

假若X = train_data是訓練數據, K(X,X)是訓練核矩陣,可拿去LibSVM做自定義核訓練。當然,這裏只是童鞋們的一個練習。LibSVM svmtrain有RBF核(-t 2)。

假若X = test_data 是測試數據, Y = train_data 是訓練數據, 那麼 K(X,Y)是測試核矩陣了。(svmpredict)


MatLab下,核矩陣怎麼求更高效?去掉for循環!

推導下。

MatLab下,X'代表X的轉置矩陣。

r^2 = ||XVec - YVec||^2

= ||XVec||^2 + ||YVec||^2 - 2*XVec*YVec'

= XVec*XVec' + YVec*YVec' - 2*XVec*YVec'

r^2 = repmat( sum(X.^2,2), 1, size(Y,1) ) ...

+ repmat( sum(Y.^2,2), 1, size(X,1) )' ...

- 2*X*Y' ;

代入公式-1, 得到高斯徑向基RBF核矩陣KRBF = K(X, Y):

KRBF = exp(-gamma*r^2); % RBF核矩陣

在LibSVM中,gamma默認是:1/num_features , 即X與Y的列數。

假若X是m×d矩陣, Y是n×d矩陣,則KRBF = K(X, Y)是m×n矩陣;

則KRBF = K(Y, Y)是n×n矩陣。

例如:Corel5k圖片庫,提取出Gist全局視覺特徵,訓練數據4500×512矩陣Y,測試數據499×512矩陣X,特徵數num_features = 512,那麼 默認值 gamma = 1/512;


高斯徑向基RBF核矩陣KRBF 寫成MatLab函數:

function KMatrix = getKRBF(X, Y, gamma)

r2 = repmat( sum(X.^2,2), 1, size(Y,1) ) ...

+ repmat( sum(Y.^2,2), 1, size(X,1) )' ...

- 2*X*Y' ; % r^2(r的平方)

KMatrix = exp(-gamma*r2);


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章