类 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:KthSelector
protected
Percentile
(double quantile, Percentile.EstimationType estimationType, NaNStrategy nanStrategy, KthSelector kthSelector) Percentile
(Percentile original) 复制构造函数,创建一个与original
相同的新Percentile
-
方法概要
修饰符和类型方法说明copy()
返回具有相同内部状态的统计信息副本。double
evaluate
(double p) 返回在存储数据上评估统计量的结果。double
evaluate
(double[] values, double p) 返回values
数组中值的p
百分位数的估算值。double
evaluate
(double[] values, int start, int length) 返回指定values
数组中指定值的quantile
百分位数的估算值。double
evaluate
(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) 获取操作的工作数组。void
setData
(double[] values) 设置数据数组。void
setData
(double[] values, int begin, int length) 设置数据数组。void
setQuantile
(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时
-