2015-02-25 3 views
-2

Обычный Linest легко, но я не знаю, как «b устанавливается равным 0, а значения m настраиваются так, чтобы они соответствовали y = mx».Как рассчитать LINEST в C# с нулевым перехватом?

static class Program 
{ 
    static void Main(string[] args) 
    { 
     var yValues = new double[] { 1, 9, 5, 7 }; 
     var xValues = new double[] { 0, 4, 2, 3 }; 


     var noConst = Linest(yValues, xValues); 
     Console.WriteLine("m = {0}, b = {1}", noConst.Slope, noConst.Intercept); 


    } 

    public static LineSpec Linest(IList<double> yValues, IList<double> xValues) 
    { 
     var yAvg = yValues.Sum()/yValues.Count; 
     var xAvg = xValues.Sum()/xValues.Count; 

     double upperSum = 0; 
     double lowerSum = 0; 
     for (var i = 0; i < yValues.Count; i++) 
     { 
      upperSum += (xValues[i] - xAvg) * (yValues[i] - yAvg); 
      lowerSum += (xValues[i] - xAvg) * (xValues[i] - xAvg); 
     } 

     var m = upperSum/lowerSum; 
     var b = yAvg - m * xAvg; 
     return new LineSpec() { Slope = m, Intercept = b }; 
    } 

} 

struct LineSpec 
{ 
    public double Slope { get; set; } 
    public double Intercept { get; set; } 
} 
+0

Я не понимаю, о чем вы просите. Вы не знаете, как вычислить LINEST с нулевым перехватом? Или у вас есть конкретная проблема с внедрением метода, который вы используете на C#? Если первый, ваш вопрос лучше подготовлен в математике SE. Если последний, вы должны предоставить подробную информацию о своей реализации, желательно с кодом, и указать, где у вас проблемы. – iheanyi

ответ

-1

Это математический вопрос, а не вопрос кодирования. Use linear regression without the intercept term.


public static LineSpec LinestConst(IList<double> yValues, IList<double> xValues) 
    { 
     var yAvg = yValues.Sum()/yValues.Count; 
     var xAvg = xValues.Sum()/xValues.Count; 

     double upperSum = 0; 
     double lowerSum = 0; 
     for (var i = 0; i < yValues.Count; i++) 
     { 
      upperSum += (xValues[i] * yValues[i]); 
      lowerSum += (xValues[i] * xValues[i]); 
     } 

     var m = upperSum/lowerSum; 
     var b = 0; 
     return new LineSpec() { Slope = m, Intercept = b }; 
    }