www.gusucode.com > classification_matlab_toolbox分类方法工具箱源码程序 > code/Classification_toolbox/Voted_Perceptron.m
function D = voted_perceptron(train_features, train_targets, params, region); % Classify using the Perceptron algorithm % Inputs: % features - Train features % targets - Train targets % Params: % 1. NumberOfPerceptrons % 2. Kernel method (Linear, Polynomial, Gaussian) % 3. Method's parameters ( Linear - none, Polinomial - power, Gaussian - sigma ) % region - Decision region vector: [-x x -y y number_of_points] % % Outputs % D - Decision sufrace % % Coded by: Igor Makienko and Victor Yosef [NumberOfPerceptrons, method, alg_param] = process_params(params); [c, n] = size(train_features); train_features = [train_features ; ones(1,n)]; train_one = find(train_targets == 1); train_zero = find(train_targets == 0); %Preprocessing processed_features = train_features; processed_features(:,train_zero) = -processed_features(:,train_zero); %Initial weights for Linear case: w_percept = rand(c+1,NumberOfPerceptrons); %Initial alphas for kernel method: alpha = rand(n,NumberOfPerceptrons); %Initial permutation matrix for kernel case; switch method case 'Polynomial' perm = polyn(processed_features', processed_features',alg_param); case 'Gaussian' perm = gaus(processed_features',processed_features',alg_param); end %Train targets for kernels' case [-1 1] : t = 2 * train_targets - 1; %Step for kernel case : etta = 1; %Initial success vector: w_sucesses = ones(NumberOfPerceptrons,1); correct_classified = 0; iter = 0; max_iter = 500; while (iter < max_iter) iter = iter + 1; indice = 1 + floor(rand(1)*n); switch method case 'Linear', InnerProduct = w_percept' * processed_features(:,indice); NegInnerProduct = (InnerProduct<=0); PosInnerProduct = (InnerProduct>0); w_sucesses = ones(size(w_sucesses)) + w_sucesses.*PosInnerProduct; w_percept(:,find(NegInnerProduct)) = w_percept(:,find(NegInnerProduct))... + processed_features(:,indice) * ones(1,sum(NegInnerProduct)); case {'Polynomial','Gaussian'} InnerProduct = perm(indice,:) * ((alpha'.*(ones(size(alpha,2),1)*t)))' ; NegInnerProduct = (InnerProduct<=0)'; PosInnerProduct = (InnerProduct>0)'; w_sucesses = ones(size(w_sucesses)) + w_sucesses.*PosInnerProduct; alpha(indice,find(NegInnerProduct)) = alpha(indice,find(NegInnerProduct))... + etta * ones(1,sum(NegInnerProduct)); otherwise error('Method unknown'); end end if (iter == max_iter), disp(['Maximum iteration (' num2str(max_iter) ') reached']) end %Find decision region N = region(5); x = ones(N,1) * linspace (region(1),region(2),N); y = linspace (region(3),region(4),N)' * ones(1,N); D = zeros(N); switch method case 'Linear', for i = 1:NumberOfPerceptrons D = D + w_sucesses(i) * (2 * ((w_percept(1,i).*x + w_percept(2,i).*y + w_percept(c+1,i))> 0) - 1); end case 'Polynomial', temp = [x(:),y(:),ones(size(y(:)))]; perm = polyn(temp,processed_features',alg_param); for i = 1:NumberOfPerceptrons, temp = 2 * (sum(((ones(N^2,1)*(alpha(:,i)'.* t)) .* (perm))') > 0) - 1; D = D + w_sucesses(i) * reshape(temp,N,N); end case 'Gaussian', temp = [x(:),y(:),ones(size(y(:)))]; perm = gaus(temp,processed_features',alg_param); for i = 1:NumberOfPerceptrons, temp = 2 * (sum(((ones(N^2,1)*(alpha(:,i)'.* t)) .* (perm))') > 0) - 1; D = D + w_sucesses(i) * reshape(temp,N,N); end end D = (D>0); disp(['Iterated ' num2str(iter) ' times.']) function out = polyn(x,y,p); %Routine function for polynomial kernel %Input: %x - (number of vectors)x(dim+1) matrix %y - (number of vectors)x(dim+1) matrix %p - order of polynom out = (ones(size(x,1),size(y,1)) + x * y').^p; function out = gaus(x,y,sigma); %Routine function for gaussian kernel %Input: %x - (number of vectors)x(dim+1) matrix %y - (number of vectors)x(dim+1) matrix %sigma - std of gaussian kernel x = x';y =y';c = []; for i = 1:size(x,1), c(:,:,i) = (ones(size(x,2),1) * y(i,:) - x(i,:)' * ones(1,size(y,2))).^2; end out = exp( - squeeze( sum(permute(c,[3,1,2]))) ./ (2 * sigma) ^2);