Xmipp  v3.23.11-Nereus
Functions
dimred_tools.cpp File Reference
#include <random>
#include <algorithm>
#include "dimred_tools.h"
#include "core/xmipp_funcs.h"
Include dependency graph for dimred_tools.cpp:

Go to the source code of this file.

Functions

void insertNeighbour (Matrix2D< int > &idx, Matrix2D< double > &distance, int i1, int i2, double d)
 
void kNearestNeighbours (const Matrix2D< double > &X, int K, Matrix2D< int > &idx, Matrix2D< double > &distance, DimRedDistance2 f, bool computeSqrt)
 
void computeRandomPointsDistance (const Matrix2D< double > &X, Matrix1D< double > &distance, Matrix1D< int > ind1, Matrix1D< int > ind2, DimRedDistance2 f, bool computeSqrt)
 
void computeDistance (const Matrix2D< double > &X, Matrix2D< double > &distance, DimRedDistance2 f, bool computeSqrt)
 
void computeDistanceToNeighbours (const Matrix2D< double > &X, int K, Matrix2D< double > &distance, DimRedDistance2 f, bool computeSqrt)
 
void computeSimilarityMatrix (Matrix2D< double > &D2, double sigma, bool skipZeros, bool normalize)
 
void computeGraphLaplacian (const Matrix2D< double > &G, Matrix2D< double > &L)
 
double intrinsicDimensionalityMLE (const Matrix2D< double > &X, DimRedDistance2 f)
 
double intrinsicDimensionalityCorrDim (const Matrix2D< double > &X, DimRedDistance2 f)
 
double intrinsicDimensionality (Matrix2D< double > &X, const String &method, bool normalize, DimRedDistance2 f)
 
void extractNearestNeighbours (const Matrix2D< double > &X, Matrix2D< int > &idx, int i, Matrix2D< double > &Xi)
 

Function Documentation

◆ insertNeighbour()

void insertNeighbour ( Matrix2D< int > &  idx,
Matrix2D< double > &  distance,
int  i1,
int  i2,
double  d 
)

Definition at line 197 of file dimred_tools.cpp.

198 {
199  int K=MAT_XSIZE(idx);
200  int kInsert=K;
201  for (int k=K-1; k>=0; --k)
202  if (MAT_ELEM(distance,i1,k)>d)
203  kInsert=k;
204  else
205  break;
206  if (kInsert<K)
207  {
208  for (int kp=K-1; kp>kInsert; --kp)
209  {
210  int kp_1=kp-1;
211  MAT_ELEM(distance,i1,kp)=MAT_ELEM(distance,i1,kp_1);
212  MAT_ELEM(idx,i1,kp)=MAT_ELEM(idx,i1,kp_1);
213  }
214  MAT_ELEM(distance,i1,kInsert)=d;
215  MAT_ELEM(idx,i1,kInsert)=i2;
216  }
217 }
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
doublereal * d
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
#define MAT_XSIZE(m)
Definition: matrix2d.h:120
constexpr int K

◆ intrinsicDimensionalityCorrDim()

double intrinsicDimensionalityCorrDim ( const Matrix2D< double > &  X,
DimRedDistance2  f 
)

Definition at line 379 of file dimred_tools.cpp.

380 {
381  int K=3;
382  Matrix2D<int> idx;
384  kNearestNeighbours(X,K,idx,distance,f);
385 
386  // Compute median and maximum
387  size_t N=MAT_XSIZE(distance)*MAT_YSIZE(distance);
388  std::sort(MATRIX2D_ARRAY(distance),MATRIX2D_ARRAY(distance)+N);
389  double median=MATRIX2D_ARRAY(distance)[N/2];
390  double maxVal=MATRIX2D_ARRAY(distance)[N-1];
391  median*=median; // Because we compute dist^2 instead of dist
392  maxVal*=maxVal;
393  if (maxVal==0)
394  return 0;
395 
396  // Compute the distance of all versus all
397  double countLessMedianK=0, countLessMaxK=0;
398  std::cerr << "Estimating dimensionality ... " << std::endl;
400  for (size_t i1=0; i1<MAT_YSIZE(X)-1; ++i1)
401  {
402  for (size_t i2=i1+1; i2<MAT_YSIZE(X); ++i2)
403  {
404  // Compute the distance between i1 and i2
405  double d=0;
406  if (f==NULL)
407  for (int j=0; j<MAT_XSIZE(X); ++j)
408  {
409  double diff=MAT_ELEM(X,i1,j)-MAT_ELEM(X,i2,j);
410  d+=diff*diff;
411  }
412  else
413  d=(*f)(X,i1,i2);
414 
415  // Check d
416  if (d<=maxVal)
417  {
418  countLessMaxK+=1;
419  if (d<=median)
420  countLessMedianK+=1;
421  }
422  }
423  progress_bar(i1);
424  }
425  progress_bar(MAT_YSIZE(X)-1);
426  double iCombinations=2.0/(MAT_YSIZE(X)*(MAT_YSIZE(X)-1));
427  double probLessMedianK=countLessMedianK*iCombinations; // Probability of a distance being less than medianK
428  double probLessMaxK=countLessMaxK*iCombinations; // Probability of a distance being less than maxK
429  return 2*log(probLessMaxK/probLessMedianK)/log(maxVal/median);
430 }
#define MAT_YSIZE(m)
Definition: matrix2d.h:124
void init_progress_bar(long total)
void kNearestNeighbours(const Matrix2D< double > &X, int K, Matrix2D< int > &idx, Matrix2D< double > &distance, DimRedDistance2 f, bool computeSqrt)
doublereal * d
void median(MultidimArray< T > &x, MultidimArray< T > &y, T &m)
Definition: filters.h:1055
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
void log(Image< double > &op)
double * f
void progress_bar(long rlen)
void sort(struct DCEL_T *dcel)
Definition: sorting.cpp:18
#define j
TYPE distance(struct Point_T *p, struct Point_T *q)
Definition: point.cpp:28
#define MAT_XSIZE(m)
Definition: matrix2d.h:120
constexpr int K
#define MATRIX2D_ARRAY(m)
Definition: matrix2d.h:89

◆ intrinsicDimensionalityMLE()

double intrinsicDimensionalityMLE ( const Matrix2D< double > &  X,
DimRedDistance2  f 
)

Definition at line 341 of file dimred_tools.cpp.

342 {
343  int k1=5;
344  int k2=12;
345  if (k2>MAT_YSIZE(X))
346  {
347  k2=MAT_YSIZE(X)-1;
348  k1=k2/2;
349  }
350  Matrix2D<int> idx;
352  kNearestNeighbours(X,k2,idx,distance,f);
353 
354  // Estimate d
355  double dsum=0;
356  std::cerr << "Estimating dimensionality ... " << std::endl;
357  init_progress_bar(MAT_YSIZE(distance));
358  for (int i=0; i<MAT_YSIZE(distance); ++i)
359  {
360  double dist=log(MAT_ELEM(distance,i,0));
361  double S=dist;
362  for (int k=1; k<MAT_XSIZE(distance); ++k)
363  {
364  dist=log(MAT_ELEM(distance,i,k));
365  S+=dist;
366  if (k>=k1)
367  {
368  double d=(k-1)/(S-dist*(k+1));
369  dsum+=d;
370  }
371  }
372  progress_bar(i);
373  }
374  progress_bar(MAT_YSIZE(distance));
375  return -dsum/((k2-k1)*MAT_YSIZE(distance));
376 }
#define MAT_YSIZE(m)
Definition: matrix2d.h:124
void init_progress_bar(long total)
void kNearestNeighbours(const Matrix2D< double > &X, int K, Matrix2D< int > &idx, Matrix2D< double > &distance, DimRedDistance2 f, bool computeSqrt)
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
doublereal * d
#define MAT_ELEM(m, i, j)
Definition: matrix2d.h:116
void log(Image< double > &op)
double * f
void progress_bar(long rlen)
TYPE distance(struct Point_T *p, struct Point_T *q)
Definition: point.cpp:28
#define MAT_XSIZE(m)
Definition: matrix2d.h:120