目的: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つのインスタンスを移動:私はそれを得る何からのコードは、これを実現する方法を説明することができ
誰でもそれは最良の解決策を見つける。私が得られないのは、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;
}
}
}