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