<p>假设您知道数据是如何分布的(即您知道数据的pdf),那么<a href="https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.norm.html" rel="nofollow noreferrer">scipy</a>在计算cdf时支持离散数据</p>
<pre><code>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()
</code></pre>
<p><a href="https://i.stack.imgur.com/khD9U.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/khD9U.png" alt="enter image description here"/></a></p>
<p>我们甚至可以打印cdf的前几个值来显示它们是离散的</p>
<pre><code>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 ])
</code></pre>
<p>同样的计算cdf的方法也适用于多维:我们使用下面的二维数据来说明</p>
<pre><code>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)
</code></pre>
<p>在上面的例子中,我事先知道我的数据是正态分布的,这就是我使用<code>scipy.stats.norm()</code>的原因-scipy支持多个分布。但同样,您需要事先知道数据是如何分布的才能使用这些函数。如果您不知道数据是如何分布的,而只是使用任何分布来计算cdf,那么您很可能会得到不正确的结果。</p>