2016-11-17 6 views
-1

私は分類のためにSVMを実装しようとしています。目標は、電源信号(.wavファイル)の原点の正しいグリッドを出力することです。グリッドはA-Iと表記されており、訓練セットと練習用信号には合計93の信号があります。私は特徴ベクトルの93x10x36マトリックスを持っています。なぜ誰かがエラーを表示するのか知っていますか? TrainCorrectGridとTraining_Cepstrum1の両方に93行があるため、問題の内容を理解できません。どんな助けでも大歓迎です。Matlab SVMの例

私のコードを以下に示します。

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

multisvm機能を次に示します。

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

これは、画像へのリンクではなく、質問のテキストにコードとエラーメッセージを入れた方が簡単に答えることができます。 – doctorlove

答えて

0

あなたはTraining_Cepstrum1サイズ[93,10,36]を持っていると述べています。しかし、multisvmに電話すると、サイズが[1,10]のTraining_Cepstrum1(93,:,1)しか渡されません。 TrainCorrectGridのサイズは[93,1]であるため、行数に不一致があります。

Practice_Cepstrum1aを渡すときに同じエラーが発生したようです。

は、この方法でTraining_Cepstrum1(:,:,1)サイズ[93,10]、TrainCorrectGridと同じ行数を持つ

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

multisvmにお電話を交換してみてください。

+0

ありがとうございます。出来た。 – user6132277

+0

multisvmがどのように意思決定しているのか知っていますか?私は、マルチスクリーン・アルゴリズムがどのように裏で働いているか、私の頭を払うことはできません – user6132277