/// <summary> /// /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <param name="target"></param> /// <param name="residual"></param> public void UpdateSplitConstants(ref GBMSplitInfo left, ref GBMSplitInfo right, double target, double residual) { var residual2 = residual * residual; left.Samples++; left.Sum += residual; left.SumOfSquares += residual2; left.Cost = left.SumOfSquares - ((left.Sum * left.Sum) / left.Samples); left.BestConstant = left.Sum / left.Samples; // Alternative update but gives slightly different results //var leftSamplesInv = 1.0 / left.Samples; //var leftAverage = left.Sum * leftSamplesInv; //left.BestConstant = leftAverage; //left.Cost = left.SumOfSquares - (left.Sum * leftAverage); //left.Cost = left.SumOfSquares - (left.Sum * left.Sum * leftSamplesInv); //left.BestConstant = left.Sum * leftSamplesInv; right.Samples--; right.Sum -= residual; right.SumOfSquares -= residual2; right.Cost = right.SumOfSquares - ((right.Sum * right.Sum) / right.Samples); right.BestConstant = right.Sum / right.Samples; // Alternative update but gives slightly different results //var rightSamplesInv = 1.0 / right.Samples; //var rightAverage = right.Sum * rightSamplesInv; //right.BestConstant = rightAverage; //right.Cost = right.SumOfSquares - (right.Sum * rightAverage); //right.Cost = right.SumOfSquares - (right.Sum * right.Sum * rightSamplesInv); //right.BestConstant = right.Sum * rightSamplesInv; }
/// <summary> /// /// </summary> /// <param name="targets"></param> /// <param name="residuals"></param> /// <param name="inSample"></param> /// <returns></returns> public GBMSplitInfo InitSplit(double[] targets, double[] residuals, bool[] inSample) { var splitInfo = GBMSplitInfo.NewEmpty(); for (int i = 0; i < inSample.Length; i++) { if (inSample[i]) { var target = targets[i]; var residual = residuals[i]; var residual2 = residual * residual; var binomial = (target - residual) * ((1.0 - target) + residual); splitInfo.Samples++; splitInfo.Sum += residual; splitInfo.SumOfSquares += residual2; splitInfo.BinomialSum += binomial; } } splitInfo.Cost = splitInfo.SumOfSquares - ((splitInfo.Sum * splitInfo.Sum) / splitInfo.Samples); splitInfo.BestConstant = BinomialBestConstant(splitInfo.Sum, splitInfo.BinomialSum); return(splitInfo); }
/// <summary> /// /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <param name="target"></param> /// <param name="residual"></param> public void UpdateSplitConstants(ref GBMSplitInfo left, ref GBMSplitInfo right, double target, double residual) { var residual2 = residual * residual; left.Samples++; left.Sum += residual; left.SumOfSquares += residual2; left.Cost = left.SumOfSquares - (left.Sum * left.Sum / (double)left.Samples); right.Samples--; right.Sum -= residual; right.SumOfSquares -= residual2; right.Cost = right.SumOfSquares - (right.Sum * right.Sum / (double)right.Samples); }
/// <summary> /// /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <param name="target"></param> /// <param name="residual"></param> public void UpdateSplitConstants(ref GBMSplitInfo left, ref GBMSplitInfo right, double target, double residual) { var residual2 = residual * residual; var binomial = (target - residual) * (1.0 - target + residual); left.Samples++; left.Sum += residual; left.SumOfSquares += residual2; left.BinomialSum += binomial; left.Cost = left.SumOfSquares - (left.Sum * left.Sum / (double)left.Samples); left.BestConstant = BinomialBestConstant(left.Sum, left.BinomialSum); right.Samples--; right.Sum -= residual; right.SumOfSquares -= residual2; right.BinomialSum -= binomial; right.Cost = right.SumOfSquares - (right.Sum * right.Sum / (double)right.Samples); right.BestConstant = BinomialBestConstant(right.Sum, right.BinomialSum); }
/// <summary> /// /// </summary> /// <param name="targets"></param> /// <param name="residuals"></param> /// <param name="inSample"></param> /// <returns></returns> public GBMSplitInfo InitSplit(double[] targets, double[] residuals, bool[] inSample) { var splitInfo = GBMSplitInfo.NewEmpty(); for (int i = 0; i < inSample.Length; i++) { if (inSample[i]) { var residual = residuals[i]; var residual2 = residual * residual; splitInfo.Samples++; splitInfo.Sum += residual; splitInfo.SumOfSquares += residual2; } } splitInfo.Cost = splitInfo.SumOfSquares - ((splitInfo.Sum * splitInfo.Sum) / splitInfo.Samples); return(splitInfo); }