Esempio n. 1
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }