public static IInterpolator1D RegressNotContinuous(double[] Xs, double[] Ys, int nSegments) { var nSamples = Xs.Length; //var x = new double[nSegments + 1]; //var y = new double[nSegments + 1]; var samplesPerSegment = nSamples / nSegments; var interps = new IInterpolator1D[nSegments]; var uBounds = new double[nSegments]; for (var i = 0; i < nSegments; i++) { var sampleXs = Xs.Skip(i * samplesPerSegment).Take(samplesPerSegment).ToArray(); var sampleYs = Ys.Skip(i * samplesPerSegment).Take(samplesPerSegment).ToArray(); var lr = LinearRegression.LinearRegressionVector(sampleXs, sampleYs); var xLo = sampleXs.First(); var xHi = sampleXs.Last(); var yLo = lr.Alpha + lr.Beta * xLo; var yHi = lr.Alpha + lr.Beta * xHi; interps[i] = InterpolatorFactory.GetInterpolator(new[] { xLo, xHi }, new[] { yLo, yHi }, Interpolator1DType.Linear); uBounds[i] = xHi; } uBounds[uBounds.Length - 1] = double.MaxValue; return(new NonContinuousInterpolator(uBounds, interps)); }
public IInterpolator1D PerformRegression() { var nPaths = _pathwiseValuesFwd.Length; var pathAvgs = _pathwiseValuesFwd.Select(x => x.Average()).ToArray(); if (_pathwiseValuesReg.All(x => x == _pathwiseValuesReg.First()) && pathAvgs.All(x => x == pathAvgs.First())) { return(new ParametricLinearInterpolator(pathAvgs.First(), 0.0)); } var lr = LinearRegression.LinearRegressionVector(_pathwiseValuesReg, pathAvgs); return(new ParametricLinearInterpolator(lr.Alpha, lr.Beta)); }
public void VectorAndNoneVectorLinearRegressionMatches() { var rand = new System.Random(); var xArray = new double[50]; var yArray = new double[50]; for (var i = 0; i < xArray.Length; i++) { xArray[i] = rand.NextDouble(); yArray[i] = rand.NextDouble(); } var reg1 = LinearRegression.LinearRegressionNoVector(xArray, yArray, false); var reg2 = LinearRegression.LinearRegressionVector(xArray, yArray); Assert.Equal(reg1.Alpha, reg2.Alpha, 10); Assert.Equal(reg1.Beta, reg2.Beta, 10); Assert.Equal(reg1.R2, reg2.R2, 10); }
public static IInterpolator1D Regress(double[] Xs, double[] Ys, int nSegments) { var nSamples = Xs.Length; var x = new double[nSegments + 1]; var y = new double[nSegments + 1]; var samplesPerSegment = nSamples / nSegments; for (var i = 0; i < nSegments; i++) { var sampleXs = Xs.Skip(i * samplesPerSegment).Take(samplesPerSegment).ToArray(); var sampleYs = Ys.Skip(i * samplesPerSegment).Take(samplesPerSegment).ToArray(); var lr = LinearRegression.LinearRegressionVector(sampleXs, sampleYs); var xLo = sampleXs.First(); var xHi = sampleXs.Last(); var yLo = lr.Alpha + lr.Beta * xLo; var yHi = lr.Alpha + lr.Beta * xHi; if (i == 0) { x[0] = xLo; y[0] = yLo; x[1] = xHi; y[1] = yHi; } else { var xD = sampleXs.Select(q => q - xLo).ToArray(); var yD = sampleYs.Select(q => q - yLo).ToArray(); var lr2 = LinearRegression.LinearRegressionNoIntercept(xD, yD); var yHiBetter = xD.Last() * lr2.Beta + yLo; x[i + 1] = xHi; y[i + 1] = yHiBetter; } } return(InterpolatorFactory.GetInterpolator(x, y, Interpolator1DType.Linear)); }