2016-11-17 3 views
-1

Ich versuche SVM für die Klassifizierung zu implementieren. Ziel ist es, das korrekte Ursprungsgitter eines Stromsignals (.wav-Datei) auszugeben. Die Gitter haben den Titel A-I und es gibt insgesamt 93 Signale für das Training und 49 Übungssignale. Ich habe eine 93x10x36 Matrix von Feature-Vektoren. Weiß jemand, warum ich die Fehler bekomme? TrainCorrectGrid und Training_Cepstrum1 haben beide 93 Zeilen, daher verstehe ich das Problem nicht. Jede Hilfe wird sehr geschätzt.Matlab SVM Beispiel

Mein Code wird hier gezeigt:

clc; clear; close all; 

load('avg_fft_feature (4).mat'); %training feature vectors 
load('practice_fft_Mag_all (2).mat'); %practice feauture vectors 
load('practice_GridOrigin.mat'); %correct grids of origin for practice data 
load PracticeCorrectGrid.mat; 
load Training_Cepstrum1; 
load Practice_Cepstrum1a; 
load fSet1.mat %load in correct practice grids 

TrainCorrectGrid=['A';'A';'A';'A';'A';'A';'A';'A';'A';'B';'B';'B';'B';'B';'B';'B';'B';'B';'B';'C';'C';'C';'C';'C';'C';'C';'C';'C';'C';'C';'D';'D';'D';'D';'D';'D';'D';'D';'D';'D';'D';'E';'E';'E';'E';'E';'E';'E';'E';'E';'E';'E';'F';'F';'F';'F';'F';'F';'F';'F';'G';'G';'G';'G';'G';'G';'G';'G';'G';'G';'G';'H';'H';'H';'H';'H';'H';'H';'H';'H';'H';'H';'I';'I';'I';'I';'I';'I';'I';'I';'I';'I';'I']; 
%[results,u] = multisvm(avg_fft_feature, TrainCorrectGrid, avg_fft_feature_practice);%avg_fft_feature); 
[results,u] = multisvm(Training_Cepstrum1(93,:,1), TrainCorrectGrid, Practice_Cepstrum1a(49,:,1)); 
disp('Grids of Origin (SVM)'); 

%Display SVM Results 
for i = 1:numel(u) 
    str = sprintf('%d: %s', i, u(i)); 
    disp(str); 
end 

%Display Percent Correct 
numCorrect = 0; 
for i = 1:numel(u) 
    %if (strcmp(TrainCorrectGrid(i,1), u(i))==1); %compare training to 
    %training 
    if (strcmp(PracticeCorrectGrid(i,1), u(i))==1); %compare practice data to training 
     numCorrect = numCorrect + 1; 
    end 
end 
numberOfElements = numel(u); 
percentCorrect = numCorrect/numberOfElements * 100; 
% percentCorrect = round(percentCorrect, 2); 
dispPercent = sprintf('Percent Correct = %0.3f%%', percentCorrect); 
disp(dispPercent); 

error shown here

Die multisvm Funktion hier gezeigt wird:

function [result, u] = multisvm(TrainingSet,GroupTrain,TestSet) 
%Models a given training set with a corresponding group vector and 
%classifies a given test set using an SVM classifier according to a 
%one vs. all relation. 
% 
%This code was written by Cody Neuburger [email protected] 
%Florida Atlantic University, Florida USA and slightly modified by Renny Varghese 
%This code was adapted and cleaned from Anand Mishra's multisvm function 
%found at http://www.mathworks.com/matlabcentral/fileexchange/33170-multi-class-support-vector-machine/ 

u=unique(GroupTrain); 
numClasses=length(u); 
result = zeros(length(TestSet(:,1)),1); 

%build models 
for k=1:numClasses 
    %Vectorized statement that binarizes Group 
    %where 1 is the current class and 0 is all other classes 
    G1vAll=(GroupTrain==u(k)); 
    models(k) = svmtrain(TrainingSet,G1vAll); 
end 

%classify test cases 
for j=1:size(TestSet,1) 
    for k=1:numClasses 
     if(svmclassify(models(k),TestSet(j,:))) 
      break; 
     end 
    end 
    result(j) = k; 
end 

mapValues = 'ABCDEFGHI'; 
u = mapValues(result); 
+0

Dies ist einfacher zu beantworten, wenn Sie den Code und die Fehlermeldung in den Text der Frage und nicht als Links zu Bildern einfügen. – doctorlove

Antwort

0

Sie feststellen, dass Training_Cepstrum1 Größe hat [93,10,36]. Aber wenn Sie multisvm anrufen, übergeben Sie nur Training_Cepstrum1(93,:,1), die Größe [1,10] hat. Da TrainCorrectGrid die Größe [93,1] hat, stimmt die Anzahl der Zeilen nicht überein.

Es sieht aus wie Sie den gleichen Fehler machen, wenn Sie Practice_Cepstrum1a übergeben.

Versuchen Sie Ihren Anruf multisvm mit

[results,u] = multisvm(Training_Cepstrum1(:,:,1), TrainCorrectGrid, Practice_Cepstrum1a(:,:,1)); 

Auf diese Weise Training_Cepstrum1(:,:,1) Größe hat [93,10], die gleiche Anzahl von Zeilen wie TrainCorrectGrid ersetzen.

+0

Vielen Dank. Es funktionierte. – user6132277

+0

Wissen Sie, wie Multisvm Entscheidungen trifft? Ich kann mir nicht vorstellen, wie der Multisvm-Algorithmus hinter den Kulissen funktioniert – user6132277