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

Samstag, 16. Juni 2012

jQuery lazyload mit jQuery UI Tabs

Bei der Anzeige von vielen Bildern ist es sinnvoll, die Bilder erst zu laden wenn sie in den sichtbaren Bereich kommen. Dazu empfiehlt sich die Verwendung des lazyload Plugins für jQuery. Allerdings habe ich gerade feststellen müssen, dass in Kombination mit jQuery-Tabs ein Problem auftritt.
Im Quelltext sind Tabs ja nichts anderes als:

Proin elit arcu, rutrum commodo, ....

Morbi tincidunt, dui sit amet faci....

Duis cursus. Maecenas....

jQuery UI Tabs
lazyload Bilder:
 $('.Image img').lazyload();
Wird nun von #tabs-1 auf #tabs-2 gewechselt, passiert nichts anderes, als dass die Sichtbarkeit von #tabs-1 auf
.ui-tabs .ui-tabs-hide {
 display: none !important;
}
gesetzt wird und #tabs-2 die entsprechende css Klasse entzogen wird. Dadurch fehlt aber das passende Event für lazyload (es wird ja nicht gescrollt) und die Bilder auf #tabs-2 werden erst nach kurzem scrollem geladen.
Dieses Verhalten ist für den Benutzer sehr unschön. Eine mögliche Lösung um dieses Verhalten zu umgehen ist, auf das show-Event der Tabs zu reagieren und das scroll-Event manuell auszulösen.
 //initialisieren der Tabs:
 $('#tabs').tabs({
  show: function(event, ui) {
   $(window).scroll();
  }
 });
Lazyload reagiert nun auf dieses Event und lädt die Bilder die sich im sichtbaren Bereich befinden.

Freitag, 15. Juni 2012

JSLint Meldungen

Dieser erste Eintrag soll die Meldungen von JSLint kurz mit einem Bespiel erläutern.
Meldung: This is better written in dot notation.
Beispiel:
 meinArray['Name'] = 'Manuel';
Lösung:
 meinArray.Name = 'Manuel';
Anmerkung:
Ob es tatsächlich schneller ist konnte ich bislang nicht feststellen, aber sicherlich erhöht sich die Lesbarkeit.
jslint wiki
Meldung: Use the array literal notation [].
Beispiel:
 var meinArray = new Array();
Lösung:
 var meinArray = [];
Diskussion auf Stackoverflow
Meldung: Use the object literal notation {}.
Beispiel:
 var meinObject = new Object();
Lösung:
 var meinObject = {};
Diskussion auf Stackoverflow