如何将np.random.logistic转换为scipy.stats.fisk?转换后分布不符
解决方法
你的参数对应是完全正确的,问题出在随机数生成器的差异和直方图的视觉误导:
随机生成器不兼容
你使用了两种不同的随机数生成器:- NumPy的
default_rng(SEED)是基于PCG64的新一代生成器 - Scipy的
rvs(random_state=SEED)默认调用旧的numpy.random.RandomState生成器
即使种子相同,两者生成的随机序列也完全不同,导致样本看起来分布不一致,但本质上两个分布是完全相同的。
- NumPy的
直方图分箱的视觉误差
固定分箱数(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
相关产品推荐
相关产品推荐

