📄 nominaltobinary.java
字号:
for (int k = 0; k < att.numValues(); k++) {
if (Utils.gr(counts[k], 0)) {
avgClassValues[j][k] /= (double)counts[k];
} else {
avgClassValues[j][k] = sum / (double)totalCounts;
}
}
}
m_Indices[j] = Utils.sort(avgClassValues[j]);
}
}
}
/** Set the output format. */
private void setOutputFormat() {
if (getInputFormat().classAttribute().isNominal()) {
setOutputFormatNominal();
} else {
setOutputFormatNumeric();
}
}
/**
* Convert a single instance over. The converted instance is
* added to the end of the output queue.
*
* @param instance the instance to convert
*/
private void convertInstance(Instance inst) {
if (getInputFormat().classAttribute().isNominal()) {
convertInstanceNominal(inst);
} else {
convertInstanceNumeric(inst);
}
}
/**
* Set the output format if the class is nominal.
*/
private void setOutputFormatNominal() {
FastVector newAtts;
int newClassIndex;
StringBuffer attributeName;
Instances outputFormat;
FastVector vals;
// Compute new attributes
newClassIndex = getInputFormat().classIndex();
newAtts = new FastVector();
for (int j = 0; j < getInputFormat().numAttributes(); j++) {
Attribute att = getInputFormat().attribute(j);
if ((!att.isNominal()) ||
(j == getInputFormat().classIndex())) {
newAtts.addElement(att.copy());
} else {
if (att.numValues() <= 2) {
if (m_Numeric) {
newAtts.addElement(new Attribute(att.name()));
} else {
newAtts.addElement(att.copy());
}
} else {
if (j < getInputFormat().classIndex()) {
newClassIndex += att.numValues() - 1;
}
// Compute values for new attributes
for (int k = 0; k < att.numValues(); k++) {
attributeName =
new StringBuffer(att.name() + "=");
attributeName.append(att.value(k));
if (m_Numeric) {
newAtts.
addElement(new Attribute(attributeName.toString()));
} else {
vals = new FastVector(2);
vals.addElement("f"); vals.addElement("t");
newAtts.
addElement(new Attribute(attributeName.toString(), vals));
}
}
}
}
}
outputFormat = new Instances(getInputFormat().relationName(),
newAtts, 0);
outputFormat.setClassIndex(newClassIndex);
setOutputFormat(outputFormat);
}
/**
* Set the output format if the class is numeric.
*/
private void setOutputFormatNumeric() {
if (m_Indices == null) {
setOutputFormat(null);
return;
}
FastVector newAtts;
int newClassIndex;
StringBuffer attributeName;
Instances outputFormat;
FastVector vals;
// Compute new attributes
newClassIndex = getInputFormat().classIndex();
newAtts = new FastVector();
for (int j = 0; j < getInputFormat().numAttributes(); j++) {
Attribute att = getInputFormat().attribute(j);
if ((!att.isNominal()) ||
(j == getInputFormat().classIndex())) {
newAtts.addElement(att.copy());
} else {
if (j < getInputFormat().classIndex())
newClassIndex += att.numValues() - 2;
// Compute values for new attributes
for (int k = 1; k < att.numValues(); k++) {
attributeName =
new StringBuffer(att.name() + "=");
for (int l = k; l < att.numValues(); l++) {
if (l > k) {
attributeName.append(',');
}
attributeName.append(att.value(m_Indices[j][l]));
}
if (m_Numeric) {
newAtts.
addElement(new Attribute(attributeName.toString()));
} else {
vals = new FastVector(2);
vals.addElement("f"); vals.addElement("t");
newAtts.
addElement(new Attribute(attributeName.toString(), vals));
}
}
}
}
outputFormat = new Instances(getInputFormat().relationName(),
newAtts, 0);
outputFormat.setClassIndex(newClassIndex);
setOutputFormat(outputFormat);
}
/**
* Convert a single instance over if the class is nominal. The converted
* instance is added to the end of the output queue.
*
* @param instance the instance to convert
*/
private void convertInstanceNominal(Instance instance) {
double [] vals = new double [outputFormatPeek().numAttributes()];
int attSoFar = 0;
for(int j = 0; j < getInputFormat().numAttributes(); j++) {
Attribute att = getInputFormat().attribute(j);
if ((!att.isNominal()) || (j == getInputFormat().classIndex())) {
vals[attSoFar] = instance.value(j);
attSoFar++;
} else {
if (att.numValues() <= 2) {
vals[attSoFar] = instance.value(j);
attSoFar++;
} else {
if (instance.isMissing(j)) {
for (int k = 0; k < att.numValues(); k++) {
vals[attSoFar + k] = instance.value(j);
}
} else {
for (int k = 0; k < att.numValues(); k++) {
if (k == (int)instance.value(j)) {
vals[attSoFar + k] = 1;
} else {
vals[attSoFar + k] = 0;
}
}
}
attSoFar += att.numValues();
}
}
}
Instance inst = null;
if (instance instanceof SparseInstance) {
inst = new SparseInstance(instance.weight(), vals);
} else {
inst = new Instance(instance.weight(), vals);
}
copyStringValues(inst, false, instance.dataset(), getInputStringIndex(),
getOutputFormat(), getOutputStringIndex());
inst.setDataset(getOutputFormat());
push(inst);
}
/**
* Convert a single instance over if the class is numeric. The converted
* instance is added to the end of the output queue.
*
* @param instance the instance to convert
*/
private void convertInstanceNumeric(Instance instance) {
double [] vals = new double [outputFormatPeek().numAttributes()];
int attSoFar = 0;
for(int j = 0; j < getInputFormat().numAttributes(); j++) {
Attribute att = getInputFormat().attribute(j);
if ((!att.isNominal()) || (j == getInputFormat().classIndex())) {
vals[attSoFar] = instance.value(j);
attSoFar++;
} else {
if (instance.isMissing(j)) {
for (int k = 0; k < att.numValues() - 1; k++) {
vals[attSoFar + k] = instance.value(j);
}
} else {
int k = 0;
while ((int)instance.value(j) != m_Indices[j][k]) {
vals[attSoFar + k] = 1;
k++;
}
while (k < att.numValues() - 1) {
vals[attSoFar + k] = 0;
k++;
}
}
attSoFar += att.numValues() - 1;
}
}
Instance inst = null;
if (instance instanceof SparseInstance) {
inst = new SparseInstance(instance.weight(), vals);
} else {
inst = new Instance(instance.weight(), vals);
}
copyStringValues(inst, false, instance.dataset(), getInputStringIndex(),
getOutputFormat(), getOutputStringIndex());
inst.setDataset(getOutputFormat());
push(inst);
}
/**
* Main method for testing this class.
*
* @param argv should contain arguments to the filter:
* use -h for help
*/
public static void main(String [] argv) {
try {
if (Utils.getFlag('b', argv)) {
Filter.batchFilterFile(new NominalToBinary(), argv);
} else {
Filter.filterFile(new NominalToBinary(), argv);
}
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -