Mercurial > hg > emotion-detection-top-level
view Code/Classifiers/SVM_MFCC_Singing.m @ 4:92ca03a8fa99 tip
Update to ICASSP 2013 benchmark
author | Dawn Black |
---|---|
date | Wed, 13 Feb 2013 11:02:39 +0000 |
parents | |
children |
line wrap: on
line source
function [] = SVM_MFCC_Singing( varargin ) cd 'C:\Users\dawn\Dropbox\TestResults' DEBUG = 1; % output results file name masterFileOutputID = fopen( 'SVM_Singing_MFCC_VoicedAndUnvoiced_Unsmoothed.txt', 'a' ); % input results file name inputFileName = 'singingMFCCStats_VoicedAndUnvoiced_Unsmoothed.txt'; fprintf( masterFileOutputID, '\n RESULTS FILE NAME: %s\n', inputFileName); inputFileID = fopen( inputFileName ); noOfArguments = length(varargin); outputFileName = 'individualResults/SVM_Results_'; resultsFileName = 'SVM_Results_'; titleName = ''; for i=1 : noOfArguments titleName = [ titleName varargin{i} '_']; fprintf( masterFileOutputID, '%s_', varargin{i} ); end outputFileName = [ outputFileName titleName ]; resultsFileName = [ resultsFileName titleName ]; fprintf( masterFileOutputID, '\t' ); outputFileName = [ outputFileName '.txt']; resultsFileName = [ resultsFileName '.txt']; fileOutputID = fopen( outputFileName, 'w' ); fileSVMOutputID = fopen( resultsFileName, 'w' ); % -------------------- get the data from the results file --------------- lineCount = 0; fileCount = 0; data = []; groups = []; while( ~(feof(inputFileID)) ) outputValues = []; thestr = fgetl(inputFileID); fileCount = fileCount + 1; % determine whether we have a positive or negative sample sampleEmotion( fileCount ) = 'U'; if( ~(isempty(strfind(thestr,'pos')))) % sample is positive sampleEmotion( fileCount ) = 'P'; groups( fileCount ) = 1; elseif( ~(isempty(strfind(thestr,'neg')))) % sample is negative sampleEmotion( fileCount ) = 'N'; groups( fileCount ) = 0; else disp('EEEK!'); pause; end % determine whether we have a male, female or trans sample gender( fileCount ) = '?'; if( ~(isempty(strfind(thestr,'fem')))) % gender is female gender( fileCount ) = 'F'; elseif( ~(isempty(strfind(thestr,'male')))) % gender is male gender( fileCount ) = 'M'; elseif( ~(isempty(strfind(thestr,'trans')))) % gender is trans gender( fileCount ) = 'T'; else disp('EEEK!'); pause; end %how many values are in the string? spaces = strfind( thestr, ' ' ); numberstr = thestr( spaces(1) : end ); % chop off the file name vars = sscanf( numberstr, '%f', inf ); data( fileCount, : ) = vars; lineCount = lineCount + 1; end fclose(inputFileID); % ------------ apply the SVM classifier ------------------------ G1E1 = []; G1E2 = []; G2E1 = []; G2E2 = []; UE1 = []; UE2 = []; noOfIterations = 10; for n = 1:noOfIterations % 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); classes = svmclassify(svmStruct,data(test,:),'showplot',true); % See how well the classifier performed classperf(cp,classes,test); numbers = cp.CountingMatrix; G1E1(n) = numbers(1,1); G1E2(n) = numbers(1,2); G2E1(n) = numbers(2,1); G2E2(n) = numbers(2,2); UE1(n) = numbers(3,1); UE2(n) = numbers(3,2); end G1E1 = sum(G1E1) / noOfIterations; G1E2 = sum(G1E2) / noOfIterations; G2E1 = sum(G2E1) / noOfIterations; G2E2 = sum(G2E2) / noOfIterations; fprintf( fileOutputID, '\n' ); fclose( fileOutputID ); fprintf( fileSVMOutputID, '\n' ); fclose( fileSVMOutputID ); fprintf( masterFileOutputID, '\n' ); fclose( masterFileOutputID ); end