Xmipp  v3.23.11-Nereus
Public Member Functions | Public Attributes | List of all members

#include <nca.h>

Inheritance diagram for NeighbourhoodCA:
Inheritance graph
[legend]
Collaboration diagram for NeighbourhoodCA:
Collaboration graph
[legend]

Public Member Functions

void setLabels (const Matrix1D< unsigned char > &labels)
 Set labels. More...
 
void setSpecificParameters (double lambda=0., int K=12)
 Set specific parameters. More...
 
double objectiveFunction ()
 
void reduceDimensionality ()
 Reduce dimensionality. More...
 
- Public Member Functions inherited from DimRedAlgorithm
 DimRedAlgorithm ()
 Empty constructor. More...
 
void setInputData (Matrix2D< double > &X)
 Set input data. More...
 
void setOutputDimensionality (size_t outputDim)
 Set output dimensionality. More...
 
const Matrix2D< double > & getReducedData ()
 Get reduced data. More...
 

Public Attributes

double lambda
 Weight factor for regularization. More...
 
Matrix1D< unsigned char > labels
 Labels. More...
 
int K
 Number of neighbours. More...
 
Matrix2D< double > D2Y
 
Matrix2D< double > A
 
Matrix1D< double > D2YRowSum
 
Matrix2D< int > idx
 
- Public Attributes inherited from DimRedAlgorithm
Matrix2D< double > * X
 Pointer to input data. More...
 
size_t outputDim
 Output dim. More...
 
Matrix2D< double > Y
 Output data. More...
 
DimRedDistance2 distance
 Distance function. More...
 
FileName fnMapping
 Save mapping. More...
 

Detailed Description

Class for making a NCA dimensionality reduction

Definition at line 20 of file nca.h.

Member Function Documentation

◆ objectiveFunction()

double NeighbourhoodCA::objectiveFunction ( )

Definition at line 40 of file nca.cpp.

41 {
42  // Project X onto the subspace given by A, Y=X*A
44 
45  // Compute the distance between the nearest neighbours of each observation
46  // in this new subspace
49  {
50  double aux=0.;
51  int actualj=MAT_ELEM(idx,i,j);
52  for (int l=0; l<MAT_XSIZE(Y); ++l)
53  {
54  double diff=MAT_ELEM(Y,i,l)-MAT_ELEM(Y,actualj,l);
55  aux+=diff*diff;
56  }
57  MAT_ELEM(D2Y,i,j)=exp(-aux);
58  }
60 
61  // Compute F
62  double F=0.;
63  for (int i=0; i<MAT_YSIZE(Y); ++i)
64  {
65  double sumClassi=0.;
66  int labeli=VEC_ELEM(labels,i);
67  for (int j=0; j<K; ++j)
68  {
69  int actualj=MAT_ELEM(idx,i,j);
70  if (VEC_ELEM(labels,actualj)==labeli)
71  sumClassi+=MAT_ELEM(D2Y,i,j);
72  }
73  if (fabs(VEC_ELEM(D2YRowSum,i))>1e-16)
74  F+=sumClassi/VEC_ELEM(D2YRowSum,i);
75  }
76 
77  // Compute regularization
78  double sumA2=0.0;
80  sumA2+=MAT_ELEM(A,i,j)*MAT_ELEM(A,i,j);
81  sumA2/=MAT_XSIZE(A)*MAT_YSIZE(A);
82 
83  return -(F-lambda*sumA2);
84 }
#define FOR_ALL_ELEMENTS_IN_MATRIX2D(m)
Definition: matrix2d.h:104
#define MAT_YSIZE(m)
Definition: matrix2d.h:124
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
void rowSum(Matrix1D< T > &sum) const
Definition: matrix2d.cpp:779
Matrix2D< double > Y
Output data.
Definition: dimred_tools.h:147
void matrixOperation_AB(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
Definition: matrix2d.cpp:411
Matrix2D< double > * X
Pointer to input data.
Definition: dimred_tools.h:141
Matrix1D< unsigned char > labels
Labels.
Definition: nca.h:27
#define i
void resizeNoCopy(int Ydim, int Xdim)
Definition: matrix2d.h:534
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
Matrix2D< int > idx
Definition: nca.h:37
double lambda
Weight factor for regularization.
Definition: nca.h:24
Matrix1D< double > D2YRowSum
Definition: nca.h:34
Matrix2D< double > D2Y
Definition: nca.h:33
#define j
#define MAT_XSIZE(m)
Definition: matrix2d.h:120
Matrix2D< double > A
Definition: nca.h:33
int K
Number of neighbours.
Definition: nca.h:30

◆ reduceDimensionality()

void NeighbourhoodCA::reduceDimensionality ( )
virtual

Reduce dimensionality.

Implements DimRedAlgorithm.

Definition at line 95 of file nca.cpp.

96 {
99  kNearestNeighbours(*X, K, idx, D2, distance, false);
100 
101  size_t d=MAT_XSIZE(*X);
102  A.initGaussian(d,outputDim,0,0.01);
103 
104  // Optimize A
106  steps.initConstant(1);
107  memcpy(&VEC_ELEM(pA,0),&MAT_ELEM(A,0,0),VEC_XSIZE(pA)*sizeof(double));
108  double goal;
109  int iter;
110  powellOptimizer(pA,1,VEC_XSIZE(pA),&ncaObjectiveFuntion,this,0.001,goal,iter,steps,false);
111  memcpy(&MAT_ELEM(A,0,0),&VEC_ELEM(pA,0),VEC_XSIZE(pA)*sizeof(double));
112 
113  // Reduction
115 }
#define MAT_YSIZE(m)
Definition: matrix2d.h:124
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
void subtractColumnMeans(Matrix2D< double > &A)
Definition: matrix2d.cpp:230
Matrix2D< double > Y
Output data.
Definition: dimred_tools.h:147
void kNearestNeighbours(const Matrix2D< double > &X, int K, Matrix2D< int > &idx, Matrix2D< double > &distance, DimRedDistance2 f, bool computeSqrt)
#define VEC_XSIZE(m)
Definition: matrix1d.h:77
void matrixOperation_AB(const Matrix2D< double > &A, const Matrix2D< double > &B, Matrix2D< double > &C)
Definition: matrix2d.cpp:411
Matrix2D< double > * X
Pointer to input data.
Definition: dimred_tools.h:141
void powellOptimizer(Matrix1D< double > &p, int i0, int n, double(*f)(double *x, void *), void *prm, double ftol, double &fret, int &iter, const Matrix1D< double > &steps, bool show)
glob_prnt iter
doublereal * d
size_t outputDim
Output dim.
Definition: dimred_tools.h:144
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
Matrix2D< int > idx
Definition: nca.h:37
double ncaObjectiveFuntion(double *p, void *prm)
Definition: nca.cpp:86
double steps
DimRedDistance2 distance
Distance function.
Definition: dimred_tools.h:150
#define MAT_XSIZE(m)
Definition: matrix2d.h:120
Matrix2D< double > A
Definition: nca.h:33
void initGaussian(int Ydim, int Xdim, double op1=0., double op2=1.)
Definition: matrix2d.cpp:1118
int K
Number of neighbours.
Definition: nca.h:30

◆ setLabels()

void NeighbourhoodCA::setLabels ( const Matrix1D< unsigned char > &  labels)

Set labels.

Definition at line 29 of file nca.cpp.

30 {
31  this->labels=labels;
32 }
Matrix1D< unsigned char > labels
Labels.
Definition: nca.h:27

◆ setSpecificParameters()

void NeighbourhoodCA::setSpecificParameters ( double  lambda = 0.,
int  K = 12 
)

Set specific parameters.

Definition at line 34 of file nca.cpp.

35 {
36  this->lambda=lambda;
37  this->K=K;
38 }
double lambda
Weight factor for regularization.
Definition: nca.h:24
int K
Number of neighbours.
Definition: nca.h:30

Member Data Documentation

◆ A

Matrix2D<double> NeighbourhoodCA::A

Definition at line 33 of file nca.h.

◆ D2Y

Matrix2D<double> NeighbourhoodCA::D2Y

Definition at line 33 of file nca.h.

◆ D2YRowSum

Matrix1D<double> NeighbourhoodCA::D2YRowSum

Definition at line 34 of file nca.h.

◆ idx

Matrix2D<int> NeighbourhoodCA::idx

Definition at line 37 of file nca.h.

◆ K

int NeighbourhoodCA::K

Number of neighbours.

Definition at line 30 of file nca.h.

◆ labels

Matrix1D<unsigned char> NeighbourhoodCA::labels

Labels.

Definition at line 27 of file nca.h.

◆ lambda

double NeighbourhoodCA::lambda

Weight factor for regularization.

Definition at line 24 of file nca.h.


The documentation for this class was generated from the following files: