SHOGUN  v2.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
LocalityPreservingProjections.cpp
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 2011 Sergey Lisitsyn
8  * Copyright (C) 2011 Berlin Institute of Technology and Max-Planck-Society
9  */
10 
12 #ifdef HAVE_LAPACK
17 #include <shogun/io/SGIO.h>
19 #include <shogun/lib/Signal.h>
20 
21 using namespace shogun;
22 
25 {
26 }
27 
29 {
30 }
31 
33 {
34  return "LocalityPreservingProjections";
35 };
36 
38  SGMatrix<float64_t> W_matrix)
39 {
40  CDenseFeatures<float64_t>* simple_features = (CDenseFeatures<float64_t>*)features;
41  ASSERT(simple_features);
42  int i,j;
43  int N = simple_features->get_num_vectors();
44  int dim = simple_features->get_num_features();
45 
46  float64_t* D_diag_vector = SG_CALLOC(float64_t, N);
47  for (i=0; i<N; i++)
48  {
49  for (j=0; j<N; j++)
50  D_diag_vector[i] += W_matrix[i*N+j];
51  }
52 
53  // W = -W
54  for (i=0; i<N*N; i++)
55  if (W_matrix[i]>0.0)
56  W_matrix[i] *= -1.0;
57  // W = W + D
58  for (i=0; i<N; i++)
59  W_matrix[i*N+i] += D_diag_vector[i];
60 
61  SGMatrix<float64_t> feature_matrix = simple_features->get_feature_matrix();
62  float64_t* XTM = SG_MALLOC(float64_t, dim*N);
63  float64_t* lhs_M = SG_MALLOC(float64_t, dim*dim);
64  float64_t* rhs_M = SG_MALLOC(float64_t, dim*dim);
65 
66  cblas_dgemm(CblasColMajor,CblasNoTrans,CblasNoTrans,dim,N,N,1.0,feature_matrix.matrix,dim,W_matrix.matrix,N,0.0,XTM,dim);
67  cblas_dgemm(CblasColMajor,CblasNoTrans,CblasTrans,dim,dim,N,1.0,XTM,dim,feature_matrix.matrix,dim,0.0,lhs_M,dim);
68 
69  for (i=0; i<N; i++)
70  cblas_dscal(dim,D_diag_vector[i],feature_matrix.matrix+i*dim,1);
71 
72  cblas_dgemm(CblasColMajor,CblasNoTrans,CblasTrans,dim,dim,N,1.0,feature_matrix.matrix,dim,feature_matrix.matrix,dim,0.0,rhs_M,dim);
73 
74  for (i=0; i<N; i++)
75  cblas_dscal(dim,1.0/D_diag_vector[i],feature_matrix.matrix+i*dim,1);
76 
77  float64_t* evals = SG_MALLOC(float64_t, dim);
78  float64_t* evectors = SG_MALLOC(float64_t, m_target_dim*dim);
79  int32_t info = 0;
80 #ifdef HAVE_ARPACK
81  arpack_dsxupd(lhs_M,rhs_M,false,dim,m_target_dim,"LA",false,3,true,false,-1e-9,0.0,
82  evals,evectors,info);
83 #else
84  wrap_dsygvx(1,'V','U',dim,lhs_M,dim,rhs_M,dim,dim-m_target_dim+1,dim,evals,evectors,&info);
85 #endif
86  SG_FREE(lhs_M);
87  SG_FREE(rhs_M);
88  SG_FREE(evals);
89  if (info!=0) SG_ERROR("Failed to solve eigenproblem (%d)\n",info);
90 
91  cblas_dgemm(CblasColMajor,CblasTrans,CblasNoTrans,N,m_target_dim,dim,1.0,feature_matrix.matrix,dim,evectors,dim,0.0,XTM,N);
92  SG_FREE(evectors);
93 
94  SGMatrix<float64_t> new_features(m_target_dim,N);
95  for (i=0; i<m_target_dim; i++)
96  {
97  for (j=0; j<N; j++)
98  new_features[j*m_target_dim+i] = XTM[i*N+j];
99  }
100  SG_FREE(D_diag_vector);
101  SG_FREE(XTM);
102  return new CDenseFeatures<float64_t>(new_features);
103 }
104 
105 #endif /* HAVE_LAPACK */

SHOGUN Machine Learning Toolbox - Documentation