簡體   English   中英

使用我自己的內核函數時出現SVM分類錯誤-Matlab

[英]SVM Classification error when using my own kernel function - Matlab

我正在嘗試實現svmtrain函數。 它在訓練中起作用,並且在分類與訓練矩陣相同數量的樣本的樣本矩陣時起作用。 我做錯了什么?

主功能

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

為什么在使用不同大小的訓練和分類矩陣時不起作用?

我認為您的RBF內核功能不正確( diag部分不正確)...

請嘗試以下向量化的實現(請參見此處此處的資源 ):

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

並將其用作:

c = 1; gamma = 1;
model = svmtrain(Xtrain, Ytrain, 'Kernel_Function',@(u,v) rbf(u,v,gamma), ...
    'BoxConstraint',c);
Ytest_hat = svmclassify(model, Xtest);

實際上,如果您查看MATLAB自己的RBF內核的私有實現( which -all rbf_kernel ),則會看到它正在使用類似的技巧(僅使用repmat而不是更有效的bsxfun

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM