Frage

ich eine ARFF Datei haben 14 numerische Spalten enthält. Ich möchte, separat eine Normalisierung auf jede Spalte durchzuführen, welche die Werte von jedem colum bis (actual_value - min(this_column)) / (max(this_column) - min(this_column)) ist, zu modifizieren. Daher werden alle Werte aus einer Spalte im Bereich [0, 1] sein. Die minimalen und maximalen Werte aus einer Spalte von denen einer anderen Spalte unterscheiden könnten.

Wie kann ich das mit Weka Filter?

Danke

War es hilfreich?

Lösung

Dies kann mit Hilfe getan werden

weka.filters.unsupervised.attribute.Normalize

Nach der Anwendung dieses Filters alle Werte in jeder Spalte werden im Bereich [0, 1]

Andere Tipps

Das ist richtig. Ich wollte nur über den Unterschied von „Normalisierung“ und „Standardisierung“ erinnern. Was in der Frage erwähnt ist „Standardisierung“, während „Normalisierung“ Gauß-Verteilung und normalisiert durch den Mittelwert annimmt und Standardabweichung der einzelnen Attribute. Wenn Sie einen Ausreißer in den Daten haben, könnte der standardisieren Filter Ihre Datenverteilung als min verletzt oder max könnte viel weiter als die anderen Instanzen sein.

Hier ist das Arbeits Normalisierung Beispiel mit K-Means in JAVA.

final SimpleKMeans kmeans = new SimpleKMeans();

final String[] options = weka.core.Utils
        .splitOptions("-init 0 -max-candidates 100 -periodic-pruning 10000 -min-density 2.0 -t1 -1.25 -t2 -1.0 -N 10 -A \"weka.core.EuclideanDistance -R first-last\" -I 500 -num-slots 1 -S 50");
kmeans.setOptions(options);

kmeans.setSeed(10);
kmeans.setPreserveInstancesOrder(true);
kmeans.setNumClusters(25);
kmeans.setMaxIterations(1000);

final BufferedReader datafile = new BufferedReader(new FileReader("/Users/data.arff");
Instances data = new Instances(datafile);

//normalize
final Normalize normalizeFilter = new Normalize();
normalizeFilter.setInputFormat(data);
data = Filter.useFilter(data, normalizeFilter);

//remove class column[0] from cluster
data.setClassIndex(0);
final Remove removeFilter = new Remove();
removeFilter.setAttributeIndices("" + (data.classIndex() + 1));
removeFilter.setInputFormat(data);
data = Filter.useFilter(data, removeFilter);

kmeans.buildClusterer(data);

System.out.println(kmeans.toString());

// evaluate clusterer
final ClusterEvaluation eval = new ClusterEvaluation();
eval.setClusterer(kmeans);
eval.evaluateClusterer(data);
System.out.println(eval.clusterResultsToString());

Wenn Sie CSV-Datei haben, dann ersetzen BufferedReader Linie oben mit unten genannten Datenquelle:

final DataSource source = new DataSource("/Users/data.csv");
final Instances data = source.getDataSet();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top