use of de.lmu.ifi.dbs.elki.datasource.filter.cleaning.ReplaceNaNWithRandomFilter in project elki by elki-project.
the class ReplaceNaNWithRandomFilterTest method parameters.
/**
* Test with standard normal distribution as parameter.
*/
@Test
public void parameters() {
String filename = UNITTEST + "nan-test-1.csv";
ReplaceNaNWithRandomFilter filter = //
new ELKIBuilder<>(ReplaceNaNWithRandomFilter.class).with(//
ReplaceNaNWithRandomFilter.Parameterizer.REPLACEMENT_DISTRIBUTION, new NormalDistribution(0, 1, new Random(0L))).build();
MultipleObjectsBundle filteredBundle = readBundle(filename, filter);
// Load the test data again without a filter.
MultipleObjectsBundle unfilteredBundle = readBundle(filename);
// Ensure the first column are the vectors.
assertTrue("Test file not as expected", TypeUtil.NUMBER_VECTOR_FIELD.isAssignableFromType(filteredBundle.meta(0)));
assertTrue("Test file not as expected", TypeUtil.NUMBER_VECTOR_FIELD.isAssignableFromType(unfilteredBundle.meta(0)));
// This cast is now safe (vector field):
int dimFiltered = ((FieldTypeInformation) unfilteredBundle.meta(0)).getDimensionality();
int dimUnfiltered = ((FieldTypeInformation) unfilteredBundle.meta(0)).getDimensionality();
assertEquals("Dimensionality expected equal", dimFiltered, dimUnfiltered);
// Note the indices of the NaN(s) in the data.
List<IntegerVector> NaNs = new ArrayList<IntegerVector>();
for (int row = 0; row < unfilteredBundle.dataLength(); row++) {
Object obj = unfilteredBundle.data(row, 0);
assertEquals("Unexpected data type", DoubleVector.class, obj.getClass());
DoubleVector d = (DoubleVector) obj;
for (int col = 0; col < dimUnfiltered; col++) {
final double v = d.doubleValue(col);
if (Double.isNaN(v)) {
NaNs.add(new IntegerVector(new int[] { row, col }));
}
}
}
// Verify that at least a single NaN exists in the unfiltered bundle.
assertTrue("NaN expected in unfiltered data", NaNs.size() > 0);
for (IntegerVector iv : NaNs) {
Object obj = filteredBundle.data(iv.intValue(0), 0);
assertEquals("Unexpected data type", DoubleVector.class, obj.getClass());
DoubleVector d = (DoubleVector) obj;
final double v = d.doubleValue(iv.intValue(1));
assertFalse("NaN not expected", Double.isNaN(v));
}
}
Aggregations