Montag, 17. November 2014

R neuralnet mit multiple Input

Ein neuronales Netz mit R

Dieses Beispiel soll kurz beschreiben, wie man mit R ein Neuronales Netz erstellt. Als erstes muss das Paket: "neuralnet" installiert und geladen werden:
install.packages("neuralnet")
library(neuralnet)
Dieses beispiel Netz soll 3 Eingänge und eine Ausgabe haben,

Definition der Ein- und Ausgangsdaten:

I1 <- c(1,2,3,4,5) #Input 1
I2 <- c(10, 20, 30, 40, 50) #Input 2
I3 <- c(100, 200, 300, 400, 500) #Input 3
O1 <- c(6,7,8,9,10) #Output

data.frame erstellen:

Ein data.frame fasst unterschiedliche Daten zusammen
NetDaten <- data.frame(I1, I2, I3, O1)
Die Daten sollten nun wie folgt aussehen:
I1 I2 I3 O1
1 1 10 100 6
2 2 20 200 7
3 3 30 300 8
4 4 40 400 9
5 5 50 500 10

Erstellen des Netzes

Das Beispiel Netz soll mit folgenden Eigenschaften erstellt werden:
Das Netz soll 10 Hidden-Neurons haben (hidden=10)
Das Anlernen des Netzes kann beendet werden, sobald ein Fehler-Threshold von 0.01 erreicht wurde (threshold=0.01)
Es wird nur 1 Netz erstellt (rep=1).
net <- neuralnet(O1~I1+I2+I3, t, hidden=10, rep=1, threshold=0.01)

Darstellen

Textuelle Ausgabe des Netzes
> print(net)
Call: neuralnet(formula = O1 ~ I1 + I2 + I3, data = NetDaten, hidden = 10,     threshold = 0.01, rep = 1)

1 repetition was calculated.

           Error Reached Threshold Steps
1 0.000537743293    0.006383272813  3259
Grafisches Darstellund des Netzes
plot(net)
Bei den blauen Neuronen handelt es sich um einen Bias, eine gute Beschreibung welche Aufgabe ein Bias hat ist hier beschrieben:http://stackoverflow.com/questions/2480650/role-of-bias-in-neural-networks.

Samstag, 15. November 2014

R mit C# Verbindung

Eine Verbindung zwischen C# und R herstellen.

An dieser Stelle möchte ich kurz meinen Lösungsweg beschreiben, wie man die Kommunikation zwischen R und C# herstellt. Ich habe dazu das Projekt R.NET benutzt. Zu beachten sind vorallem die unterschiedlichen Version die benutzt werden.

Alle Beispiele wurden auf einem Windows 7 64Bit in einer virtuellen Maschine getestet.

Benötigte Installationen

  • 1. R-Project
    Unter http://cran.rstudio.com/ findet ihr die aktuelle Version von R. Ich habe die Version R-3.1.2 installiert. Die Einstellungen beim installieren müssen nicht verändert werden. Ich habe beide Version 32Bit und 64Bit installiert.
  • 2. R.NET
    R.NET kann von http://rdotnet.codeplex.com/ heruntergeladen werden. Da ich Probleme mit der NUGET Version hatte, habe ich die Sources vom Commit rdotnet-e0329307d844 benutzt. Die darin enthaltenen Projekte RDotNet und RDotNet.NativeLibrary können dann später in der Projektmappe benutzt werden.
Weitere Software wird nicht benötigt.

Verwendung

Projekt erstellen und R.NET-Projekte hinzufügen.

Als erstes muss ein neues C# Projekt erstellt werden. Anschließend werden die beiden Projekte RDotNet und RDotNet.NativeLibrary der neuen Projektmappe hinzugefügt. Rechtsklick auf die Projektmappe -> Hinzufügen -> Vorhandenes Projekt... und dann die csproj der beiden Projekte auswählen. Danach sollte die Projektmappe in etwa so aussehen:

Verweise hinzufügen

Nun muss das neue Projekt nur noch die entsprechenden Verweise auf die RDotNet Projekte erhalten. Rechtsklick auf das Projekt -> Hinzufügen -> Verweis -> Projekte und dann beide Projekte auswählen.

Der Quelltext

Nun ist alles vorbereitet. Als erstes erhält die Klasse in der R benutzt werden soll einen entsprechenden Verweis auf das RDotNet Projekt.
using RDotNet;
Als nächstes muss die EnvironmentVariable R_HOME gesetzt und die PATH Variable angepasst werden.
//R_HOME
Environment.SetEnvironmentVariable("R_HOME", "C:\\Program Files\\R\\R-3.1.2");
//PATH
Environment.SetEnvironmentVariable("PATH", System.Environment.GetEnvironmentVariable("PATH")+ ";" + @"C:\Program Files\R\R-3.1.2\bin\i386");
Die Variable R_HOME zeigt auf das Hauptverzeichnis der R Installation, vohingegen die PATH Variable auf das Verzeichnis der R.exe zeigen muss. Auch hier gilt es zu beachten, dass die Versionen übereinstimmen. Um nun eine Instanz von R zu erhalten, benutzen wir die Funktion GetInstance von der REngine.
REngine engine = REngine.GetInstance();
engine enhält nun eine Instanz von R mit der sich arbeiten lässt.

Funktionstest

Um sicher zu gehen, dass alles erfolgreich war, empfiehlt es sich das Beispiel aus der R.NET dokumentation kurz anzuwenden
 
CharacterVector charVec = engine.CreateCharacterVector(new[] { "Hello, R world!, .NET speaking" });
engine.SetSymbol("greetings", charVec);
engine.Evaluate("str(greetings)"); // print out in the console
string[] a = engine.Evaluate("'Hi there .NET, from the R engine'").AsCharacter().ToArray();
Console.WriteLine("R answered: '{0}'", a[0]);
Console.WriteLine("Press any key to exit the program");            
engine.Dispose();
Das sollte folgende Ausgabe auf der Console erzeugen:
 
chr"Hello, R world!, .NET speaking"
[1]"Hi there .NET, from the R engine"
R answered: 'Hi there .NET, from the R engine'
Press any key to exit the program