public void Bug6162() { // When UncertianMeasurementSample.FitToPolynomial used Cholesky inversion of (A^T A), this inversion // would fail when roundoff errors would made the matrix non-positive-definite. We have now changed // to QR decomposition, which is more robust. //real data double[] X_axis = new double[] { 40270.65625, 40270.6569444444, 40270.6576388888, 40270.6583333332, 40270.6590277776, 40270.659722222, 40270.6604166669, 40270.6611111113, 40270.6618055557, 40270.6625000001 }; double[] Y_axis = new double[] { 246.824996948242, 246.850006103516, 245.875, 246.225006103516, 246.975006103516, 247.024993896484, 246.949996948242, 246.875, 247.5, 247.100006103516 }; UncertainMeasurementSample DataSet = new UncertainMeasurementSample(); for (int i = 0; i < 10; i++) { DataSet.Add(X_axis[i], Y_axis[i], 1); } UncertainMeasurementFitResult DataFit = DataSet.FitToPolynomial(3); BivariateSample bs = new BivariateSample(); for (int i = 0; i < 10; i++) { bs.Add(X_axis[i], Y_axis[i]); } PolynomialRegressionResult bsFit = bs.PolynomialRegression(3); foreach (Parameter p in bsFit.Parameters) { Console.WriteLine(p); } }
public void BivariatePolynomialRegressionSimple() { // Pick a simple polynomial Polynomial p = Polynomial.FromCoefficients(3.0, -2.0, 1.0); // Use it to generate a data set Random rng = new Random(1); ContinuousDistribution xDistribution = new CauchyDistribution(1.0, 2.0); ContinuousDistribution errorDistribution = new NormalDistribution(0.0, 3.0); List <double> xs = new List <double>(TestUtilities.CreateDataSample(rng, xDistribution, 10)); List <double> ys = new List <double>(xs.Select(x => p.Evaluate(x) + errorDistribution.GetRandomValue(rng))); PolynomialRegressionResult fit = Bivariate.PolynomialRegression(ys, xs, p.Degree); // Parameters should agree Assert.IsTrue(fit.Parameters.Count == p.Degree + 1); for (int k = 0; k <= p.Degree; k++) { Assert.IsTrue(fit.Coefficient(k).ConfidenceInterval(0.99).ClosedContains(p.Coefficient(k))); } // Residuals should agree Assert.IsTrue(fit.Residuals.Count == xs.Count); for (int i = 0; i < xs.Count; i++) { double z = ys[i] - fit.Predict(xs[i]).Value; Assert.IsTrue(TestUtilities.IsNearlyEqual(z, fit.Residuals[i])); } // Intercept is same as coefficient of x^0 Assert.IsTrue(fit.Intercept == fit.Coefficient(0)); }
public void InternetSampleDownload() { FrameTable table = DownloadFrameTable(new Uri("https://raw.githubusercontent.com/Dataweekends/zero_to_deep_learning_udemy/master/data/weight-height.csv")); FrameView view = table.WhereNotNull(); view.AddComputedColumn("Bmi", (FrameRow r) => { double h = (double)r["Height"]; double w = (double)r["Weight"]; return(w / (h * h)); }); FrameView males = view.Where("Gender", (string s) => (s == "Male")); FrameView females = view.Where("Gender", (string s) => (s == "Female")); SummaryStatistics maleSummary = new SummaryStatistics(males["Height"].As <double>()); SummaryStatistics femaleSummary = new SummaryStatistics(females["Height"].As <double>()); TestResult allNormal = view["Height"].As <double>().ShapiroFranciaTest(); TestResult maleNormal = males["Height"].As <double>().ShapiroFranciaTest(); TestResult femaleNormal = females["Height"].As <double>().ShapiroFranciaTest(); TestResult tTest = Univariate.StudentTTest(males["Height"].As <double>(), females["Height"].As <double>()); TestResult mwTest = Univariate.MannWhitneyTest(males["Height"].As <double>(), females["Height"].As <double>()); LinearRegressionResult result0 = males["Weight"].As <double>().LinearRegression(males["Height"].As <double>()); PolynomialRegressionResult result1 = males["Height"].As <double>().PolynomialRegression(males["Weight"].As <double>(), 1); PolynomialRegressionResult result2 = males["Height"].As <double>().PolynomialRegression(males["Weight"].As <double>(), 2); PolynomialRegressionResult result3 = males["Height"].As <double>().PolynomialRegression(males["Weight"].As <double>(), 3); //MultiLinearRegressionResult multi = view["Weight"].As<double>().MultiLinearRegression(view["Height"].As<double>(), view["Gender"].As<string>().Select(s => (s == "Male") ? 1.0 : 0.0).ToList()); }
public void BivariatePolynomialRegressionCovariance() { // do a set of polynomial regression fits // make sure not only that the fit parameters are what they should be, but that their variances/covariances are as claimed Random rng = new Random(271828); // define logistic parameters double[] a = new double[] { 0.0, -1.0, 2.0, -3.0 }; // keep track of sample of returned a and b fit parameters MultivariateSample A = new MultivariateSample(a.Length); // also keep track of returned covariance estimates // since these vary slightly from fit to fit, we will average them SymmetricMatrix C = new SymmetricMatrix(a.Length); // also keep track of test statistics Sample F = new Sample(); // do 100 fits for (int k = 0; k < 100; k++) { // we should be able to draw x's from any distribution; noise should be drawn from a normal distribution ContinuousDistribution xd = new CauchyDistribution(); ContinuousDistribution nd = new NormalDistribution(0.0, 4.0); // generate a synthetic data set BivariateSample s = new BivariateSample(); for (int j = 0; j < 20; j++) { double x = xd.GetRandomValue(rng); double y = nd.GetRandomValue(rng); for (int i = 0; i < a.Length; i++) { y += a[i] * MoreMath.Pow(x, i); } s.Add(x, y); } // do the regression PolynomialRegressionResult r = s.PolynomialRegression(a.Length - 1); ColumnVector ps = r.Parameters.ValuesVector; // record best fit parameters A.Add(ps); // record estimated covariances C += r.Parameters.CovarianceMatrix; // record the fit statistic F.Add(r.F.Statistic.Value); } C = (1.0 / A.Count) * C; // allow matrix division by real numbers // check that mean parameter estimates are what they should be: the underlying population parameters for (int i = 0; i < A.Dimension; i++) { Assert.IsTrue(A.Column(i).PopulationMean.ConfidenceInterval(0.95).ClosedContains(a[i])); } // check that parameter covarainces are what they should be: the reported covariance estimates for (int i = 0; i < A.Dimension; i++) { for (int j = i; j < A.Dimension; j++) { Assert.IsTrue(A.TwoColumns(i, j).PopulationCovariance.ConfidenceInterval(0.95).ClosedContains(C[i, j])); } } // check that F is distributed as it should be //Console.WriteLine(fs.KolmogorovSmirnovTest(new FisherDistribution(2, 48)).LeftProbability); }