如何在Python中计算累积分布函数(CDF)?
我想从我拥有的点数组(离散分布)中计算它,而不是使用例如scipy提供的连续分布。
回答:
(我的问题解释可能有误。如果问题是如何从离散PDF转换为离散CDF,那么如果样本是等间隔的,使用np.cumsum
除以合适的常数就可以。如果数组不是等间隔的,那么对数组乘以点之间的距离后使用np.cumsum
就可以。)
如果你有一个离散的样本数组,并且你想知道样本的CDF,那么你可以简单地对数组进行排序。如果你查看排序后的结果,你会发现最小值代表0%,最大值代表100%。如果你想知道分布中50%的值,只需查看排序数组中间的元素即可。
让我们通过一个简单的例子来更仔细地看一下这个问题:
import matplotlib.pyplot as pltimport numpy as np# 创建一些随机分布的数据:data = np.random.randn(10000)# 对数据进行排序:data_sorted = np.sort(data)# 计算样本的比例值p = 1. * np.arange(len(data)) / (len(data) - 1)# 绘制排序后的数据:fig = plt.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,但自然地,由于点的数量是有限的,它并不是完全准确的。
这个函数很容易反转,具体使用哪种形式取决于你的应用需求。