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)
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 ) ;
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>& )
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]);
101 const std::vector< std::list< Point3d > >&,
102 const AimsData<T>&,
const AimsData<float>&,
int newNb )
107 throw std::runtime_error(
"Inconsistant data !") ;
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,
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>
161 template <
typename T>
168 template <
typename T>
175 template <
typename T>
178 const AimsData<T>& data )
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() ){
199 pca.doIt( 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 ;
234 template <
typename T>
237 const std::vector< std::list< Point3d > >& classes,
238 const AimsData<T>& data,
const AimsData<float>& initDistances )
251 template <
typename T>
254 const std::vector< std::list< Point3d > >& classes,
255 const AimsData<T>& data,
const AimsData<float>&,
int newNb )
262 while( cIt != cLast ){
263 constFrom.insert( *cIt ) ;
271 template <
typename T>
273 const AimsData<T>& data,
int 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 )
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(agregatePoints, data) ;
313 template <
typename T>
316 const std::vector< std::list< Point3d > >& classes,
317 const AimsData<T>& data,
const AimsData<float>& initDistances )
321 AimsData<double> indiv(data.dimT()) ;
322 std::list<Point3d>::const_iterator iter( classes[*(this->
constitutedFrom().begin())].begin() ),
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 ) ;
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 )
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. ;
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 ;
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 )
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 )
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 )
555 while( cIt != cLast ){
556 constFrom.insert( *cIt ) ;
566 template <
typename T>
568 const AimsData<T>& data,
int numberOfSignificantVps,
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. ;
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( 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 ;
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 )
671 AimsData<float> indiv( 1, data.dimT() ), indivTr(data.dimT()) ;
672 std::list<Point3d>::const_iterator iter( classes[*(this->
constitutedFrom().begin())].begin() ),
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 ) ;
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 )
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>
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>
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().dimX() ) ;
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().dimX() ; ++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().dimX() * 0.5 * classesKinDescription[0]->mean().dimX() ) ) ;
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().dimX() ; ++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().dimX() ) ;
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( classesKinDescription[c1]->mean(), classesKinDescription[c2]->mean()) ;
1120 _meanDist2By2 = _varDist2By2 = _meanSurfVolRatio = _varSurfVolRatio = _meanMaxMomentRatio = _varMaxMomentRatio = 0. ;
1122 ForEach2d( distance2by2, c1, c2 ){
1123 (*_kinModel2by2Distances)( c1, c2 ) = 0.5 * ( distance2by2( c1, c2 ) + distance2by2( c2, c1 ) ) / nbFrames ;
1125 if( !(*_antiCorrelatedMeans)(c1, c2) ){
1127 float val = (*_kinModel2by2Distances)( c1, c2 ) ;
1128 _meanDist2By2 += val ;
1129 _varDist2By2 += val * val ;
1131 if( (*_labelsVolumes)[c1] == 0. || (*_labelsVolumes)[c2] == 0. )
1134 val = std::max( (*_interactionSurf)(c1, c2) / (*_labelsVolumes)[c1],
1135 (*_interactionSurf)(c2, c1) / (*_labelsVolumes)[c2] ) ;
1137 _meanSurfVolRatio += val ;
1138 _varSurfVolRatio += val * val ;
1140 val = 0.5 * (*_maxMomentValueRatios)(c1, c2) ;
1141 _meanMaxMomentRatio += val ;
1142 _varMaxMomentRatio += val * val ;
1146 _meanDist2By2 /= float( nbOfCases ) ;
1147 _meanSurfVolRatio /= float( nbOfCases ) ;
1148 _meanMaxMomentRatio /= float( nbOfCases ) ;
1150 _varDist2By2 = ( _varDist2By2 / float( nbOfCases ) - _meanDist2By2 * _meanDist2By2 )
1151 /
float( nbOfCases - 1 ) * float( nbOfCases ) ;
1152 _varSurfVolRatio = ( _varSurfVolRatio / float( nbOfCases ) - _meanSurfVolRatio * _meanSurfVolRatio )
1153 /
float( nbOfCases - 1 ) * float( nbOfCases ) ;
1154 _varMaxMomentRatio = ( _varMaxMomentRatio / float( nbOfCases ) - _meanMaxMomentRatio * _meanMaxMomentRatio )
1155 /
float( nbOfCases - 1 ) * float( nbOfCases ) ;
1156 if( _varMaxMomentRatio == 0. )
1157 _varMaxMomentRatio = 1. ;
1160 double meanCentered1 = 0., meanCentered2 = 0. ;
1162 ForEach2d( distance2by2, c1, c2 ){
1163 (*_kinModel2by2Distances)( c1, c2 ) = 0.5 * ( distance2by2( c1, c2 ) + distance2by2( c2, c1 ) ) / nbFrames ;
1165 if( !(*_antiCorrelatedMeans)(c1, c2) ){
1167 meanCentered1 += (*_kinModel2by2Distances)( c1, c2 ) - _meanDist2By2 ;
1169 if( (*_labelsVolumes)[c1] == 0. || (*_labelsVolumes)[c2] == 0. )
1172 val = std::max( (*_interactionSurf)(c1, c2) / (*_labelsVolumes)[c1],
1173 (*_interactionSurf)(c2, c1) / (*_labelsVolumes)[c2] ) ;
1175 meanCentered2 += val - _meanSurfVolRatio ;
1180 AimsData<double> correctedDists( classesKinDescription.size(), classesKinDescription.size() ) ;
1181 AimsData<double> correctedSurfVolRatio( correctedDists.clone() ), correctedMomentOfMax( correctedDists.clone() ) ;
1182 ForEach2d( correctedDists, c1, c2 ){
1183 correctedDists(c1, c2) = ( (*_kinModel2by2Distances)( c1, c2 ) - _meanDist2By2 ) / sqrt( _varDist2By2 ) ;
1184 correctedSurfVolRatio(c1, c2) = -( std::max( (*_interactionSurf)(c1, c2) / (*_labelsVolumes)[c1],
1185 (*_interactionSurf)(c2, c1) / (*_labelsVolumes)[c1] ) - _meanSurfVolRatio ) / sqrt( _varSurfVolRatio ) ;
1189 correctedMomentOfMax(c1, c2) = ( (*_maxMomentValueRatios)(c1, c2) - _meanMaxMomentRatio )
1190 / sqrt( _varMaxMomentRatio ) ;
1213 template <
typename T>
1217 return new SCKBDistanceElement<T>( _maxMomentValueRatios, _kinModel2by2Distances, _interactionSurf, _labelsVolumes,
1218 _spatialregularizationWeight, _timeOfMaximumWeight,
1219 _meanDist2By2, _varDist2By2, _meanSurfVolRatio, _varSurfVolRatio, _meanMaxMomentRatio, _varMaxMomentRatio,
1220 std::set<int>(), n ) ;
1223 template <
typename T>
1225 const std::vector< std::list< Point3d > >&
classes,
1226 const AimsData<T>&
data ) :
1229 template <
typename T>
1232 template <
typename T>
1239 template <
typename T>
1241 const std::vector< std::list< Point3d > >&
classes,
1242 const AimsData<T>&
data ) :
1245 template <
typename T>
1248 template <
typename T>
1255 template <
typename T>
1258 _initDistancesAlreadyComputed(false)
1261 throw std::runtime_error(
"You must specify a method for ascendant hierarcical classification !") ;
1263 if( method->
methodType() ==
"Max2By2Distance" )
1269 throw std::runtime_error(
"Incompatible pre-computed distances between element matrix size !") ;
1271 _distanceBetweenInitialElements = fact->
initDistances()->clone() ;
1275 _initDistancesAlreadyComputed = true ;
1276 _canAddElement = false ;
1278 else if( method->
classes().size() )
1280 _m = method->
classes().size() ;
1282 _canAddElement = false ;
1287 template <
typename T>
1290 if( !_canAddElement )
1294 _listeN.push_back(el);
1301 template <
typename T>
1304 if( _initDistancesAlreadyComputed ){
1305 for(
int i = 0 ; i < _distanceBetweenInitialElements.dimX() ; ++i )
1306 for(
int j = i + 1 ; j < _distanceBetweenInitialElements.dimY() ; ++j )
1307 _mMap.insert( std::pair<float, Point2d>( _distanceBetweenInitialElements(i, j),
1315 _distanceBetweenInitialElements = AimsData<float>(_m, _m) ;
1318 typename std::list<Element<T>*>::iterator
1319 iiter(_listeN.begin()), ilast(_listeN.end()) ;
1323 while( iiter != ilast )
1325 typename std::list<Element<T>*>::iterator
1326 jiter(iiter), jlast(_listeN.end()) ;
1329 while( jiter != jlast )
1331 if( (*iiter) != (*jiter) ){
1332 d = (*iiter)->distanceTo( *jiter, _classes, _data,
1333 _distanceBetweenInitialElements );
1334 _mMap.insert(std::pair<float, Point2d>
1335 (d, Point2d((*iiter)->number(),(*jiter)->number())));
1336 _distanceBetweenInitialElements( (*iiter)->number(),
1337 (*jiter)->number() ) = d ;
1338 _distanceBetweenInitialElements( (*jiter)->number(),
1339 (*iiter)->number() ) = d ;
1349 template <
typename T>
1352 std::multimap<float, Point2d>::const_iterator it = _mMap.begin();
1353 int Na = it->second[0], Nb = it->second[1];
1358 _result.push_back(std::pair<Point2d, float> ( Point2d(Na, Nb),it->first));
1359 std::cout <<Na<<
" "<<Nb<<
" "<<(it->first) <<
" : " << std::endl;
1362 typename std::list<Element<T>*>::iterator vectiter, tmpiter;
1363 vectiter=_listeN.begin();
1364 while(vectiter!=_listeN.end())
1366 if( ((*vectiter)->number()) == Na )
1371 _listeN.erase(tmpiter);
1375 if( ((*vectiter)->number()) == Nb )
1380 _listeN.erase(tmpiter);
1390 _distanceBetweenInitialElements, _m + etape ) ;
1393 while( cit != clt ){
1397 std::multimap<float, Point2d>::iterator mapiter, tempiter;
1398 mapiter= _mMap.begin();
1399 while(mapiter!=_mMap.end())
1401 if( (mapiter->second[0]==Na) || (mapiter->second[1]==Na) ||
1402 (mapiter->second[0]==Nb) || (mapiter->second[1]==Nb) )
1406 _mMap.erase(tempiter);
1413 typename std::list<Element<T>*>::iterator
1414 iiter(_listeN.begin()), ilast(_listeN.end()) ;
1415 while( iiter != ilast )
1417 d = nouveau->
distanceTo( *iiter, _classes, _data, _distanceBetweenInitialElements ) ;
1418 _mMap.insert(std::pair<float, Point2d>
1419 (d, Point2d((*iiter)->number(), nouveau->
number())) );
1426 _listeN.push_back(nouveau);
1430 template <
typename T>
1434 for (
unsigned int i=1; i<_m;i++)
1436 std::cout<<
"Etape n°"<<i<<std::endl;
1445 template <
typename T>
1449 std::vector<int> liste;
1450 for(
unsigned int i=_m-nc;i<_m-1;i++)
1452 if((
unsigned int)_result[i].first[0]<(2*_m-nc+1))
1454 liste.push_back(_result[i].first[0]);
1457 if((
unsigned int)_result[i].first[1]<(2*_m-nc+1))
1459 liste.push_back(_result[i].first[1]);
1467 template <
typename T>
1471 std::vector<int> liste;
1472 for(
int i=_m-2;(_result[i].second<d)||(i<0);i--)
1474 if((
unsigned int)_result[i].first[0]<=_m)
1476 liste.push_back(_result[i].first[0]);
1480 if(_result[_result[i].first[0]-_m-1].second<d)
1482 liste.push_back(_result[i].first[0]);
1486 if((
unsigned int)_result[i].first[1]<=_m)
1488 liste.push_back(_result[i].first[1]);
1492 if(_result[_result[i].first[1]-_m-1].second<d)
1494 liste.push_back(_result[i].first[1]);
1504 template <
typename T>
1510 aClass.push_back(N);
1514 Proc(_result[N-_m-1].first[0], aClass );
1515 Proc(_result[N-_m-1].first[1], aClass );
1520 template <
typename T>
1521 std::vector<Point2d>
Cah<T>::cut(
const std::vector< std::pair<Point2d, float> >& res_cah,
int nc )
1525 if( res_cah.size() )
1528 _m = _result.size() + 1;
1531 std::vector<int> liste = leaves(nc);
1539 std::vector<Point2d> res;
1540 std::map<int,int> t;
1541 for(
unsigned int c=0;c<liste.size();c++)
1543 std::vector<int> aClasse ;
1545 Proc(liste[c], aClasse);
1547 for(
unsigned int i=0;i<aClasse.size();i++)
1549 t[aClasse[i]] = (c+1);
1553 std::map<int,int>::iterator mapit;
1555 for(mapit=t.begin();mapit!=t.end();mapit++)
1557 point[0] = mapit->first;
1558 point[1] = mapit->second;
1559 res.push_back(point);
1566 template <
typename T>
1573 while( (
unsigned int)(nc + 1) < res_cah.size() && res_cah[nc + 1].second < d )
1576 return cut( res_cah, _m + 1 - nc ) ;
1580 template <
typename T>
1587 AimsData<float> derivate( res_cah.size() ) ;
1588 AimsData<float> cost( res_cah.size() ) ;
1589 AimsData<float> curvature( res_cah.size() ) ;
1591 for(
unsigned int i = 1 ; i < res_cah.size() - 1 ; ++i ){
1592 cost[i] = res_cah[i].second ;
1593 derivate[i] = ( res_cah[i+1].second - res_cah[i-1].second) * 0.5 ;
1596 int maxCurvInd = 0 ;
1597 float maxCurv = 0. ;
1598 for(
unsigned int i = 1 ; i < res_cah.size() - 1 ; ++i ){
1599 curvature[i] = ( res_cah[i+1].second - 2 * res_cah[i].second + res_cah[i-1].second) * 0.25 ;
1601 if( curvature[i] > maxCurv ){
1602 maxCurv = curvature[i] ;
1614 return cut( res_cah, _m + 1 - maxCurvInd ) ;
1617 template <
typename T>
1620 std::string car = fileout +
"_cah" ;
1622 std::ofstream os( car.c_str() ) ;
1624 for(
unsigned i=0;i<_result.size();i++)
1626 os << _result[i].first[0] <<
" " << _result[i].first[1]
1627 <<
" " << _result[i].second << std::endl ;
1632 AimsData<float> derivate( _result.size() ) ;
1633 AimsData<float> cost( _result.size() ) ;
1634 AimsData<float> curvature( _result.size() ) ;
1636 for(
unsigned int i = 1 ; i < _result.size() - 3 ; ++i ){
1637 cost[i] = _result[i].second ;
1638 derivate[i] = ( _result[i+1].second - _result[i-1].second) * 0.5 ;
1641 for(
unsigned int i = 1 ; i < _result.size() - 1 ; ++i )
1642 curvature[i] = ( _result[i+1].second - 2 * _result[i].second + _result[i-1].second) * 0.25 ;
1652 template <
typename T>
1653 const std::vector< std::pair<Point2d, float> >&
Cah<T>::load(
const std::string& filein )
1657 unsigned int Na = 0, Nb = 0;
1660 std::ifstream is( filein.c_str() ) ;
1665 _result.push_back(std::pair<Point2d, float> (Point2d(Na, Nb), d) );
1673 _result.push_back(std::pair<Point2d, float> (Point2d(Na, Nb), d) );
bool correlated(const AimsData< T > &x, const AimsData< T > &y)
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)
const std::vector< float > & baryValue() const
float meanReconstructionError()
PcaCahElementFactory(int nbOfSignificantVps, 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 std::vector< std::list< Point3d > > & _classes
const Point3df & baryPosition() const
Max2By2DistanceElement(const std::set< int > &constitutedFrom=std::set< int >(), int number=-1)
virtual std::list< Element< T > *> creator() const
float meanReconstructionError()
float _varReconstructionError
float unreconstructedInertia()
virtual const AimsData< float > * initDistances() const
const std::vector< std::list< Point3d > > & classes() const
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
CahElementFactory(const std::vector< std::list< Point3d > > &classes=std::vector< std::list< Point3d > >(), const AimsData< T > &data=AimsData< T >())
std::vector< float > _mean
float varReconstructionError()
float _unreconstructedInertia
void save(const std::string &name)
virtual ~PcaCahElementFactory()
float varReconstructionError()
BaryElement(int card, const aims::Individuals< float > &bary, const std::set< int > &constitutedFrom=std::set< int >(), int number=-1)
const std::vector< std::pair< Point2d, float > > & doit()
PPcaCahElementFactory(int nbOfSignificantVps, 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)=0
virtual std::string methodType() const =0
AimsData< double > * kineticSampleDistance(const std::vector< aims::DiscriminantAnalysisElement *> &classes)
const std::vector< std::pair< Point2d, float > > & load(const std::string &name)
virtual ~Max2By2DistanceCahElementFactory()
std::vector< Point2d > distanceCut(const std::vector< std::pair< Point2d, float > > &res, float)
virtual ~PcaReprocReconsErrorCahElementFactory()
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
aims::ProbabilisticPcaElement * ppca()
BaryCahElementFactory(const std::vector< std::list< Point3d > > &classes=std::vector< std::list< Point3d > >(), const AimsData< T > &data=AimsData< T >())
float unreconstructedInertia()
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 ~PPcaCahElementFactory()
virtual ~CahElementFactory()
AimsData< double > momentOfMaxValueRatios(const std::vector< aims::DiscriminantAnalysisElement *> &classesKinDescription)
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
AimsData< double > momentOfMaximumDifference(const std::vector< aims::DiscriminantAnalysisElement *> &classesKinDescription)
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)
AimsData< double > interactionSurfaces(const AimsData< int > &locMap, const std::vector< short > &unfusionedLabels, AimsData< double > &interactionSurf, std::vector< double > &labelsVolumes)
int _numberOfSignificantVps
const AimsData< float > & errorMatrix()
virtual Element< T > * creator(int n) const =0
PcaReprocReconsErrorCahElementFactory(int nbOfSignificantVps, 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)
std::set< int > _constitutedFrom
const AimsData< T > & data() const
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
Max2By2DistanceCahElementFactory(const AimsData< float > &initDistances)
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
std::vector< Point2d > cut(const std::vector< std::pair< Point2d, float > > &res, int)
void initialisationDist()
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)=0
std::vector< Point2d > maxCurvatureCut(const std::vector< std::pair< Point2d, float > > &res)
void setNumber(int number)
virtual float distanceTo(Element< T > *other, const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data, const AimsData< float > &initDistances)
const std::set< int > & constitutedFrom() const
bool addElement(Element< T > *el)
Returns false if el ca not be added.
const AimsData< float > & errorMatrix()
AimsData< float > _errorMatrix
const AimsData< T > & _data
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 std::list< Element< T > *> creator() const
Cah(const CahElementFactory< T > *method)
virtual ~BaryCahElementFactory()
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)
const AimsData< float > * initDistances() const
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)
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 _meanReconstructionError
void computeReconstructionError(const std::vector< std::list< Point3d > > &classes, const AimsData< T > &data)