use of com.amazon.randomcutforest.returntypes.OneSidedConvergingDiVectorAccumulator in project random-cut-forest-by-aws by aws.
the class RandomCutForestTest method testGetApproximateAnomalyAttribution.
@Test
public void testGetApproximateAnomalyAttribution() {
float[] point = { 1.2f, -3.4f };
DiVector zero = new DiVector(dimensions);
DiVector result = forest.getApproximateAnomalyAttribution(point);
assertFalse(forest.isOutputReady());
assertArrayEquals(zero.high, result.high, EPSILON);
assertArrayEquals(zero.low, result.low, EPSILON);
doReturn(true).when(forest).isOutputReady();
ConvergingAccumulator<DiVector> accumulator = new OneSidedConvergingDiVectorAccumulator(dimensions, RandomCutForest.DEFAULT_APPROXIMATE_ANOMALY_SCORE_HIGH_IS_CRITICAL, RandomCutForest.DEFAULT_APPROXIMATE_DYNAMIC_SCORE_PRECISION, RandomCutForest.DEFAULT_APPROXIMATE_DYNAMIC_SCORE_MIN_VALUES_ACCEPTED, numberOfTrees);
for (int i = 0; i < numberOfTrees; i++) {
SamplerPlusTree<Integer, float[]> component = (SamplerPlusTree<Integer, float[]>) components.get(i);
ITree<Integer, float[]> tree = component.getTree();
DiVector treeResult = new DiVector(dimensions);
for (int j = 0; j < dimensions; j++) {
treeResult.high[j] = Math.random();
treeResult.low[j] = Math.random();
}
when(tree.traverse(aryEq(point), any(VisitorFactory.class))).thenReturn(treeResult);
when(tree.getMass()).thenReturn(256);
if (!accumulator.isConverged()) {
accumulator.accept(treeResult);
}
}
DiVector expectedResult = accumulator.getAccumulatedValue().scale(1.0 / accumulator.getValuesAccepted());
result = forest.getApproximateAnomalyAttribution(point);
assertArrayEquals(expectedResult.high, result.high, EPSILON);
assertArrayEquals(expectedResult.low, result.low, EPSILON);
}
use of com.amazon.randomcutforest.returntypes.OneSidedConvergingDiVectorAccumulator in project random-cut-forest-by-aws by aws.
the class RandomCutForest method getApproximateAnomalyAttribution.
public DiVector getApproximateAnomalyAttribution(float[] point) {
if (!isOutputReady()) {
return new DiVector(dimensions);
}
IVisitorFactory<DiVector> visitorFactory = new VisitorFactory<>((tree, y) -> new AnomalyAttributionVisitor(tree.projectToTree(y), tree.getMass()), (tree, x) -> x.lift(tree::liftFromTree));
ConvergingAccumulator<DiVector> accumulator = new OneSidedConvergingDiVectorAccumulator(dimensions, DEFAULT_APPROXIMATE_ANOMALY_SCORE_HIGH_IS_CRITICAL, DEFAULT_APPROXIMATE_DYNAMIC_SCORE_PRECISION, DEFAULT_APPROXIMATE_DYNAMIC_SCORE_MIN_VALUES_ACCEPTED, numberOfTrees);
Function<DiVector, DiVector> finisher = x -> x.scale(1.0 / accumulator.getValuesAccepted());
return traverseForest(transformToShingledPoint(point), visitorFactory, accumulator, finisher);
}
use of com.amazon.randomcutforest.returntypes.OneSidedConvergingDiVectorAccumulator in project random-cut-forest-by-aws by aws.
the class RandomCutForest method getApproximateDynamicAttribution.
/**
* Atrribution for dynamic sequential scoring; getL1Norm() should agree with
* getDynamicScoringSequential
*
* @param point input
* @param precision parameter to stop early stopping
* @param highIsCritical are high values anomalous (otherwise low
* values are anomalous)
* @param ignoreLeafMassThreshold we ignore leaves with mass equal/below *
* threshold
* @param seen function for scoring points that have been
* seen before
* @param unseen function for scoring points not seen in tree
* @param newDamp dampening function based on duplicates
* @return attribution DiVector of the score
*/
public DiVector getApproximateDynamicAttribution(float[] point, double precision, boolean highIsCritical, int ignoreLeafMassThreshold, BiFunction<Double, Double, Double> seen, BiFunction<Double, Double, Double> unseen, BiFunction<Double, Double, Double> newDamp) {
if (!isOutputReady()) {
return new DiVector(dimensions);
}
VisitorFactory<DiVector> visitorFactory = new VisitorFactory<>((tree, y) -> new DynamicAttributionVisitor(y, tree.getMass(), ignoreLeafMassThreshold, seen, unseen, newDamp), (tree, x) -> x.lift(tree::liftFromTree));
ConvergingAccumulator<DiVector> accumulator = new OneSidedConvergingDiVectorAccumulator(dimensions, highIsCritical, precision, DEFAULT_APPROXIMATE_DYNAMIC_SCORE_MIN_VALUES_ACCEPTED, numberOfTrees);
Function<DiVector, DiVector> finisher = vector -> vector.scale(1.0 / accumulator.getValuesAccepted());
return traverseForest(transformToShingledPoint(point), visitorFactory, accumulator, finisher);
}
Aggregations