2012-03-19 5 views
1

Цель: добавить смещение-примесь к раздельному решению растущих деревьев в openCV.Gini Примесь, растущие случайные деревья в 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; 
      } 
     } 
    } 
} 

Его использованием Джини примесей.

enter image description here

Любой, кто может объяснить, как код сделать это, от того, что я понимаю: сначала он помещает все счетчики класса в нужном узле, и при перемещении одного экземпляра справа налево и обновление 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; 
       } 
      } 
     } 

ответ

1

Хорошо, коэффициент Джини в этом случае просто потому, что есть только две группы, влево и вправо. Таким образом, вместо того, чтобы большую сумму 1-sum(pj*pj) мы 1-pl*pl-pr*pr. доля товаров слева 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).

 Смежные вопросы

  • Нет связанных вопросов^_^