Feedback

Lineare Regression

Sprache: C#

Funktion für die Lineare Regression…
/// <summary>
        /// Lineare Regression</param>
        /// 
        /// </summary>
        /// <param name="x-Werte"></param>
        /// <param name="y-Werte"></param>
        /// <returns>m,n</returns>
        public static List<double> LineareRegression(List<double> xWerte, List<double> yWerte)
        {
           
            double xAvg = 0;

            double yAvg = 0;

            foreach (double _xWerte in xWerte)
            {
                 xAvg += _xWerte;
            }
            foreach (double _yWerte in yWerte)
            {
                yAvg += _yWerte;
            }

            xAvg = xAvg / xWerte.Count();

            yAvg = yAvg / yWerte.Count();

            double v1 = 0;

            double v2 = 0;

            for (int i = 0; i < xWerte.Count(); i++)
            {
                v1 += (xWerte[i] - xAvg) * (yWerte[i] - yAvg);
                v2 += Math.Pow(xWerte[i] - xAvg, 2);
            }

            //Formel y = m/x + n
            double m = v1 / v2;

            double n = yAvg - m * xAvg;

            List<double> mn = new List<double>();
            mn.Add(m);
            mn.Add(n);
            return mn;
        }
/// <summary>
        /// Lineare Regression</param>
        /// 
        /// </summary>
        /// <param name="x-Werte"></param>
        /// <param name="y-Werte"></param>
        /// <returns>m,n</returns>
        public static List<double> LineareRegression(List<double> xWerte, List<double> yWerte)
        {
           
            double xAvg = 0;

            double yAvg = 0;

            foreach (double _xWerte in xWerte)
            {
                 xAvg += _xWerte;
            }
            foreach (double _yWerte in yWerte)
            {
                yAvg += _yWerte;
            }

            xAvg = xAvg / xWerte.Count();

            yAvg = yAvg / yWerte.Count();

            double v1 = 0;

            double v2 = 0;

            for (int i = 0; i < xWerte.Count(); i++)
            {
                v1 += (xWerte[i] - xAvg) * (yWerte[i] - yAvg);
                v2 += Math.Pow(xWerte[i] - xAvg, 2);
            }

            //Formel y = m/x + n
            double m = v1 / v2;

            double n = yAvg - m * xAvg;

            List<double> mn = new List<double>();
            mn.Add(m);
            mn.Add(n);
            return mn;
        }

1 Kommentar

  1. Wenn du schon alle Elemente der Liste druchläufst, könntest du auch ein IEnumerable statt einer List verwenden. Auch wäre es besser Point-Werte entgegen zu nehmen (selbst geschriebener Typ), so sind garantiert immer x und y vorhanden. (Momentan prüfst du nichtmal darauf.)

    Beim durchlaufen der Elemente in der Liste könntest du deren Anzahl zählen um so den Aufruf von Count() zu vermeiden. (Die LINQ-Methode durchläuft nochmal alle Elemente, die Count-Eigenschaft der List wäre am effektivsten).
    Am besten wäre natürlich gleich die Average-Methode [1].

    Als Rückgabewert solltest du keine List verwenden, sondern lieber eine eigene Struktur oder out-Parameter.

    [1]http://msdn.microsoft.com/de-de/library/system.linq.enumerable.average.aspx