Вычислить кумулятивную функцию распределения (CDF) в Python

Как я могу вычислить в python кумулятивная функция распределения (CDF)?

Я хочу вычислить его из массива точек, которые у меня есть (дискретное распределение), а не с непрерывными распределениями, которые, например, имеет scipy.

1 ответов


(возможно, что моя интерпретация вопроса неверна. Если вопрос в том, как получить из дискретного PDF в дискретный CDF, то np.cumsum разделенный соответствующей константой будет делать, если образцы равнорасположены. Если массив не equispaced, то np.cumsum массива, умноженного на расстояния между точками.)

Если у вас есть дискретный массив образцов, и вы хотели бы знать CDF образца, то вы можете просто отсортировать массив. Если вы посмотрите на отсортированный результат, вы поймете , что наименьшее значение представляет 0%, а наибольшее-100 %. Если вы хотите узнать значение в 50 % распределения, просто посмотрите на элемент массива, который находится в середине отсортированного массива.

давайте более подробно рассмотрим это на простом примере:

import matplotlib.pyplot as plt
import numpy as np

# create some randomly ddistributed data:
data = np.random.randn(10000)

# sort the data:
data_sorted = np.sort(data)

# calculate the proportional values of samples
p = 1. * arange(len(data)) / (len(data) - 1)

# plot the sorted data:
fig = figure()
ax1 = fig.add_subplot(121)
ax1.plot(p, data_sorted)
ax1.set_xlabel('$p$')
ax1.set_ylabel('$x$')

ax2 = fig.add_subplot(122)
ax2.plot(data_sorted, p)
ax2.set_xlabel('$x$')
ax2.set_ylabel('$p$')

Это дает следующий график, где правый участок является традиционной кумулятивной функцией распределения. Он должен отражать СГО процесс за точками, но, естественно, это не тот, пока число точек конечное.

cumulative distribution function

эта функция легко инвертировать, и это зависит от вашего приложения, который форма вам нужен.