在Python中,R的ecdf(x)(x)函数在numpy或scipy中的等价形式是什么?ecdf(x)(x)基本上等同于:
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)
还是需要别的什么?
EDIT如何控制ecdf使用的bin数?
ecdf
dzhpxtsq1#
ecdf的OP实现是错误的,您不应该对值执行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的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
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()
du7egjpx2#
请尝试以下链接:statsmodels.ECDFECDF in python without step function?示例代码
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)
4c8rllxm3#
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 ])
如图所示,它给出了正态分布的correct 68–95–99.7% probabilities。
l7wslrjt4#
本文作者有一个用户编写的ECDF函数的非常好的示例:他的系列讲座面向计算经济学的研究生;但是,对于任何学习Python中一般科学计算的人来说,它们都是我的首选资源。
编辑:这是一年前的事了,但我想我还是要回答你问题中的“编辑”部分,以防你(或其他人)仍然觉得它有用。
ECDF实际上不像直方图那样存在任何“箱”。如果G是使用数据向量Z形成的经验分布函数,则G(x)是Z〈= x出现的次数除以len这不需要“装仓”来确定。因此,存在ECDF保留关于数据集的所有可能信息的意义(因为它必须保留整个数据集以进行计算),而直方图实际上会因为分箱而丢失一些数据集的信息,因此我更喜欢在可能的情况下使用ecdfs而不是直方图。有趣的是:如果您需要从非常大的流数据中创建一个占用空间小的类似ECDF的对象,您应该阅读McDermott等人的“Data Skeletons“论文。
vtwuwzda5#
def ecdf(x): Sorted = np.sort(x) Length = len(x) ecdf = np.zeros(Length) for i in range(Length): ecdf[i] = sum(Sorted <= x[i])/Length return ecdf x = np.array([1, 2, 5, 4, 3, 6, 7, 8, 9, 10]) ecdf(x)
5条答案
按热度按时间dzhpxtsq1#
ecdf
的OP实现是错误的,您不应该对值执行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
的ECDF
,也可以提供自己的实现。du7egjpx2#
请尝试以下链接:
statsmodels.ECDF
ECDF in python without step function?
示例代码
4c8rllxm3#
R中的ecdf函数返回经验累积分布函数,因此具有精确等价形式:
如图所示,它给出了正态分布的correct 68–95–99.7% probabilities。
l7wslrjt4#
本文作者有一个用户编写的ECDF函数的非常好的示例:他的系列讲座面向计算经济学的研究生;但是,对于任何学习Python中一般科学计算的人来说,它们都是我的首选资源。
编辑:这是一年前的事了,但我想我还是要回答你问题中的“编辑”部分,以防你(或其他人)仍然觉得它有用。
ECDF实际上不像直方图那样存在任何“箱”。如果G是使用数据向量Z形成的经验分布函数,则G(x)是Z〈= x出现的次数除以len这不需要“装仓”来确定。因此,存在ECDF保留关于数据集的所有可能信息的意义(因为它必须保留整个数据集以进行计算),而直方图实际上会因为分箱而丢失一些数据集的信息,因此我更喜欢在可能的情况下使用ecdfs而不是直方图。
有趣的是:如果您需要从非常大的流数据中创建一个占用空间小的类似ECDF的对象,您应该阅读McDermott等人的“Data Skeletons“论文。
vtwuwzda5#