java.lang.Object
io.jenetics.stat.Quantile
- All Implemented Interfaces:
DoubleConsumer
Implementation of the quantile estimation algorithm published by
Raj JAIN and Imrich CHLAMTAC:
The P2 Algorithm for Dynamic Calculation of Quantiles and
Histograms Without Storing Observations
[Communications
of the ACM; October 1985, Volume 28, Number 10]
This class is designed to work with (though does not require) streams. For example, you can compute the quantile with:
final DoubleStream stream = ...;
final Quantile quantile = stream.collect(
() -> new Quantile(0.23),
Quantile::accept,
Quantile::combine
);
- Since:
- 1.0
- Version:
- 6.0
- See Also:
- Implementation Note:
- This implementation is not thread safe. However, it is safe to use on a
parallel stream, because the parallel implementation of
Stream.collect()provides the necessary partitioning, isolation, and merging of results for safe and efficient parallel execution. Using this class in thecollectmethod of a parallel stream can lead to a reduced accuracy of the quantile value. Since this implementation is an estimation algorithm, combining the estimations will only work for large streams (size >> 1000).
-
Constructor Summary
ConstructorsConstructorDescriptionQuantile(double quantile) Create a new quantile accumulator with the given value. -
Method Summary
Modifier and TypeMethodDescriptionvoidaccept(double value) Combine twoQuantileobjects.longcount()Return the number of samples the quantile value was calculated of.doublequantile()Return the quantilethisobject has been parametrized with.voidreset()Reset this object to its initial state.booleanCompares the state of twoQuantileobjects.toMedian(ToDoubleFunction<? super T> mapper) Return aCollectorwhich applies a double-producing mapping function to each input element, and returns the median for the resulting values.toQuantile(double quantile, ToDoubleFunction<? super T> mapper) Return aCollectorwhich applies a double-producing mapping function to each input element, and returns quantiles for the resulting values.toString()doublevalue()Return the computed quantile value.Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface java.util.function.DoubleConsumer
andThen
-
Constructor Details
-
Quantile
Create a new quantile accumulator with the given value.- Parameters:
quantile- the wished quantile value.- Throws:
IllegalArgumentException- if thequantileis not in the range[0, 1].
-
-
Method Details
-
reset
Reset this object to its initial state. -
quantile
Return the quantilethisobject has been parametrized with.- Returns:
- the quantile
thisobject has been parametrized with - Since:
- 3.1
-
value
Return the computed quantile value.- Returns:
- the quantile value.
-
count
Return the number of samples the quantile value was calculated of.- Returns:
- the number of samples the quantile value was calculated of
-
accept
- Specified by:
acceptin interfaceDoubleConsumer
-
combine
Combine twoQuantileobjects.- Parameters:
other- the otherQuantileobject to combine- Returns:
this- Throws:
NullPointerException- if theotherobject isnull.IllegalArgumentException- if thequantile()of theotherobject differs fromthisone.- Since:
- 3.1
-
sameState
Compares the state of twoQuantileobjects. This is a replacement for theObject.equals(Object)which is not advisable to implement for this mutable object. If two objects have the same state, it has still the same state when updated with the same value.final Quantile q1 = ...; final Quantile q2 = ...; if (q1.sameState(q2)) { final double value = random.nextDouble(); q1.accept(value); q2.accept(value); assert q1.sameState(q2); assert q2.sameState(q1); assert q1.sameState(q1); }- Parameters:
other- the other object for the test- Returns:
truethethisand theotherobjects have the same state,falseotherwise- Since:
- 3.7
-
toString
-
toQuantile
public static <T> Collector<T,?, toQuantileQuantile> (double quantile, ToDoubleFunction<? super T> mapper) Return aCollectorwhich applies a double-producing mapping function to each input element, and returns quantiles for the resulting values.final Stream<SomeObject> stream = ...; final Quantile quantile = stream .collect(toQuantile(0.25, v -> v.doubleValue()));- Type Parameters:
T- the type of the input elements- Parameters:
quantile- the wished quantile value.mapper- a mapping function to apply to each element- Returns:
- a
Collectorimplementing the quantile reduction - Throws:
NullPointerException- if the givenmapperisnullIllegalArgumentException- if thequantileis not in the range[0, 1].
-
toMedian
Return aCollectorwhich applies a double-producing mapping function to each input element, and returns the median for the resulting values.final Stream<SomeObject> stream = ...; final Quantile median = stream.collect(toMedian(v -> v.doubleValue()));- Type Parameters:
T- the type of the input elements- Parameters:
mapper- a mapping function to apply to each element- Returns:
- a
Collectorimplementing the quantile reduction - Throws:
NullPointerException- if the givenmapperisnull
-