类 Percentile
- 所有已实现的接口:
-
Serializable,UnivariateStatistic,MathArrays.Function
根据样本数据,有几种常用的估算百分位数(又称分位数)的方法。对于大样本,不同方法的结果非常接近,但是当样本量较小时,不同方法会给出显著不同的结果。这里实现的算法如下:
- 设
n为(排序后的)数组的长度,0 < p <= 100为所需的百分位数。 - 如果
n = 1,则返回唯一的数组元素(不考虑p的值);否则 - 计算估算的百分位位置
pos = p * (n + 1) / 100以及d为pos与floor(pos)之间的差值(即pos的小数部分)。 - 如果
pos < 1,则返回数组中最小的元素。 - 否则,如果
pos >= n,则返回数组中最大的元素。 - 否则,让
lower为数组中位置为floor(pos)的元素,让upper为数组中的下一个元素。返回lower + d * (upper - lower)
为了计算百分位数,数据必须至少部分有序。输入数组将被复制并使用排序定义进行递归分区。由Arrays.sort(double[])使用的排序是由Double.compareTo(Double)确定的排序。此排序使得Double.NaN大于任何其他值(包括Double.POSITIVE_INFINITY)。因此,例如,{0, 1, 2, 3, 4, Double.NaN}的中位数(第50百分位数)计算结果为2.5。
由于百分位数估算通常涉及数组元素之间的插值,包含NaN或无限值的数组通常会导致返回NaN或无限值。
此外,为了包含在分位数页面(维基百科)中提到的不同估算类型,使用了一种特定于类型的NaN处理策略,以与从流行工具(如R(R1-R9)、Excel(R7))观察到的结果密切匹配。
百分位数仅使用选择而不是完全排序,并在各种evaluate方法调用之间缓存选择算法状态。这极大地提高了效率,无论是对单个百分位数还是多个百分位数的计算。为了在基于相同数据计算多个百分位数时最大化性能,用户应该使用evaluate(double[], double)或setData(double[])方法之一设置数据数组,然后仅使用提供的百分位数调用evaluate(double)。
请注意,此实现未同步。如果多个线程同时访问此类的实例,并且至少有一个线程调用了increment()或clear()方法,则必须在外部进行同步。
- 另请参阅:
-
嵌套类概要
嵌套类 -
构造器概要
构造器限定符构造器说明使用以下默认值构造一个百分位数。Percentile(double quantile) 使用特定百分位数值和以下默认方法类型构造一个百分位数:Percentile.EstimationType.LEGACY默认NaN策略:NaNStrategy.REMOVED一个Kth Selector:KthSelectorprotectedPercentile(double quantile, Percentile.EstimationType estimationType, NaNStrategy nanStrategy, KthSelector kthSelector) Percentile(Percentile original) 复制构造函数,创建一个与original相同的新Percentile -
方法概要
修饰符和类型方法说明copy()返回具有相同内部状态的统计信息副本。doubleevaluate(double p) 返回在存储数据上评估统计量的结果。doubleevaluate(double[] values, double p) 返回values数组中值的p百分位数的估算值。doubleevaluate(double[] values, int start, int length) 返回指定values数组中指定值的quantile百分位数的估算值。doubleevaluate(double[] values, int begin, int length, double p) 返回values数组中值的p百分位数的估算值,从数组中(基于0的)位置begin的元素开始,包括length个值。获取用于计算的估算类型。获取用于计算的kthSelector。获取用于计算的NaN处理策略。获取用于计算的KthSelector中使用的PivotingStrategy。double返回量化字段的值(确定在调用evaluate()时计算哪个百分位数)。protected double[]getWorkArray(double[] values, int begin, int length) 获取操作的工作数组。voidsetData(double[] values) 设置数据数组。voidsetData(double[] values, int begin, int length) 设置数据数组。voidsetQuantile(double p) 设置量化字段的值(确定在调用evaluate()时计算哪个百分位数)。withEstimationType(Percentile.EstimationType newEstimationType) 构建一个与当前实例类似的新实例,但estimation type不同。withKthSelector(KthSelector newKthSelector) 构建一个与当前实例类似的新实例,但具体设置了kthSelector实例。withNaNStrategy(NaNStrategy newNaNStrategy) 构建一个与当前实例类似的新实例,但NaN处理策略不同。从类继承的方法 org.hipparchus.stat.descriptive.AbstractUnivariateStatistic
evaluate, getData, getDataRef从类继承的方法 java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait从接口继承的方法 org.hipparchus.stat.descriptive.UnivariateStatistic
evaluate
-
构造器详细资料
-
Percentile
public Percentile()使用以下默认值构造一个百分位数。- 默认百分位数:50.0,可以使用
setQuantile(double)重置 - 默认估算类型:
Percentile.EstimationType.LEGACY,可以使用withEstimationType(EstimationType)重置 - 默认NaN策略:
NaNStrategy.REMOVED,可以使用withNaNStrategy(NaNStrategy)重置 - 使用
PivotingStrategy.MEDIAN_OF_3的KthSelector,可以使用withKthSelector(KthSelector)重置
- 默认百分位数:50.0,可以使用
-
Percentile
使用特定百分位数值和以下默认值构造一个百分位数。- 默认方法类型:
Percentile.EstimationType.LEGACY - 默认NaN策略:
NaNStrategy.REMOVED - 一个Kth Selector:
KthSelector
- 参数:
-
quantile- 分位数 - 抛出:
-
MathIllegalArgumentException- 如果p不大于0且不大于100
- 默认方法类型:
-
Percentile
复制构造函数,创建一个与original相同的新Percentile- 参数:
-
original- 要复制的Percentile实例 - 抛出:
-
NullArgumentException- 如果original为null
-
Percentile
protected Percentile(double quantile, Percentile.EstimationType estimationType, NaNStrategy nanStrategy, KthSelector kthSelector) throws MathIllegalArgumentException - 参数:
-
quantile- 要计算的分位数 -
estimationType- 百分位数的一个估计类型 -
nanStrategy- 用于处理NaN的一个NaNStrategy -
kthSelector- 在搜索过程中使用的一个KthSelector - 抛出:
-
MathIllegalArgumentException- 如果p不在(0,100]范围内 -
NullArgumentException- 如果类型或传递的NaNStrategy为null
-
-
方法详细资料
-
setData
public void setData(double[] values) 设置数据数组。存储的值是参数数组的副本,而不是数组本身。
- 覆盖:
-
setData在类中AbstractUnivariateStatistic - 参数:
-
values- 要存储的数据数组(可以为null以删除存储的数据) - 另请参阅:
-
setData
设置数据数组。输入数组将被复制,而不是引用。- 覆盖:
-
setData在类中AbstractUnivariateStatistic - 参数:
-
values- 要存储的数据数组 -
begin- 要包含的第一个元素的索引 -
length- 要包含的元素数量 - 抛出:
-
MathIllegalArgumentException- 如果values为null或索引无效 - 另请参阅:
-
evaluate
返回对存储数据计算统计量的结果。存储的数组是之前调用
setData(double[])设置的数组。- 参数:
-
p- 要计算的百分位数值 - 返回:
- 应用于存储数据的统计量的值
- 抛出:
-
MathIllegalArgumentException- 如果p不是有效的分位数值(p必须大于0且不大于100)
-
evaluate
返回values数组中指定值的quantile百分位数的估计值。估计的分位数由
quantile属性确定。- 如果
length = 0,则返回Double.NaN - 如果
length = 1,则返回values[begin](对于任何quantile值) - 如果
values为null,或start或length无效,则抛出MathIllegalArgumentException
有关使用的百分位数估计算法,请参见
Percentile。- 指定者:
-
evaluate在接口中MathArrays.Function - 指定者:
-
evaluate在接口中UnivariateStatistic - 指定者:
-
evaluate在类中AbstractUnivariateStatistic - 参数:
-
values- 输入数组 -
start- 要包含的第一个数组元素的索引 -
length- 要包含的元素数量 - 返回:
- 分位数值
- 抛出:
-
MathIllegalArgumentException- 如果参数无效
- 如果
-
evaluate
返回p值的估计值,该值是values数组中的p百分位数。- 如果
values的长度为0,则返回Double.NaN - 如果
values的长度为1,则返回values[0](对于任何p值) - 如果
values为null或p不是有效的分位数值(p必须大于0且不大于100),则抛出MathIllegalArgumentException
默认实现以自然方式委托给
evaluate(double[], int, int, double)。- 参数:
-
values- 输入值数组 -
p- 要计算的百分位数值 - 返回:
- 百分位数值,如果数组为空则返回Double.NaN
- 抛出:
-
MathIllegalArgumentException- 如果values为null或p无效
- 如果
-
evaluate
public double evaluate(double[] values, int begin, int length, double p) throws MathIllegalArgumentException 返回p值的估计值,该值是从数组中的第begin位置(基于0)开始并包括length个值的p百分位数。调用此方法不会修改此统计量的内部
quantile状态。- 如果
length = 0,则返回Double.NaN - 如果
length = 1,则返回values[begin](对于任何p值) - 如果
values为null,begin或length无效,或p不是有效的分位数值(p必须大于0且不大于100),则抛出MathIllegalArgumentException
有关使用的百分位数估计算法,请参见
Percentile。- 参数:
-
values- 输入值数组 -
begin- 要包含在计算中的第一个(基于0)元素的索引 -
length- 要包含的数组元素数量 -
p- 要计算的百分位数 - 返回:
- 百分位数值
- 抛出:
-
MathIllegalArgumentException- 如果参数无效或输入数组为null
- 如果
-
getQuantile
public double getQuantile()返回分位数字段的值(在调用evaluate()时不带分位数参数时确定计算的是哪个百分位数)。- 返回:
-
在构造时设置的分位数或
setQuantile(double)
-
setQuantile
设置分位数字段的值(在调用evaluate()时不带分位数参数时确定计算的是哪个百分位数)。- 参数:
-
p- 0 < p <= 100的值 - 抛出:
-
MathIllegalArgumentException- 如果p不大于0且不大于100
-
copy
返回具有相同内部状态的统计量的副本。- 指定者:
-
copy在接口中UnivariateStatistic - 指定者:
-
copy在类中AbstractUnivariateStatistic - 返回:
- 统计量的副本
-
getWorkArray
protected double[] getWorkArray(double[] values, int begin, int length) 获取用于操作的工作数组。如果存在先前的storedData,则使用它,否则对NaN进行检查并复制由begin和length参数定义的数组的子集。将使用设置的nanStrategy来在返回结果数组之前保留/删除/替换任何NaN。- 参数:
-
values- 数组中的数字 -
begin- 开始读取数组的索引 -
length- 从开始索引开始读取的数组长度 - 返回:
- 从值中切片的工作数组,范围为[begin, begin+length)
- 抛出:
-
MathIllegalArgumentException- 如果值或索引无效
-
getEstimationType
获取用于计算的估计类型。- 返回:
-
设置的
estimationType
-
withEstimationType
构建一个类似于当前实例的新实例,除了估计类型。此方法旨在作为流畅构建器模式的一部分使用。应按以下方式执行构建精细调整实例:
Percentile customized = new Percentile(quantile). withEstimationType(estimationType). withNaNStrategy(nanStrategy). withKthSelector(kthSelector);如果省略任何
withXxx方法,则将使用相应自定义参数的默认值。- 参数:
-
newEstimationType- 新实例的估计类型 - 返回:
- 一个新实例,带有更改后的估计类型
- 抛出:
-
NullArgumentException- 当newEstimationType为null时
-
getNaNStrategy
获取用于计算的NaN处理策略。- 返回:
-
在构造过程中设置的
NaN处理策略
-
withNaNStrategy
构建一个类似于当前实例的新实例,除了NaN处理策略。此方法旨在作为流畅构建器模式的一部分使用。应按以下方式执行构建精细调整实例:
Percentile customized = new Percentile(quantile). withEstimationType(estimationType). withNaNStrategy(nanStrategy). withKthSelector(kthSelector);如果省略任何
withXxx方法,则将使用相应自定义参数的默认值。- 参数:
-
newNaNStrategy- 新实例的NaN策略 - 返回:
- 一个新实例,带有更改后的NaN处理策略
- 抛出:
-
NullArgumentException- 当newNaNStrategy为null时
-
getKthSelector
获取用于计算的kthSelector。- 返回:
-
设置的
kthSelector
-
getPivotingStrategy
获取在KthSelector中用于计算的枢轴策略。- 返回:
- 设置的枢轴策略
-
withKthSelector
构建一个类似于当前实例的新实例,除了专门设置的kthSelector实例。此方法旨在作为流畅构建器模式的一部分使用。应按以下方式执行构建精细调整实例:
Percentile customized = new Percentile(quantile). withEstimationType(estimationType). withNaNStrategy(nanStrategy). withKthSelector(newKthSelector);如果省略任何
withXxx方法,则将使用相应自定义参数的默认值。- 参数:
-
newKthSelector- 新实例的KthSelector - 返回:
- 一个新实例,带有更改后的KthSelector
- 抛出:
-
NullArgumentException- 当newKthSelector为null时
-