Libsvm自定義核函數【轉】

1. 使用libsvm工具箱時,能夠指定使用工具箱自帶的一些核函數(-t參數),主要有:函數

-t kernel_type : set type of kernel function (default 2)工具

  • 0 -- linear: u'*v
  • 1 -- polynomial: (gamma*u'*v + coef0)^degree
  • 2 -- radial basis function: exp(-gamma*|u-v|^2)
  • 3 -- sigmoid: tanh(gamma*u'*v + coef0)

2. 有時咱們須要使用本身的核函數,這時候能夠用 -t 4參數來實現:測試

-t kernel_type : set type of kernel function (default 2)
4 -- precomputed kernel (kernel values in training_instance_matrix)spa

使用-t 4參數時,再有了核函數後,須要給出核矩陣,關於核函數以及核函數構造相關的知識,你們能夠看看相關書籍,在此不特別深刻說明。code

好比線性核函數 是 K(x,x') = (x * x'),設訓練集是train_data,設訓練集有150個樣本 , 測試集是test_data,設測試集有120個樣本
則 訓練集的核矩陣是 ktrain1 = train_data*train_data'
測試集的核矩陣是 ktest1 = test_data*train_data'
想要使用-t 4參數還須要把樣本的序列號放在覈矩陣前面 ,造成一個新的矩陣,而後使用svmtrain創建支持向量機,再使用svmpredict進行預測便可。形式與使用其餘-t參數少有不一樣,以下:orm

ktrain1 = train_data*train_data';
Ktrain1 = [(1:150)',ktrain1];
 
model_precomputed1 = svmtrain(train_label, Ktrain1, '-t 4');  % 注意此處的 輸入 Ktrain1
 
ktest1 = test_data*train_data';
Ktest1 = [(1:120)', ktest1];
 
[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label,Ktest1,model_precomputed1); % 注意此處輸入Ktest1</pre>

下面是一個總體的小例子,你們能夠看一下:blog

%% Use_precomputed_kernelForLibsvm_example
% faruto
% last modified by 2011.04.20
%%
tic;
clear;
clc;
close all;
format compact;
%%
load heart_scale.mat;
% Split Data
train_data = heart_scale_inst(1:150,:);
train_label = heart_scale_label(1:150,:);
test_data = heart_scale_inst(151:270,:);
test_label = heart_scale_label(151:270,:);
 
%% Linear Kernel
model_linear = svmtrain(train_label, train_data, '-t 0');
[predict_label_L, accuracy_L, dec_values_L] = svmpredict(test_label, test_data, model_linear);
 
%% Precomputed Kernel One
% 使用的核函數 K(x,x') = (x * x')
% 核矩陣
ktrain1 = train_data*train_data';
Ktrain1 = [(1:150)',ktrain1];
model_precomputed1 = svmtrain(train_label, Ktrain1, '-t 4');
ktest1 = test_data*train_data';
Ktest1 = [(1:120)', ktest1];
[predict_label_P1, accuracy_P1, dec_values_P1] = svmpredict(test_label, Ktest1, model_precomputed1);
 
%% Precomputed Kernel Two
% 使用的核函數 K(x,x') = ||x|| * ||x'||
% 核矩陣
ktrain2 = ones(150,150);
for i = 1:150
 for j = 1:150
 ktrain2(i,j) = sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
 end
end
Ktrain2 = [(1:150)',ktrain2];
model_precomputed2 = svmtrain(train_label, Ktrain2, '-t 4');
 
ktest2 = ones(120,150);
for i = 1:120
 for j = 1:150
 ktest2(i,j) = sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5;
 end
end
Ktest2 = [(1:120)', ktest2];
[predict_label_P2, accuracy_P2, dec_values_P2] = svmpredict(test_label, Ktest2, model_precomputed2);
%% Precomputed Kernel Three
% 使用的核函數 K(x,x') = (x * x') / ||x|| * ||x'||
% 核矩陣
ktrain3 = ones(150,150);
for i = 1:150
 for j = 1:150
 ktrain3(i,j) = ...
 train_data(i,:)*train_data(j,:)'/(sum(train_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
 end
end
Ktrain3 = [(1:150)',ktrain3];
model_precomputed3 = svmtrain(train_label, Ktrain3, '-t 4');
 
ktest3 = ones(120,150);
for i = 1:120
 for j = 1:150
 ktest3(i,j) = ...
 test_data(i,:)*train_data(j,:)'/(sum(test_data(i,:).^2)^0.5 * sum(train_data(j,:).^2)^0.5);
 end
end
Ktest3 = [(1:120)', ktest3];
[predict_label_P3, accuracy_P3, dec_values_P3] = svmpredict(test_label, Ktest3, model_precomputed3);
 
 
%% Display the accuracy
accuracyL = accuracy_L(1) % Display the accuracy using linear kernel
accuracyP1 = accuracy_P1(1) % Display the accuracy using precomputed kernel One
accuracyP2 = accuracy_P2(1) % Display the accuracy using precomputed kernel Two
accuracyP3 = accuracy_P3(1) % Display the accuracy using precomputed kernel Three
%%
toc;

運行結果:it

Accuracy = 85% (102/120) (classification)
Accuracy = 85% (102/120) (classification)
Accuracy = 67.5% (81/120) (classification)
Accuracy = 84.1667% (101/120) (classification)
accuracyL =
 85
accuracyP1 =
 85
accuracyP2 =
 67.5000
accuracyP3 =
 84.1667
Elapsed time is 1.424549 seconds.

 3. 交叉驗證io

accuracy = svmtrain(train_label, Ktrain1, '-t 4 -v 10');  ast

相關文章
相關標籤/搜索