You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将np.random.logistic转换为scipy.stats.fisk?转换后分布不符

解决方法

你的参数对应是完全正确的,问题出在随机数生成器的差异和直方图的视觉误导:

  1. 随机生成器不兼容
    你使用了两种不同的随机数生成器:

    • NumPy的default_rng(SEED)是基于PCG64的新一代生成器
    • Scipy的rvs(random_state=SEED)默认调用旧的numpy.random.RandomState生成器
      即使种子相同,两者生成的随机序列也完全不同,导致样本看起来分布不一致,但本质上两个分布是完全相同的。
  2. 直方图分箱的视觉误差
    固定分箱数(30)会放大样本差异的视觉效果,换成核密度估计(KDE)更能清晰反映分布的真实形状。

修正代码

将Scipy的随机生成器替换为NumPy的新生成器,同时用KDE对比分布:

import numpy as np
import numpy.random as npr
import scipy.stats as ss
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde

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)
# 使用NumPy的新生成器生成Scipy样本
s = ss.fisk(
    c=1/PARAMS['scale'],
    scale=np.exp(PARAMS['loc']),
).rvs(
    random_state=Generator,
    size=SIZE,
)

# 绘制KDE对比分布
plt.figure(figsize=(10, 6))
x = np.linspace(0, 10, 1000)
kde_ns = gaussian_kde(ns)
kde_s = gaussian_kde(s)
plt.plot(x, kde_ns(x), color='b', label='ns = exp(logistic)')
plt.plot(x, kde_s(x), color='r', linestyle='--', label='s = fisk.rvs')
plt.title('Log-Logistic Distribution KDE Comparison')
plt.xlabel('Value')
plt.ylabel('Density')
plt.legend()
plt.show()

# 打印统计量验证
print(f"ns均值: {ns.mean():.4f}, s均值: {s.mean():.4f}")
print(f"ns中位数: {np.median(ns):.4f}, s中位数: {np.median(s):.4f}")

运行后会看到两条KDE曲线几乎完全重合,统计量也高度一致,证明两个分布是相同的。

内容的提问来源于stack exchange,提问作者E.Z

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 04:24:55