package com.rapidminer.operator.similarity; import java.util.List; import com.rapidminer.example.ExampleSet; import com.rapidminer.operator.IOObject; import com.rapidminer.operator.Operator; import com.rapidminer.operator.OperatorDescription; import com.rapidminer.operator.OperatorException; import com.rapidminer.parameter.ParameterType; import com.rapidminer.tools.math.similarity.DistanceMeasure; import com.rapidminer.tools.math.similarity.DistanceMeasures; public class ExampleSet2SimilarityExampleSet extends Operator { public ExampleSet2SimilarityExampleSet(OperatorDescription description) { super(description); } public IOObject[] apply() throws OperatorException { ExampleSet exampleSet = getInput(ExampleSet.class); DistanceMeasure measure = DistanceMeasures.createMeasure(this, exampleSet); return new IOObject[] { new SimilarityExampleSet(exampleSet, measure) }; /* Attribute idAttribute = exampleSet.getAttributes().getId(); if (idAttribute == null) throw new UserError(this, 129); // constructing new memory example table List<Attribute> attributes = new ArrayList<Attribute>(3); Attribute firstIdAttribute; Attribute secondIdAttribute; if (idAttribute.isNominal()) { firstIdAttribute = AttributeFactory.createAttribute("FIRST_ID", Ontology.NOMINAL); secondIdAttribute = AttributeFactory.createAttribute("SECOND_ID", Ontology.NOMINAL); } else { firstIdAttribute = AttributeFactory.createAttribute("FIRST_ID", Ontology.NUMERICAL); secondIdAttribute = AttributeFactory.createAttribute("SECOND_ID", Ontology.NUMERICAL); } attributes.add(firstIdAttribute); attributes.add(secondIdAttribute); String name = "SIMILARITY"; if (measure.isDistance()) { name = "DISTANCE"; } Attribute similarityAttribute = AttributeFactory.createAttribute(name, Ontology.REAL); attributes.add(similarityAttribute); MemoryExampleTable table = new MemoryExampleTable(attributes); // copying mapping of original id attribute if (idAttribute.isNominal()) { NominalMapping mapping = idAttribute.getMapping(); firstIdAttribute.setMapping(mapping); secondIdAttribute.setMapping(mapping); } // creating new datarows with ids and measure value boolean isDistance = measure.isDistance(); for (int i = 0; i < exampleSet.size(); i++) { Example firstExample = exampleSet.getExample(i); for (int j = i + 1; j < exampleSet.size(); j++) { double[] data = new double[3]; Example secondExample = exampleSet.getExample(j); data[0] = firstExample.getValue(idAttribute); data[1] = secondExample.getValue(idAttribute); if (isDistance) data[2] = measure.calculateDistance(firstExample, secondExample); else data[2] = measure.calculateSimilarity(firstExample, secondExample); table.addDataRow(new DoubleArrayDataRow(data)); } } return new IOObject[] { table.createExampleSet() }; */ } public Class<?>[] getInputClasses() { return new Class<?>[] {ExampleSet.class}; } public Class<?>[] getOutputClasses() { return new Class<?>[] {ExampleSet.class}; } public List<ParameterType> getParameterTypes() { List<ParameterType> types = super.getParameterTypes(); types.addAll(DistanceMeasures.getParameterTypes(this)); return types; } }