36 #ifndef __INCLUDE_MIXTURE__
37 #define __INCLUDE_MIXTURE__
40 #ifndef __INCLUDE_MIST_H__
44 #ifndef __INCLUDE_MIST_VECTOR__
56 #define EMALGORITHM_DEBUG 0
81 inline std::ostream &
operator <<( std::ostream &out,
const distribution &a )
83 out <<
"( " << a.weight <<
", " << a.av <<
", " << a.sd <<
" )";
98 v[ 0 ] = v[ 3 ] = 1.0;
99 v[ 1 ] = v[ 2 ] = 0.0;
103 inline std::ostream &
operator <<( std::ostream &out,
const distribution2 &a )
105 out <<
"( " << a.weight <<
", " << a.av <<
", < " << a.v[ 0 ] <<
", " << a.v[ 1 ] <<
", " << a.v[ 2 ] <<
", " << a.v[ 3 ] <<
" > )";
112 double t = dp.
v[ 0 ] * dp.
v[ 3 ] - dp.
v[ 1 ] * dp.
v[ 2 ];
113 double a = dp.
v[ 3 ] / t;
114 double b = -dp.
v[ 1 ] / t;
115 double c = -dp.
v[ 2 ] / t;
116 double d = dp.
v[ 0 ] / t;
119 const double pi = 3.1415926535897932384626433832795;
120 const double _2pi = 2.0 * pi;
121 double vvv = ( a * x + b * y ) * x + ( c * x + d * y ) * y;
122 return ( 1.0 / ( _2pi * sqrt( t ) ) * std::exp( - vvv / 2.0 ) );
127 const double pi = 3.1415926535897932384626433832795;
128 const double _2pi = std::sqrt( 2.0 * pi );
129 double myu = x - dp.
av;
130 return ( 1.0 / ( _2pi * dp.
sd ) * std::exp( - myu * myu / ( 2.0 * dp.
sd * dp.
sd ) ) );
150 template <
class Array >
153 if( rSamples.empty( ) || nComponents == 0 )
158 typedef size_t size_type;
162 const double pi = 3.1415926535897932384626433832795;
163 const double _2pi = std::sqrt( 2.0 * pi );
164 const double _log_2pi = std::log( _2pi );
165 double fLastLikelihood = -1.0e30;
168 std::vector< mixture::distribution > pdp( nComponents );
171 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
172 for( m = 0 ; m < nComponents ; m++ )
174 std::cerr << pdp[ m ] << std::endl;
179 for( m = 0 ; m < nComponents ; m++ )
181 pdp[ m ] = opdp[ m ];
187 for( m = 0 ; m < nComponents ; m++ )
189 tmp += pdp[ m ].weight;
197 for( m = 0 ; m < nComponents ; m++ )
199 pdp[ m ].weight /= tmp;
204 for( nIteration = 0 ; nIteration < nMaxIteration ; nIteration++ )
207 for( k = 0 ; k < nSamples ; k++ )
211 for( m = 0 ; m < nComponents ; m++ )
213 double myu = rSamples[ k ] - pdp[ m ].av;
214 double v = pdp[ m ].weight * std::exp( - myu * myu / ( 2.0 * pdp[ m ].sd * pdp[ m ].sd ) ) / pdp[ m ].sd;
226 for( size_type m = 0 ; m < nComponents ; m++ )
228 Weight( k, m ) /= tmp;
234 for( m = 0 ; m < nComponents ; m++ )
236 double weight_sum = 0;
240 for( k = 0 ; k < nSamples ; k++ )
242 weight_sum += Weight( k, m );
243 average +=
static_cast< double >( rSamples[ k ] ) * Weight( k, m );
246 if( weight_sum > 0.0 )
248 pdp[ m ].weight = weight_sum /
static_cast< double >( nSamples );
249 pdp[ m ].av = average / weight_sum;
251 for( k = 0 ; k < nSamples ; k++ )
253 double myu = rSamples[ k ] - pdp[ m ].av;
254 variance += Weight( k, m ) * myu * myu;
257 variance /= weight_sum;
266 pdp[ m ].sd = std::sqrt( variance );
270 double weight_sum = 0;
271 for( m = 0 ; m < nComponents ; m++ )
273 weight_sum += pdp[ m ].weight;
276 if( std::abs( weight_sum - 1.0 ) > 0.1 )
282 double fLikelihood = 0.0;
284 for( k = 0 ; k < nSamples ; k++ )
288 for( m = 0 ; m < nComponents ; m++ )
290 double myu = rSamples[ k ] - pdp[ m ].av;
291 tmp += pdp[ m ].weight * std::exp( - myu * myu / ( 2.0 * pdp[ m ].sd * pdp[ m ].sd ) ) / pdp[ m ].sd;
300 fLikelihood += std::log( tmp ) - _log_2pi;
303 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
304 for( m = 0 ; m < nComponents ; m++ )
306 std::cerr << pdp[ m ] << std::endl;
308 #elif defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 2
309 printf(
"%f = ( %f, %f, %f )\n", fLikelihood, pdp[ 0 ].weight, pdp[ 0 ].av, pdp[ 0 ].sd );
312 if( fLastLikelihood >= fLikelihood || 2.0 * std::abs( fLastLikelihood - fLikelihood ) < tolerance * ( std::abs( fLastLikelihood ) + std::abs( fLikelihood ) ) )
318 for( m = 0 ; m < nComponents ; m++ )
320 opdp[ m ] = pdp[ m ];
323 fLastLikelihood = fLikelihood;
346 template <
class Array >
349 if( rSamples.empty( ) || nComponents == 0 )
354 typedef size_t size_type;
358 const double pi = 3.1415926535897932384626433832795;
359 const double _2pi = 2.0 * pi;
360 const double _log_2pi = std::log( _2pi );
361 double fLastLikelihood = -1.0e30;
364 std::vector< mixture::distribution2 > pdp( nComponents );
367 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
368 for( m = 0 ; m < nComponents ; m++ )
370 std::cerr << pdp[ m ] << std::endl;
376 for( m = 0 ; m < nComponents ; m++ )
378 pdp[ m ] = opdp[ m ];
385 for( m = 0 ; m < nComponents ; m++ )
387 tmp += pdp[ m ].weight;
395 for( m = 0 ; m < nComponents ; m++ )
397 pdp[ m ].weight /= tmp;
402 for( nIteration = 0 ; nIteration < nMaxIteration ; nIteration++ )
406 for( k = 0 ; k < nSamples ; k++ )
410 for( m = 0 ; m < nComponents ; m++ )
412 double t = pdp[ m ].v[ 0 ] * pdp[ m ].v[ 3 ] - pdp[ m ].v[ 1 ] * pdp[ m ].v[ 2 ];
413 double a = pdp[ m ].v[ 3 ];
414 double b = -pdp[ m ].v[ 1 ];
415 double c = -pdp[ m ].v[ 2 ];
416 double d = pdp[ m ].v[ 0 ];
417 double x = rSamples[ k ].x - pdp[ m ].av.x;
418 double y = rSamples[ k ].y - pdp[ m ].av.y;
419 double vvv = ( ( a * x + b * y ) * x + ( c * x + d * y ) * y ) / t;
420 double v = pdp[ m ].weight * ( 1.0 / sqrt( t ) ) * std::exp( - vvv / 2.0 );
431 for( size_type m = 0 ; m < nComponents ; m++ )
433 Weight( k, m ) /= tmp;
439 for( m = 0 ; m < nComponents ; m++ )
441 double weight_sum = 0;
447 for( k = 0 ; k < nSamples ; k++ )
449 weight_sum += Weight( k, m );
450 average += rSamples[ k ] * Weight( k, m );
453 if( weight_sum > 0.0 )
455 pdp[ m ].weight = weight_sum /
static_cast< double >( nSamples );
456 pdp[ m ].av = average / weight_sum;
458 for( k = 0 ; k < nSamples ; k++ )
460 double w = Weight( k, m );
461 double xx = rSamples[ k ].x - pdp[ m ].av.x;
462 double yy = rSamples[ k ].y - pdp[ m ].av.y;
472 if( v1 * v2 < v3 * v3 )
474 v3 = std::sqrt( v1 * v2 ) - 1.0e-10;
484 pdp[ m ].v[ 0 ] = v1;
485 pdp[ m ].v[ 3 ] = v2;
486 pdp[ m ].v[ 1 ] = pdp[ m ].v[ 2 ] = v3;
490 double weight_sum = 0;
491 for( m = 0 ; m < nComponents ; m++ )
493 weight_sum += pdp[ m ].weight;
496 if( std::abs( weight_sum - 1.0 ) > 0.1 )
502 double fLikelihood = 0.0;
504 for( k = 0 ; k < nSamples ; k++ )
508 for( m = 0 ; m < nComponents ; m++ )
510 double t = pdp[ m ].v[ 0 ] * pdp[ m ].v[ 3 ] - pdp[ m ].v[ 1 ] * pdp[ m ].v[ 2 ];
511 double a = pdp[ m ].v[ 3 ];
512 double b = -pdp[ m ].v[ 1 ];
513 double c = -pdp[ m ].v[ 2 ];
514 double d = pdp[ m ].v[ 0 ];
515 double x = rSamples[ k ].x - pdp[ m ].av.x;
516 double y = rSamples[ k ].y - pdp[ m ].av.y;
517 double vvv = ( ( a * x + b * y ) * x + ( c * x + d * y ) * y ) / t;
518 tmp += Weight( k, m ) * pdp[ m ].weight / sqrt( t ) * std::exp( - vvv / 2.0 );
526 fLikelihood += std::log( tmp ) - _log_2pi;
529 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
530 for( m = 0 ; m < nComponents ; m++ )
532 std::cerr << pdp[ m ] << std::endl;
534 #elif defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 2
535 printf(
"%f = ( %f, %f )\n", fLikelihood, pdp[ 0 ].weight, pdp[ 0 ].av );
538 if( fLastLikelihood >= fLikelihood || 2.0 * std::abs( fLastLikelihood - fLikelihood ) < tolerance * ( std::abs( fLastLikelihood ) + std::abs( fLikelihood ) ) )
544 for( m = 0 ; m < nComponents ; m++ )
546 opdp[ m ] = pdp[ m ];
549 fLastLikelihood = fLikelihood;
570 template <
class Array1,
class Array2 >
571 bool estimate_mixture(
const Array1 &rSamples, Array2 &pdp,
typename Array1::size_type nMaxIteration,
double tolerance,
typename Array1::size_type &nIteration )
573 return(
estimate_mixture( rSamples, &pdp[ 0 ], rSamples.size( ), pdp.size( ), nMaxIteration, tolerance, nIteration ) );
590 template <
class Array1,
class Array2 >
591 bool estimate_mixture(
const Array1 &rSamples, Array2 &pdp,
typename Array1::size_type nMaxIteration,
double tolerance )
593 typename Array1::size_type nIteration = 0;
594 return(
estimate_mixture( rSamples, &pdp[ 0 ], rSamples.size( ), pdp.size( ), nMaxIteration, tolerance, nIteration ) );
611 template <
class Array >
614 size_t nIteration = 0;
615 return(
estimate_mixture( rSamples, pdp, rSamples.size( ), nComponents, nMaxIteration, tolerance, nIteration ) );
633 template <
class Array >
636 size_t nIteration = 0;
637 return(
estimate_mixture( rSamples, pdp, rSamples.size( ), nComponents, nMaxIteration, tolerance, nIteration ) );
662 template <
class Array >
663 bool estimate_mixture(
const Array &rSamples,
mixture::distribution *opdp,
size_t nSamples,
size_t nComponents,
double minimum,
double bin,
size_t nMaxIteration,
double tolerance,
size_t &nIteration )
665 if( rSamples.empty( ) || nComponents == 0 || bin == 0.0 )
670 typedef size_t size_type;
674 const double pi = 3.1415926535897932384626433832795;
675 const double _2pi = std::sqrt( 2.0 * pi );
676 const double _log_2pi = std::log( _2pi );
677 double fLastLikelihood = -1.0e30;
678 double tmp, number_of_samples;
681 std::vector< mixture::distribution > pdp( nComponents );
685 for( m = 0 ; m < nComponents ; m++ )
687 pdp[ m ] = opdp[ m ];
692 for( m = 0 ; m < nComponents ; m++ )
694 tmp += pdp[ m ].weight;
703 for( m = 0 ; m < nComponents ; m++ )
705 pdp[ m ].weight /= tmp;
706 pdp[ m ].av -= minimum;
709 for( k = 0, number_of_samples = 0.0 ; k < nSamples ; k++ )
711 number_of_samples += rSamples[ k ];
715 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
716 for( m = 0 ; m < nComponents ; m++ )
718 std::cerr << pdp[ m ] << std::endl;
724 for( nIteration = 0 ; nIteration < nMaxIteration ; nIteration++ )
727 for( k = 0 ; k < nSamples ; k++ )
729 if( rSamples[ k ] == 0 )
736 for( m = 0 ; m < nComponents ; m++ )
738 double myu = ( k + 0.5 ) * bin - pdp[ m ].av;
739 double v = pdp[ m ].weight * std::exp( - myu * myu / ( 2.0 * pdp[ m ].sd * pdp[ m ].sd ) ) / pdp[ m ].sd;
751 for( size_type m = 0 ; m < nComponents ; m++ )
753 Weight( k, m ) /= tmp;
759 for( m = 0 ; m < nComponents ; m++ )
761 double weight_sum = 0;
765 for( k = 0 ; k < nSamples ; k++ )
767 if( rSamples[ k ] == 0 )
771 double w = Weight( k, m ) * rSamples[ k ];
773 average += ( k + 0.5 ) * bin * w;
776 if( weight_sum > 0.0 )
778 pdp[ m ].weight = weight_sum / number_of_samples;
779 pdp[ m ].av = average / weight_sum;
781 for( k = 0 ; k < nSamples ; k++ )
783 double myu = ( k + 0.5 ) * bin - pdp[ m ].av;
784 variance += Weight( k, m ) * rSamples[ k ] * myu * myu;
787 variance /= weight_sum;
795 pdp[ m ].sd = std::sqrt( variance );
799 double weight_sum = 0;
800 for( m = 0 ; m < nComponents ; m++ )
802 weight_sum += pdp[ m ].weight;
805 if( std::abs( weight_sum - 1.0 ) > 0.1 )
811 double fLikelihood = 0.0;
813 for( k = 0 ; k < nSamples ; k++ )
815 if( rSamples[ k ] == 0 )
822 for( m = 0 ; m < nComponents ; m++ )
824 double myu = ( k + 0.5 ) * bin - pdp[ m ].av;
825 tmp += Weight( k, m ) * pdp[ m ].weight * std::exp( - myu * myu / ( 2.0 * pdp[ m ].sd * pdp[ m ].sd ) ) / pdp[ m ].sd;
833 fLikelihood += rSamples[ k ] * ( std::log( tmp ) - _log_2pi );
836 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
837 for( m = 0 ; m < nComponents ; m++ )
839 std::cerr << pdp[ m ] << std::endl;
841 #elif defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 2
842 printf(
"%f = ( %f, %f, %f )\n", fLikelihood, pdp[ 0 ].weight, pdp[ 0 ].av, pdp[ 0 ].sd );
845 if( fLastLikelihood >= fLikelihood || 2.0 * std::abs( fLastLikelihood - fLikelihood ) < tolerance * ( std::abs( fLastLikelihood ) + std::abs( fLikelihood ) ) )
851 for( m = 0 ; m < nComponents ; m++ )
853 opdp[ m ] = pdp[ m ];
856 fLastLikelihood = fLikelihood;
861 for( m = 0 ; m < nComponents ; m++ )
863 opdp[ m ].
av += minimum;
888 template <
class T,
class Allocator >
891 if( rSamples.
empty( ) || nComponents == 0 )
896 typedef size_t size_type;
898 size_type i, j, k, m;
900 const double pi = 3.1415926535897932384626433832795;
901 const double _2pi = 2.0 * pi;
902 const double _log_2pi = std::log( _2pi );
903 double fLastLikelihood = -1.0e30;
904 double number_of_samples;
907 std::vector< mixture::distribution2 > pdp( nComponents );
911 for( m = 0 ; m < nComponents ; m++ )
913 pdp[ m ] = opdp[ m ];
916 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
917 for( m = 0 ; m < nComponents ; m++ )
920 tmp.
av.
x += minimum1;
921 tmp.
av.
y += minimum2;
922 std::cerr << tmp << std::endl;
929 for( m = 0 ; m < nComponents ; m++ )
931 tmp += pdp[ m ].weight;
939 for( m = 0 ; m < nComponents ; m++ )
941 pdp[ m ].weight /= tmp;
942 pdp[ m ].av.x -= minimum1;
943 pdp[ m ].av.y -= minimum2;
946 for( k = 0, number_of_samples = 0.0 ; k < rSamples.
size( ) ; k++ )
948 number_of_samples += rSamples[ k ];
954 for( nIteration = 0 ; nIteration < nMaxIteration ; nIteration++ )
958 for( j = 0 ; j < rSamples.
height( ) ; j++ )
960 for( i = 0 ; i < rSamples.
width( ) ; i++ )
962 if( rSamples( i, j ) == 0 )
969 for( m = 0 ; m < nComponents ; m++ )
971 double t = pdp[ m ].v[ 0 ] * pdp[ m ].v[ 3 ] - pdp[ m ].v[ 1 ] * pdp[ m ].v[ 2 ];
972 double a = pdp[ m ].v[ 3 ];
973 double b = -pdp[ m ].v[ 1 ];
974 double c = -pdp[ m ].v[ 2 ];
975 double d = pdp[ m ].v[ 0 ];
976 double x = pdp[ m ].av.x - ( i + 0.5 ) * bin;
977 double y = pdp[ m ].av.y - ( j + 0.5 ) * bin;
978 double vvv = ( ( a * x + b * y ) * x + ( c * x + d * y ) * y ) / t;
979 double v = pdp[ m ].weight * std::exp( - vvv / 2.0 ) / sqrt( t );
980 Weight( i, j, m ) = v;
990 for( size_type m = 0 ; m < nComponents ; m++ )
992 Weight( i, j, m ) /= tmp;
999 for( m = 0 ; m < nComponents ; m++ )
1001 double weight_sum = 0;
1008 for( j = 0 ; j < rSamples.
height( ) ; j++ )
1010 for( i = 0 ; i < rSamples.
width( ) ; i++ )
1012 double w = Weight( i, j, m ) * rSamples( i, j );
1014 avex +=
static_cast< double >( ( i + 0.5 ) * bin ) * w;
1015 avey +=
static_cast< double >( ( j + 0.5 ) * bin ) * w;
1019 if( weight_sum > 0.0 )
1021 pdp[ m ].weight = weight_sum / number_of_samples;
1022 pdp[ m ].av.x = avex / weight_sum;
1023 pdp[ m ].av.y = avey / weight_sum;
1025 for( j = 0 ; j < rSamples.
height( ) ; j++ )
1027 for( i = 0 ; i < rSamples.
width( ) ; i++ )
1029 double w = Weight( i, j, m );
1030 double xx = ( i + 0.5 ) * bin - pdp[ m ].av.x;
1031 double yy = ( j + 0.5 ) * bin - pdp[ m ].av.y;
1032 double num = rSamples( i, j );
1033 v1 += w * xx * xx * num;
1034 v2 += w * yy * yy * num;
1035 v3 += w * xx * yy * num;
1043 if( v1 * v2 < v3 * v3 )
1045 v3 = std::sqrt( v1 * v2 ) - 1.0e-10;
1055 pdp[ m ].v[ 0 ] = v1;
1056 pdp[ m ].v[ 3 ] = v2;
1057 pdp[ m ].v[ 1 ] = pdp[ m ].v[ 2 ] = v3;
1061 double weight_sum = 0;
1062 for( m = 0 ; m < nComponents ; m++ )
1064 weight_sum += pdp[ m ].weight;
1067 if( std::abs( weight_sum - 1.0 ) > 0.1 )
1073 double fLikelihood = 0.0;
1075 for( j = 0 ; j < rSamples.
height( ) ; j++ )
1077 for( i = 0 ; i < rSamples.
width( ) ; i++ )
1079 if( rSamples( i, j ) == 0 )
1086 for( m = 0 ; m < nComponents ; m++ )
1088 double t = pdp[ m ].v[ 0 ] * pdp[ m ].v[ 3 ] - pdp[ m ].v[ 1 ] * pdp[ m ].v[ 2 ];
1089 double a = pdp[ m ].v[ 3 ];
1090 double b = -pdp[ m ].v[ 1 ];
1091 double c = -pdp[ m ].v[ 2 ];
1092 double d = pdp[ m ].v[ 0 ];
1093 double x = pdp[ m ].av.x - ( i + 0.5 ) * bin;
1094 double y = pdp[ m ].av.y - ( j + 0.5 ) * bin;
1095 double vvv = ( ( a * x + b * y ) * x + ( c * x + d * y ) * y ) / t;
1096 tmp += Weight( i, j, m ) * pdp[ m ].weight * std::exp( - vvv / 2.0 ) / std::sqrt( t );
1104 fLikelihood += rSamples( i, j ) * ( std::log( tmp ) - _log_2pi );
1108 #if defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 1
1109 for( m = 0 ; m < nComponents ; m++ )
1112 tmp.
av.
x += minimum1;
1113 tmp.
av.
y += minimum2;
1114 std::cerr << tmp << std::endl;
1116 #elif defined( EMALGORITHM_DEBUG ) && EMALGORITHM_DEBUG == 2
1117 printf(
"%f = ( %f, %f )\n", fLikelihood, pdp[ 0 ].weight, pdp[ 0 ].av );
1120 if( fLastLikelihood >= fLikelihood || 2.0 * std::abs( fLastLikelihood - fLikelihood ) < tolerance * ( std::abs( fLastLikelihood ) + std::abs( fLikelihood ) ) )
1126 for( m = 0 ; m < nComponents ; m++ )
1128 opdp[ m ] = pdp[ m ];
1131 fLastLikelihood = fLikelihood;
1134 for( m = 0 ; m < nComponents ; m++ )
1136 opdp[ m ].
av.
x += minimum1;
1137 opdp[ m ].
av.
y += minimum2;
1159 template <
class Array1,
class Array2 >
1160 bool estimate_mixture(
const Array1 &rSamples, Array2 &pdp,
double minimum,
double bin,
typename Array1::size_type nMaxIteration,
double tolerance,
typename Array1::size_type &nIteration )
1162 return(
histogram::estimate_mixture( rSamples, &pdp[ 0 ], rSamples.size( ), pdp.size( ), minimum, bin, nMaxIteration, tolerance, nIteration ) );
1180 template <
class Array1,
class Array2 >
1181 bool estimate_mixture(
const Array1 &rSamples, Array2 &pdp,
double minimum,
double bin,
typename Array1::size_type nMaxIteration,
double tolerance )
1183 typename Array1::size_type nIteration = 0;
1184 return(
histogram::estimate_mixture( rSamples, &pdp[ 0 ], rSamples.size( ), pdp.size( ), minimum, bin, nMaxIteration, tolerance, nIteration ) );
1203 template <
class Array >
1204 bool estimate_mixture(
const Array &rSamples,
mixture::distribution *pdp,
typename Array::size_type nComponents,
double minimum,
double bin,
typename Array::size_type nMaxIteration,
double tolerance )
1206 size_t nIteration = 0;
1207 return(
histogram::estimate_mixture( rSamples, pdp, rSamples.size( ), nComponents, minimum, bin, nMaxIteration, tolerance, nIteration ) );
1233 template <
class T,
class Allocator,
class Array1 >
1234 bool estimate_mixture(
const array2< T, Allocator > &rSamples, Array1 &pdp,
double minimum1,
double minimum2,
double bin,
typename Array1::size_type nMaxIteration,
double tolerance,
typename Array1::size_type &nIteration )
1257 template <
class T,
class Allocator,
class Array1 >
1283 template <
class T,
class Allocator >
1284 bool estimate_mixture(
const array2< T, Allocator > &rSamples,
mixture::distribution2 *pdp,
typename array2< T, Allocator >::size_type nComponents,
double minimum1,
double minimum2,
double bin,
typename array2< T, Allocator >::size_type nMaxIteration,
double tolerance )
1286 size_t nIteration = 0;
1287 return(
histogram::estimate_mixture( rSamples, pdp, nComponents, minimum1, minimum2, bin, nMaxIteration, tolerance, nIteration ) );
1300 #endif // __INCLUDE_MIXTURE__