CCalcWmML::CCalcWmML(int L, int K, int b) { this->L = L; this->K = K; this->b = b; wm = new double [K+1]; kernel = new double [L+1]; kernelTruncated = new double [L+1]; c = new double [L+1]; //c_m : the inner product of all L-merEsts for two L-mer with m mismatches cTr = new double [L+1]; // c using truncated g. h = new double [L+1]; // h_m : for inner product of all gapped-kmer counts . calcwm(); calcKernel(); calcc(); }
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { double *xd; /* input data, size Nd*n */ double *xs; /* SVM data, size Ns*n */ double *y; /* output data, size Nd*1 */ double *a; /* SVM coefficients, size Ns*1 */ double b; /* bias term, scalar */ long Nd; /* number of input data */ long Ns; /* number of SVM data */ long n; /* dimension of input space */ long d; /* number of output dimensions */ int *dy; /* dimensions of output vector*/ long i,j; /* counters */ kernel ker; /* kernel function */ mxArray *F; /* field of MATLAB struct */ if (nrhs!=2) mexErrMsgTxt("Invalid number of input arguments."); if (nlhs>2) mexErrMsgTxt("Invalid number of output arguments."); /* --- check input arguments --- */ if ( mxGetNumberOfElements(prhs[0]) != 1 || !mxIsStruct(prhs[0]) || getSvm(prhs[0],&a,&xs,&Ns,&n,&b,&ker) ) mexErrMsgTxt("Invalid first argument (support vector machine)."); if ( mxIsEmpty(prhs[1]) || !mxIsDouble(prhs[1]) || mxIsComplex(prhs[1]) ) mexErrMsgTxt("Invalid second argument (input data)."); if (nlhs > 1) { if ( (F=mxGetField(prhs[0],0,FNAME_PROB)) == NULL || mxIsEmpty(F) || mxGetNumberOfDimensions(F) > 2 || !mxIsDouble(F) || mxIsComplex(F) || mxGetNumberOfElements(F) != 2 ) mexErrMsgTxt("SVM does not contain valid probability information."); } /* --- get input arguments --- */ d = mxGetNumberOfDimensions(prhs[1]); /* get true number of input dims */ dy = (int*)mxGetDimensions(prhs[1]); while ( d>2 && dy[d-1]==1 ) d--; if ( dy[d-1]==n ) /* compute number of output dims */ d--; else if ( n>1 ) mexErrMsgTxt("Sizes of SVM and input data do not match."); xd = mxGetPr(prhs[1]); /* get input data */ Nd = 1; for (i=0; i<d; i++) Nd *= dy[i]; /* --- compute SVM output --- */ plhs[0] = mxCreateNumericArray(d,dy,mxDOUBLE_CLASS,mxREAL); y = mxGetPr(plhs[0]); for (i=0; i<Nd; i++) { y[i] = b; for (j=0; j<Ns; j++) y[i] += a[j]*calcKernel(xd+i,Nd,xs+j,Ns,n,&ker); } /* --- compute probabilities --- */ if (nlhs > 1) { double *p; /* probability matrix */ double predict; /* temporary computation value */ double probA = (mxGetPr(mxGetField(prhs[0],0,FNAME_PROB)))[0]; double probB = (mxGetPr(mxGetField(prhs[0],0,FNAME_PROB)))[1]; plhs[1] = mxCreateNumericArray(d,dy,mxDOUBLE_CLASS,mxREAL); p = mxGetPr(plhs[1]); /* probability computation due to svm.cpp */ #define min_prob 1e-7 for (i=0; i<Nd; i++) { predict = y[i]*probA + probB; if (predict<0) predict = 1.0/(1.0+exp(predict)); else predict = 1.0-1.0/(1.0+exp(-predict)); if (y[i]<0) /* always use PREDICTED class */ predict = 1-predict; p[i] = (predict > 1-min_prob) ? 1-min_prob : predict; } } }
/** * Computes Gram matrix of a specified kernel. Given a data matrix * X (n x d), it returns Gram matrix K (n x n). * * @param kernelType 'linear' | 'poly' | 'rbf' | 'cosine' * * @param kernelParam -- | degree | sigma | -- * * @param X a matrix with each row being a feature vector * @return Gram matrix (n x n) * */ Matrix& calcKernel(std::string kernelType, double kernelParam, Matrix& X) { return calcKernel(kernelType, kernelParam, X, X); }