📄 testinstances.java
字号:
} } switch (attType) { case Attribute.NOMINAL: FastVector nomStrings = new FastVector(valIndex + 1); for (int j = 0; j < nomCount; j++) nomStrings.addElement(prefix + (j + 1)); result = new Attribute(name, nomStrings); break; case Attribute.NUMERIC: result = new Attribute(name); break; case Attribute.STRING: result = new Attribute(name, (FastVector) null); break; case Attribute.DATE: result = new Attribute(name, "yyyy-mm-dd"); break; case Attribute.RELATIONAL: Instances rel; if (index == CLASS_IS_LAST) rel = getRelationalClassFormat(); else rel = getRelationalFormat(index); if (rel == null) { TestInstances dataset = new TestInstances(); dataset.setNumNominal(getNumRelationalNominal()); dataset.setNumNominalValues(getNumRelationalNominalValues()); dataset.setNumNumeric(getNumRelationalNumeric()); dataset.setNumString(getNumRelationalString()); dataset.setNumDate(getNumRelationalDate()); dataset.setNumInstances(0); dataset.setClassType(Attribute.NOMINAL); // dummy to avoid endless recursion, will be deleted anyway rel = new Instances(dataset.generate()); if (!getNoClass()) { int clsIndex = rel.classIndex(); rel.setClassIndex(-1); rel.deleteAttributeAt(clsIndex); } } result = new Attribute(name, rel); break; default: throw new IllegalArgumentException("Attribute type '" + attType + "' unknown!"); } return result; } /** * Generates the class value * * @param data the dataset to work on * @return the new class value * @throws Exception if something goes wrong */ protected double generateClassValue(Instances data) throws Exception { double result = Double.NaN; switch (m_ClassType) { case Attribute.NUMERIC: result = m_Random.nextFloat() * 0.25 + Math.abs(m_Random.nextInt()) % Math.max(2, m_NumNominal); break; case Attribute.NOMINAL: result = Math.abs(m_Random.nextInt()) % data.numClasses(); break; case Attribute.STRING: String str = ""; for (int n = 0; n < m_Words.length; n++) { if ( (n > 0) && (m_WordSeparators.length() != 0) ) str += m_WordSeparators.charAt(m_Random.nextInt(m_WordSeparators.length())); str += m_Words[m_Random.nextInt(m_Words.length)]; } result = data.classAttribute().addStringValue(str); break; case Attribute.DATE: result = data.classAttribute().parseDate( (2000 + m_Random.nextInt(100)) + "-01-01"); break; case Attribute.RELATIONAL: if (getRelationalClassFormat() != null) { result = data.classAttribute().addRelation(getRelationalClassFormat()); } else { TestInstances dataset = new TestInstances(); dataset.setNumNominal(getNumRelationalNominal()); dataset.setNumNominalValues(getNumRelationalNominalValues()); dataset.setNumNumeric(getNumRelationalNumeric()); dataset.setNumString(getNumRelationalString()); dataset.setNumDate(getNumRelationalDate()); dataset.setNumInstances(getNumInstancesRelational()); dataset.setClassType(Attribute.NOMINAL); // dummy to avoid endless recursion, will be deleted anyway Instances rel = new Instances(dataset.generate()); int clsIndex = rel.classIndex(); rel.setClassIndex(-1); rel.deleteAttributeAt(clsIndex); result = data.classAttribute().addRelation(rel); } break; } return result; } /** * Generates a new value for the specified attribute. The classValue * might be used in the process. * * @param data the dataset to work on * @param index the index of the attribute * @param classVal the class value for the current instance, might be * used in the calculation * @return the new attribute value * @throws Exception if something goes wrong */ protected double generateAttributeValue(Instances data, int index, double classVal) throws Exception { double result = Double.NaN; switch (data.attribute(index).type()) { case Attribute.NUMERIC: result = classVal * 4 + m_Random.nextFloat() * 1 - 0.5; break; case Attribute.NOMINAL: if (m_Random.nextFloat() < 0.2) { result = Math.abs(m_Random.nextInt()) % data.attribute(index).numValues(); } else { result = ((int)classVal) % data.attribute(index).numValues(); } //result = m_Random.nextInt(data.attribute(index).numValues()); break; case Attribute.STRING: String str = ""; for (int n = 0; n < m_Words.length; n++) { if ( (n > 0) && (m_WordSeparators.length() != 0) ) str += m_WordSeparators.charAt(m_Random.nextInt(m_WordSeparators.length())); str += m_Words[m_Random.nextInt(m_Words.length)]; } result = data.attribute(index).addStringValue(str); break; case Attribute.DATE: result = data.attribute(index).parseDate( (2000 + m_Random.nextInt(100)) + "-01-01"); break; case Attribute.RELATIONAL: Instances rel = new Instances(data.attribute(index).relation(), 0); for (int n = 0; n < getNumInstancesRelational(); n++) { Instance inst = new Instance(rel.numAttributes()); inst.setDataset(data); for (int i = 0; i < rel.numAttributes(); i++) { inst.setValue(i, generateAttributeValue(rel, i, 0)); } rel.add(inst); } result = data.attribute(index).addRelation(rel); break; } return result; } /** * generates a new dataset. * * @return the generated data * @throws Exception if something goes wrong */ public Instances generate() throws Exception { if (getMultiInstance()) { TestInstances bag = (TestInstances) this.clone(); bag.setMultiInstance(false); bag.setNumInstances(0); bag.setSeed(m_Random.nextInt()); Instances bagFormat = bag.generate(); bagFormat.setClassIndex(-1); bagFormat.deleteAttributeAt(bagFormat.numAttributes() - 1); // generate multi-instance structure TestInstances structure = new TestInstances(); structure.setSeed(m_Random.nextInt()); structure.setNumNominal(1); structure.setNumRelational(1); structure.setRelationalFormat(0, bagFormat); structure.setClassType(getClassType()); structure.setNumClasses(getNumClasses()); structure.setRelationalClassFormat(getRelationalClassFormat()); structure.setNumInstances(getNumInstances()); m_Data = structure.generate(); // generate bags bag.setNumInstances(getNumInstancesRelational()); for (int i = 0; i < getNumInstances(); i++) { bag.setSeed(m_Random.nextInt()); Instances bagData = new Instances(bag.generate()); bagData.setClassIndex(-1); bagData.deleteAttributeAt(bagData.numAttributes() - 1); double val = m_Data.attribute(1).addRelation(bagData); m_Data.instance(i).setValue(1, val); } } else { // initialize int clsIndex = m_ClassIndex; if (clsIndex == CLASS_IS_LAST) clsIndex = getNumAttributes() - 1; // generate attributes FastVector attributes = new FastVector(getNumAttributes()); // Add Nominal attributes for (int i = 0; i < getNumNominal(); i++) attributes.addElement(generateAttribute(i, Attribute.NOMINAL)); // Add m_Numeric attributes for (int i = 0; i < getNumNumeric(); i++) attributes.addElement(generateAttribute(i, Attribute.NUMERIC)); // Add some String attributes... for (int i = 0; i < getNumString(); i++) attributes.addElement(generateAttribute(i, Attribute.STRING)); // Add some Date attributes... for (int i = 0; i < getNumDate(); i++) attributes.addElement(generateAttribute(i, Attribute.DATE)); // Add some Relational attributes... for (int i = 0; i < getNumRelational(); i++) attributes.addElement(generateAttribute(i, Attribute.RELATIONAL)); // Add class attribute if (clsIndex != NO_CLASS) attributes.insertElementAt(generateAttribute(CLASS_IS_LAST, getClassType()), clsIndex); m_Data = new Instances(getRelation(), attributes, getNumInstances()); m_Data.setClassIndex(clsIndex); // generate instances for (int i = 0; i < getNumInstances(); i++) { Instance current = new Instance(getNumAttributes()); current.setDataset(m_Data); // class double classVal; if (clsIndex != NO_CLASS) { classVal = generateClassValue(m_Data); current.setClassValue(classVal); } else { classVal = m_Random.nextFloat(); } // other attributes for (int n = 0; n < getNumAttributes(); n++) { if (clsIndex == n) continue; current.setValue(n, generateAttributeValue(m_Data, n, classVal)); } m_Data.add(current); } } if (m_Data.classIndex() == NO_CLASS) m_Data.setClassIndex(-1); return getData(); } /** * returns a TestInstances instance setup already for the the given * capabilities. * * @param c the capabilities to base the TestInstances on * @return the configured TestInstances object */ public static TestInstances forCapabilities(Capabilities c) { TestInstances result; result = new TestInstances(); // multi-instance? if (c.getOwner() instanceof MultiInstanceCapabilitiesHandler) { Capabilities multi = (Capabilities) ((MultiInstanceCapabilitiesHandler) c.getOwner()).getMultiInstanceCapabilities().clone(); multi.setOwner(null); // otherwise recursive! result = forCapabilities(multi); result.setMultiInstance(true); } else { // class if (c.handles(Capability.NO_CLASS)) result.setClassIndex(NO_CLASS); else if (c.handles(Capability.NOMINAL_CLASS)) result.setClassType(Attribute.NOMINAL); else if (c.handles(Capability.BINARY_CLASS)) result.setClassType(Attribute.NOMINAL); else if (c.handles(Capability.NUMERIC_CLASS)) result.setClassType(Attribute.NUMERIC); else if (c.handles(Capability.DATE_CLASS)) result.setClassType(Attribute.DATE); else if (c.handles(Capability.STRING_CLASS)) result.setClassType(Attribute.STRING); else if (c.handles(Capability.RELATIONAL_CLASS)) result.setClassType(Attribute.RELATIONAL); // # of classes if (c.handles(Capability.UNARY_CLASS)) result.setNumClasses(1); if (c.handles(Capability.BINARY_CLASS)) result.setNumClasses(2); if (c.handles(Capability.NOMINAL_CLASS)) result.setNumClasses(4); // attributes if (c.handles(Capability.NOMINAL_ATTRIBUTES)) { result.setNumNominal(1); result.setNumRelationalNominal(1); } else { result.setNumNominal(0); result.setNumRelationalNominal(0); } if (c.handles(Capability.NUMERIC_ATTRIBUTES)) { result.setNumNumeric(1); result.setNumRelationalNumeric(1); } else { result.setNumNumeric(0); result.setNumRelationalNumeric(0); } if (c.handles(Capability.DATE_ATTRIBUTES)) { result.setNumDate(1); result.setNumRelationalDate(1); } else { result.setNumDate(0); result.setNumRelationalDate(0); } if (c.handles(Capability.STRING_ATTRIBUTES)) { result.setNumString(1); result.setNumRelationalString(1); } else { result.setNumString(0); result.setNumRelationalString(0); } if (c.handles(Capability.RELATIONAL_ATTRIBUTES)) result.setNumRelational(1); else result.setNumRelational(0); } return result; } /** * returns a string representation of the object * * @return a string representation of the object */ public String toString() { String result; result = ""; result += "Relation: " + getRelation() + "\n"; result += "Seed: " + getSeed() + "\n"; result += "# Instances: " + getNumInstances() + "\n"; result += "ClassType: " + getClassType() + "\n"; result += "# Classes: " + getNumClasses() + "\n"; result += "Class index: " + getClassIndex() + "\n"; result += "# Nominal: " + getNumNominal() + "\n"; result += "# Nominal values: " + getNumNominalValues() + "\n"; result += "# Numeric: " + getNumNumeric() + "\n"; result += "# String: " + getNumString() + "\n"; result += "# Date: " + getNumDate() + "\n"; result += "# Relational: " + getNumRelational() + "\n"; result += " - # Nominal: " + getNumRelationalNominal() + "\n"; result += " - # Nominal values: " + getNumRelationalNominalValues() + "\n"; result += " - # Numeric: " + getNumRelationalNumeric() + "\n"; result += " - # String: " + getNumRelationalString() + "\n"; result += " - # Date: " + getNumRelationalDate() + "\n"; result += " - # Instances: " + getNumInstancesRelational() + "\n"; result += "Multi-Instance: " + getMultiInstance() + "\n"; result += "Words: " + getWords() + "\n"; result += "Word separators: " + getWordSeparators() + "\n"; return result; } /** * for running the class from commandline, prints the generated data * to stdout * * @param args the commandline parameters * @throws Exception if something goes wrong */ public static void main(String[] args) throws Exception { TestInstances inst; inst = new TestInstances(); // help requested? if (Utils.getFlag("h", args) || Utils.getFlag("help", args)) { StringBuffer result = new StringBuffer(); result.append("\nTest data generator options:\n\n"); result.append("-h|-help\n\tprints this help\n"); Enumeration enm = inst.listOptions(); while (enm.hasMoreElements()) { Option option = (Option) enm.nextElement(); result.append(option.synopsis() + "\n" + option.description() + "\n"); } System.out.println(result); System.exit(0); } // generate data inst.setOptions(args); System.out.println(inst.generate()); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -