[Home]

##### ESQSVR

A Matlab code for Laplacian support vector regression for the extensive semi-quantitative regression problem. [Code]

##### Reference

Yuan-Hai Shao, Ya-Fen Ye, Yong-Cui Wang, Nai-Yang Deng. Extensive semi-quantitative regression. Submitted.

##### Main Function

Need kernel function and laplacian function.

function [g1 g2 predictY]=ESQSVR(Data,FunPara) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ESQSVR: Laplacian support vector regression for the extensive semi-quantitative regression problem % Usage: [g1 g2 predictY]=ESQSVR(Data,FunPara) % % Input: % DataTrain - stuct value in Matlab-----Training data. % Data.XA: The quantitative input; % Data.YA: The quantitative labels; % Data.XB: The semi-quantitative input; % Data.testX: The semi-quantitative input; % % FunPara - Struct value in Matlab % FunPara.c1: [0,inf] Paramter to tune the weight; % FunPara.c2: [0,inf] Paramter to tune the weight; % FunPara.eps: [0,inf] Paramter to tune the weight; % FunPara.Yl: Paramter to the threshold for the negative qualitative data; % FunPara.Yh: Paramter to the threshold for the negative qualitative data; % FunPara.knn: knn parameter is an integer greater than 0; % kerfPara: kernel parameters. See kernelfun.m; % % Output: % g1 - Predict value of the Data.XA; % g2 - Predict value of the Data.XB; % % Examples: % load sinN1.mat XA XB YA; % Data.XA = XA; % Data.XB = XB; % Data.YA = YA; % Data.testX = XB; % FunPara.c1=2^(2); % FunPara.c2=2^(-3); % FunPara.eps=0.02; % FunPara.Yl=0.8; % FunPara.Yh=1.2; % FunPara.knn=2; % FunPara.kerfPara.type = 'lin'; % FunPara.kerfPara.pars = 4; % [g1 g2 predictY]=ESQSVR(Data,FunPara); % % Reference: Yuan-Hai Shao, Ya-Fen Ye, Yong-Cui Wang, Nai-Yang Deng. % Extensive semi-quantitative regression problem. Submitted. % % Version 1.0 --Oct/2013 % Written by Ya-Fen Ye (yafenye@163.com) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Initailization %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %tic; Xpos=Data.XA; Ypos=Data.YA; Xneg=Data.XB; c1= FunPara.c1; c2= FunPara.c2; eps = FunPara.eps; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Matrices are defined using the same symbols with the paper %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [m1,n1]=size(Xpos); [m2,n1]=size(Xneg); e1=ones(m1,1); e2=ones(m2,1); e=[e1;e2]; I1=eye(m1,m1); I2=eye(m2,m2); eps=[eps*I1,zeros(m1,m2); zeros(m2,m1),eps*I2]; M=[I1,zeros(m1,m2); zeros(m2,m1),zeros(m2,m2)]; N=[zeros(m1,m1),zeros(m1,m2); zeros(m2,m1),I2]; X=[Xpos;Xneg]; Y=[Ypos;zeros(m2,1)]; YL=[zeros(m1,1);FunPara.Yl*e2]; YH=[zeros(m1,1);FunPara.Yh*e2]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Construct laplacian matrix %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% L=laplacian1(X,FunPara.knn); L=(L+L')/2; L=abs(L); % L=eye(size(X),size(X)); LM=inv(L+M); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Compute Kernel %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% kerfPara = FunPara.kerfPara; if strcmp(kerfPara.type,'lin') G=[Xpos,e1;Xneg,e2]; %min [alpha,beta,gamma]*Q*[alpha,beta,gamma]'+P'*[alpha,beta,gamma]' Q=[G*G'+(1/c2)*LM,-G*G'-(1/c2)*LM, -(1/c2)*LM*N', (1/c2)*LM*N'; -G*G'-(1/c2)*LM, G*G'+(1/c2)*LM, (1/c2)*LM*N', -(1/c2)*LM*N'; -(1/c2)*N*LM', (1/c2)*N*LM', (1/c2)*N*LM*N', -(1/c2)*N*LM*N' (1/c2)*N*LM', -(1/c2)*N*LM', -(1/c2)*N*LM*N', (1/c2)*N*LM*N']; P=[-Y'*M*LM+(eps*e)', Y'*M*LM+(eps*e)',Y'*M*LM*N'-YL',-Y'*M*LM*N'+YH']'; else HH=kernelfun(X,kerfPara,X)+e*e'; % min [alpha,beta,gamma]*Q*[alpha,beta,gamma]'+P'*[alpha,beta,gamma]' Q=[HH+(1/c2)*LM,-HH-(1/c2)*LM, -(1/c2)*LM*N', (1/c2)*LM*N'; -HH'-(1/c2)*LM, HH+(1/c2)*LM, (1/c2)*LM*N', -(1/c2)*LM*N'; -(1/c2)*N*LM', (1/c2)*N*LM', (1/c2)*N*LM*N', -(1/c2)*N*LM*N' (1/c2)*N*LM', -(1/c2)*N*LM', -(1/c2)*N*LM*N', (1/c2)*N*LM*N']; P=[-Y'*M*LM+(eps*e)', Y'*M*LM+(eps*e)',Y'*M*LM*N'-YL',-Y'*M*LM*N'+YH']'; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Train Data using QP solver %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LB=[zeros(m1+m2,1);zeros(m1+m2,1);zeros(m1+m2,1);zeros(m1+m2,1)]; UB=[c1*e;c1*e;c1*e;c1*e]; Q=(Q+Q')/2; soll=quadprog(Q,P,[],[],[],[],LB,UB); %toc alpha=soll(1:m1+m2); beta=soll(m1+m2+1:2*(m1+m2)); gamma=soll(2*(m1+m2)+1:3*(m1+m2)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Predict and output %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if strcmp(kerfPara.type,'lin') z=G'*(alpha-beta); m=size(z,1); g=(1/c2)*inv(L+M)*(c2*M'*Y-alpha+beta+N'*gamma); g1=Xpos*z(1:m-1)+z(m)*e1; g2=Xneg*z(1:m-1)+z(m)*e2; predictY=Data.testX*z(1:m-1)+z(m)*ones(size(Data.testX(:,1)),1); else g=HH*(alpha-beta); g1=g(1:m1); g2=g(m1+1:m1+m2); HHnew=kernelfun(X,kerfPara,Data.testX); predictY=HHnew'*(alpha-beta); end