我有一些matlab代码,希望能够重写成python。这是一个简单的程序,计算某个分布并将其以双对数刻度绘制出来。
我的问题出在计算累积分布函数上。以下是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中,我可以简单地使用:
[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不同。
我使用了这个解决方案(最多点数的),但看起来它并没有正确地工作。
loglog
和plt.loglog
吗?