Esempio n. 1
0
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;
    }
  }
}
Esempio n. 3
0
/**
 * 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);
}