目标:在openCV的树木生长的分裂决策中添加偏移杂质。
目前在opencv随机树中,拆分的方式如下:
if( !priors )
{
int L = 0, R = n1;
for( i = 0; i < m; i++ )
rsum2 += (double)rc[i]*rc[i];
for( i = 0; i < n1 - 1; i++ )
{
int idx = responses[sorted_indices[i]];
int lv, rv;
L++; R--;
lv = lc[idx]; rv = rc[idx];
lsum2 += lv*2 + 1;
rsum2 -= rv*2 - 1;
lc[idx] = lv + 1; rc[idx] = rv - 1;
if( values[i] + epsilon < values[i+1] )
{
double val = (lsum2*R + rsum2*L)/((double)L*R);
if( best_val < val )
{
best_val = val;
best_i = i;
}
}
}
}它使用了基尼杂质。

任何人谁能解释代码是如何做到这一点的,从我得到的:最初它将所有类计数放在右边的节点中,当从右到左移动一个实例并更新lsum2和rsum2时,它会找到最佳解决方案。我不明白的是p_j^2与lv*2 +1或rv*2-1有什么关系。
真正的问题是,如果有可用的偏移量,并且想要基于偏移量的相似性的不纯添加一个拆分。(偏移是从中心到当前节点的方向和距离。
我想出的是这样的东西,如果有人能指出任何缺陷,那就太好了,因为atm没有给出好的结果,我不确定从哪里开始调试。
//Compute mean
for(i = 0; i<n1;++i)
{
float* point = (float*)(points.data + rstep*sample_idx_src[sorted_indices[i]]);
meanx[responses[sorted_indices[i]]] += point[0];
meany[responses[sorted_indices[i]]] += point[1];
}
for(i = 0;i<m;++i)
{
meanx[i] /= rc0[i];
meany[i] /= rc0[i];
}
if(!priors)
{
int L = 0, R = n1;
for(i=0;i<n1;i++)
{
float* point = (float*)(points.data + rstep*sample_idx_src[sorted_indices[i]]);
double tmp = point[0] - meanx[responses[sorted_indices[i]]];
rsum2 += tmp*tmp;
tmp = point[1] -meany[responses[sorted_indices[i]]];
rsum2 += tmp*tmp;
}
double minDist = DBL_MAX;
for(i=0;i<n1;++i)
{
float* point = (float*)(points.data + rstep*sample_idx_src[sorted_indices[i]]);
++L; --R;
double tmp = point[0] - meanx[responses[sorted_indices[i]]];
lsum2 += tmp*tmp;
tmp = point[1] -meany[responses[sorted_indices[i]]];
lsum2 += tmp*tmp;
tmp = point[0] - meanx[responses[sorted_indices[i]]];
rsum2 -= tmp*tmp;
tmp = point[1] -meany[responses[sorted_indices[i]]];
rsum2 -= tmp*tmp;
if( values[i] + epsilon < values[i+1] )
{
double val = (lsum2 + rsum2)/((double)L*R);
if(val < minDist )
{
minDist = val;
best_val = -val;
best_i = i;
}
}
}发布于 2015-07-30 20:23:20
在这种情况下,基尼系数很简单,因为只有两组,左和右。所以我们用1-pl*pl-pr*pr代替了大笔的1-sum(pj*pj)。左侧pl上的项目比例是左侧lv上的项目数量除以总数。
现在,当我们移动拆分时,pl*pl和pr*pr会发生变化,但不是因为项目的总数发生了变化。因此,我们没有优化pr和pl (浮点数),而是优化了lv and rv (它们是简单的计数)。
接下来是为什么要使用2*lv+1的问题。这很简单:我们通过增加lv = lv=1来优化lv*lv。现在,如果你写出所有的项,(lv+1)*(lv+1) - (lv*lv) (增加)恰好是2*lv+1。而减少的(rv-1)*(rv-1) - (rv*rv)恰好是-2*rv+1或-(r*rv+1)。
https://stackoverflow.com/questions/9775283
复制相似问题