2012-03-19 6 views
1

目的:openCVの成長する樹木の分割決定にオフセット不純物を加えること。ジニ不純物を使用してGiniの不純物、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; 
      } 
     } 
    } 
} 

その:

は現在、OpenCVのランダム木で、分割は以下のように行われます。最初はそれが正しいノード内のすべてのクラス数を置く、としながら、右から左へと更新lsum2とrsum2から1つのインスタンスを移動:私はそれを得る何からのコードは、これを実現する方法を説明することができ

enter image description here

誰でもそれは最良の解決策を見つける。私が得られないのは、p_j^2がlv * 2 +1またはrv * 2-1にどのように関連しているかです。

オフセットが利用可能であり、オフセットの類似性の不純物に基づいて分割を追加したい場合、実際の質問です。 (オフセットは現在のノードの方向と中心からの距離です

私が思いついたのは、このようなものです。誰かが何らかの欠陥を指摘することができれば、良い結果になるでしょう。唯一の二つのグループがあるので、デバッグを開始する場所がわからない。

//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

[OK]を、このときのジニ係数は、左と右、簡単です。私たちは1-pl*pl-pr*pr持っているので、代わりに多額1-sum(pj*pj)の。アイテムの割合左のplは、左の項目の数です。lvを合計で割ったものです。

分割を変更すると、pl*plpr*prは変更されますが、アイテムの総数が変更されるため、変更されません。したがって、prpl(浮動小数点数)を最適化する代わりに、lv and rv(単純なカウント)を最適化します。

次に、理由は2*lv+1です。これは簡単です:lv = lv=1lv*lvに最適化するように増やしています。すべての条件を書き出すと、(lv+1)*(lv+1) - (lv*lv)(増加)は2*lv+1になります。そして、(rv-1)*(rv-1) - (rv*rv)-2*rv+1または-(r*rv+1)になります。

関連する問題