如何在python中计算累积分布函数(CDF)?
我想从我拥有的点数组(离散分布)中进行计算,而不是从scipy具有的连续分布中进行计算。
(我对这个问题的解释很可能是错误的。如果问题是如何从离散的PDF转换为离散的CDF,那么np.cumsum
如果样本是等距的,则将其除以合适的常数即可。如果数组不是等距的,然后np.cumsum
将数组乘以点之间的距离即可。)
如果您有一个离散的样本数组,并且想知道样本的CDF,则可以对数组进行排序。如果查看排序结果,您将意识到最小值代表0%,最大值代表100%。如果您想知道分布的50%处的值,只需查看排序数组中间的array元素即可。
让我们用一个简单的例子仔细看一下:
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. * np.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$')
这给出了以下图,其中右侧图是传统的累积分布函数。它应该反映出点背后的过程的CDF,但是自然地,只要点数是有限的,它就不是。
此功能易于反转,并且取决于您的应用程序所需的形式。
整齐!谢谢你的回答。我不知道是否应该为此创建一个新问题,但是,如果我的数据具有N个维度,该怎么办?(出于示例的目的,请说2)
如何获得可以使用的功能?您的答案仅是情节。
这
np.linspace(0, 1, len(data))
比1. * arange(len(data)) / (len(data) - 1)
@Tjorriemorrie要将其作为实际函数使用,可以使用插值:
f = lambda x: np.interp(x, p, data_sorted)
。然后,您可以f(0.5)
例如获取中位数。@charmoniumQ:我也很喜欢
linspace
,但值得一提的是,使用np.linspace(0, 1, len(data), endpoint=False)
or 是一个好习惯np.arange(len(data)) / len(data)
,否则它不是CDF的无偏估计量。我喜欢这篇文章并提供详细说明。