【问题标题】:Gini Impurity, growing random trees in opencv基尼杂质,在opencv中生长随机树
【发布时间】:2015-07-30 20:23:19
【问题描述】:

目标:在 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;
                }
            }
        }

【问题讨论】:

    标签: opencv tree information-retrieval random-forest


    【解决方案1】:

    好的,本例中的基尼系数很简单,因为只有左右两组。所以我们有1-pl*pl-pr*pr,而不是一大笔钱1-sum(pj*pj)。左侧pl 的项目比例是左侧lv 的项目数除以总数。

    现在,当我们移动拆分时,pl*plpr*pr 会发生变化,但不是因为项目总数发生变化。因此,我们优化lv and rv(简单计数),而不是优化prpl(它们是浮点数)。

    接下来,为什么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)

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 2022-06-14
      • 2022-11-05
      • 2019-07-08
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多