99 if (data->
Sigma != NULL) {
129 testdata->
r = testdata->
m;
166 for (i=0; i<n; i++) {
167 for (j=i; j<n; j++) {
168 x1 = &data->
RAW[i*(data->
m+1)+1];
169 x2 = &data->
RAW[j*(data->
m+1)+1];
183 err(
"[GenSVM Error]: Unknown kernel type in " 184 "gensvm_make_kernel\n");
218 int M, status, LWORK, *IWORK = NULL,
220 long i, j, num_eigen, cutoff_idx;
221 double max_eigen, abstol, *WORK = NULL,
225 double *tempSigma =
Malloc(
double, n);
226 double *tempP =
Malloc(
double, n*n);
237 status =
dsyevx(
'V',
'A',
'U', n, K, n, 0, 0, 0, 0, abstol, &M,
238 tempSigma, tempP, n, WORK, -1, IWORK, IFAIL);
242 WORK = (
double *)realloc(WORK, LWORK*
sizeof(
double));
243 status =
dsyevx(
'V',
'A',
'U', n, K, n, 0, 0, 0, 0, abstol, &M,
244 tempSigma, tempP, n, WORK, LWORK, IWORK, IFAIL);
248 err(
"[GenSVM Error]: Nonzero exit status from dsyevx.\n");
255 max_eigen = tempSigma[n-1];
258 for (i=0; i<n; i++) {
259 if (tempSigma[i]/max_eigen > cutoff) {
265 num_eigen = n - cutoff_idx;
267 Sigma =
Calloc(
double, num_eigen);
268 for (i=0; i<num_eigen; i++) {
269 Sigma[i] = tempSigma[n-1 - i];
274 P =
Calloc(
double, n*num_eigen);
275 for (j=n-1; j>n-1-num_eigen; j--) {
276 for (i=0; i<n; i++) {
277 P[i*num_eigen + (n-1)-j] = tempP[i + j*n];
315 long n_train = data_train->
n;
316 long n_test = data_test->
n;
317 long m = data_test->
m;
318 double value, *x1 = NULL,
320 *K2 =
Calloc(
double, n_test * n_train);
322 for (i=0; i<n_test; i++) {
323 for (j=0; j<n_train; j++) {
324 x1 = &data_test->
RAW[i*(m+1)+1];
325 x2 = &data_train->
RAW[j*(m+1)+1];
338 err(
"[GenSVM Error]: Unknown kernel type in " 339 "gensvm_make_crosskernel\n");
368 long i, j, n = data->
n;
372 data->
Z =
Calloc(
double, n*(r+1));
375 for (i=0; i<n; i++) {
376 for (j=0; j<r; j++) {
407 struct GenData *traindata,
double *K2)
409 long n1, n2, r, i, j;
410 double value, *N = NULL,
422 for (i=0; i<n1; i++) {
423 for (j=0; j<r; j++) {
430 cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans, n2, r, n1, 1.0,
431 K2, n1, M, r, 0.0, N, r);
434 for (j=0; j<r; j++) {
441 testdata->
Z =
Calloc(
double, n2*(r+1));
442 for (i=0; i<n2; i++) {
443 for (j=0; j<r; j++) {
478 value += (x1[i] - x2[i]) * (x1[i] - x2[i]);
504 double coef,
double degree)
506 double value = cblas_ddot(n, x1, 1, x2, 1);
509 return pow(value, degree);
533 double value = cblas_ddot(n, x1, 1, x2, 1);
550 int dsyevx(
char JOBZ,
char RANGE,
char UPLO,
int N,
double *A,
int LDA,
551 double VL,
double VU,
int IL,
int IU,
double ABSTOL,
int *M,
552 double *W,
double *Z,
int LDZ,
double *WORK,
int LWORK,
553 int *IWORK,
int *IFAIL)
555 extern void dsyevx_(
char *JOBZ,
char *RANGE,
char *UPLO,
int *Np,
556 double *A,
int *LDAp,
double *VLp,
double *VUp,
557 int *ILp,
int *IUp,
double *ABSTOLp,
int *M,
558 double *W,
double *Z,
int *LDZp,
double *WORK,
559 int *LWORKp,
int *IWORK,
int *IFAIL,
int *INFOp);
561 dsyevx_(&JOBZ, &RANGE, &UPLO, &N, A, &LDA, &VL, &VU, &IL, &IU, &ABSTOL,
562 M, W, Z, &LDZ, WORK, &LWORK, IWORK, IFAIL, &INFO);
577 extern double dlamch_(
char *CMACH);
578 return dlamch_(&CMACH);
#define Calloc(type, size)
double gamma
kernel parameter for RBF, poly, and sigmoid
void err(const char *fmt,...)
Parse a formatted string and write it to standard error.
void gensvm_kernel_trainfactor(struct GenData *data, double *P, double *Sigma, long r)
Compute the training factor as part of kernel preprocessing.
int dsyevx(char JOBZ, char RANGE, char UPLO, int N, double *A, int LDA, double VL, double VU, int IL, int IU, double ABSTOL, int *M, double *W, double *Z, int LDZ, double *WORK, int LWORK, int *IWORK, int *IFAIL)
Compute the eigenvalues and optionally the eigenvectors of a symmetric matrix.
#define matrix_get(M, cols, i, j)
double degree
kernel parameter for poly
void gensvm_kernel_postprocess(struct GenModel *model, struct GenData *traindata, struct GenData *testdata)
Compute the kernel postprocessing factor.
double dlamch(char CMACH)
Determine double precision machine parameters.
long gensvm_kernel_eigendecomp(double *K, long n, double cutoff, double **P_ret, double **Sigma_ret)
Find the (reduced) eigendecomposition of a kernel matrix.
#define Malloc(type, size)
A structure to represent the data.
A structure to represent a single GenSVM model.
double gensvm_kernel_dot_poly(double *x1, double *x2, long n, double gamma, double coef, double degree)
Compute the polynomial kernel between two vectors.
Header file for gensvm_kernel.c.
double gensvm_kernel_dot_sigmoid(double *x1, double *x2, long n, double gamma, double coef)
Compute the sigmoid kernel between two vectors.
double * Sigma
eigenvalues from the reduced eigendecomposition
void gensvm_kernel_copy_kernelparam_to_data(struct GenModel *model, struct GenData *data)
Copy the kernelparameters from GenModel to GenData.
long r
number of eigenvalues (width of Z)
void gensvm_kernel_preprocess(struct GenModel *model, struct GenData *data)
Do the preprocessing steps needed to perform kernel GenSVM.
double * gensvm_kernel_cross(struct GenModel *model, struct GenData *data_train, struct GenData *data_test)
Compute the kernel crossproduct between two datasets.
double degree
kernel parameter for poly
long m
number of predictors (width of RAW)
double coef
kernel parameter for poly and sigmoid
#define matrix_set(M, cols, i, j, val)
KernelType kerneltype
type of kernel used in the model
#define matrix_mul(M, cols, i, j, val)
double gamma
kernel parameter for RBF, poly, and sigmoid
double coef
kernel parameter for poly and sigmoid
long n
number of instances
void gensvm_kernel_testfactor(struct GenData *testdata, struct GenData *traindata, double *K2)
Calculate the matrix product for the testfactor.
double * RAW
augmented raw data matrix
void gensvm_kernel_compute(struct GenModel *model, struct GenData *data, double *K)
Compute the kernel matrix.
double kernel_eigen_cutoff
cutoff value for the ratio of eigenvalues in the reduced
Header file for gensvm_print.c.
double gensvm_kernel_dot_rbf(double *x1, double *x2, long n, double gamma)
Compute the RBF kernel between two vectors.