mirror of
https://github.com/opencv/opencv.git
synced 2024-11-29 05:29:54 +08:00
Fix epsilon comparison when splitting
This commit is contained in:
parent
fd1b66b37d
commit
0712bccf52
@ -638,7 +638,6 @@ void DTreesImpl::calcValue( int nidx, const vector<int>& _sidx )
|
|||||||
|
|
||||||
DTreesImpl::WSplit DTreesImpl::findSplitOrdClass( int vi, const vector<int>& _sidx, double initQuality )
|
DTreesImpl::WSplit DTreesImpl::findSplitOrdClass( int vi, const vector<int>& _sidx, double initQuality )
|
||||||
{
|
{
|
||||||
const double epsilon = FLT_EPSILON*2;
|
|
||||||
int n = (int)_sidx.size();
|
int n = (int)_sidx.size();
|
||||||
int m = (int)classLabels.size();
|
int m = (int)classLabels.size();
|
||||||
|
|
||||||
@ -688,7 +687,8 @@ DTreesImpl::WSplit DTreesImpl::findSplitOrdClass( int vi, const vector<int>& _si
|
|||||||
rsum2 -= 2*rv*wval - w2;
|
rsum2 -= 2*rv*wval - w2;
|
||||||
lcw[idx] = lv + wval; rcw[idx] = rv - wval;
|
lcw[idx] = lv + wval; rcw[idx] = rv - wval;
|
||||||
|
|
||||||
if( values[curr] + epsilon < values[next] )
|
float value_between = (values[next] + values[curr]) * 0.5f;
|
||||||
|
if( value_between > values[curr] && value_between < values[next] )
|
||||||
{
|
{
|
||||||
double val = (lsum2*R + rsum2*L)/(L*R);
|
double val = (lsum2*R + rsum2*L)/(L*R);
|
||||||
if( best_val < val )
|
if( best_val < val )
|
||||||
@ -985,7 +985,6 @@ DTreesImpl::WSplit DTreesImpl::findSplitCatClass( int vi, const vector<int>& _si
|
|||||||
|
|
||||||
DTreesImpl::WSplit DTreesImpl::findSplitOrdReg( int vi, const vector<int>& _sidx, double initQuality )
|
DTreesImpl::WSplit DTreesImpl::findSplitOrdReg( int vi, const vector<int>& _sidx, double initQuality )
|
||||||
{
|
{
|
||||||
const float epsilon = FLT_EPSILON*2;
|
|
||||||
const double* weights = &w->sample_weights[0];
|
const double* weights = &w->sample_weights[0];
|
||||||
int n = (int)_sidx.size();
|
int n = (int)_sidx.size();
|
||||||
|
|
||||||
@ -1021,7 +1020,8 @@ DTreesImpl::WSplit DTreesImpl::findSplitOrdReg( int vi, const vector<int>& _sidx
|
|||||||
L += wval; R -= wval;
|
L += wval; R -= wval;
|
||||||
lsum += t; rsum -= t;
|
lsum += t; rsum -= t;
|
||||||
|
|
||||||
if( values[curr] + epsilon < values[next] )
|
float value_between = (values[next] + values[curr]) * 0.5f;
|
||||||
|
if( value_between > values[curr] && value_between < values[next] )
|
||||||
{
|
{
|
||||||
double val = (lsum*lsum*R + rsum*rsum*L)/(L*R);
|
double val = (lsum*lsum*R + rsum*rsum*L)/(L*R);
|
||||||
if( best_val < val )
|
if( best_val < val )
|
||||||
|
Loading…
Reference in New Issue
Block a user