Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的经验cdf与matlab类似';是一个_Python_Matlab_Numpy_Matplotlib_Statistics - Fatal编程技术网

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);

我有一些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);
        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
vs
log
不同,因此它取决于您的需要。它看起来相当不错,谢谢!我只将“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)