%FEATEVAL Evaluation of feature set for classification % % J = feateval_new(A,CRIT,T) % J = feateval_new(A,CRIT,N) % % INPUT % A input dataset % CRIT string name of a method or untrained mapping % T validation dataset (optional) % N number of cross-validations (optional) % % OUTPUT % J scalar criterion value % % DESCRIPTION % Evaluation of features by the criterion CRIT for classification, % using objects in the dataset A. The larger J, the better. Resulting % J-values are incomparable over the various methods. % The following methods are supported: % % crit='in-in' : inter-intra distance. % crit='maha-s': sum of estimated Mahalanobis distances. % crit='maha-m': minimum of estimated Mahalanobis distances. % crit='eucl-s': sum of squared Euclidean distances. % crit='eucl-m': minimum of squared Euclidean distances. % crit='NN' : 1-Nearest Neighbour leave-one-out % classification performance (default). % (performance = 1 - error). % % CRIT can also be any untrained classifier, e.g. LDC([],1e-6,1e-6). % The classification error is used for a performance estimate. If % supplied, the dataset T is used for obtaining an unbiased estimate % of the performance of classifiers trained with the dataset A. % If a number of cross-validations N is supplied, the routine is % run for N times with different training and test sets generated % from A by cross-validation. Results are averaged. If T nor N are % given, the apparent performance on A is used. % % SEE ALSO % DATASETS, FEATSELO, FEATSELB, FEATSELF, FEATSELP, FEATSELM, FEATRANK % Copyright: R.P.W. Duin, duin@ph.tn.tudelft.nl % Faculty of Applied Physics, Delft University of Technology % P.O. Box 5046, 2600 GA Delft, The Netherlands % REVISIONS % DXD1: David Tax, 08-05-2003 % I added the inter/intra distance criterion. % $Id: feateval.m,v 1.8 2005/12/15 20:43:25 duin Exp $ function J = feateval_new(a,crit,t, varargin) prtrace(mfilename); [ma,k,c] = getsize(a); if nargin < 2 crit = 'NN'; end if nargin < 3 t =[]; prwarning(4,'Where needed, input dataset is used for validation') end if(isscalar(t) && ~isdataset(t) ) % cross-validation desired, t rotations if( t > 0 ) K = crossval(a,nmc,t,0); % trick to get rotation set from crossval J = 0; JALL = 1:size(a,1); for j=1:t JIN = JALL; JOUT = find(K==j); JIN(JOUT) = []; JOUT = JALL(JOUT); train = a(JIN,:); test = a(JOUT,:); J = J + feval(mfilename,train,crit,test); end J = J/t; return else J = cross_val_leave1out_rec_index(a, crit); return; end end % if(~isempty(t)) % ClassSizes = classsizes(t); % bClassesPresent_t = ClassSizes > 0 ; % else % ClassSizes = classsizes(a); % bClassesPresent_t = ClassSizes > 0 ; % end % % if( sum(bClassesPresent_t) < 2 ) % error('Debe haber representadas al menos 2 clases en el dataset.'); % end % islabtype(a,'crisp'); isvaldset(a,1,2); % at least 1 object per class, 2 classes iscomdset(a,t); if ischar(crit) %DXD1 if strcmp(crit,'in-in') % inter/intra distances islabtype(a,'crisp','soft'); if isempty(t) [U,G] = meancov_new(a,0); prior = getprior(a); else [U,G] = meancov_new(t,0); prior = 1/sum(classsizes(t))*classsizes(t); % S_w = sum(G(:,:,bClassesPresent_t),3); % % iClassMean = +U; % iTotalMean = prior(bClassesPresent_t) * iClassMean(bClassesPresent_t,:); % % S_b = zeros( size(iClassMean,2) ); % % for j = find(bClassesPresent_t) % iAux = iClassMean(j,:) - iTotalMean; % between scatter % S_b = S_b + prior(j)*(iAux' * iAux); % end end S_w = reshape(nansum(reshape(G(:,:,bClassesPresent_t),k*k,sum(bClassesPresent_t))*prior(bClassesPresent_t)',2),k,k); % within scatter [dummy, S_b] = meancov_new(+U, 0); % between scatter if( det(S_w) == 0 ) J = 0; else J = trace(inv(S_w)*S_b); end % t % U % +U % disp(['G:' num2str(G) ' Sw:' num2str(S_w) ' S_b:' num2str(S_b)]); elseif( strcmp(crit,'maha-s') || strcmp(crit,'maha-m') )% Mahalanobis distances islabtype(a,'crisp','soft'); if isempty(t) D = distmaha_new(a,[],[]); else [U,G] = meancov_new( a, 0 ); D = distmaha(t,U,G); D = meancov_new(D,0); end D = +D; D = D(bClassesPresent_t,bClassesPresent_t); if strcmp(crit,'maha-m') D = D + realmax*eye(sum(bClassesPresent_t)); J = min(min(D)); else J = sum(sum(D))/2; end elseif strcmp(crit,'eucl-s') || strcmp(crit,'eucl-m') % Euclidean distances islabtype(a,'crisp','soft'); U = meancov_new(a,0); if(isempty(t)) D = distm_new(U,U); else D = distm_new(t,U); D = meancov_new(D,0); end D = +D; D = D(bClassesPresent_t,bClassesPresent_t); if strcmp(crit,'eucl-m') D = D + realmax*eye( sum(bClassesPresent_t) ); J = min(min(D)); else J = sum(sum(D))/2; end elseif strcmp(crit,'NN') % 1-NN performance islabtype(a,'crisp','soft'); if isempty(t) J = 1 - testk(a,1); else J = 1 - testk(a,1,t); end else error('Criterion undefined'); end else ismapping(crit); isuntrained(crit); if isempty(t) J = 1 - (a * (a * crit) * testc); else J = 1 - (t * (a * crit) * testc); end end return