public IActionResult GetLogisticRegressionResult([FromBody] GetLogisticRegressionRequest request) { var logisticRegression = new LogisticRegression(); logisticRegression.Regress(request.Inputs, request.Outputs); return(new OkObjectResult(logisticRegression.ToDto())); }
/// <summary> /// Computes the Logistic Regression Analysis. /// </summary> /// <remarks>The likelihood surface for the /// logistic regression learning is convex, so there will be only one /// peak. Any local maxima will be also a global maxima. /// </remarks> /// <param name="limit"> /// The difference between two iterations of the regression algorithm /// when the algorithm should stop. If not specified, the value of /// 10e-4 will be used. The difference is calculated based on the largest /// absolute parameter change of the regression. /// </param> /// <param name="maxIterations"> /// The maximum number of iterations to be performed by the regression /// algorithm. /// </param> /// <returns> /// True if the model converged, false otherwise. /// </returns> /// public bool Compute(double limit, int maxIterations) { double delta; int iteration = 0; do // learning iterations until convergence { delta = regression.Regress(inputData, outputData); iteration++; } while (delta > limit && iteration < maxIterations); // Check if the full model has converged bool converged = iteration <= maxIterations; // Store model information this.result = regression.Compute(inputData); this.deviance = regression.GetDeviance(inputData, outputData); this.logLikelihood = regression.GetLogLikelihood(inputData, outputData); this.chiSquare = regression.ChiSquare(inputData, outputData); // Store coefficient information for (int i = 0; i < regression.Coefficients.Length; i++) { this.waldTests[i] = regression.GetWaldTest(i); this.standardErrors[i] = regression.GetStandardError(i); this.coefficients[i] = regression.Coefficients[i]; this.confidences[i] = regression.GetConfidenceInterval(i); this.oddsRatios[i] = regression.GetOddsRatio(i); } // Perform likelihood-ratio tests against diminished nested models for (int i = 0; i < inputCount; i++) { // Create a diminished inner model without the current variable double[][] data = inputData.RemoveColumn(i); LogisticRegression inner = new LogisticRegression(inputCount - 1); iteration = 0; do // learning iterations until convergence { delta = inner.Regress(data, outputData); iteration++; } while (delta > limit && iteration < maxIterations); double ratio = 2.0 * (logLikelihood - inner.GetLogLikelihood(data, outputData)); ratioTests[i + 1] = new ChiSquareTest(ratio, 1); } // Returns true if the full model has converged, false otherwise. return(converged); }
/// <summary> /// Fits a logistic regression model to data until convergence. /// </summary> private bool fit(LogisticRegression regression, double[][] input, double[] output) { double delta; int iteration = 0; do // learning iterations until convergence { delta = regression.Regress(input, output); iteration++; } while (delta > limit && iteration < maxIterations); // Check if the full model has converged return(iteration <= maxIterations); }
static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("TestLogisticRegression [train corpus file name] [test corpus file name]"); return; } double[][] inputs; double[] outputs; Console.WriteLine("Loading train corpus..."); //Load training corpus LoadCorpusFromFile(args[0], out inputs, out outputs); //Try to normalize output value Normalize(outputs); Console.WriteLine("Logistic regression..."); LogisticRegression lr = new LogisticRegression(inputs[0].Length); double error = lr.Regress(inputs, outputs); Console.WriteLine("Parameter list:"); for (int i = 0; i < lr.Coefficients.Length; i++) { Console.WriteLine("Coefficient {0}: {1}", i, lr.Coefficients[i]); } Console.WriteLine("Delta: {0}", error); Console.WriteLine(); //Load test corpus Console.WriteLine("Testing regress result:"); LoadCorpusFromFile(args[1], out inputs, out outputs); //Try to normalize output value Normalize(outputs); for (int i = 0; i < outputs.Length; i++) { StringBuilder sb = new StringBuilder(); double output = lr.Compute(inputs[i]); for (int j = 0; j < inputs[i].Length; j++) { sb.Append(inputs[i][j].ToString() + " "); } sb.Append(outputs[i] + " RV:" + output); sb.Append(" Err:" + (output - outputs[i]).ToString()); Console.WriteLine(sb.ToString()); } }
public void When_Compute_Logistic_Regression() { double[][] inputs = { new double[] { 55, 0 }, new double[] { 28, 0 }, new double[] { 65, 1 }, new double[] { 46, 0 }, new double[] { 86, 1 }, new double[] { 56, 1 }, new double[] { 85, 0 }, new double[] { 33, 0 }, new double[] { 21, 1 }, new double[] { 42, 1 } }; double[] outputs = { 0, 0, 0, 1, 1, 1, 0, 0, 0, 1 }; var logisticRegression = new LogisticRegression(); logisticRegression.Regress(inputs, outputs); var result = logisticRegression.Compute(new double[] { 87, 1 }); var oddsRatio = logisticRegression.GetOddsRatio(); var standardErrors = logisticRegression.GetStandardErrors(); Assert.Equal(0.75143272858390264, result); Assert.Equal(0.085627701183141239, oddsRatio[0]); Assert.Equal(1.0208597029292656, oddsRatio[1]); Assert.Equal(5.8584748981778869, oddsRatio[2]); Assert.Equal(2.1590686019476122, standardErrors[0]); Assert.Equal(0.0337904223210436, standardErrors[1]); Assert.Equal(1.4729903935788495, standardErrors[2]); }