ecdf(x)(x)
在 numpy 或 scipy 中,R 的函数在 Python 中的等价物是什么?ecdf(x)(x)
与以下基本相同:
import numpy as np
def ecdf(x):
# normalize X to sum to 1
x = x / np.sum(x)
return np.cumsum(x)
还是需要其他东西?
编辑如何控制使用的垃圾箱数量ecdf
?
OP 的实现ecdf
是错误的,你不应该接受cumsum()
这些值。所以不是ys = np.cumsum(x)/np.sum(x)
但ys = np.cumsum(1 for _ in x)/float(len(x))
或更好ys = np.arange(1, len(x)+1)/float(len(x))
如果您对额外的依赖项没问题,您可以选择statmodels
's ECDF
,或者提供您自己的实现。见下文:
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.distributions.empirical_distribution import ECDF
%matplotlib inline
grades = (93.5,93,60.8,94.5,82,87.5,91.5,99.5,86,93.5,92.5,78,76,69,94.5,
89.5,92.8,78,65.5,98,98.5,92.3,95.5,76,91,95,61)
def ecdf_wrong(x):
xs = np.sort(x) # need to be sorted
ys = np.cumsum(xs)/np.sum(xs) # normalize so sum == 1
return (xs,ys)
def ecdf(x):
xs = np.sort(x)
ys = np.arange(1, len(xs)+1)/float(len(xs))
return xs, ys
xs, ys = ecdf_wrong(grades)
plt.plot(xs, ys, label="wrong cumsum")
xs, ys = ecdf(grades)
plt.plot(xs, ys, label="handwritten", marker=">", markerfacecolor='none')
cdf = ECDF(grades)
plt.plot(cdf.x, cdf.y, label="statmodels", marker="<", markerfacecolor='none')
plt.legend()
plt.show()
试试这些链接:
示例代码
import numpy as np
from statsmodels.distributions.empirical_distribution import ECDF
import matplotlib.pyplot as plt
data = np.random.normal(0,5, size=2000)
ecdf = ECDF(data)
plt.plot(ecdf.x,ecdf.y)
R 中的ecdf函数返回经验累积分布函数,因此完全等效的函数是:
def ecdf(x):
x = np.sort(x)
n = len(x)
def _ecdf(v):
# side='right' because we want Pr(x <= v)
return (np.searchsorted(x, v, side='right') + 1) / n
return _ecdf
np.random.seed(42)
X = np.random.normal(size=10_000)
Fn = ecdf(X)
Fn([3, 2, 1]) - Fn([-3, -2, -1])
## array([0.9972, 0.9533, 0.682 ])
如图所示,它给出了正态分布的正确概率为 68-95-99.7%。
这位作者有一个用户编写的 ECDF 函数的非常好的示例:John Stachurski 的 Python 讲座。他的系列讲座面向计算经济学研究生;然而,对于任何学习 Python 通用科学计算的人来说,它们都是我的首选资源。
编辑:现在已经一岁了,但我想我仍然会回答你问题的“编辑”部分,以防你(或其他人)仍然觉得它有用。
与直方图一样,ECDF 确实没有任何“箱”。如果 G 是使用数据向量 Z 形成的经验分布函数,则 G(x) 实际上是 Z <= x 的出现次数除以 len(Z)。这不需要“分箱”来确定。因此,在某种意义上,ECDF 保留了有关数据集的所有可能信息(因为它必须保留整个数据集以进行计算),而直方图实际上通过分箱丢失了有关数据集的一些信息。出于这个原因,我更喜欢尽可能使用 ecdfs 与直方图。
有趣的奖励:如果您需要从非常大的流数据创建一个类似 ECDF 的小尺寸对象,您应该查看 McDermott 等人的这篇“ Data Skeletons ”论文。