将 np.random.logistic 转换为 scipy.stats.fisk

问题描述 投票:0回答:1

我不知道如何将

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

result of plotting snippet above

python numpy scipy distribution
1个回答
0
投票

SciPy 的文档指的是 SciPy 的

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)

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.