2017-10-05 10 views
0

私はMATLAB R2016aでLIBSvm 3.22を使用しています(ただし、既にR2017aでもテスト済みです)。x64 PCで、私のコードをランチすると変な動作があります。LibSVM for Matlab - 不安定な結果

私は、Pre-Computer Kernel(68x68、対称、対角線上のすべてゼロ)を使用しています。あなたが見ることができるように、私は同じことを2回行う

% 
    clear all 

    % 
    % 
    E1=load('..\sani_bi.mat'); 
    addpath('..\libsvm-3.22\windows\'); 
D=E1.Error_fro_sym 
D=D+D' 
labels=[zeros(34,1);ones(size(D,1)-34,1)]'; 
results = []; 
GACC=[]; 
dec_values_p = []; 
models=[]; 
rbfKernel = @(Gamma) exp(-Gamma .* D); 
for C = 25:27%21:30 
    for Gamma = -1.75:.01:1%-50:.01:25 
     eC= 2^C; 
     eG=2^Gamma; 
     K = [rbfKernel(eG)]; 
     szK=size(K,1); 
     u_param = ['-c ' num2str(eC) ' -t 4 -q']; 
     for i = 1: szK 
      % 
      ind=[1:i-1, i+1:szK]; 
      model = svmtrain(labels(ind)',[(1:szK-1)', K(ind,ind)],u_param); 
      [predict_label, accuracy, dec_values] = svmpredict(labels(i),K(i,ind), model); 
      dec_values_p=[dec_values_p; dec_values]; 
      results = [results; accuracy(1)/100]; 
      %disp([i accuracy(1)/100]); 
     end 
     value=sum(results)/szK; 
     disp(value); 
     GACC=[GACC; value, C, Gamma,sum(dec_values_p)/szK]; 
     results = []; 
     dec_values_p = []; 
    end 
end 
E=sortrows(GACC,[1]); 
save('GACC') 
%% 
clear all 

E1=load('..\sani_bi.mat'); 
E2=load('.\GACC.mat'); 
GACC=E2.GACC; 
addpath('..\libsvm-3.22\windows\'); 
D=E1.Error_fro_sym 
D=D+D' 
labels=[zeros(34,1);ones(size(D,1)-34,1)]'; 
results = []; 
GACC1=[]; 
dec_values_p = []; 
models=[]; 
rbfKernel = @(Gamma) exp(-Gamma .* D); 
for C = 25:27%21:30 
    for Gamma = -1.75:.01:1%-50:.01:25 
     eC= 2^C; 
     eG=2^Gamma; 
     K = [rbfKernel(eG)]; 
     szK=size(K,1); 
     u_param = ['-c ' num2str(eC) ' -t 4 -q']; 
     for i = 1: szK 
      % 
      ind=[1:i-1, i+1:szK]; 
      model = svmtrain(labels(ind)',[(1:szK-1)', K(ind,ind)],u_param); 
      [predict_label, accuracy, dec_values] = svmpredict(labels(i),K(i,ind), model); 
      dec_values_p=[dec_values_p; dec_values]; 
      results = [results; accuracy(1)/100]; 
      %disp([i accuracy(1)/100]); 
     end 
     value=sum(results)/szK; 
     disp(value); 
     GACC1=[GACC1; value, C, Gamma,sum(dec_values_p)/szK]; 
     results = []; 
     dec_values_p = []; 
    end 
end 


GACC(GACC(:,4) ~= GACC1(:,4),:) 

は、ここに私のコードです。しかし、必ずしも最後のコマンドが同じことを返すわけではありません。 はたまにokです:

GACC= 
0,500000000000000 27 0,970000000000000 -0,418026223801469 
0,500000000000000 27 0,980000000000000 -0,418081551411518 
0,500000000000000 27 0,990000000000000 -0,418132655182850 
0,500000000000000 27 1 -0,418184269051726 

GACC1= 
0,500000000000000 27 0,970000000000000 -0,233717714208454 
0,500000000000000 27 0,980000000000000 -0,233752196783965 
0,500000000000000 27 0,990000000000000 -0,233784292330333 
0,500000000000000 27 1 -0,233816355641198 

ともう一度実行している打つ:それは

ans = 

Empty matrix: 0-by-4 

を返されたが、時にはそれが何かを返し、(例えば)私が見ることができる2つの行列を見ていますGACC == GACC1広告、私は得る:

GACC= 
0,500000000000000 27 0,970000000000000 159857,292875661 
0,500000000000000 27 0,980000000000000 159875,372503753 
0,500000000000000 27 0,990000000000000 159891,859001955 
0,500000000000000 27 1 159908,815885524  

GACC1= 
0,220588235294118 27 0,970000000000000 -0,0149253624535754 
0,220588235294118 27 0,980000000000000 -0,0149350999202524 
0,205882352941176 27 0,990000000000000 -0,0149446308316416 
0,205882352941176 27 1 -0,0149534857047891 

そして、いくつかの実行後に、それは最初の結果に引き返す(差が発見ません)

なぜこのようなことが起こるかわかりません。私のデバッグ中には、問題がdec_valueが発散していつまで収束するかのように見える "予測"メソッドにある可能性があることがわかりましたが、LIBSvmソースを見るとseed \ random初期化を見つけることができず、 (ランダムなスタートや何か別の最適化がない)。

カーネルマトリックスの問題(精度の問題がありますか?)サポートのための

1       2,54073447948936e-11 4,23480527542159e-12 
2,54073447948936e-11  1      8,81718110217103e-12 
4,23480527542159e-12  8,81718110217103e-12 1 

ありがとう: Kは、この(べき乗されているため、対角は明らかに、すべて1である)のようなものです!

+0

[タグ:カーネル]タグは**オペレーティングシステム**カーネル用です(タグの説明を参照)。しかし、あなたの質問は、 "カーネル"という言葉の他の意味についてです。あなたの質問に、より適切なタグを使用してください。 [私はあなたの質問の話題に慣れていないので、置換のタグを提案することはできません。] – Tsyvarev

答えて

0

libSVMは、svm_binary_svc_probability関数とsvm_cross_validation関数のデータシャッフルに「C」乱数ジェネレータ(rand()関数)を使用します。

参照くださいsvm.cpp:

Line 1906:  int j = i+rand()%(prob->l-i); 
Line 2371:    int j = i+rand()%(count[c]-i); 
Line 2408:   int j = i+rand()%(l-i); 

だから、あなたがソースを修正し、安定した結果を得るためにLIBSVMを再コンパイルする必要があります。

-rndオプション(https://github.com/agdavydov81/antennaarray/tree/master/voice-noise-music/matlab/thirdpart/libsvm/src)で私のlibSVM 3.2.1フォークを試すこともできます。この場合、任意のlibSVM機能に接頭辞libを使用してください。 svmtrainの代わりにlibsvmtrainです。

+0

rand()はsvm_binary_svc_probabilityとsvm_cross_validationに表示されます。しかし: - SVMをランチ確率で設定した場合に限り、その関数にアクセスする最初のポイント:そして私は持っていません(確率パラメータのデフォルト値は0なので、ifをスキップします) - svm_cross_validationを使用しない 他のツールではなく、特にLibSVMを使用する必要があります – RicMarVr

+0

Hmmm ...あなたが正しいようです。 GACCでも訓練されたモデルを保存する方が良いかもしれません。モデルが同じ(等しくない)場合は、svmpredictの問題です。 –

関連する問題