Einleitung
Wer sich schon länger über die Stabilität von Weka (bzw der java-vm) unter Linux aufregt, dem wird das hier helfen: Ich habe herausgefunden, die man Weka Classifier mit gcj baut. Das ist ein gcc-Frontend für java, das aus java-Sourcecode normalen Maschinencode macht, statt java Bytecode. Die so erstellten Classifier scheinen in ersten Tests vom RAM-Verbrach her und von der Geschwindigkeit ungefähr auf dem Niveau der java-Classifier zu liegen, aber Classifier, die vorher bei mir abstürzten, laufen jetzt ohne Probleme durch. Ein Paket mit ein paar vorkompilierten Classifiern gibt es hier: http://www-i6.informatik.rwth-aachen.de/~weyand/classpack.tgz Wer mehr Classifier will, kann mir mailen oder folgender Anleitung folgen, um sie selbst zu bauen. Es ist verhältnismäßig einfach.
Kochrezept
Man nehme
Einen gcj, den man in jeder gut sortierten Distribution kriegt. Ist meistens einfach beim gcc dabei. Ich verwende gcj 3.3.5. Ein Weka Paket , zu finden hier: http://prdownloads.sourceforge.net/weka/weka-3-4-4.zip Das sehr praktische gcj build system von Chris Marshall, zu finden hier: http://www.hopelesscase.com:81/gcj/make_c_cpp_java.tgzZubereitung
Den gcj installieren, zB mitUSE=gcj emerge gccunter Gentoo.
Einen Ordner erstellen und die restlichen Zutaten dorthin kopieren und entpacken.
mkdir weka_gcj cd weka_gcj wget http://puzzle.dl.sourceforge.net/sourceforge/weka/weka-3-4-4.zip wget http://www.hopelesscase.com:81/gcj/make_c_cpp_java.tgz unzip weka-3-4-4.zip tar xvzf make_c_cpp_java.tgz
Den Weka Quellcode entpacken:
cp weka-3-4-4/weka-src.jar . jar xvf weka-src.jar
Jetzt muss das Buildsystem auf den Weka-Quellcode angepasst werden. Das passiert fast ausschließlich über kopieren von Dateien in diverse Ordner. Zunächst kommt das Projektmakefile und zwei Tools ins Stammverzeichnis. Dann muss noch eine leere depend-File erstellt werden:
cp make_c_cpp_java/java/Makefile make_c_cpp_java/java/make_dep1 make_c_cpp_java/java/make_dep2 . touch deps
Den Ordner mit dem entpackten build system kann man jetzt entsorgen oder in einen anderen Ordner verschieben, der stört sonst den build-Prozess
rm -rf make_c_cpp_java
Damit das build system weiß, welche Dateien es benutzen soll, braucht es in jedem benötigten Ordner eine Makefile. Diese muss so aussehen:
proglist : true clean : true
Dabei darauf achten, dass man in Makefiles mit Tab einrückt. Wenn sie erstellt ist, kopiert man diese Makefile in folgende Ordner:
cp dummy_Makefile weka/Makefile cp dummy_Makefile weka/classifiers/Makefile cp dummy_Makefile weka/clusterers/Makefile cp dummy_Makefile weka/core/Makefile cp dummy_Makefile weka/estimators/Makefile cp dummy_Makefile weka/filters/Makefile cp dummy_Makefile weka/classifiers/bayes/Makefile cp dummy_Makefile weka/classifiers/functions/Makefile ...(Alle classifier-Unterordner, die man haben will)...
Alle Dateien in den Ordnern, in denen eine solche Makefile liegt, werden nachher kompiliert (dh in .o-Dateien übersetzt, nicht gelinkt). Um die java-Files festzulegen, aus denen Programme gelinkt werden sollen, geht man in den entsprechenden Ordner und passt die Makefile an. Hier führe ich das mal am Naive Bayes Classifier vor.:
cd weka/classifiers/bayes/ vim MakefileJetzt die Makefile so ändern:
proglist : touch NaiveBayes.java.e clean : rm -f NaiveBayes *.e
Mit den .e-Files signalisiert man dem build-System, dass es eine Datei linken soll. Wenn man weitere Classifier bauen will, fügt man einfach entsprechende Einträge im Makefile hinzu. Um zu bauen, geht man wieder in den Hauptordner und ruft make auf:
cd ../../.. make depend make allBei make depend nicht von den warnings und errors irritieren lassen.
Danach liegt die frisch zubereitete Binary in weka/classifiers/bayes und heißt NaiveBayes. Man benutzt sie genau wie ihr java-Äquivalent, also z.b.
./NaiveBayes -x 10 -t dmc2005.arff
das macht 10x-Cross-Validation.
Da der gcj noch nicht fertig ist, lassen sich nicht alle Classifier kompilieren, ich hatte zB Probleme mit dem MultilayerPerceptron. Und die GUI ging natürlich erst recht nicht
Dann guten Appetit! Tob