13 #include <aims/math/pca_d.h>
14 #include <aims/math/ppca.h>
15 #include <aims/io/writer.h>
16 #include <aims/connectivity/connectivity.h>
17 #include <aims/classification/individuals_d.h>
22 const std::set<int>& constitutedFrom,
int number ) :
23 Element<T>( number, card, constitutedFrom ), _bary(bary)
28 const AimsData<T>& data,
const std::set<int>& constitutedFrom,
30 Element<T>( number, 0, constitutedFrom )
36 while( aggIt != aggLast ) {
37 this->
_card += classes[*aggIt].size() ;
41 computeBary( classes, data ) ;
47 const AimsData<T>& data )
50 int indivSize = data.dimT() ;
54 Point3df position(0., 0., 0.) ;
55 std::vector<float> value( indivSize ) ;
57 std::set<int>::iterator constFromIter(this->_constitutedFrom.begin()), constLast(this->_constitutedFrom.end()) ;
60 while( constFromIter != constLast ){
61 std::list<Point3d>::const_iterator iter(classes[*constFromIter].begin()), last(classes[*constFromIter].end()) ;
62 while( iter != last ){
63 position += Point3df( (*iter)[0], (*iter)[1], (*iter)[2] ) ;
64 for(
int j = 0 ; j < indivSize ; ++j )
65 value[j] += data((*iter)[0], (*iter)[1], (*iter)[2], j) ;
72 float invNbInd = 1. / nbInd ;
73 for(
int j = 0 ; j < indivSize ; ++j )
74 value[j] *= invNbInd ;
75 position = position * invNbInd ;
77 _bary = aims::Individuals<float>(position, value) ;
83 const std::vector< std::list< Point3d > >&,
84 const AimsData<T>&,
const AimsData<float>& )
87 unsigned int size = baryValue().size() ;
89 throw std::runtime_error(
"Inconsistant data !") ;
91 for(
unsigned int i = 0 ; i < size ; ++i )
92 d += (_bary.value()[i] - otherB->
baryValue()[i])*(_bary.value()[i] - otherB->
baryValue()[i]);
93 d *= this->_card * otherB->
card() /( this->_card + otherB->
card() ) ;
101 const std::vector< std::list< Point3d > >&,
102 const AimsData<T>&,
const AimsData<float>&,
int newNb )
105 unsigned int size = baryValue().size() ;
107 throw std::runtime_error(
"Inconsistant data !") ;
110 std::set<int> constFrom( this->constitutedFrom() ) ;
113 while( cIt != cLast ){
114 constFrom.insert( *cIt ) ;
120 std::vector<float> val( size ) ;
121 int newCard = this->_card + otherB->
card() ;
122 float invNewCard = 1./newCard ;
123 for(
unsigned int i=0;i<_bary.value().size();i++)
124 val[i] = (this->_card*_bary.value()[i] +
126 pos = (float(this->_card)*_bary.position() +
129 aims::Individuals<float> newBary( pos, val );
136 template <
typename T>
138 const AimsData<T>& data,
int numberOfSignificantVps,
139 const std::set<int>& constitutedFrom,
int number ) :
140 Element<T>( number, 0, constitutedFrom ), _meanReconstructionError(-1.), _varReconstructionError(-1.),
141 _unreconstructedInertia(-1.), _numberOfSignificantVps(numberOfSignificantVps)
146 while( aggIt != aggLast ) {
147 this->
_card += classes[*aggIt].size() ;
154 template <
typename T>
158 return _meanReconstructionError ;
161 template <
typename T>
165 return _varReconstructionError ;
168 template <
typename T>
172 return _unreconstructedInertia ;
175 template <
typename T>
178 const AimsData<T>& data )
180 _meanReconstructionError = 0. ;
181 _varReconstructionError = 0. ;
182 std::set<int>::const_iterator aggIter( this->_constitutedFrom.begin() ), aggLast( this->_constitutedFrom.end() ) ;
184 std::list<Point3d> agregatePoints ;
185 while( aggIter != aggLast ){
186 std::list<Point3d>::const_iterator lIter(classes[*aggIter].begin()), lLast(classes[*aggIter].end() ) ;
187 while( lIter != lLast ){
188 agregatePoints.push_back( *lIter ) ;
194 if(
int(agregatePoints.size()) > data.dimT() ){
198 AimsPCA pca( _numberOfSignificantVps ) ;
199 pca.doIt<T>( agregatePoints, data ) ;
200 AimsData<float> errorMatrix = pca.reconstructionErrorMatrix( ) ;
203 std::list<Point3d>::iterator iter( agregatePoints.begin() ), last( agregatePoints.end() ) ;
204 AimsData<float> indiv( 1, data.dimT() ), indivTr(data.dimT()) ;
205 while( iter != last ){
207 for (
int t = 0 ; t < data.dimT() ; ++t ){
208 indiv(0,t) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
209 indivTr(t,0) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
211 norm2 += data( (*iter)[0], (*iter)[1], (*iter)[2], t )*
212 data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
214 float val = indiv.cross( errorMatrix.cross(indivTr) )(0,0) / norm2 ;
215 _meanReconstructionError += val ;
216 _varReconstructionError += val * val ;
220 _meanReconstructionError /= double(agregatePoints.size()) ;
221 _varReconstructionError = _varReconstructionError / double(agregatePoints.size()) -
222 _meanReconstructionError * _meanReconstructionError ;
223 if( this->_constitutedFrom.size() == 1 )
224 _errorMatrix = errorMatrix ;
228 _unreconstructedInertia = 1. ;
229 _meanReconstructionError = 1. ;
230 _varReconstructionError = 1. ;
234 template <
typename T>
237 const std::vector< std::list< Point3d > >& classes,
238 const AimsData<T>& data,
const AimsData<float>& initDistances )
240 Element<T> * fusionEl = agregateTo( other, classes, data, initDistances ) ;
251 template <
typename T>
254 const std::vector< std::list< Point3d > >& classes,
255 const AimsData<T>& data,
const AimsData<float>&,
int newNb )
259 std::set<int> constFrom( this->constitutedFrom() ) ;
262 while( cIt != cLast ){
263 constFrom.insert( *cIt ) ;
271 template <
typename T>
273 const AimsData<T>& data,
int numberOfSignificantVps,
274 const std::set<int>& constitutedFrom,
int number ) :
275 Element<T>( number, 0, constitutedFrom ), _numberOfSignificantVps(numberOfSignificantVps)
281 while( aggIt != aggLast ) {
282 this->
_card += classes[*aggIt].size() ;
287 _ppcaElement =
new aims::ProbabilisticPcaElement( _numberOfSignificantVps ) ;
289 computeReconstructionError( classes, data ) ;
292 template <
typename T>
295 const AimsData<T>& data )
297 std::set<int>::const_iterator aggIter( this->_constitutedFrom.begin() ), aggLast( this->_constitutedFrom.end() ) ;
299 std::list<Point3d> agregatePoints ;
300 while( aggIter != aggLast ){
301 std::list<Point3d>::const_iterator lIter(classes[*aggIter].begin()), lLast(classes[*aggIter].end() ) ;
302 while( lIter != lLast ){
303 agregatePoints.push_back( *lIter ) ;
309 if(
int(agregatePoints.size()) > data.dimT() )
310 _ppcaElement->doIt<T>(agregatePoints, data) ;
313 template <
typename T>
316 const std::vector< std::list< Point3d > >& classes,
317 const AimsData<T>& data,
const AimsData<float>& initDistances )
320 if( this->constitutedFrom().size() == 1 && other->
constitutedFrom().size() == 1 ){
321 AimsData<double> indiv(data.dimT()) ;
322 std::list<Point3d>::const_iterator iter( classes[*(this->constitutedFrom().begin())].begin() ),
323 last( classes[*(this->constitutedFrom().begin())].end() ) ;
324 float oneToTwoMeanError = 0. ;
325 float twoToOneMeanError = 0. ;
326 while( iter != last ){
328 for (
int t = 0 ; t < data.dimT() ; ++t ){
329 indiv(t) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
331 norm2 += data( (*iter)[0], (*iter)[1], (*iter)[2], t )*
332 data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
334 oneToTwoMeanError -= otherPPca->
ppca()->posteriorProbability( indiv, 1. ) ;
338 oneToTwoMeanError /= float(classes[*(this->constitutedFrom().begin())].size()) ;
344 while( iter != last ){
346 for (
int t = 0 ; t < data.dimT() ; ++t ){
347 indiv(t) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
349 norm2 += data( (*iter)[0], (*iter)[1], (*iter)[2], t )*
350 data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
352 twoToOneMeanError -= _ppcaElement->posteriorProbability( indiv, 1. ) ;
355 twoToOneMeanError /= float(classes[ *(otherPPca->
constitutedFrom().begin())].size()) ;
357 return std::max( oneToTwoMeanError, twoToOneMeanError ) ;
361 std::set<int>::const_iterator cIter( this->constitutedFrom().begin() ), cLast( this->constitutedFrom().end() ) ;
362 while( cIter != cLast ){
363 constFrom.insert( *cIter ) ;
375 std::set<int>::const_iterator c1Iter( constFrom.begin() ), c1Last( constFrom.end() ) ;
377 float maxDistance = 0. ;
378 while( c1Iter != c1Last )
380 std::set<int>::const_iterator c2Iter( c1Iter ) ;
382 while( c2Iter != c1Last )
386 float initDist = initDistances( *c1Iter, *c2Iter ) ;
387 if( maxDistance < initDist )
388 maxDistance = initDist ;
399 template <
typename T>
402 const std::vector< std::list< Point3d > >& classes,
403 const AimsData<T>& data,
const AimsData<float>&,
int newNb )
407 std::set<int> constFrom( this->constitutedFrom() ) ;
410 while( cIt != cLast ){
411 constFrom.insert( *cIt ) ;
419 template <
typename T>
422 const std::vector< std::list< Point3d > >& ,
423 const AimsData<T>& ,
const AimsData<float>& )
426 double surf1To2 = 0., surf2To1 = 0., dist1To2 = 0., dist2To1 = 0., maxMomentRatio = 1. ;
428 for( std::set<int>::iterator itC1 = this->constitutedFrom().begin() ; itC1 != this->constitutedFrom().end() ; ++itC1 )
430 surf1To2 += (*_interactionSurf)(*itC1, *itC2) ;
431 surf2To1 += (*_interactionSurf)(*itC2, *itC1) ;
432 dist1To2 = std::max(dist1To2, (*_kinModel2by2Distances)(*itC1, *itC2) ) ;
433 dist2To1 = std::max(dist2To1, (*_kinModel2by2Distances)(*itC2, *itC1) ) ;
445 maxMomentRatio = std::max( maxMomentRatio, (*_maxMomentValueRatios)(*itC1, *itC2) ) ;
448 double vol1 = 0, vol2 = 0 ;
449 for( std::set<int>::iterator itC1 = this->constitutedFrom().begin() ; itC1 != this->constitutedFrom().end() ; ++itC1 )
450 vol1 += (*_labelsVolumes)[*itC1] ;
452 vol2 += (*_labelsVolumes)[*itC2] ;
454 double maxSurfVolRatio = std::max( surf1To2 / vol1, surf2To1 / vol2 ) ;
456 return ( 0.5 * ( dist1To2 + dist2To1 ) - _meanDist2By2 ) / sqrt(_varDist2By2)
457 - _spatialregularizationWeight * ( maxSurfVolRatio - _meanSurfVolRatio ) / sqrt(_varSurfVolRatio)
458 + _timeOfMaximumWeight * ( maxMomentRatio - _meanMaxMomentRatio ) / sqrt(_varMaxMomentRatio) ;
463 template <
typename T>
466 const std::vector< std::list< Point3d > >& ,
467 const AimsData<T>& ,
const AimsData<float>& ,
int newNb )
469 std::set<int> constFrom( this->constitutedFrom() ) ;
472 while( cIt != cLast ){
473 constFrom.insert( *cIt ) ;
477 return new SCKBDistanceElement<T>( _maxMomentValueRatios, _kinModel2by2Distances, _interactionSurf, _labelsVolumes,
478 _spatialregularizationWeight, _timeOfMaximumWeight,
479 _meanDist2By2, _varDist2By2, _meanSurfVolRatio, _varSurfVolRatio,
480 _meanMaxMomentRatio, _varMaxMomentRatio,
484 template <
typename T>
486 Element<T>( number, 0, constitutedFrom )
492 template <
typename T>
495 const std::vector< std::list< Point3d > >&,
496 const AimsData<T>&,
const AimsData<float>& initDistances )
500 if( this->constitutedFrom().size() == 1 && other->
constitutedFrom().size() == 1 ){
501 return initDistances( *( this->constitutedFrom().begin() ), *( other->
constitutedFrom().begin() ) ) ;
505 std::set<int>::const_iterator cIter( this->constitutedFrom().begin() ), cLast( this->constitutedFrom().end() ) ;
506 while( cIter != cLast ){
507 constFrom.insert( *cIter ) ;
519 std::set<int>::const_iterator c1Iter( constFrom.begin() ), c1Last( constFrom.end() ) ;
521 float maxDistance = initDistances( *(constFrom.begin()), *(constFrom.rbegin()) ) ;
522 while( c1Iter != c1Last ){
523 std::set<int>::const_iterator c2Iter( c1Iter ) ;
525 while( c2Iter != c1Last )
529 float initDist = initDistances( *c1Iter, *c2Iter ) ;
531 if( maxDistance < initDist )
532 maxDistance = initDist ;
544 template <
typename T>
547 const std::vector< std::list< Point3d > >&,
548 const AimsData<T>&,
const AimsData<float>&,
int newNb )
552 std::set<int> constFrom( this->constitutedFrom() ) ;
555 while( cIt != cLast ){
556 constFrom.insert( *cIt ) ;
566 template <
typename T>
568 const AimsData<T>& data,
int numberOfSignificantVps,
569 const std::set<int>& constitutedFrom,
int number) :
570 Element<T>( number, 0, constitutedFrom ), _meanReconstructionError(-1.), _varReconstructionError(-1.),
571 _unreconstructedInertia(-1.), _numberOfSignificantVps(numberOfSignificantVps)
576 while( aggIt != aggLast ) {
577 this->
_card += classes[*aggIt].size() ;
581 computeReconstructionError( classes, data ) ;
584 template <
typename T>
587 const AimsData<T>& data )
589 _meanReconstructionError = 0. ;
590 _varReconstructionError = 0. ;
591 std::set<int>::const_iterator aggIter( this->_constitutedFrom.begin() ), aggLast( this->_constitutedFrom.end() ) ;
593 std::list<Point3d> agregatePoints ;
594 while( aggIter != aggLast ){
595 std::list<Point3d>::const_iterator lIter(classes[*aggIter].begin()), lLast(classes[*aggIter].end() ) ;
596 while( lIter != lLast ){
597 agregatePoints.push_back( *lIter ) ;
603 if(
int(agregatePoints.size()) > data.dimT() ){
607 AimsPCA pca( _numberOfSignificantVps ) ;
608 pca.doIt<T>( agregatePoints, data ) ;
609 AimsData<float> errorMatrix = pca.reconstructionErrorMatrix( ) ;
612 std::list<Point3d>::iterator iter( agregatePoints.begin() ), last( agregatePoints.end() ) ;
613 AimsData<float> indiv( 1, data.dimT() ), indivTr(data.dimT()) ;
614 while( iter != last ){
616 for (
int t = 0 ; t < data.dimT() ; ++t ){
617 indiv(0,t) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
618 indivTr(t,0) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
620 norm2 += data( (*iter)[0], (*iter)[1], (*iter)[2], t )*
621 data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
623 float val = indiv.cross( errorMatrix.cross(indivTr) )(0,0) / norm2 ;
624 _meanReconstructionError += val ;
625 _varReconstructionError += val * val ;
629 _meanReconstructionError /= double(agregatePoints.size()) ;
630 _varReconstructionError = _varReconstructionError / double(agregatePoints.size()) -
631 _meanReconstructionError * _meanReconstructionError ;
632 _errorMatrix = errorMatrix ;
636 _unreconstructedInertia = 1. ;
637 _meanReconstructionError = 1. ;
638 _varReconstructionError = 1. ;
642 template <
typename T>
646 return _meanReconstructionError ;
649 template <
typename T>
653 return _varReconstructionError ;
656 template <
typename T>
660 return _unreconstructedInertia ;
663 template <
typename T>
666 const std::vector< std::list< Point3d > >& classes,
667 const AimsData<T>& data,
const AimsData<float>& initDistances )
670 if( this->constitutedFrom().size() == 1 && other->
constitutedFrom().size() == 1 ){
671 AimsData<float> indiv( 1, data.dimT() ), indivTr(data.dimT()) ;
672 std::list<Point3d>::const_iterator iter( classes[*(this->constitutedFrom().begin())].begin() ),
673 last( classes[*(this->constitutedFrom().begin())].end() ) ;
674 AimsData<float> secondErrorMatrix = otherPcaReproc->
errorMatrix() ;
675 float oneToTwoMeanError = 0. ;
676 float twoToOneMeanError = 0. ;
677 while( iter != last ){
679 for (
int t = 0 ; t < data.dimT() ; ++t ){
680 indiv(0,t) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
681 indivTr(t,0) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
683 norm2 += data( (*iter)[0], (*iter)[1], (*iter)[2], t )*
684 data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
686 oneToTwoMeanError += indiv.cross( secondErrorMatrix.cross(indivTr) )(0,0) / norm2 ;
690 oneToTwoMeanError /= float(classes[*(this->constitutedFrom().begin())].size()) ;
695 iter = classes[ *(otherPcaReproc->
constitutedFrom().begin())].begin() ;
698 while( iter != last ){
700 for (
int t = 0 ; t < data.dimT() ; ++t ){
701 indiv(0,t) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
702 indivTr(t,0) = data( (*iter)[0], (*iter)[1], (*iter)[2], t ) - _mean[t] ;
704 norm2 += data( (*iter)[0], (*iter)[1], (*iter)[2], t )*
705 data( (*iter)[0], (*iter)[1], (*iter)[2], t ) ;
707 twoToOneMeanError += indiv.cross( _errorMatrix.cross(indivTr) )(0,0) / norm2 ;
710 twoToOneMeanError /= float(classes[ *(otherPcaReproc->
constitutedFrom().begin())].size()) ;
711 twoToOneMeanError = ( twoToOneMeanError - _meanReconstructionError ) *
712 ( twoToOneMeanError - _meanReconstructionError ) /
713 ( 2. * _varReconstructionError ) ;
715 return std::max( oneToTwoMeanError, twoToOneMeanError ) ;
719 std::set<int>::const_iterator cIter( this->constitutedFrom().begin() ), cLast( this->constitutedFrom().end() ) ;
720 while( cIter != cLast ){
721 constFrom.insert( *cIter ) ;
725 std::set<int>::const_iterator c1Iter( constFrom.begin() ), c1Last( constFrom.end() ) ;
727 float maxDistance = 0. ;
728 while( c1Iter != c1Last )
730 std::set<int>::const_iterator c2Iter( c1Iter ) ;
732 while( c2Iter != c1Last )
734 float initDist = initDistances( *c1Iter, *c2Iter ) ;
736 if( maxDistance < initDist )
737 maxDistance = initDist ;
746 template <
typename T>
749 const std::vector< std::list< Point3d > >& classes,
750 const AimsData<T>& data,
const AimsData<float>&,
int newNb )
753 std::set<int> constFrom( this->constitutedFrom() ) ;
756 while( cIt != cLast ){
757 constFrom.insert( *cIt ) ;
765 template <
typename T>
767 const AimsData<T>& data ) : _classes( classes ), _data( data ) {}
769 template <
typename T>
773 template <
typename T>
774 std::list< Element<T>* >
777 std::list<Element<T>*> listeEl ;
778 for(
unsigned int c = 0 ; c < _classes.size() ; ++c )
779 listeEl.push_back( creator(c) ) ;
783 template <
typename T>
787 template <
typename T>
790 template <
typename T>
794 return new BaryElement<T>( this->_classes, this->_data, std::set<int>(), n ) ;
798 template <
typename T>
800 const std::vector< std::list< Point3d > >& classes,
801 const AimsData<T>& data ) :
804 template <
typename T>
807 template <
typename T>
811 return new PcaElement<T>( this->_classes, this->_data, _nbOfSignificantVps, std::set<int>(), n ) ;
816 template <
typename T>
818 CahElementFactory<T>( ), _initDistances( initDistances.clone() ), _nbClasses(initDistances.dimX())
820 std::cout <<
"Init distances = " << _initDistances.dimX() <<
", " << _initDistances.dimY() << std::endl ;
823 template <
typename T>
826 template <
typename T>
834 template <
typename T>
835 std::list< Element<T>* >
838 std::list<Element<T>*> listeEl ;
839 std::cout <<
"Nb classes = " << _nbClasses << std::endl ;
840 for(
int c = 0 ; c < _nbClasses ; ++c )
841 listeEl.push_back( creator(c) ) ;
848 std::cout <<
"CAH::kineticSampleDistance" << std::endl ;
849 for(
unsigned int c = 0 ; c < classes.size() ; ++c )
850 if( ! classes[c]->computed() )
851 std::cerr <<
"Not computed for class " << c << std::endl ;
853 double nbFrames = double( classes[0]->mean().getSizeX() ) ;
854 AimsData<double> distance2by2( classes.size(), classes.size() ) ;
856 ForEach2d( distance2by2, c1, c2 ){
857 distance2by2( c1, c2 ) = classes[c1]->distance( classes[c2]->mean() ) ;
860 AimsData<double> * symDistance2by2 =
new AimsData<double>( classes.size(), classes.size() ) ;
861 ForEach2d( distance2by2, c1, c2 ){
862 (*symDistance2by2)( c1, c2 ) = 0.5 * ( distance2by2( c1, c2 ) + distance2by2( c2, c1 ) ) / nbFrames ;
867 return symDistance2by2 ;
872 AimsData<double>& interactionSurf, std::vector<double>& labelsVolumes )
874 std::cout <<
"CAH::interactionSurfaces" << std::endl ;
876 int maxLabel = unfusionedLabels[0] ;
877 for(
unsigned int ind = 0 ; ind < unfusionedLabels.size() ; ++ind ){
878 if( unfusionedLabels[ind] > maxLabel ){
879 maxLabel = unfusionedLabels[ind] ;
884 std::cout << std::endl <<
"max label computed : " << maxLabel <<
" on " << unfusionedLabels.size() <<
"indivs" << std::endl ;
886 labelsVolumes = std::vector<double>( maxLabel + 1 ) ;
887 interactionSurf = AimsData<double>( maxLabel + 1, maxLabel + 1 ) ;
889 aims::Connectivity * conn = 0 ;
890 if( locMap.dimZ() == 1 )
891 conn =
new aims::Connectivity( 0, 0, aims::Connectivity::CONNECTIVITY_4_XY ) ;
893 conn =
new aims::Connectivity( 0, 0, aims::Connectivity::CONNECTIVITY_6_XYZ ) ;
895 Point3df voxelSize( locMap.sizeX(), locMap.sizeY(), locMap.sizeZ() ) ;
896 float voxelVolume = locMap.sizeX() * locMap.sizeY() * locMap.sizeZ() ;
897 std::vector<float> surfaces( conn->nbNeighbors(), voxelVolume ) ;
899 for(
int n = 0 ; n < conn->nbNeighbors() ; ++n ){
901 if( conn->xyzOffset(n)[1] != 0. )
903 else if( conn->xyzOffset(n)[2] != 0. )
905 surfaces[n] /= voxelSize[index] ;
906 std::cout <<
"xyzOffset : " << conn->xyzOffset(n) <<
" : " << surfaces[n] << std::endl ;
909 std::cout <<
"surface vector computed" << std::endl ;
911 int ind, indLabel, neigh, neighLabel ;
914 Point3d dims( locMap.dimX(), locMap.dimY(), locMap.dimZ() ) ;
915 ForEach3d( locMap, x, y, z ){
916 ind = locMap( x, y, z ) ;
917 indLabel = unfusionedLabels[ind] ;
918 labelsVolumes[ indLabel ] += voxelVolume ;
919 p = Point3d(x, y, z) ;
920 for(
int n = 0 ; n < conn->nbNeighbors() ; ++n ){
921 pNeigh = p + conn->xyzOffset(n) ;
922 if( pNeigh[0] >= 0 && pNeigh[1] >= 0 && pNeigh[2] >= 0 &&
923 pNeigh[0] < locMap.dimX() && pNeigh[1] < locMap.dimY() && pNeigh[2] < locMap.dimZ() ) {
924 neigh = locMap( pNeigh ) ;
925 neighLabel = unfusionedLabels[neigh] ;
926 if( indLabel != neighLabel ){
927 interactionSurf( indLabel, neighLabel ) += surfaces[n] ;
934 std::cout <<
"interaction surfaces computed" << std::endl ;
937 AimsData<double> surfaceVolumeRatio( maxLabel + 1, maxLabel + 1 ) ;
938 ForEach2d( interactionSurf, c1, c2 ){
940 surfaceVolumeRatio( c1, c2 ) = interactionSurf( c1, c2 ) / labelsVolumes[c1] ;
943 AimsData<double> symetrizedSurfaceVolumeRatio( maxLabel + 1, maxLabel + 1 ) ;
944 double maximum, minimum = std::max( surfaceVolumeRatio( 0, 1 ), surfaceVolumeRatio( 1, 0 ) ) ;
947 ForEach2d( interactionSurf, c1, c2 ){
949 symetrizedSurfaceVolumeRatio( c1, c2 ) = std::max( surfaceVolumeRatio( c1, c2 ), surfaceVolumeRatio( c2, c1 ) ) ;
950 if( symetrizedSurfaceVolumeRatio( c1, c2 ) > maximum )
951 maximum = symetrizedSurfaceVolumeRatio( c1, c2 ) ;
952 if( symetrizedSurfaceVolumeRatio( c1, c2 ) < minimum )
953 minimum = symetrizedSurfaceVolumeRatio( c1, c2 ) ;
964 AimsData<double> distanceMatrix(maxLabel + 1, maxLabel + 1) ;
965 ForEach2d( interactionSurf, c1, c2 ){
967 distanceMatrix(c1, c2) = 0. ;
969 distanceMatrix(c1, c2) = (symetrizedSurfaceVolumeRatio(c1, c2) - minimum) / ( maximum - minimum ) ;
972 return distanceMatrix ;
979 if( x.dimX() == 1 && y.dimX() == 1 )
982 if( x.dimX() != y.dimX() ){
983 std::cerr <<
"Wrong size for correlation !" << std::endl ;
984 throw std::runtime_error(
"Wrong size for correlation !") ;
990 for(
int t = 0 ; t < x.dimX() ; ++t ){
994 xMean /= T(x.dimX()) ;
995 yMean /= T(y.dimX()) ;
998 for(
int t = 0 ; t < x.dimX() ; ++t )
999 corr += ( x(t) - xMean ) * ( y(t) - yMean ) ;
1000 return (corr > 0.) ;
1028 std::vector<short> momentOfMax( classesKinDescription.size() ) ;
1029 std::vector<float> valueOfMax( classesKinDescription.size() ) ;
1031 for(
unsigned int c = 0 ; c < classesKinDescription.size() ; ++c ){
1032 for(
int t = 0 ; t < classesKinDescription[c]->mean().getSizeX() ; ++t )
1033 if( classesKinDescription[c]->mean()(t) > classesKinDescription[c]->mean()(maxInd) )
1035 momentOfMax[c] = maxInd ;
1039 AimsData<double> res( classesKinDescription.size(), classesKinDescription.size() ) ;
1041 ForEach2d( res, c1, c2){
1042 if( momentOfMax[c1] == momentOfMax[c2] )
1043 res( c1, c2) == 0. ;
1045 double minMoment = std::min(momentOfMax[c1], momentOfMax[c2]) ;
1046 res( c1, c2) = 2. * std::max( momentOfMax[c1] - momentOfMax[c2], momentOfMax[c2] - momentOfMax[c1]) *
1047 exp( - (minMoment * minMoment)
1048 / ( 2. * 0.5 * classesKinDescription[0]->mean().getSizeX() * 0.5 * classesKinDescription[0]->mean().getSizeX() ) ) ;
1062 std::vector<short> momentOfMax( classesKinDescription.size() ) ;
1063 std::vector<float> valueOfMax( classesKinDescription.size() ) ;
1065 for(
unsigned int c = 0 ; c < classesKinDescription.size() ; ++c ){
1066 for(
int t = 0 ; t < classesKinDescription[c]->mean().getSizeX() ; ++t )
1067 if( classesKinDescription[c]->mean()(t) > classesKinDescription[c]->mean()(maxInd) )
1069 momentOfMax[c] = maxInd ;
1071 AimsData<double> valueAtMaxMoment( classesKinDescription.size(), classesKinDescription.size() ) ;
1073 ForEach2d(valueAtMaxMoment, c1, c2){
1075 valueAtMaxMoment(c1, c2) = 1. - ( classesKinDescription[c2]->mean()( momentOfMax[c1] ) / classesKinDescription[c2]->mean()( momentOfMax[c2] ) ) ;
1077 AimsData<double> res( valueAtMaxMoment.clone() );
1078 ForEach2d(res, c1, c2){
1079 res(c1, c2) = 0.5 * ( valueAtMaxMoment(c1, c2) + valueAtMaxMoment(c2, c1) ) ;
1088 template<
typename T>
1090 const std::vector<aims::DiscriminantAnalysisElement*>& classesKinDescription,
1091 const AimsData<int>& locMap,
1092 const std::vector<short>& unfusionedLabels,
1093 const std::vector<float>& classMaximaMoment,
1094 float spatialregularizationWeight,
1095 float timeOfMaximumWeight ) :
1097 _spatialregularizationWeight(spatialregularizationWeight),
1098 _timeOfMaximumWeight(timeOfMaximumWeight)
1100 _interactionSurf =
new AimsData<double> ;
1101 _labelsVolumes =
new std::vector<double> ;
1104 _antiCorrelatedMeans =
new AimsData<char>( classesKinDescription.size(), classesKinDescription.size() ) ;
1107 double nbFrames = double( classesKinDescription[0]->mean().getSizeX() ) ;
1108 _kinModel2by2Distances =
new AimsData<double>( classesKinDescription.size(), classesKinDescription.size() ) ;
1110 AimsData<double> distance2by2( classesKinDescription.size(), classesKinDescription.size() ) ;
1111 double max2By2Distance = 0 ;
1113 ForEach2d( distance2by2, c1, c2 ){
1114 distance2by2( c1, c2 ) = classesKinDescription[c1]->distance( classesKinDescription[c2]->mean() ) ;
1115 if( distance2by2( c1, c2 ) > max2By2Distance )
1116 max2By2Distance = distance2by2( c1, c2 ) ;
1117 (*_antiCorrelatedMeans)(c1, c2) = !correlated<double>(
1118 classesKinDescription[c1]->mean(), classesKinDescription[c2]->mean()) ;
1121 _meanDist2By2 = _varDist2By2 = _meanSurfVolRatio = _varSurfVolRatio = _meanMaxMomentRatio = _varMaxMomentRatio = 0. ;
1123 ForEach2d( distance2by2, c1, c2 ){
1124 (*_kinModel2by2Distances)( c1, c2 ) = 0.5 * ( distance2by2( c1, c2 ) + distance2by2( c2, c1 ) ) / nbFrames ;
1126 if( !(*_antiCorrelatedMeans)(c1, c2) ){
1128 float val = (*_kinModel2by2Distances)( c1, c2 ) ;
1129 _meanDist2By2 += val ;
1130 _varDist2By2 += val * val ;
1132 if( (*_labelsVolumes)[c1] == 0. || (*_labelsVolumes)[c2] == 0. )
1135 val = std::max( (*_interactionSurf)(c1, c2) / (*_labelsVolumes)[c1],
1136 (*_interactionSurf)(c2, c1) / (*_labelsVolumes)[c2] ) ;
1138 _meanSurfVolRatio += val ;
1139 _varSurfVolRatio += val * val ;
1141 val = 0.5 * (*_maxMomentValueRatios)(c1, c2) ;
1142 _meanMaxMomentRatio += val ;
1143 _varMaxMomentRatio += val * val ;
1147 _meanDist2By2 /= float( nbOfCases ) ;
1148 _meanSurfVolRatio /= float( nbOfCases ) ;
1149 _meanMaxMomentRatio /= float( nbOfCases ) ;
1151 _varDist2By2 = ( _varDist2By2 / float( nbOfCases ) - _meanDist2By2 * _meanDist2By2 )
1152 /
float( nbOfCases - 1 ) * float( nbOfCases ) ;
1153 _varSurfVolRatio = ( _varSurfVolRatio / float( nbOfCases ) - _meanSurfVolRatio * _meanSurfVolRatio )
1154 /
float( nbOfCases - 1 ) * float( nbOfCases ) ;
1155 _varMaxMomentRatio = ( _varMaxMomentRatio / float( nbOfCases ) - _meanMaxMomentRatio * _meanMaxMomentRatio )
1156 /
float( nbOfCases - 1 ) * float( nbOfCases ) ;
1157 if( _varMaxMomentRatio == 0. )
1158 _varMaxMomentRatio = 1. ;
1161 double meanCentered1 = 0., meanCentered2 = 0. ;
1163 ForEach2d( distance2by2, c1, c2 ){
1164 (*_kinModel2by2Distances)( c1, c2 ) = 0.5 * ( distance2by2( c1, c2 ) + distance2by2( c2, c1 ) ) / nbFrames ;
1166 if( !(*_antiCorrelatedMeans)(c1, c2) ){
1168 meanCentered1 += (*_kinModel2by2Distances)( c1, c2 ) - _meanDist2By2 ;
1170 if( (*_labelsVolumes)[c1] == 0. || (*_labelsVolumes)[c2] == 0. )
1173 val = std::max( (*_interactionSurf)(c1, c2) / (*_labelsVolumes)[c1],
1174 (*_interactionSurf)(c2, c1) / (*_labelsVolumes)[c2] ) ;
1176 meanCentered2 += val - _meanSurfVolRatio ;
1181 AimsData<double> correctedDists( classesKinDescription.size(), classesKinDescription.size() ) ;
1182 AimsData<double> correctedSurfVolRatio( correctedDists.clone() ), correctedMomentOfMax( correctedDists.clone() ) ;
1183 ForEach2d( correctedDists, c1, c2 ){
1184 correctedDists(c1, c2) = ( (*_kinModel2by2Distances)( c1, c2 ) - _meanDist2By2 ) / sqrt( _varDist2By2 ) ;
1185 correctedSurfVolRatio(c1, c2) = -( std::max( (*_interactionSurf)(c1, c2) / (*_labelsVolumes)[c1],
1186 (*_interactionSurf)(c2, c1) / (*_labelsVolumes)[c1] ) - _meanSurfVolRatio ) / sqrt( _varSurfVolRatio ) ;
1190 correctedMomentOfMax(c1, c2) = ( (*_maxMomentValueRatios)(c1, c2) - _meanMaxMomentRatio )
1191 / sqrt( _varMaxMomentRatio ) ;
1214 template <
typename T>
1218 return new SCKBDistanceElement<T>( _maxMomentValueRatios, _kinModel2by2Distances, _interactionSurf, _labelsVolumes,
1219 _spatialregularizationWeight, _timeOfMaximumWeight,
1220 _meanDist2By2, _varDist2By2, _meanSurfVolRatio, _varSurfVolRatio, _meanMaxMomentRatio, _varMaxMomentRatio,
1221 std::set<int>(), n ) ;
1224 template <
typename T>
1226 const std::vector< std::list< Point3d > >& classes,
1227 const AimsData<T>& data ) :
1230 template <
typename T>
1233 template <
typename T>
1237 return new PPcaElement<T>( this->_classes, this->_data, _nbOfSignificantVps, std::set<int>(), n ) ;
1240 template <
typename T>
1242 const std::vector< std::list< Point3d > >& classes,
1243 const AimsData<T>& data ) :
1246 template <
typename T>
1249 template <
typename T>
1256 template <
typename T>
1258 _classes( method->classes() ), _data(method->data()), _m(0), _canAddElement(true),
1259 _initDistancesAlreadyComputed(false)
1262 throw std::runtime_error(
"You must specify a method for ascendant hierarcical classification !") ;
1264 if( method->
methodType() ==
"Max2By2Distance" )
1270 throw std::runtime_error(
"Incompatible pre-computed distances between element matrix size !") ;
1272 _distanceBetweenInitialElements = fact->
initDistances()->clone() ;
1276 _initDistancesAlreadyComputed = true ;
1277 _canAddElement = false ;
1279 else if( method->
classes().size() )
1281 _m = method->
classes().size() ;
1283 _canAddElement = false ;
1288 template <
typename T>
1291 if( !_canAddElement )
1295 _listeN.push_back(el);
1302 template <
typename T>
1305 if( _initDistancesAlreadyComputed ){
1306 for(
int i = 0 ; i < _distanceBetweenInitialElements.dimX() ; ++i )
1307 for(
int j = i + 1 ; j < _distanceBetweenInitialElements.dimY() ; ++j )
1308 _mMap.insert( std::pair<float, Point2d>( _distanceBetweenInitialElements(i, j),
1316 _distanceBetweenInitialElements = AimsData<float>(_m, _m) ;
1319 typename std::list<Element<T>*>::iterator
1320 iiter(_listeN.begin()), ilast(_listeN.end()) ;
1324 while( iiter != ilast )
1326 typename std::list<Element<T>*>::iterator
1327 jiter(iiter), jlast(_listeN.end()) ;
1330 while( jiter != jlast )
1332 if( (*iiter) != (*jiter) ){
1333 d = (*iiter)->distanceTo( *jiter, _classes, _data,
1334 _distanceBetweenInitialElements );
1335 _mMap.insert(std::pair<float, Point2d>
1336 (d, Point2d((*iiter)->number(),(*jiter)->number())));
1337 _distanceBetweenInitialElements( (*iiter)->number(),
1338 (*jiter)->number() ) = d ;
1339 _distanceBetweenInitialElements( (*jiter)->number(),
1340 (*iiter)->number() ) = d ;
1350 template <
typename T>
1353 std::multimap<float, Point2d>::const_iterator it = _mMap.begin();
1354 int Na = it->second[0], Nb = it->second[1];
1359 _result.push_back(std::pair<Point2d, float> ( Point2d(Na, Nb),it->first));
1360 std::cout <<Na<<
" "<<Nb<<
" "<<(it->first) <<
" : " << std::endl;
1363 typename std::list<Element<T>*>::iterator vectiter, tmpiter;
1364 vectiter=_listeN.begin();
1365 while(vectiter!=_listeN.end())
1367 if( ((*vectiter)->number()) == Na )
1372 _listeN.erase(tmpiter);
1376 if( ((*vectiter)->number()) == Nb )
1381 _listeN.erase(tmpiter);
1391 _distanceBetweenInitialElements, _m + etape ) ;
1394 while( cit != clt ){
1398 std::multimap<float, Point2d>::iterator mapiter, tempiter;
1399 mapiter= _mMap.begin();
1400 while(mapiter!=_mMap.end())
1402 if( (mapiter->second[0]==Na) || (mapiter->second[1]==Na) ||
1403 (mapiter->second[0]==Nb) || (mapiter->second[1]==Nb) )
1407 _mMap.erase(tempiter);
1414 typename std::list<Element<T>*>::iterator
1415 iiter(_listeN.begin()), ilast(_listeN.end()) ;
1416 while( iiter != ilast )
1418 d = nouveau->
distanceTo( *iiter, _classes, _data, _distanceBetweenInitialElements ) ;
1419 _mMap.insert(std::pair<float, Point2d>
1420 (d, Point2d((*iiter)->number(), nouveau->
number())) );
1427 _listeN.push_back(nouveau);
1431 template <
typename T>
1434 initialisationDist();
1435 for (
unsigned int i=1; i<_m;i++)
1437 std::cout<<
"Etape n°"<<i<<std::endl;
1446 template <
typename T>
1450 std::vector<int> liste;
1451 for(
unsigned int i=_m-nc;i<_m-1;i++)
1453 if((
unsigned int)_result[i].first[0]<(2*_m-nc+1))
1455 liste.push_back(_result[i].first[0]);
1458 if((
unsigned int)_result[i].first[1]<(2*_m-nc+1))
1460 liste.push_back(_result[i].first[1]);
1468 template <
typename T>
1472 std::vector<int> liste;
1473 for(
int i=_m-2;(_result[i].second<d)||(i<0);i--)
1475 if((
unsigned int)_result[i].first[0]<=_m)
1477 liste.push_back(_result[i].first[0]);
1481 if(_result[_result[i].first[0]-_m-1].second<d)
1483 liste.push_back(_result[i].first[0]);
1487 if((
unsigned int)_result[i].first[1]<=_m)
1489 liste.push_back(_result[i].first[1]);
1493 if(_result[_result[i].first[1]-_m-1].second<d)
1495 liste.push_back(_result[i].first[1]);
1505 template <
typename T>
1511 aClass.push_back(N);
1515 Proc(_result[N-_m-1].first[0], aClass );
1516 Proc(_result[N-_m-1].first[1], aClass );
1521 template <
typename T>
1522 std::vector<Point2d>
Cah<T>::cut(
const std::vector< std::pair<Point2d, float> >& res_cah,
int nc )
1526 if( res_cah.size() )
1529 _m = _result.size() + 1;
1532 std::vector<int> liste = leaves(nc);
1540 std::vector<Point2d> res;
1541 std::map<int,int> t;
1542 for(
unsigned int c=0;c<liste.size();c++)
1544 std::vector<int> aClasse ;
1546 Proc(liste[c], aClasse);
1548 for(
unsigned int i=0;i<aClasse.size();i++)
1550 t[aClasse[i]] = (c+1);
1554 std::map<int,int>::iterator mapit;
1556 for(mapit=t.begin();mapit!=t.end();mapit++)
1558 point[0] = mapit->first;
1559 point[1] = mapit->second;
1560 res.push_back(point);
1567 template <
typename T>
1574 while( (
unsigned int)(nc + 1) < res_cah.size() && res_cah[nc + 1].second < d )
1577 return cut( res_cah, _m + 1 - nc ) ;
1581 template <
typename T>
1588 AimsData<float> derivate( res_cah.size() ) ;
1589 AimsData<float> cost( res_cah.size() ) ;
1590 AimsData<float> curvature( res_cah.size() ) ;
1592 for(
unsigned int i = 1 ; i < res_cah.size() - 1 ; ++i ){
1593 cost[i] = res_cah[i].second ;
1594 derivate[i] = ( res_cah[i+1].second - res_cah[i-1].second) * 0.5 ;
1597 int maxCurvInd = 0 ;
1598 float maxCurv = 0. ;
1599 for(
unsigned int i = 1 ; i < res_cah.size() - 1 ; ++i ){
1600 curvature[i] = ( res_cah[i+1].second - 2 * res_cah[i].second + res_cah[i-1].second) * 0.25 ;
1602 if( curvature[i] > maxCurv ){
1603 maxCurv = curvature[i] ;
1615 return cut( res_cah, _m + 1 - maxCurvInd ) ;
1618 template <
typename T>
1621 std::string car = fileout +
"_cah" ;
1623 std::ofstream os( car.c_str() ) ;
1625 for(
unsigned i=0;i<_result.size();i++)
1627 os << _result[i].first[0] <<
" " << _result[i].first[1]
1628 <<
" " << _result[i].second << std::endl ;
1633 AimsData<float> derivate( _result.size() ) ;
1634 AimsData<float> cost( _result.size() ) ;
1635 AimsData<float> curvature( _result.size() ) ;
1637 for(
unsigned int i = 1 ; i < _result.size() - 3 ; ++i ){
1638 cost[i] = _result[i].second ;
1639 derivate[i] = ( _result[i+1].second - _result[i-1].second) * 0.5 ;
1642 for(
unsigned int i = 1 ; i < _result.size() - 1 ; ++i )
1643 curvature[i] = ( _result[i+1].second - 2 * _result[i].second + _result[i-1].second) * 0.25 ;
1653 template <
typename T>
1654 const std::vector< std::pair<Point2d, float> >&
Cah<T>::load(
const std::string& filein )
1658 unsigned int Na = 0, Nb = 0;
1661 std::ifstream is( filein.c_str() ) ;
1666 _result.push_back(std::pair<Point2d, float> (Point2d(Na, Nb), d) );
1674 _result.push_back(std::pair<Point2d, float> (Point2d(Na, Nb), d) );
AimsData< double > momentOfMaxValueRatios(const std::vector< aims::DiscriminantAnalysisElement * > &classesKinDescription)
AimsData< double > * kineticSampleDistance(const std::vector< aims::DiscriminantAnalysisElement * > &classes)
AimsData< double > momentOfMaximumDifference(const std::vector< aims::DiscriminantAnalysisElement * > &classesKinDescription)
bool correlated(const AimsData< T > &x, const AimsData< T > &y)
AimsData< double > interactionSurfaces(const AimsData< int > &locMap, const std::vector< short > &unfusionedLabels, AimsData< double > &interactionSurf, std::vector< double > &labelsVolumes)
virtual ~BaryCahElementFactory()
BaryCahElementFactory(const std::vector< std::list< Point3d > > &classes=std::vector< std::list< Point3d > >(), const AimsData< T > &data=AimsData< T >())
virtual Element< T > * agregateTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances, int newNb=-1)
const Point3df & baryPosition() const
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
const std::vector< float > & baryValue() const
BaryElement(int card, const aims::Individuals< float > &bary, const std::set< int > &constitutedFrom=std::set< int >(), int number=-1)
virtual std::string methodType() const =0
virtual Element< T > * creator(int n) const =0
const std::vector< std::list< Point3d > > & classes() const
virtual ~CahElementFactory()
virtual std::list< Element< T > * > creator() const
CahElementFactory(const std::vector< std::list< Point3d > > &classes=std::vector< std::list< Point3d > >(), const AimsData< T > &data=AimsData< T >())
void save(const std::string &name)
void initialisationDist()
std::vector< Point2d > maxCurvatureCut(const std::vector< std::pair< Point2d, float > > &res)
const std::vector< std::pair< Point2d, float > > & doit()
const std::vector< std::pair< Point2d, float > > & load(const std::string &name)
std::vector< Point2d > distanceCut(const std::vector< std::pair< Point2d, float > > &res, float)
std::vector< Point2d > cut(const std::vector< std::pair< Point2d, float > > &res, int)
bool addElement(Element< T > *el)
Returns false if el ca not be added.
Cah(const CahElementFactory< T > *method)
void setNumber(int number)
const std::set< int > & constitutedFrom() const
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)=0
std::set< int > _constitutedFrom
virtual Element< T > * agregateTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances, int newNb=-1)=0
Max2By2DistanceCahElementFactory(const AimsData< float > &initDistances)
virtual ~Max2By2DistanceCahElementFactory()
virtual std::list< Element< T > * > creator() const
const AimsData< float > * initDistances() const
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
Max2By2DistanceElement(const std::set< int > &constitutedFrom=std::set< int >(), int number=-1)
virtual Element< T > * agregateTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances, int newNb=-1)
PPcaCahElementFactory(int nbOfSignificantVps, const std::vector< std::list< Point3d > > &classes=std::vector< std::list< Point3d > >(), const AimsData< T > &data=AimsData< T >())
virtual ~PPcaCahElementFactory()
aims::ProbabilisticPcaElement * ppca()
virtual Element< T > * agregateTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances, int newNb=-1)
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
PPcaElement(const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, int numberOfSignificantVps, const std::set< int > &constitutedFrom=std::set< int >(), int number=-1)
PcaCahElementFactory(int nbOfSignificantVps, const std::vector< std::list< Point3d > > &classes=std::vector< std::list< Point3d > >(), const AimsData< T > &data=AimsData< T >())
virtual ~PcaCahElementFactory()
PcaElement(const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, int numberOfSignificantVps, const std::set< int > &constitutedFrom=std::set< int >(), int number=-1)
virtual Element< T > * agregateTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances, int newNb=-1)
float unreconstructedInertia()
float meanReconstructionError()
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
float varReconstructionError()
void computeReconstructionError(const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data)
PcaReprocReconsErrorCahElementFactory(int nbOfSignificantVps, const std::vector< std::list< Point3d > > &classes=std::vector< std::list< Point3d > >(), const AimsData< T > &data=AimsData< T >())
virtual ~PcaReprocReconsErrorCahElementFactory()
PcaReprocReconsErrorElement(const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, int numberOfSignificantVps, const std::set< int > &constitutedFrom=std::set< int >(), int number=-1)
float unreconstructedInertia()
float varReconstructionError()
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
virtual Element< T > * agregateTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances, int newNb=-1)
const AimsData< float > & errorMatrix()
float meanReconstructionError()
SCKBDistanceCahElementFactory(const std::vector< std::list< Point3d > > &classes, const std::vector< aims::DiscriminantAnalysisElement * > &classesKinDescription, const AimsData< int > &locMap, const std::vector< short > &unfusionedLabels, const std::vector< float > &classMaximaMoment, float spatialregularizationWeight=1., float timeOfMaximumWeight=0.5)
virtual Element< T > * agregateTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances, int newNb=-1)
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)