/// <summary>Gets best split.</summary>
/// <param name="x">The Matrix to process.</param>
/// <param name="y">The Vector to process.</param>
/// <param name="used">The used.</param>
/// <returns>The best split.</returns>
private Tuple<int, double, Impurity> GetBestSplit(Matrix x, Vector y, List<int> used)
{
double bestGain = -1;
int bestFeature = -1;
Impurity bestMeasure = null;
for (int i = 0; i < x.Cols; i++)
{
// already used?
if (used.Contains(i)) continue;
double gain = 0;
Impurity measure = (Impurity)Ject.Create(ImpurityType);
// get appropriate column vector
var feature = x.Col(i);
// get appropriate feature at index i
// (important on because of multivalued
// cols)
var property = Descriptor.At(i);
// if discrete, calculate full relative gain
if (property.Discrete)
gain = measure.RelativeGain(y, feature);
// otherwise segment based on width
else
gain = measure.SegmentedRelativeGain(y, feature, Width);
// best one?
if (gain > bestGain)
{
bestGain = gain;
bestFeature = i;
bestMeasure = measure;
}
}
return new Tuple<int, double, Impurity>(bestFeature, bestGain, bestMeasure);
}