package org.neuroph.adapters.weka;
import java.util.List;
import org.neuroph.core.NeuralNetwork;
import org.neuroph.core.Neuron;
import org.neuroph.core.data.DataSet;
import weka.classifiers.AbstractClassifier;
import weka.core.Instance;
import weka.core.Instances;
/**
* Weka classifier wrapper for Neuroph neural networks
* Classifier based on Neuroph which can be used inside weka
*
* @author Zoran Sevarac
*/
public class WekaNeurophClassifier extends AbstractClassifier {
/**
* NeuralNetwork
*/
private NeuralNetwork neuralNet;
/**
* Creates instance of NeurophWekaClassifier using specified neural network
* @param neuralNet NeuralNetwork
*/
public WekaNeurophClassifier(NeuralNetwork neuralNet) {
this.neuralNet = neuralNet;
}
/**
* Builds classifier using specified data set
* (trains neural network using that data set)
*
* @param data Instance weka data set
* @throws Exception
*/
@Override
public void buildClassifier(Instances data) throws Exception {
// convert weka dataset to neuroph dataset
DataSet dataSet = WekaDataSetConverter.convertWekaToNeurophDataset(data, neuralNet.getInputsCount(), neuralNet.getOutputsCount());
// train neural network
neuralNet.learn(dataSet);
}
/**
* Classifies instance as one of possible classes
* @param instance Instance to classify
* @return double classes double value
* @throws Exception
*/
@Override
public double classifyInstance(Instance instance) throws Exception {
double[] item = convertInstanceToDoubleArray(instance);
// set neural network input
neuralNet.setInput(item);
// calculate neural network output
neuralNet.calculate();
// find neuron with highest output
List outputNeurons = neuralNet.getOutputNeurons();
Neuron maxNeuron = null;
int maxIdx = 0;
double maxOut = Double.NEGATIVE_INFINITY;
for (int i=0; i< outputNeurons.size(); i++) {
if (outputNeurons.get(i).getOutput() > maxOut) {
maxOut = outputNeurons.get(i).getOutput();
maxIdx = i;
}
}
// and return its idx (class)
return maxIdx;
}
/**
* Calculates predict values for every possible class that
* instance can be classified as that
* @param instance Instance to calculate values for
* @return double[] array of predict values
* @throws Exception
*/
@Override
public double[] distributionForInstance(Instance instance) throws Exception {
// Convert instance to double array
double[] item = convertInstanceToDoubleArray(instance);
// set neural network input
neuralNet.setInput(item);
// calculate neural network output
neuralNet.calculate();
return neuralNet.getOutput();
}
public NeuralNetwork getNeuralNetwork() {
return neuralNet;
}
private double[] convertInstanceToDoubleArray(Instance instance) {
//initialize double array for values
double[] item = new double[instance.numAttributes() - 1];
//fill double array with values from instances
for (int i = 0; i < instance.numAttributes() - 1; i++) {
item[i] = instance.value(i);
}
return item;
}
}
Ads help maintain this website.