Zajmuję się trochę SVM-ami i w matlabie 7.7.0 wraz z bioinformatic toolbox zauważyłem funkcję svmtrain(). W helpie wyczytałem że można utworzyć własne funkcje jądra, zmodyfikowałem trochę typową rbf, i chciałem wstawić ją jako funkcję jądra do svmtrain. Za pomocą help svmtrain i zamieszczonymi tam informacjami i zmodyfikowałem przykładowy program.
Moje dane to szachownica.
- Kod: Zaznacz wszystko
data =
1.0000 1.0000
2.0000 1.0000
3.0000 1.0000
1.5000 1.5000
2.5000 1.5000
1.0000 2.0000
2.0000 2.0000
3.0000 2.0000
1.5000 2.5000
2.5000 2.5000
1.0000 3.0000
2.0000 3.0000
3.0000 3.0000
4.0000 1.0000
5.0000 1.0000
6.0000 1.0000
4.5000 1.5000
5.5000 1.5000
4.0000 2.0000
5.0000 2.0000
6.0000 2.0000
4.5000 2.5000
5.5000 2.5000
4.0000 3.0000
5.0000 3.0000
6.0000 3.0000
1.0000 4.0000
2.0000 4.0000
3.0000 4.0000
1.5000 4.5000
2.5000 4.5000
1.0000 5.0000
2.0000 5.0000
3.0000 5.0000
1.5000 5.5000
2.5000 5.5000
1.0000 6.0000
2.0000 6.0000
3.0000 6.0000
4.0000 4.0000
5.0000 4.0000
6.0000 4.0000
4.5000 4.5000
5.5000 4.5000
4.0000 5.0000
5.0000 5.0000
6.0000 5.0000
4.5000 5.5000
5.5000 5.5000
4.0000 6.0000
5.0000 6.0000
6.0000 6.0000
groups =
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
Stworzyłem funkcję jądra nazwana erbf i umieściłem w pliku erbf.m
- Kod: Zaznacz wszystko
function k = erbf(u,v)
k = exp(-sqrt((u-v)*(u-v)')/(2*10^2));
Następnie staram się uruchomić zmodyfikowany przykładowy program
- Kod: Zaznacz wszystko
% Randomly select training and test sets
[train, test] = crossvalind('holdOut',groups);
cp = classperf(groups);
% Use a linear support vector machine classifier
svmStruct = svmtrain(data(train,:),groups(train),'showplot',true,'KERNEL_FUNCTION',@erbf);
% Add a title to the plot
title(sprintf('Kernel Function: %s',...
func2str(svmStruct.KernelFunction)),...
'interpreter','none');
% Classify the test set using svmclassify
classes = svmclassify(svmStruct,data(test,:),'showplot',true);
% See how well the classifier performed
classperf(cp,classes,test);
cp.CorrectRate
Wtedy wyskakują mi następujące błędy:
- Kod: Zaznacz wszystko
??? Error using ==> minus
Matrix dimensions must agree.
Error in ==> erbf at 2
k = exp(-sqrt((u-v)*(u-v)')/(2*10^2));
Error in ==> svmdecision at 13
f = (feval(kfun,sv,Xnew,kfunargs{:})'*alphaHat(:)) + bias;
Error in ==> svmplotsvs at 30
[dummy, Z] = svmdecision([X(:),Y(:)],svm_struct);
Error in ==> svmtrain at 522
hSV = svmplotsvs(hAxis,hLines,groupString,svm_struct);
Niestety nie wiem skąd one się wzięły i co należy zmodyfikować aby one zniknęły. Mógłby ktoś pomóc, lub dać jakieś wskazówki? Wiem że to musi być coś z moją funkcją jądra. Na oryginalnych (np 'rbf') działa dobrze.
Z góry wielkie dzięki i przepraszam jeśli umieściłem temat w złym dziale.