/// <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); }