如何在固定位置参数下拟合逻辑分布(Logistic Distribution)

秋丽同学_1078

秋丽同学_1078

2026-03-25

566人浏览

原创

如何在固定位置参数下拟合逻辑分布(Logistic Distribution)

本文详解如何使用 scipy 对逻辑分布进行带约束的参数估计,重点实现位置参数(loc)固定、仅估计尺度参数(scale)的极大似然拟合,并提供自定义似然函数、不确定性评估与可视化验证的完整流程。

本文详解如何使用 scipy 对逻辑分布进行带约束的参数估计,重点实现位置参数(loc)固定、仅估计尺度参数(scale)的极大似然拟合,并提供自定义似然函数、不确定性评估与可视化验证的完整流程。

在统计建模与可靠性分析中,逻辑分布因其对称性、重尾特性及解析友好的 CDF 形式(Sigmoid 函数),常被用于替代正态分布建模偏态不显著但尾部略厚的数据。当先验知识明确指示分布中心(如已知极值、理论截断点或物理临界值)时,固定位置参数(floc)进行尺度参数估计是更稳健、更具解释性的做法——它既避免了自由拟合引入的偏差,又提升了尺度参数的估计精度。

SciPy 的 scipy.stats.logistic.fit() 方法原生支持该场景:通过关键字参数 floc 直接冻结位置参数,仅对 scale 执行极大似然估计(MLE)。例如:

import numpy as np
from scipy import stats

# 生成模拟数据(真实 loc=1.2, scale=2.3)
np.random.seed(123456)
true_dist = stats.logistic(loc=1.2, scale=2.3)
data = true_dist.rvs(30000)

# 固定 loc=1.2,仅估计 scale
fitted_loc, fitted_scale = stats.logistic.fit(data, floc=1.2)
print(f"Fixed loc={fitted_loc:.6f}, Estimated scale={fitted_scale:.6f}")
# 输出: Fixed loc=1.200000, Estimated scale=2.304335

✅ 注意:floc 参数必须为标量(非区间),且传入值将被严格固定;若需同时固定多个参数,可组合使用 floc, fscale, f0 等(详见 scipy.stats._distn_infrastructure.fit 文档)。

对于需要更高控制力的场景(如添加自定义约束、获取 Hessian 矩阵以评估参数不确定性),建议手动构建负对数似然函数并调用 scipy.optimize.minimize:

from scipy import optimize

def neg_log_likelihood(scale, data, fixed_loc):
    """负对数似然函数:输入 scale,返回 -logL"""
    return -stats.logistic(loc=fixed_loc, scale=scale).logpdf(data).sum()

# 初始值建议设为数据 IQR / 1.3 ≈ scale 的粗略估计
initial_scale = (np.percentile(data, 75) - np.percentile(data, 25)) / 1.3

result = optimize.minimize(
    fun=neg_log_likelihood,
    x0=[initial_scale],
    args=(data, 1.2),
    method='BFGS',
    options={'disp': True}
)

if result.success:
    est_scale = result.x[0]
    # 近似标准误:sqrt(对角线元素 of Hessian inverse)
    stderr = np.sqrt(np.diag(result.hess_inv))[0] if hasattr(result, 'hess_inv') else None
    print(f"MLE scale: {est_scale:.6f} ± {stderr:.6f}" if stderr else f"MLE scale: {est_scale:.6f}")

此方法不仅复现了 fit(..., floc=...) 的结果,还直接输出优化过程信息与参数协方差近似(hess_inv),便于后续误差传播或置信区间计算。

关于 PDF 表达式的疑问:Scipy 文档中给出的标准逻辑分布 PDF
$$ f(x) = \frac{e^{-x}}{(1 + e^{-x})^2} $$
对应的是 标准形式(loc=0, scale=1)。而 Balakrishnan 书中的一般形式
$$ f(x; \mu, s) = \frac{1}{s} \cdot \frac{\exp\left(-\frac{x-\mu}{s}\right)}{\left(1 + \exp\left(-\frac{x-\mu}{s}\right)\right)^2} $$
正是其位置-尺度族扩展——二者完全等价。Scipy 中 logistic.pdf(x, loc=μ, scale=s) 内部即执行变量代换 $z = (x - \mu)/s$ 后调用标准 PDF 并乘以雅可比因子 $1/s$,因此无需手动缩放。

最后,务必通过经验累积分布函数(ECDF)与拟合 CDF 对比图验证拟合质量,而非依赖 QQ 图检验正态性(逻辑分布误差天然不服从正态分布):

import matplotlib.pyplot as plt
from statsmodels.distributions.empirical_distribution import ECDF

ecdf = ECDF(data)
x_grid = np.linspace(data.min(), data.max(), 500)
cdf_fitted = stats.logistic.cdf(x_grid, loc=1.2, scale=est_scale)

plt.figure(figsize=(8, 5))
plt.plot(x_grid, cdf_fitted, 'b-', label=f'Fitted Logistic CDF (loc=1.2, scale={est_scale:.4f})')
plt.step(ecdf.x, ecdf.y, 'r--', where='post', label='Empirical CDF', alpha=0.8)
plt.xlabel('x'); plt.ylabel('CDF'); plt.legend(); plt.grid(True, alpha=0.3)
plt.title('Goodness-of-fit: Empirical vs Fitted CDF')
plt.show()

✅ 总结关键实践建议:

  • 优先使用 stats.logistic.fit(data, floc=...) 实现简洁可靠的固定位置拟合;
  • 需要标准误或复杂约束时,手动构建负对数似然并优化;
  • 验证拟合效果应基于 CDF 匹配度(ECDF 对比),而非残差正态性假设;
  • 所有 PDF 公式差异均源于标准化与一般化表述,Scipy 实现严格遵循位置-尺度族定义,可直接信赖。
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1831

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4904

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1789

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

29277

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3507

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1223

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

616

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2723

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习