Spec-Zone.ru › NumPy 2.0

numpy.percentile

numpy.percentile(a, q, axis=None, out=None, overwrite_input=False, method='linear', keepdims=False, *, weights=None, interpolation=None)[source]

Вычисление q-го процентиля данных по указанной оси.

Возвращает q-й процентиль(и) элементов массива.

Параметры:
aarray_like вещественных чисел

Входной массив или объект, который может быть преобразован в массив.

qarray_like float

Процент или последовательность процентов для вычисления процентилей. Значения должны быть в диапазоне от 0 до 100 включительно.

axis{int, кортеж из int, None}, необязательно

Ось или оси, по которым вычисляются процентили. По умолчанию процентиль(и) вычисляются по сглаженному варианту массива.

Изменено в версии 1.9.0: Поддерживается кортеж осей

outndarray, необязательно

Альтернативный выходной массив, в который поместить результат. Он должен иметь ту же форму и длину буфера, что и ожидаемый результат, но тип (результата) будет преобразован при необходимости.

overwrite_inputbool, необязательно

Если True, то разрешить изменение входного массива a промежуточными вычислениями, чтобы сохранить память. В этом случае содержимое входного a после завершения этой функции не определено.

methodstr, необязательно

Этот параметр указывает метод для оценки процентиля. Существует множество различных методов, некоторые уникальны для NumPy. См. примечания для объяснения. Доступные варианты, отсортированные по типу R, как суммируется в статье H&F [1]:

  1. ‘inverted_cdf’
  2. ‘averaged_inverted_cdf’
  3. ‘closest_observation’
  4. ‘interpolated_inverted_cdf’
  5. ‘hazen’
  6. ‘weibull’
  7. ‘linear’ (по умолчанию)
  8. ‘median_unbiased’
  9. ‘normal_unbiased’

Первые три метода являются разрывными. NumPy дополнительно определяет следующие разрывные варианты по умолчанию ‘linear’ (7.):

  • ‘lower’
  • ‘higher’,
  • ‘midpoint’
  • ‘nearest’

Изменено в версии 1.22.0: Этот аргумент ранее назывался «интерполяция» и предлагал только «линейный» по умолчанию и последние четыре варианта.

keepdimsbool, необязательно

Если это True, оси, которые были уменьшены, остаются в результате как размеры с размером один. С этим параметром результат будет корректно транслироваться относительно исходного массива a.

Новое в версии 1.9.0.

weightsarray_like, необязательно

Массив весов, связанных со значениями в a. Каждое значение в a вносит вклад в процентиль в соответствии со своим связанным весом. Массив весов может быть одномерным (в этом случае его длина должна быть размером a по заданной оси) или иметь ту же форму, что и a. Если weights=None, то все данные в a предполагаются с весом, равным единице. Только method=”inverted_cdf” поддерживает веса. См. примечания для более подробной информации.

Новое в версии 2.0.0.

interpolationstr, необязательно

Устаревшее имя для ключевого аргумента method.

Устарело начиная с версии 1.22.0.

Возвращает:
percentileскаляр или ndarray

Если q — единственный процентиль и axis=None, то результат — скаляр. Если задано несколько процентилей, первая ось результата соответствует процентилям. Другие оси — это оси, оставшиеся после сокращения a. Если вход содержит целые числа или числа с плавающей точкой меньше float64, тип данных выходных данных — float64. В противном случае тип данных результата такой же, как у входных данных. Если out задан, возвращается этот массив.

См. также

mean
median

эквивалентно percentile(..., 50)

nanpercentile
quantile

эквивалентно percentile, за исключением того, что q в диапазоне [0, 1].

Примечания

В общем случае процентиль на уровне процента \(q\) кумулятивной функции распределения \(F(y)=P(Y \leq y)\) с мерой вероятности \(P\) определяется как любое число \(x\), которое удовлетворяет условиям покрытия

\[P(Y < x) \leq q/100 \quad\text{and} \quad P(Y \leq x) \geq q/100\]

с случайной переменной \(Y\sim P\). Выборочные процентили, результат percentile, обеспечивают непараметрическую оценку соответствующих характеристик генеральной совокупности, представленных неизвестной \(F\), по данному вектору данных a длиной n.

Один тип оценок возникает, когда \(F\) рассматривается как эмпирическая функция распределения данных, т.е. \(F(y) = \frac{1}{n} \sum_i 1_{a_i \leq y}\). Затем различные методы соответствуют различным вариантам \(x\), которые удовлетворяют вышеприведенным неравенствам. Методы, которые следуют этому подходу, это inverted_cdf и averaged_inverted_cdf.

Более общий способ определения выборочных оценок процентилей следующий. Эмпирический q-процентиль a - это n * q/100-е значение от минимального до максимального в отсортированной копии a. Значения и расстояния двух ближайших соседей, а также параметр method определяют процентиль, если нормализованный ранг не соответствует точно местоположению n * q/100. Эта функция аналогична медиане, если q=50, аналогична минимуму, если q=0 и аналогична максимуму, если q=100.

Необязательный параметр method определяет метод, используемый, когда искомый процентиль находится между двумя индексами i и j = i + 1. В этом случае мы сначала определяем i + g, виртуальный индекс, который находится между i и j, где i - целая часть, а g - дробная часть индекса. Тогда окончательный результат представляет собой интерполяцию a[i] и a[j] на основе g. При вычислении g, i и j изменяются с использованием поправочных констант alpha и beta, выбор которых зависит от используемого method. Наконец, обратите внимание, что поскольку Python использует нумерацию с нуля, код вычитает еще 1 из индекса внутри.

Следующая формула определяет виртуальный индекс i + g, местоположение процентиля в отсортированной выборке:

\[i + g = (q / 100) * ( n - alpha - beta + 1 ) + alpha\]

Затем разные методы работают следующим образом

inverted_cdf:

метод 1 из H&F [1]. Этот метод даёт разрывные результаты:

  • если g > 0; то взять j
  • если g = 0; то взять i
averaged_inverted_cdf:

метод 2 из H&F [1]. Этот метод даёт разрывные результаты:

  • если g > 0; то взять j
  • если g = 0; то взять среднее значение между границами
closest_observation:

метод 3 из H&F [1]. Этот метод даёт разрывные результаты:

  • если g > 0; то взять j
  • если g = 0 и индекс нечётный; то взять j
  • если g = 0 и индекс чётный; то взять i
interpolated_inverted_cdf:

метод 4 из H&F [1]. Этот метод даёт непрерывные результаты, используя:

  • alpha = 0
  • beta = 1
hazen:

метод 5 из H&F [1]. Этот метод даёт непрерывные результаты, используя:

  • alpha = 1/2
  • beta = 1/2
weibull:

метод 6 из H&F [1]. Этот метод даёт непрерывные результаты, используя:

  • alpha = 0
  • beta = 0
linear:

метод 7 из H&F [1]. Этот метод даёт непрерывные результаты, используя:

  • alpha = 1
  • beta = 1
median_unbiased:

метод 8 из H&F [1]. Этот метод, вероятно, лучший, если функция распределения выборки неизвестна (см. ссылку). Этот метод даёт непрерывные результаты, используя:

  • alpha = 1/3
  • beta = 1/3
normal_unbiased:

метод 9 из H&F [1]. Этот метод, вероятно, лучший, если известно, что функция распределения выборки является нормальной. Этот метод даёт непрерывные результаты, используя:

  • alpha = 3/8
  • beta = 3/8
lower:

Метод NumPy, сохранённый для обратной совместимости. Принимает i в качестве точки интерполяции.

higher:

Метод NumPy, сохранённый для обратной совместимости. Принимает j в качестве точки интерполяции.

nearest:

Метод NumPy, сохранённый для обратной совместимости. Принимает i или j, какой из них ближе.

midpoint:

Метод NumPy, сохранённый для обратной совместимости. Использует (i + j) / 2.

Для взвешенных перцентилей вышеуказанные условия покрытия остаются в силе. Эмпирическая кумулятивная функция распределения просто заменяется её взвешенной версией, т.е. \(P(Y \leq t) = \frac{1}{\sum_i w_i} \sum_i w_i 1_{x_i \leq t}\). Только method="inverted_cdf" поддерживает веса.

Список литературы

[1] (1,2,3,4,5,6,7,8,9,10)

Р. Дж. Хайнман и Й. Фан, «Образцы квантилей в статистических пакетах», The American Statistician, 50(4), стр. 361-365, 1996

Примеры

>>> a = np.array([[10, 7, 4], [3, 2, 1]])
>>> a
array([[10,  7,  4],
       [ 3,  2,  1]])
>>> np.percentile(a, 50)
3.5
>>> np.percentile(a, 50, axis=0)
array([6.5, 4.5, 2.5])
>>> np.percentile(a, 50, axis=1)
array([7.,  2.])
>>> np.percentile(a, 50, axis=1, keepdims=True)
array([[7.],
       [2.]])
>>> m = np.percentile(a, 50, axis=0)
>>> out = np.zeros_like(m)
>>> np.percentile(a, 50, axis=0, out=out)
array([6.5, 4.5, 2.5])
>>> m
array([6.5, 4.5, 2.5])
>>> b = a.copy()
>>> np.percentile(b, 50, axis=1, overwrite_input=True)
array([7.,  2.])
>>> assert not np.all(a == b)

Различные методы можно визуализировать графически:

import matplotlib.pyplot as plt

a = np.arange(4)
p = np.linspace(0, 100, 6001)
ax = plt.gca()
lines = [
    ('linear', '-', 'C0'),
    ('inverted_cdf', ':', 'C1'),
    # Almost the same as `inverted_cdf`:
    ('averaged_inverted_cdf', '-.', 'C1'),
    ('closest_observation', ':', 'C2'),
    ('interpolated_inverted_cdf', '--', 'C1'),
    ('hazen', '--', 'C3'),
    ('weibull', '-.', 'C4'),
    ('median_unbiased', '--', 'C5'),
    ('normal_unbiased', '-.', 'C6'),
    ]
for method, style, color in lines:
    ax.plot(
        p, np.percentile(a, p, method=method),
        label=method, linestyle=style, color=color)
ax.set(
    title='Percentiles for different methods and data: ' + str(a),
    xlabel='Percentile',
    ylabel='Estimated percentile value',
    yticks=a)
ax.legend(bbox_to_anchor=(1.03, 1))
plt.tight_layout()
plt.show()
../../_images/numpy-percentile-1.png

© 2005–2024 NumPy Developers
Licensed under the 3-clause BSD License.
https://numpy.org/doc/2.0/reference/generated/numpy.percentile.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API