python中的经验cdf与matlab类似';是一个
我有一些matlab代码,我想重写成python。这是一个简单的程序,可以计算一些分布,并以双对数标度绘制 我遇到的问题是计算cdf。以下是matlab代码:python中的经验cdf与matlab类似';是一个,python,matlab,numpy,matplotlib,statistics,Python,Matlab,Numpy,Matplotlib,Statistics,我有一些matlab代码,我想重写成python。这是一个简单的程序,可以计算一些分布,并以双对数标度绘制 我遇到的问题是计算cdf。以下是matlab代码: for D = 1:10 delta = D / 10; for k = 1:n N_delta = poissrnd(delta^-alpha,1); Y_k_delta = ( (1 - randn(N_delta)) / (delta.^alpha) ).^(-1/alpha);
for D = 1:10
delta = D / 10;
for k = 1:n
N_delta = poissrnd(delta^-alpha,1);
Y_k_delta = ( (1 - randn(N_delta)) / (delta.^alpha) ).^(-1/alpha);
Y_k_delta = Y_k_delta(Y_k_delta > delta);
X(k) = sum(Y_k_delta);
%disp(X(k))
end
[f,x] = ecdf(X);
plot(log(x), log(1-f))
hold on
end
在matlab one中,我可以简单地使用:
[f,x] = ecdf(X);
在点x处获得cdf(f)。是它的文档。在python中,它更复杂:
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
from statsmodels.distributions.empirical_distribution import ECDF
alpha = 1.5
n = 1000
X = []
for delta in range(1,5):
delta = delta/10.0
for k in range(1,n + 1):
N_delta = np.random.poisson(delta**(-alpha), 1)
Y_k_delta = ( (1 - np.random.random(N_delta)) / (delta**alpha) )**(-1/alpha)
Y_k_delta = [i for i in Y_k_delta if i > delta]
X.append(np.sum(Y_k_delta))
ecdf = ECDF(X)
x = np.linspace(min(X), max(X))
f = ecdf(x)
plt.plot(np.log(f), np.log(1-f))
plt.show()
这让我的情节看起来很奇怪,显然不像matlab那样流畅。我认为问题在于我不理解ECDF的功能,或者它的工作原理与matlab不同。
我为我的python代码实现了一个解决方案(最重要的一个),但它似乎无法正常工作。一旦有了示例,您就可以使用*和: 例如:
from scipy import stats
from matplotlib import pyplot as plt
# a normal distribution with a mean of 0 and standard deviation of 1
n = stats.norm(loc=0, scale=1)
# draw some random samples from it
sample = n.rvs(100)
# compute the ECDF of the samples
qe, pe = ecdf(sample)
# evaluate the theoretical CDF over the same range
q = np.linspace(qe[0], qe[-1], 1000)
p = n.cdf(q)
# plot
fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.plot(q, p, '-k', lw=2, label='Theoretical CDF')
ax.plot(qe, pe, '-r', lw=2, label='Empirical CDF')
ax.set_xlabel('Quantile')
ax.set_ylabel('Cumulative probability')
ax.legend(fancybox=True, loc='right')
plt.show()
*如果您使用的numpy版本早于1.9.0,则
np.unique
将不接受return\u counts
关键字参数,您将得到TypeError
:
TypeError: unique() got an unexpected keyword argument 'return_counts'
在这种情况下,一种解决方法是获取一组“反向”索引,并使用np.bincount
对出现的情况进行计数:
quantiles, idx = np.unique(sample, return_inverse=True)
counts = np.bincount(idx)
1.我建议在这些情况下,在你的问题中添加数字,这会有很大帮助。2.您是否熟悉matlab的
loglog
和plt.loglog
?1。是的,我知道,我需要一次时间来学习如何连接这些。。。2.没有,我从来没有用过。只需单击编辑器菜单中的小横向图标,您就可以通过一个链接包含来自计算机或web的图像。2.我建议你检查一下:它们的工作原理类似于相应的绘图
s,还有一点,它们为你处理日志
s。它通常更好:它们在保留原始变量的同时保持对数刻度:如果x
从1变为1000,那么最后的xticklabel
s将不会写入log(1000)
,而是1000
,并且将以对数方式选择刻度。这与绘制log
vslog
不同,因此它取决于您的需要。它看起来相当不错,谢谢!我只将“return\u counts=True”更改为“True”,因为我在这个版本中遇到了错误。顺便说一句,祝你论文顺利!如果出现错误意外的关键字参数“return\u counts”
,则必须运行不支持return\u counts
参数到np.unique
(这是在v1.9中添加的)的旧版本的numpy。在这种情况下,调用np.unique(…,True)
将对应于np.unique(…,return\u index=True)
,这将为您提供唯一值的索引,而不是作为第二个返回变量的计数,因此您的CDF将不正确。有关解决方法,请参阅我的更新。
quantiles, idx = np.unique(sample, return_inverse=True)
counts = np.bincount(idx)