用Python计算累积分布函数(CDF)
machine-learning
numpy
python
scipy
25
0

如何在python中计算累积分布函数(CDF)

我想从我拥有的点数组(离散分布)中进行计算,而不是从scipy具有的连续分布中进行计算。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

(我对这个问题的解释可能是错误的。如果问题是如何从离散的PDF转换为离散的CDF,则将np.cumsum除以合适的常数将在样本np.cumsum 。不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,但是自然地,只要点数是有限的,它就不是。

累积分布函数

此函数易于反转,并且取决于您的应用程序所需的形式。

收藏
评论

假设您知道数据的分布方式(即您知道数据的pdf),那么scipy在计算cdf的时候确实支持离散数据

import numpy as np
import scipy
import matplotlib.pyplot as plt
import seaborn as sns

x = np.random.randn(10000) # generate samples from normal distribution (discrete data)
norm_cdf = scipy.stats.norm.cdf(x) # calculate the cdf - also discrete

# plot the cdf
sns.lineplot(x=x, y=norm_cdf)
plt.show()

在此处输入图片说明

我们甚至可以打印cdf的前几个值以表明它们是离散的

print(norm_cdf[:10])
>>> array([0.39216484, 0.09554546, 0.71268696, 0.5007396 , 0.76484329,
       0.37920836, 0.86010018, 0.9191937 , 0.46374527, 0.4576634 ])

计算CDF的相同方法也适用于多个维度:我们使用下面的2D数据进行说明

mu = np.zeros(2) # mean vector
cov = np.array([[1,0.6],[0.6,1]]) # covariance matrix
# generate 2d normally distributed samples using 0 mean and the covariance matrix above
x = np.random.multivariate_normal(mean=mu, cov=cov, size=1000) # 1000 samples
norm_cdf = scipy.stats.norm.cdf(x)
print(norm_cdf.shape)
>>> (1000, 2)

在上面的示例中,我已经知道我的数据是正态分布的,这就是为什么我使用scipy.stats.norm()原因-scipy支持多种分布。但是同样,您需要事先知道如何分配数据才能使用这些功能。如果您不知道数据的分布方式,而只是使用任何分布来计算cdf,则很可能会得到不正确的结果。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号