⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 proxm.m

📁 The Matlab Toolbox for Pattern Recognition
💻 M
字号:
%PROXM Proximity mapping% %  W = PROXM(A,TYPE,P,WEIGHTS)%  W = A*PROXM([],TYPE,P,WEIGHTS)% % INPUT%  A       Dataset%  TYPE    Type of the proximity (optional; default: 'distance')%  P       Parameter of the proximity (optional; default: 1)%  WEIGHTS Weights (optional; default: all 1)%% OUTPUT%  W       Proximity mapping%% DESCRIPTION  % Computation of the [K x M] proximity mapping (or kernel) defined by % the [M x K] dataset A. Unlabeled objects in A are neglected.% If B is an [N x K] dataset, then D=B*W is the [N x M] proximity matrix% between B and A. The proximities can be defined by the following types: % % 	'POLYNOMIAL'   | 'P': SIGN(A*B'+1).*(A*B'+1).^P%   'HOMOGENEOUS'  | 'H': SIGN(A*B').*(A*B').^P% 	'EXPONENTIAL'  | 'E': EXP(-(||A-B||)/P)% 	'RADIAL_BASIS' | 'R': EXP(-(||A-B||.^2)/(P*P))% 	'SIGMOID'      | 'S': SIGM((SIGN(A*B').*(A*B'))/P)% 	'DISTANCE'     | 'D': ||A-B||.^P% 	'MINKOWSKI'    | 'M': SUM(|A-B|^P).^(1/P)% 	'CITY-BLOCK'   | 'C': SUM(|A-B|)%   'COSINE'       | 'O': 1 - (A*B')/||A||*||B||% % In the polynomial case for a non-integer P, the proximity is computed % as D = SIGN(S+1).*ABS(S+1).^P, in order to avoid problems with negative% inner products S = A*B'. The features of the objects in A and B may be % weighted by the weights in the vector WEIGHTS.% % SEE ALSO% MAPPINGS, DATASETS% 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% $Id: proxm.m,v 1.12 2005/02/01 16:10:53 duin Exp $function W = proxm(A,type,s,weights)	prtrace(mfilename);		if (nargin < 4)		weights = [];		prwarning(4,'Weights are not supplied, assuming all 1.');	end	if (nargin < 3) | (isempty(s))      s = 1;      prwarning(4,'The proximity parameter is not supplied, assuming 1.');   end	if (nargin < 2) | (isempty(type))      type = 'd';      prwarning(4,'Type of the proximity is not supplied, assuming ''DISTANCE''.');   end	% No data, return an untrained mapping.	if (nargin < 1) | (isempty(A))		W = mapping(mfilename,{type,s,weights});		W = setname(W,'Proximity mapping');		return;	end	[m,k] = size(A);  	if (isstr(type))		% Definition of the mapping, just store parameters.		all = char('polynomial','p','exponential','e','radial_basis','r', ...	  		       'sigmoid','s','distance','d','minkowski','m','city-block','c',...                   'cosine','o','uniform','u');		if (~any(strcmp(cellstr(all),type)))			error(['Unknown proximity type: ' type])		end		A = cdats(A,1);		[m,k] = size(A);		if (isa(A,'dataset'))			W = mapping(mfilename,'trained',{A,type,s,weights},getlab(A), ...                            getfeatsize(A),getobjsize(A));		else			W = mapping(mfilename,'trained',{A,type,s,weights},[],k,m);		end		W = setname(W,'Proximity mapping');										   	elseif isa(type,'mapping')   		% Execution of the mapping: compute a proximity matrix		% between the input data A and B; output stored in W.		w = type;		[B,type,s,weights] = deal(w.data{1},w.data{2},w.data{3},w.data{4});		[kk,n] = size(w);		if (k ~= kk)			error('Mismatch in sizes between the mapping and its data stored internally.'); 		end		if (~isempty(weights))					if (length(weights) ~= k), 				error('Weight vector has a wrong length.'); 			end			A = A.*(ones(m,1)*weights(:)');			B = B.*(ones(n,1)*weights(:)');		end		switch type			case {'polynomial','p'}				D = +(A*B');				D = D + ones(m,n);				if (s ~= round(s))					D = sign(D).*abs(D).^s;				elseif (s ~= 1)					D = D.^s;				end				case {'homogeneous','h'}				D = +(A*B'); 				if (s ~= round(s))					D = sign(D).*abs(D).^s;				elseif (s ~= 1)					D = D.^s;				end				case {'sigmoid','s'}				D = +(A*B'); 				D = sigm(D/s);					case {'city-block','c'}				D = zeros(m,n);				for j=1:n				D(:,j) = sum(abs(A - repmat(+B(j,:),m,1)),2);			end					case {'minkowski','m'}				D = zeros(m,n);				for j=1:n				D(:,j) = sum(abs(A - repmat(+B(j,:),m,1)).^s,2).^(1/s);			end					case {'exponential','e'}				D = dist2(B,A);				D = exp(-sqrt(D)/s);					case {'radial_basis','r'}				D = dist2(B,A);				D = exp(-D/(s*s));					case {'distance','d'}				D = dist2(B,A);				if s ~= 2					D = sqrt(D).^s;				end                			case {'cosine','o'}				D = +(A*B'); 				lA = sqrt(sum(A.*A,2));				lB = sqrt(sum(B.*B,2));				D = 1 - D./(lA*lB');                			otherwise				error('Unknown proximity type')		end		W = setdat(A,D,w);				else		error('Illegal TYPE argument.')	endreturn;function D = dist2(B,A)% Computes square Euclidean distance, avoiding large matrices for a high % dimensionality data	m = size(A,1);	n = size(B,1);	D = ones(m,1)*sum(B'.*B',1); 	D = D + sum(A'.*A',1)'*ones(1,n); 	D = D - 2 .* (+A)*(+B)';	% Clean result.	J = find(D<0);	D(J) = zeros(size(J));return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -