我不知道如何将
np.random.logistic
转换为 scipy.stats.fisk
,这是我的代码:
import numpy as np
import numpy.random as npr
import scipy.stats as ss
import matplotlib.pyplot as plt
SEED = 1337
SIZE = 1_000_000
Generator = npr.default_rng(seed=SEED)
PARAMS = {
"loc": 0,
"scale": 1
}
n = Generator.logistic(
loc=PARAMS['loc'],
scale=PARAMS['scale'],
size=SIZE,
)
ns = np.exp(n)
s = ss.fisk(
c=1/PARAMS['scale'],
scale=np.exp(PARAMS['loc']),
).rvs(
random_state=SEED,
size=SIZE,
)
从 scipy 文档阅读,假设
n
是一个逻辑随机变量,位置为 loc
,尺度为 scale
。那么 ns=np.exp(n)
是一个 Fisk(对数逻辑)随机变量,具有 scale=np.exp(l)
和形状 c=1/scale
。
但是,绘制
n
和 ns
会给出完全不同的分布。
我做错了什么?
plt.figure(figsize=(14, 6))
plt.subplot(1, 2, 1)
plt.hist(n, bins=30, density=True, alpha=0.6, color='g', label="n")
plt.title('Logistic Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.legend()
plt.subplot(1, 2, 2)
plt.hist(ns, bins=30, density=True, alpha=0.6, color='b', label="ns")
plt.hist(s, bins=30, density=True, alpha=0.6, color='r', label="s")
plt.title('Log-Logistic Distribution')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.legend()
plt.show()
logistic
发行版。如果您将随机变量 n
替换为 SciPy 的 logistic
分布中的随机变量,您会发现随机变量本身是相同的。
import numpy as np
import numpy.random as npr
import scipy.stats as ss
import matplotlib.pyplot as plt
SEED = 1337
SIZE = 1_000_000
Generator = npr.default_rng(seed=SEED)
PARAMS = {
"loc": 0,
"scale": 1
}
n = ss.logistic(
loc=PARAMS['loc'],
scale=PARAMS['scale'],
).rvs(
random_state=SEED,
size=SIZE,
)
ns = np.exp(n)
s = ss.fisk(
c=1/PARAMS['scale'],
scale=np.exp(PARAMS['loc']),
).rvs(
random_state=SEED,
size=SIZE,
)
plt.hist(s, range=[0, 25], bins=40, alpha=0.5)
plt.hist(ns, range=[0, 25], bins=40, alpha=0.5)
np.testing.assert_allclose(s, ns)