Laden...

Multiple Lineare Regression: Suche kostenlose Bibliothek oder einen Ansatz für eine eigene Methode

Erstellt von Sebastian1989101 vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.565 Views
Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 12 Jahren
Multiple Lineare Regression: Suche kostenlose Bibliothek oder einen Ansatz für eine eigene Methode

Hallo Community,

ich beschäftige mich gerade mit "Multiple Lineare Regression" nur sind mir bisher mal abgesehen von Kostenpflichtigen Libarys keine möglichkeiten unter gekommen ds ganze in C# dar zu stellen, da die Formeln zur Berechnung ja auch sehr "komplex" sind. Meine Frage wäre also jetzt wie eine methode zur Berechnung einer Multiple Lineare Regression aussehen müsste in C#, vielleicht hat ja jemand das nöþige know how mir da weiter zu helfen.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

G
538 Beiträge seit 2008
vor 12 Jahren

Du könntest eventuell die Apache Math-Library als vorlage Verwenden (die ist in JAVA - das solltest du Lesen können, wenn du sonst C# programmierst).
Dort gibt es verschiedenste Funktionen - u.A. auch Regression. Allerdings kann ich dir nicht sagen, ob auch die multiple Lineare drin enthalten ist.

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Sebastian1989101,

Meine Frage wäre

Und was ist deine Frage? 😉 (SCNR)

wie eine methode zur Berechnung einer Multiple Lineare Regression aussehen müsste in C#

Welche Antwort würdest du dir denn unter Beachtung von [Hinweis] Wie poste ich richtig? Punkt 4.a, 4.b, 4.c erwarten?

Wie ein Algorithmus/Formeln zu Code gebracht wird sollte klar sein, wenn man es selber machen will*. Sonst ist es besser auf eine kommerzielle Lösung auszuweichen. Dies kann aber auch in Betracht gezogen werden, wenn der Aufwand der Eigenimplementierung mit dem Aufwand des Kaufens verglichen wird.

* versteh mich nicht falsch, aber deine Frage käme so rüber, als ob du den fertigen Code haben willst. Wir helfen gerne wenn du wo hängst, aber Ersatz für kommerzielle Lösungen gibts nicht (umsonst 😉).

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 12 Jahren

Nein ne komplette Lösung wäre eh nicht möglich weil es ja auch individual Anforderungen sind. 😉 Aber die Java Lib war eine gute Idee, leider komme ich dort auf andere Ergebnisse als Erwartet.

Nutzte die von dir genannte Libary wie folgt:


import junit.framework.Assert;
import org.junit.Test;
import org.apache.commons.math.linear.RealMatrix;
import org.apache.commons.math.stat.regression.OLSMultipleLinearRegression;

public class RegressionTest {
	
	@Test
	public void test() {
		double spannung[] = new double[] { -0.408081, -0.389191, -0.368439, -0.344971, -0.319122, -0.279144, -0.232635, -0.18219, -0.104462, -0.004669, 0.094086, 0.172852, 0.222107, 0.270813, 0.310181, 0.335907, 0.360443, 0.383148, 0.402771 };
        double a[] = new double[] { 0.778608861, 0.720991789, 0.666407106, 0.61130345, 0.556716978, 0.476772906, 0.389130711, 0.299442172, 0.167342783, 0.000195861, -0.165632606, -0.300969183, -0.388667939, -0.478720667, -0.555930433, -0.610884667, -0.665799556, -0.722983894, -0.778030039 };
        double a3[] = new double[] { 0.472017419, 0.374792556, 0.29595035, 0.228439153, 0.172545405, 0.108376395, 0.058923227, 0.026849666, 0.004686202, 7.51354E-12, -0.004543991, -0.027262526, -0.058713254, -0.10971008, -0.171815107, -0.227969986, -0.295141651, -0.377907811, -0.4709655 };

        double aMulti[][] = new double[a.length][2];
        for(int i = 0; i < a.length; i++)
        {
            aMulti[i][0] = a[i];
            aMulti[i][1] = a3[i];
        }
		
		OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();
		regression.newSampleData(spannung, aMulti);
		RealMatrix matrix = regression.calculateHat();
		double result[] = matrix.getRow(0);
		
		Assert.assertEquals(0.13990603, result[0], 0.0);
		Assert.assertEquals(-0.607547541, result[1], 0.0);
		Assert.assertEquals(-0.004253808, result[2], 0.0);
		Assert.assertEquals(result.length, 3);
	}
}

Im assert sieht man ja was ich erwarten würde, ich weiß leider auch nicht ob ich das mehr diminsionale Array korrekt erzeuge, ebendso wenig weiß ich in moment wie ich zur Lösung mit den Korrekten Zahlen komme. (Die Zahlen stammen aus Excel's Multiple Linear Regression Methode und sind richtig so, darum asserte ich auf exakt diese werte).

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Sebastian1989101,

da es sich um Floating-Point-Numbers handelt sollte nie exakt auf Gleichheit geprüft werden. Ich nehem dass es hier der Java-Ursprung von NUnit ist (heißt der JUnit? egal) und wenn dem so ist kann auch eine Toleranz angegeben werden. Noch besser ist den Vergleich mit dem relativen Fehler durchzuführen. Siehe auch [FAQ] Double und Float: Fehler beim Vergleich und Rundungsfehler.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 12 Jahren

Das mit den nicht auf der exakten gleichheit testen ist mir ja bekannt, ich bin eh aktuell nur am debuggen aber die Werte stimmen leider hinten und Vorne nicht. Und ja JUnit ist die NUnit Java Variante die in der Eclipse Umgebung eigentlich auch direkt vorhanden ist soweit ich weiß. Dummerweise darf die abweichung in der finalen impementierung maximal 1 / 100000000 sein also sehr gering und aktuell wären die Werte nichtmal alle innerhalb der Toleranz wenn ich eine Toleranz über 5.0 verwende.

Also scheine ich ja noch irgend was falsch zu machen oder die Java libary ist schon die 3te die nicht Funktioniert für die Multiple Lineare Regression...

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog

Sebastian1989101 Themenstarter:in
241 Beiträge seit 2010
vor 12 Jahren

Da die Java Libary leider auch nicht Funktioniert, hier nochmal ein Post von mir...
Diesmal habe ich im Anhang mein aktuellen Stand gepackt. Es Funktioniert ja bereits Teilweise ich vermisse nur noch ein Ergebnis was ich benötige.

Nach einigen Tests mit Excel habe ich festgestellt, dass es mir bereits gelingt folgende Funktion abzubilden:

{=RGP(B15:T15;B16:T17;FALSCH)}

leider benötige ich allerdings das Ergebnis was bei Excel bei

{=RGP(B15:T15;B16:T17;WAHR)}

heraus kommt, dies will mir absolut nocht gelingen... Das ganze muss auf eine genaurigkeit von 1 / 32768 sein. Also 0,000030517578125 genau. Für die Excel 'false' Variante erreiche ich dies bereits nur bin ich ratlos wie ich die 'true' Funktion abbilden soll...

Wäre toll wenn jemand die Zeit findet sich das ganze anzusehen (im Anhang ist der SourceCode meines aktuellen standes und eine Excel Tabelle die das abbildet) und mir vielleicht ein denk anstoß geben kann oder mir sagen kann woran es liegt das ich solch ergebnisse erhalte und das eine Zahl einfach 'fehlt' ich bin gerade zu blind es zu sehen...

Mfg.

WAGO Kontakttechnik GmbH & Co. KG / Software Notion
Softwareentwicklung

C# .NET with WPF, ASP, Xamarin and Unity
Personal Blog: Development Blog