public double CheckNewBasisFast(Basis basis, Basis basisReflected, double newKnotVal, Func <double[][], double[], double[]> solver, ref double [][] transformedData) { if (transformedData == null) { List <Basis> tempNewBasises = new List <Basis>(this.Basises); tempNewBasises.Add(basis); tempNewBasises.Add(basisReflected); transformedData = Recalc(tempNewBasises, Regressors); } else { int ncol = transformedData[0].Length - 2; int nrow = transformedData.Length; bool b1Warning = true; bool b2Warning = true; double b1Temp = 0.0; double b2Temp = 0.0; for (int i = 0; i < nrow; i++) { transformedData[i][ncol] += basis.CalcFastDependedOnPrevious(Regressors[i], newKnotVal, basis.Hinges[basis.Hinges.Count - 1].Value, i); transformedData[i][ncol + 1] += basisReflected.CalcFastDependedOnPrevious(Regressors[i], newKnotVal, basis.Hinges[basis.Hinges.Count - 1].Value, i); if (b1Warning) { b1Warning = b1Temp == transformedData[i][ncol]; b1Temp = transformedData[i][ncol]; } if (b2Warning) { b2Warning = b2Temp == transformedData[i][ncol]; b2Temp = transformedData[i][ncol]; } } if (b1Warning || b2Warning) { return(double.MaxValue); } //Console.WriteLine("Warn {0} {1} !" + ++_warns, b1Temp, b2Temp); } //var tempNewRegressionCoefficients = RegressionToolkit.CalculateLeastSquares(transformedData, Y); var tempNewRegressionCoefficients = solver(transformedData, Y); var tempNewpredicted = RegressionToolkit.Predict(tempNewRegressionCoefficients.ToArray(), transformedData); var tempNewRSS = RegressionToolkit.CalcRSS(tempNewpredicted.ToArray(), Y); return(tempNewRSS); }
//public double[] YTransformed { get; set; } public double CheckNewBasis(Basis basis, Basis basisReflected) { List <Basis> tempNewBasises = new List <Basis>(this.Basises); tempNewBasises.Add(basis); tempNewBasises.Add(basisReflected); var transformedData = Recalc(tempNewBasises, Regressors); var tempNewRegressionCoefficients = RegressionToolkit.CalculateLeastSquares(transformedData, Y); var tempNewpredicted = RegressionToolkit.Predict(tempNewRegressionCoefficients.ToArray(), transformedData); var tempNewRSS = RegressionToolkit.CalcRSS(tempNewpredicted.ToArray(), Y); return(tempNewRSS); }
public void Recalc() { RegressorsTransformed = Recalc(this.Basises, Regressors); //_regressionCoefficients = RegressionToolkit.CalculateLeastSquares(RegressorsTransformed, Y); //regressionCoefficients = PrepareAndCalcCholesskyFull(RegressorsTransformed, Y).ToList(); //Задать V нужный размер _v = ResizeV(this._v, RegressorsTransformed[0].Length); //А C можно пересчитать прямо тут _c = __calcC(RegressorsTransformed); _regressionCoefficients = PrepareAndCalcCholesskyNewColumns(RegressorsTransformed, Y).ToList(); var predicted = RegressionToolkit.Predict(_regressionCoefficients.ToArray(), RegressorsTransformed); _RSS = RegressionToolkit.CalcRSS(predicted.ToArray(), Y); _RSq = RegressionToolkit.CalcRSq(predicted.ToArray(), Y); }