www.gusucode.com > classification_matlab_toolbox分类方法工具箱源码程序 > code/Classification_toolbox/RCE.m

    function D = RCE(train_features, train_targets, lambda_m, region)

% Classify using the reduced coulomb energy algorithm
% Inputs:
% 	features	- Train features
%	targets	    - Train targets
%	lambda_m	- Maximum radius 
%	region	    - Decision region vector: [-x x -y y number_of_points]
%
% Outputs
%	D			- Decision sufrace

epsilon 	= 1e-4;
[Dim,Nf]    = size(train_features);
N			= region(5);
x           = linspace (region(1),region(2),N);
y           = linspace (region(3),region(4),N);
X           = train_features;

%Train the classifier
W   		= X;            %w_ij <- x_i
lambda      = zeros(1,Nf);

for i = 1:Nf,
    %x_hat <- arg min D(x, x_tag)
    dist 			 = sqrt(sum((X - X(:,i) * ones(1,Nf)).^2));
    [m, indices]      = sort(dist);
    x_hat			 = find(train_targets(indices) ~= train_targets(i));
    
    %lambda_j <- min(D(x_hat, x_tag)-epsilon, lambda_m)
    lambda(i)	     = min(dist(x_hat(1))-epsilon,lambda_m);
end

%Build the decision surface using the classifier
D = zeros(N);
for i = 1:N,
    for j = 1:N,
        %if D(x, x_hat_j)<lambda_j then D_t <- D_t U x_tag_j
        dist		 = sqrt(sum((X - [x(i) y(j)]' * ones(1,Nf)).^2));
        indices 		 = find(dist < lambda);
        %The decision is a little different from DH&S, since there an ambiguous result can
        %Occure. Here we do not allow this.
        if isempty(indices),
            D(j,i) = rand(1) > .5;
        else
            D(j,i) = sum(train_targets(indices))/length(indices) > .5;
        end
    end
    
    if (i/50 == floor(i/50)),
        disp(['Finished ' num2str(i) ' lines out of ' num2str(N) ' lines.']);
    end
end