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