Feedback

C# - Lineare Regression

Veröffentlicht von am 2/6/2013
(2 Bewertungen)
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;
        }
Abgelegt unter LineareRegression.

1 Kommentare zum Snippet

Koopakiller schrieb am 9/28/2014:
Wenn du schon alle Elemente der Liste druchläufst, könntest du auch ein IEnumerable<T> statt einer List<T> 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<T> wäre am effektivsten).
Am besten wäre natürlich gleich die Average-Methode [1].

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

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

Logge dich ein, um hier zu kommentieren!