36 #ifndef AIMS_MATH_PPCA_D_H 37 #define AIMS_MATH_PPCA_D_H 57 if( selectedPoints.size() <= (unsigned) data.
dimT() )
67 std::list< Point3d >::const_iterator iter( selectedPoints.begin() ),
68 last( selectedPoints.end() ) ;
73 for(
int t = 0 ; t < data.
dimT() ; ++t )
74 individuals( i, t ) = T( data( (*iter)[0], (*iter)[1], (*iter)[2],
78 mean +=
Point3df( (*iter)[0], (*iter)[1], (*iter)[2] ) ;
82 doIt( individuals, distanceRef ) ;
105 std::cout <<
"toto" << std::endl << std::endl ;
107 if( matriceIndiv.
dimX() <= matriceIndiv.
dimY() ){
118 int nbFrame = matriceIndiv.
dimY() ;
120 if( matriceIndiv.
dimY() < nbFrame )
121 std::cerr <<
"Beware : not enough data to evaluate svd" << std::endl ;
128 for(
int ind = 0 ; ind < matriceIndiv.
dimX() ; ++ind )
129 for(
int t = 0 ; t < matriceIndiv.
dimY() ; ++t )
131 val = matriceIndiv( ind, t ) ;
136 double meanMean = 0. ;
139 for(
int t = 0 ; t < nbFrame ; ++t )
141 _mean[t] /= centeredIndivMatrix.
dimX() ;
142 for(
int ind = 0 ; ind < centeredIndivMatrix.dimX() ; ++ind ){
143 centeredIndivMatrix( ind, t ) = matriceIndiv(ind, t) - _mean[t] ;
144 meanMean += centeredIndivMatrix( ind, t ) ;
147 std::cout <<
"Mean centered mean = " << meanMean <<
" (should be 0) " << std::endl ;
156 wri02.
write(centeredIndivMatrix) ;
163 for(
int k=0; k < centeredIndivMatrix.dimX() ;++k)
164 matVarCov(x, y) += centeredIndivMatrix(k, x)
165 * centeredIndivMatrix(k, y);
166 matVarCov(x, y) /= centeredIndivMatrix.
dimX() - 1 ;
170 wriMVC.
write(matVarCov) ;
190 for(
int i = 0 ; i < nbFrame ; ++i )
192 _EVect(i, j) = matVarCov(i, j) ;
195 for(
int i = _nbOfSignificantEV + ignoreVPs ; i < nbFrame ; ++i )
198 _Sigma2 /= double(nbFrame - ( _nbOfSignificantEV + ignoreVPs ) ) ;
201 std::cout <<
"\tLamda " << c+1 <<
"EValue = " <<
_EValues(c, c) ;
202 std::cout <<
"\tSigma2 = " <<
_Sigma2 << std::endl ;
212 std::cout <<
"_Wi.dimZ = " <<
_Wi.
dimZ()
213 <<
"\t_Wi.dimT = " <<
_Wi.
dimT() << std::endl ;
215 std::cout <<
"_EVect.dimZ = " <<
_EVect.
dimZ()
216 <<
"\t_EVect.dimT = " <<
_EVect.
dimT() << std::endl ;
228 double val = 0.5 * ( Ci(x, y) + Ci(y, x) ) ;
229 Ci(x, y) = Ci(y, x) = val ;
232 for(
int i = 0; i < nbFrame ; ++i )
239 double s = 0.00000001 ;
251 for ( i=0; i<n; i++ )
254 if ( w( i, i ) > ts ) w( i, i ) = 1.0f / w( i, i );
261 std::cout <<
"Unkept values = " << unkept << std::endl ;
272 ciFloat(x, y) = float( Ci(x, y) ) ;
281 std::cout <<
"_invCiInside.dimZ = " << _invCi.
dimZ()
282 <<
"\t_invCiInside.dimT = " << _invCi.
dimT() << std::endl ;
288 std::cout <<
"-0.5 * log( _detCi ) = " << -0.5 * log(
_detCi ) <<
"\t log(_PIj) = " << log(
_PIj) << std::endl ;
348 int nbFrame = matriceIndiv.
dimY() ;
350 if( matriceIndiv.
dimY() < nbFrame )
351 std::cerr <<
"Beware : not enough data to evaluate svd" << std::endl ;
361 matriceIndiv.
dimY() ) ;
364 for(
int ind = 0 ; ind < matriceIndiv.
dimX() ; ++ind )
365 for(
int t = 0 ; t < matriceIndiv.
dimY() ; ++t )
366 mean[t] += matriceIndiv( ind, t ) ;
370 for(
int t = 0 ; t < nbFrame ; ++t ){
371 mean[t] /= centeredIndivMatrix.
dimX() ;
373 for(
int ind = 0 ; ind < centeredIndivMatrix.dimX() ; ++ind ){
374 centeredIndivMatrix( ind, t ) = matriceIndiv(ind, t) - mean[t] ;
385 for(
int k=0; k < centeredIndivMatrix.dimX() ;++k)
386 matVarCov(x, y) += centeredIndivMatrix(k, x)
387 * centeredIndivMatrix(k, y);
388 matVarCov(x, y) /= centeredIndivMatrix.
dimX() - 1 ;
402 svd.
sort(matVarCov, EValues) ;
407 Sigma2 += EValues(i, i) ;
418 std::list< Point3d > >&
420 int nbOfSignificantEigenValues,
421 const std::vector<double>& PIj ) :
422 _classes(classes), _data(data),
_PIj(PIj),
423 _nbOfSignificantEigenValues(nbOfSignificantEigenValues)
427 if( PIj.size() != 0 )
428 if( PIj.size() == classes.size() )
431 throw std::runtime_error(
"Inconsistant data : number of classes and " 432 "number of classes prior probabilities are " 436 _PIj.reserve( _classes.size() ) ;
437 for(
unsigned int c = 0 ; c < _classes.size() ; ++c )
438 _PIj.push_back( 1./_classes.size() ) ;
441 _discrElements.reserve( _classes.size() ) ;
449 for(
unsigned int c = 0 ; c < _classes.size() ; ++c ){
450 if(
int(_classes[c].size()) > _data.dimT() ) {
453 el.
doIt( _classes[c], _data ) ;
455 std::cout <<
"Noise Ref = " << _distanceRef << std::endl ;
457 el.
doIt( _classes[c], _data, _distanceRef ) ;
460 for(
int t = 0 ; t < _data.dimT() ; ++t )
464 std::cout <<
"Class " << c <<
" done !" << std::endl ;
465 _discrElements.push_back( el ) ;
467 std::cerr <<
"Not enough data for element " << c << std::endl ;
473 eigenValuesWri.
write(eigenValues) ;
474 std::cout <<
"Probabilistic Pca initization completed" << std::endl ;
483 {
if( tolerance * norm2 > _discrElements[c].meanNorm() )
486 return 2 * pow( 0.5, _discrElements[c].meanNorm()
487 / (tolerance * tolerance * norm2 ) ) ;
495 double res = 1 - factor * factor * sigma2 / norm2 ;
505 std::vector<double>& maxProbaByClass )
510 std::vector<double> res( _discrElements.size() ) ;
512 double scoreSum = 0. ;
513 for(
unsigned int c = 0 ; c < _discrElements.size() ; ++c )
517 res[c] = _discrElements[c].posteriorProbability( x, 1 ) * _PIj[c] ;
518 if( res[c] > maxProbaByClass[c] )
519 maxProbaByClass[c] = res[c] ;
523 for(
unsigned int c = 0 ; c < _discrElements.size() ; ++c )
540 std::vector<double> res( _discrElements.size() ) ;
546 for(
unsigned int c = 0 ; c < _discrElements.size() ; ++c )
548 res[c] = _discrElements[c].posteriorProbability( x, 1 ) ;
549 if( res[c] > maxProbaByClass[c] )
550 maxProbaByClass[c] = res[c] ;
564 double lnPMin = _discrElements[0].lnPosteriorProbability( x ) ;
566 for(
unsigned int c = 0 ; c < _discrElements.size() ; ++c )
568 lnP = _discrElements[c].lnPosteriorProbability( x ) ;
588 if( dynamicImage.
dimT() != _data.dimT() )
590 if( segmented.
dimX() != _data.dimX() || segmented.
dimY() != _data.dimY()
591 || segmented.
dimZ() != _data.dimZ() )
595 segmented.
setSizeXYZT( _data.sizeX(), _data.sizeY(), _data.sizeZ(),
606 for(
int t = 0 ; t < _data.dimT() ; ++t )
607 indiv(t) = dynamicImage(x, y, z, t ) ;
613 std::cout <<
"Probabilistic Pca classification completed" << std::endl ;
626 indivPriorProbabilities )
629 ( indivPriorProbabilities.
dimX( ) == 1
630 && indivPriorProbabilities.
dimY( ) == 1
631 && indivPriorProbabilities.
dimZ( ) == 1 ) ;
638 if(
mask( x, y, z ) )
642 if( dynamicImage.
dimT() != _data.dimT() )
644 if( fuzzySegmented.
dimX() != _data.dimX()
645 || fuzzySegmented.
dimY() != _data.dimY() ||
646 fuzzySegmented.
dimZ() != _data.dimZ()
647 || fuzzySegmented.
dimT() != int(_classes.size() ) )
650 _data.dimZ(), _classes.size() ) ;
651 fuzzySegmented.
setSizeXYZT( _data.sizeX(), _data.sizeY(),
652 _data.sizeZ(), 1.0 ) ;
655 std::vector<double> probabilityRepartition ;
656 std::vector<double> maxProbaByClass( _discrElements.size(), 0. ) ;
657 std::vector<double>
max( _discrElements.size(), 0. ) ;
660 dynamicImage.
dimZ() ) ;
669 for(
int t = 0 ; t < _data.dimT() ; ++t )
671 indiv(t) = dynamicImage(x, y, z, t ) ;
672 norm += indiv(t) * indiv(t);
678 for(
int c = 0 ; c < fuzzySegmented.
dimT() ; ++c )
680 fuzzySegmented(x, y, z, c) = probabilityRepartition[c] ;
681 if( probabilityRepartition[c] >
max[c] )
682 max[c] = probabilityRepartition[c] ;
683 if( probabilityRepartition[c] > maxOnClass(x, y, z) )
684 maxOnClass(x, y, z) = probabilityRepartition[c] ;
689 std::cout <<
"Max on c = " ;
690 for(
int c = 0 ; c < fuzzySegmented.
dimT() ; ++c )
691 std::cout <<
max[c] <<
" " << std::endl ;
694 fuzzySegmentedW.
write( fuzzySegmented ) ;
711 pbByClassW.
write( fuzzySegmented ) ;
713 std::cout <<
"Probabilistic Pca : fuzzy classification completed" 724 std::vector<double> res( _discrElements.size() ) ;
726 double scoreSum = 0. ;
727 for(
unsigned int c = 0 ; c < _discrElements.size() ; ++c )
AimsFastAllocationData< double > _EValues
float posteriorProbability(const AimsData< double > &x, float pX, unsigned int classNb)
double pX(const AimsData< double > &x)
const AimsData< double > & eigenValues()
AimsData< T > & transpose()
float max(float x, float y)
BucketMap< Void > * mask(const BucketMap< Void > &src, const BucketMap< Void > &m, bool intersect=true)
void sort(AimsData< T > &, AimsData< T > &, AimsData< T > *v=NULL)
sort the U and V matrices and the W vector in decreasing order
bool classification(const AimsData< T > &dynamicImage, const AimsData< byte > &mask, AimsData< short > &segmented)
std::vector< double > andersonScores(const AimsData< double > &x, double px, std::vector< double > &maxProbaByClass)
AimsData< T > doit(AimsData< T > &, AimsData< T > *v=NULL)
Singular Value Decomposition.
#define ForEach3d(thing, x, y, z)
#define ForEach2d(thing, x, y)
const AimsData< double > & mean() const
float norm2(const AimsVector< T, D > &v1)
std::vector< double > posteriorProbabilities(const AimsData< double > &x, double px, std::vector< double > &maxProbaByClass)
void setReturnType(SVDReturnType rt)
Point3df cross(const Point3df &A, const Point3df &B)
double normFactor() const
double noiseVariance() const
virtual bool write(const T &obj, bool ascii=false, const std::string *format=0)
void doIt(const AimsData< T > &individuals, double distanceRef=0.)
AimsFastAllocationData< double > _mean
ProbabilisticPca(const AimsData< T > &data, const std::vector< std::list< Point3d > > &classes, int nbOfSignificantEigenValues, const std::vector< double > &PIj=std::vector< double >())
AimsData< T > clone() const
AimsData< T > cross(const AimsData< T > &other)
int affectedTo(const AimsData< double > &x)
AimsFastAllocationData< double > _x
AimsFastAllocationData< double > _xT
bool fuzzyClassification(const AimsData< T > &dynamicImage, const AimsData< byte > &mask, AimsData< float > &fuzzySegmented, double thresholdOnMaxPercentage=0., double andersonScoreThreshold=0.2, const AimsData< double > &indivPriorProbabilities=aims::AimsFastAllocationData< double >())
AimsFastAllocationData< double > _Wi
void setSizeXYZT(float sizex=1.0f, float sizey=1.0f, float sizez=1.0f, float sizet=1.0f)
AIMSDATA_API float norm(const Tensor &thing)
AimsFastAllocationData< double > _invCi
AimsFastAllocationData< double > _EVect