示例#1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="design"></param>
        /// <param name="response"></param>
        /// <param name="weights"></param>
        /// <param name="distribution"></param>
        /// <param name="maxIterations"></param>
        /// <param name="absoluteTolerance"></param>
        /// <param name="relativeTolerance"></param>
        /// <returns></returns>
        public static (double[] Coefficients, double[] WeightedResponse) RegressIrls([NotNull][ItemNotNull] this double[][] design, [NotNull] double[] response, [NotNull] double[] weights, [NotNull] IDistribution distribution, int maxIterations = 100, double absoluteTolerance = 1e-8, double relativeTolerance = default)
        {
            if (response is null)
            {
                throw new ArgumentNullException(nameof(response));
            }
            if (design is null)
            {
                throw new ArgumentNullException(nameof(design));
            }
            if (weights is null)
            {
                throw new ArgumentNullException(nameof(weights));
            }

            double[] oldResiduals    = new double[design.Length];
            double[] wlsCoefficients = new double[design[0].Length];
            double[] wlsResponse     = new double[weights.Length];
            double[] wlsWeights      = new double[weights.Length];

            Array.Copy(weights, wlsWeights, wlsWeights.Length);

            double[] meanResponse   = distribution.InitialMean(response);
            double[] linearResponse = distribution.Predict(meanResponse);

            for (int i = 0; i < maxIterations; i++)
            {
                wlsWeights =
                    distribution.Weight(meanResponse)
                    .Multiply(weights);

                wlsResponse =
                    distribution.LinkFunction
                    .FirstDerivative(meanResponse)
                    .Multiply(response.Subtract(meanResponse))
                    .Add(linearResponse);

                wlsCoefficients =
                    design.RegressWls(wlsResponse, wlsWeights);

                linearResponse =
                    design.MatrixProduct(wlsCoefficients);

                meanResponse =
                    distribution.Fit(linearResponse);

                double[] residuals =
                    response.Subtract(linearResponse);

                if (HasConverged(residuals, oldResiduals, absoluteTolerance, relativeTolerance))
                {
                    break;
                }

                Array.Copy(residuals, oldResiduals, oldResiduals.Length);
            }

            return(wlsCoefficients, wlsResponse);
        }
        public void FitTest()
        {
            IDistribution target = CreateMultivariateContinuousDistribution();

            double[][] observations =
            {
                new double[] { 1, 1 },
                new double[] { 1, 1 },
            };

            double[] weights = { 0.50, 0.50 };

            bool thrown;

            IFittingOptions options = new NormalOptions()
            {
                Regularization = 0.1
            };

            thrown = false;
            try
            {
                target.Fit(observations, weights);
            }
            catch
            {
                thrown = true;
            }

            Assert.AreEqual(true, thrown);


            thrown = false;
            try
            {
                target.Fit(observations, weights, options);
            }
            catch
            {
                thrown = true;
            }

            Assert.AreEqual(false, thrown);
        }
        public void FitTest1()
        {
            IDistribution target = CreateMultivariateContinuousDistribution(); // TODO: Initialize to an appropriate value

            Array observations = new double[][]
            {
                new double[] { 1, 1 },
                new double[] { 1, 1 },
            };

            bool thrown;

            IFittingOptions options = new NormalOptions()
            {
                Regularization = 0.1
            };

            thrown = false;
            try
            {
                target.Fit(observations);
            }
            catch
            {
                thrown = true;
            }

            Assert.AreEqual(true, thrown);


            thrown = false;
            try
            {
                target.Fit(observations, options);
            }
            catch
            {
                thrown = true;
            }

            Assert.AreEqual(false, thrown);
        }
示例#4
0
        public void FitTest2()
        {
            IDistribution target = CreateUnivariateDiscreteDistribution();

            double[] observations = { 0, 1, 1, 1, 1 };
            target.Fit(observations);

            double mean = Accord.Statistics.Tools.Mean(observations);

            Assert.AreEqual(mean, (target as BernoulliDistribution).Mean);
        }
        public void FitTest2()
        {
            IDistribution target = CreateUnivariateContinuousDistribution();

            double[] observations = { 0.12, 2, 0.52 };

            target.Fit(observations);

            double expected = 0.88;
            double actual   = (target as NormalDistribution).Mean;

            Assert.AreEqual(expected, actual);
        }
        public void FitTest()
        {
            IDistribution target = CreateUnivariateDiscreteDistribution();

            double[]        observations = { 0, 1, 1, 1, 1 };
            IFittingOptions options      = null;

            target.Fit(observations, options);

            double mean = Measures.Mean(observations);

            Assert.AreEqual(mean, (target as BernoulliDistribution).Mean);
        }
示例#7
0
        public void FitTest1()
        {
            IDistribution target = CreateUnivariateDiscreteDistribution();

            double[]        observations = { 0, 1, 1, 1, 1 };
            double[]        weights      = { 0.125, 0.125, 0.25, 0.25, 0.25 };
            IFittingOptions options      = null;

            target.Fit(observations, weights, options);

            double mean = Accord.Statistics.Tools.WeightedMean(observations, weights);

            Assert.AreEqual(mean, (target as BernoulliDistribution).Mean);
        }
        public void FitTest1()
        {
            IDistribution target = CreateUnivariateContinuousDistribution();

            double[]        observations = { 0.12, 2, 0.52 };
            double[]        weights      = { 0.25, 0.25, 0.50 };
            IFittingOptions options      = null;

            target.Fit(observations, weights, options);

            double expected = 0.79;
            double actual   = (target as NormalDistribution).Mean;

            Assert.AreEqual(expected, actual);
        }
示例#9
0
        public void ProbabilityFunctionTest()
        {
            IDistribution target = CreateUnivariateDiscreteDistribution();

            double p = 0.42;
            double q = 1 - p;

            Assert.AreEqual(q, target.ProbabilityFunction(0));
            Assert.AreEqual(p, target.ProbabilityFunction(1));


            double[] observations = { 0, 1, 0, 0, 1, 0 };

            target.Fit(observations);

            p = Accord.Statistics.Tools.Mean(observations);
            q = 1 - p;

            Assert.AreEqual(q, target.ProbabilityFunction(0));
            Assert.AreEqual(p, target.ProbabilityFunction(1));
        }
        public void FitTest2()
        {
            IDistribution target = CreateMultivariateContinuousDistribution();

            double[][] observations =
            {
                new double[] { 1, 2 },
                new double[] { 3, 2 },
                new double[] { 2, 3 },
                new double[] { 1, 2 },
            };

            target.Fit(observations);

            double[]   expectedMean = Measures.Mean(observations, dimension: 0);
            double[][] expectedCov  = Measures.Covariance(observations, expectedMean);

            MultivariateContinuousDistribution actual = target as MultivariateContinuousDistribution;

            Assert.IsTrue(expectedMean.IsEqual(actual.Mean));
            Assert.IsTrue(expectedCov.IsEqual(actual.Covariance));
        }
        public void FitTest3()
        {
            IDistribution target = CreateMultivariateContinuousDistribution();

            double[][] observations =
            {
                new double[] { 1, 2 },
                new double[] { 3, 2 },
                new double[] { 2, 3 },
                new double[] { 1, 2 },
            };

            target.Fit(observations);

            double[] expectedMean = Accord.Statistics.Tools.Mean(observations);
            double[,] expectedCov = Accord.Statistics.Tools.Covariance(observations, expectedMean);

            MultivariateContinuousDistribution actual = target as MultivariateContinuousDistribution;

            Assert.IsTrue(expectedMean.IsEqual(actual.Mean));
            Assert.IsTrue(expectedCov.IsEqual(actual.Covariance));
        }