% Calculation of gradient and objective for Smooth Hinge Multi-Class % Classifcation. % % function [obj,grad] = mccsh(v,Y,V,lambda,l,varargin) % v - vector of parameters [n*p*l,1] % Y - rating matrix (labels) [n,m] % V - the feature matrix [m,p] % lambda - regularization parameter [scalar] % l - # of labels (1..l) % obj - value of objective at v [scalar] % grad - gradient at v [n*p*l,1] % % Written by Jason Rennie, April 2005 % Last modified: Tue Jul 25 15:00:21 2006 function [obj,grad,hessdiag] = mccsh(v,Y,V,lambda,l,varargin) fn = mfilename; if nargin < 5 error('insufficient parameters') end % Parameters that can be set via varargin verbose = 1; % Process varargin paramgt; hessdiag = 0; t0 = clock; [n,m] = size(Y); p = length(v)./n./l; if p ~= floor(p) | p < 1 error('dimensions of v and Y don''t match l'); end U = reshape(v,n,p,l); Z = zeros(n,m,l); for i=1:l Z(:,:,i) = U(:,:,i)*V'; end obj = lambda.*sum(sum(sum(U.^2)))./2; dU = zeros(n,p,l); YY = full(Y==0) + Y; YI = sub2ind(size(Z),(1:n)'*ones(1,m),ones(n,1)*(1:m),YY); ZY = Z(YI); for i=1:l obj = obj + sum(sum(h(ZY-Z(:,:,i)).*(Y~=i).*(Y>0))); end ZHP = zeros(n,m); for i=1:l ZHP = ZHP + hprime(ZY-Z(:,:,i)).*(Y~=i).*(Y>0); end for i=1:l dU(:,:,i) = ((Y==i).*ZHP - (Y~=i).*(Y>0).*hprime(ZY-Z(:,:,i)))*V + lambda.*U(:,:,i); end grad = dU(:); if verbose fprintf(1,'lambda=%.2e obj=%.4e grad''*grad=%.4e time=%.1f\n',lambda,obj,grad'*grad,etime(clock,t0)); end % ret = (z>0).*(z<1).*((1-z).^2)/2.0 + (z<=0).*(0.5-z); function [ret] = h(z) zin01 = (z>0)-(z>=1); zle0 = z<=0; ret = zin01./2 - zin01.*z + zin01.*z.^2./2 + zle0./2 - zle0.*z; % ret = (z>0).*(z<1).*(z-1) - (z<=0); function [ret] = hprime(z) zin01 = (z>0)-(z>=1); zle0 = z<=0; ret = zin01.*z - zin01 - zle0; % ChangeLog % 7/25/06 - Added varargin, verbose % 3/23/05 - made calcultions take better advantage of sparseness % 3/18/05 - fixed bug in objective (wasn't squaring fro norms) % 3/1/05 - added objective calculation % 2/23/05 - fixed bug in hprime()