www.pudn.com > standardmodelrelease.zip > CLSnn.m
function [Model,looerrors] = CLSnn(X,y,sPARAMS);
%function [Model,looerrors] = CLSnn(X,y,sPARAMS);
%
%Builds a NN classifier
%X contains the data-points as COLUMNS, i.e., X is nfeatures \times nexamples
%y is a column vector of all the labels. y is nexamples \times 1
%sPARAMS is a structure of parameters:
%sPARAMS.k is the k for knn
%sPARAMS.deg determines the p-norm to be used as distance
%Model contains the parameters of the nn classifier
if nargin<3
sPARAMS.k = 1;
end
if ~isfield(sPARAMS,'deg')
sPARAMS.deg = 2;
end
Model.k = sPARAMS.k;
Model.deg = sPARAMS.deg;
Model.trainX = X;
Model.trainy = y;
if isfield(sPARAMS,'numindeces')
Model.numindeces = sPARAMS.numindeces;
else
Model.numindeces = inf;
end
if nargout>1
deg = Model.deg;
len1 = size(X,2);
len2 = size(Model.trainX,2);
if deg==2
X2 = sum((X).^2,1);
Z2 = sum((Model.trainX).^2,1);
distance = (repmat(Z2,len1,1)+repmat(X2',1,len2)-2*X'*Model.trainX)';
else
distance = zeros(len2,len1);
for i = 1:len1,
for j = 1:len2,
distance(j,i) = sum(abs(X(:,i)-Model.trainX(:,j)).^deg);
end
end
end
maxdistance = max(distance(:));
distance = distance + eye(len1)*maxdistance;
[sorted,index] = sort(distance);
yy = Model.trainy(index);
if Model.k>1
weights = mean(yy(1:Model.k,:),1)';
disp('kNN weights::just sign no voting');
labels = sign(weights);
else
labels = yy(1,:)';
weights = 1./(sorted(1,:)'+eps);
end
looerrors = mean(labels==y);
end