www.gusucode.com > 超全的模式识别matlab源码程序 > code/Leader_Follower.m
function [patterns, targets, label, W] = Leader_Follower(train_patterns, train_targets, params, plot_on) %Reduce the number of data points using the basic leader-follower clustering algorithm %Inputs: % train_patterns - Input patterns % train_targets - Input targets % params - Algorithm parameters: [Min distance to connect, Rate of convergence] % plot_on - Plot stages of the algorithm % %Outputs % patterns - New patterns % targets - New targets % label - The labels given for each of the original patterns % W - Weights matrice if (nargin < 4), plot_on = 0; end [theta, eta] = process_params(params); [D,L] = size(train_patterns); %Preprocessing patterns = [train_patterns ; ones(1,L)]; patterns = patterns ./ (ones(D+1,1) * sqrt(sum(patterns.^2))); %w1 <- x w = patterns(:,1); for i = 2:L, %Accept new pattern x x = patterns(:,i); %j <- argmin||x-wj|| (Find nearest cluster) dist = sqrt(sum((w - x*ones(1,size(w,2))).^2)); j = find(min(dist) == dist); %if ||x-wj|| < theta if dist(j) < theta, %wj <- wj + eta*x w(:,j) = w(:,j) + eta*x; else %Add new w <- x w(:,end+1) = x; end w = w ./ (ones(D+1,1) * sqrt(sum(w.^2))); if (plot_on > 0), %Assign each of the patterns to a center dist = w'*patterns; [m, label] = max(dist); centers = zeros(D,size(w,2)); for i = 1:size(w,2), in = find(label == i); if ~isempty(in) centers(:,i) = mean(train_patterns(1:2,find(label==i))')'; else centers(:,i) = nan; end end %Plot centers during training plot_process(centers, plot_on) else disp(['There are ' num2str(size(w,2)) ' clusters so far']) end end %Assign each of the patterns to a center N = size(w,2); dist = w'*patterns; [m, label] = max(dist); patterns = zeros(D,N); targets = zeros(1,N); Uc = unique(train_targets); for i = 1:N, in = find(label == i); if ~isempty(in), h = hist(train_targets(in), Uc); [m, best] = max(h); targets(i) = Uc(best); if length(in) == 1, patterns(:,i) = train_patterns(:,in); else patterns(:,i) = mean(train_patterns(:,in)')'; end else patterns(:,i) = nan; end end