2014-06-25 24 views
1

我想实现一个svmtrain函数。它在训练时起作用,它在对训练矩阵进行分类的采样数相同的样本矩阵时起作用。我做错了什么?使用我自己的内核函数时的SVM分类错误 - Matlab

主要功能

function [ output_args ] = RBFTest(xtrain, ytrain) 
output_args=svmtrain(xtrain,ytrain,'Kernel_Function',@mine,... 
'boxconstraint',1); 
end 

核函数(其设定为与RBF内核,我试图加速使用GPU)

function [ output ] = mine(U,V) 
sig=1; 
n=size(U,1); 
K=U*V'/sig^2; 
d=diag(K); 
K=K-ones(n,1)*d'/2; 
K=K-d*ones(1,n)/2; 
output=exp(K); 
end 

我训练....

>> R2=RBFTest(X(1:3000,:),Y(1:3000,:)) 

R2 = 

      SupportVectors: [3000x57 double] 
        Alpha: [3000x1 double] 
        Bias: -0.0219 
      KernelFunction: @mine 
     KernelFunctionArgs: {} 
       GroupNames: [3000x1 double] 
    SupportVectorIndices: [3000x1 double] 
       ScaleData: [1x1 struct] 
      FigureHandles: [] 

我尝试对样本中较小的一部分进行分类...但它不起作用

>> mean(svmclassify(R2,X(1:2000,:))==Y(1:2000)) 
Error using svmclassify (line 114) 
An error was encountered during classification. 
Matrix dimensions must agree. 

我尝试分类相同的数据用于训练...工作!

>> mean(svmclassify(R2,X(1:3000,:))==Y(1:3000)) 

ans = 

    0.9990 

我再培训与较小的样本....

>> R2=RBFTest(X(1:1000,:),Y(1:1000,:)) 

R2 = 

      SupportVectors: [1000x57 double] 
        Alpha: [1000x1 double] 
        Bias: -0.0549 
      KernelFunction: @mine 
     KernelFunctionArgs: {} 
       GroupNames: [1000x1 double] 
    SupportVectorIndices: [1000x1 double] 
       ScaleData: [1x1 struct] 
      FigureHandles: [] 

我归类不同的样本,但使用相同的矩阵和矢量大小...以及它的工作原理

>> mean(svmclassify(R2,X(1001:2000,:))==Y(1001:2000)) 

ans = 

    0.4610 

为什么它不使用不同大小的训练和分类矩阵时不工作?

回答

0

我不认为你的RBF核函数是正确的(与diag的部分不右看看)...

试试下面的矢量,而不是执行(见来源herehere):

function K = rbf(U, V, sigma) 
    if nargin < 3, sigma = 1; end 
    %K = pdist2(U, V, 'euclidean').^2; 
    K = bsxfun(@plus, sum(U.^2,2), sum(V.^2,2).') - 2*(U*V'); 
    K = exp(-K ./ (2*sigma^2)); 
end 

,并用它作为:

事实上,如果你看看MATLAB自己的私人是否履行离子的RBF内核(which -all rbf_kernel),你会发现它使用的是类似的技巧(仅用于repmat而不是效率更高的bsxfun

+0

非常感谢!现在它工作! – user3774343