Python中scipy.stats.norm正态分布函数的使用指南

宋时安
宋时安
发布时间:2026-10-12| 2人浏览过
原创

scipy.stats.norm 是 Python SciPy 库中用于模拟和操作正态分布(高斯分布)的核心工具。通过该模块可轻松计算概率密度、累计分布、分位点及生成符合特定均值与标准差的随机样本,广泛应用于数据统计分析与算法验证环节。

scipy.stats.norm 函数概述与公式原理

scipy.stats.norm 用于实现连续型正态分布的概率计算。其标准概率密度函数(PDF)数学表达式为:

正态分布概率密度函数标准形式示意图
正态分布概率密度函数标准形式示意图

在代码调用中,norm.pdf(x, loc, scale) 的计算逻辑等效于先将原始值归一化:y = (x - loc) / scale,再代入标准正态分布密度函数除以尺度参数,即 norm.pdf(y) / scale。其中 loc 对应分布的均值(mean),scale 对应标准差(standard deviation)。

核心调用方法与操作步骤

第1步:安装必要依赖库

执行该功能需提前配置好数据分析环境。若尚未安装相关包,可在终端或 Notebook 中运行以下命令:

pip install scipy numpy matplotlib

第2步:选择 API 风格生成概率分布图

SciPy 提供了两种等效的调用路径,可根据代码可读性需求自由选择:

  • 实例化冻结分布(Frozen Distribution):先固定 loc 和 scale 生成对象,后续直接对对象调用 .pdf() 等方法。适合需要在多处复用同一分布参数的场景。
  • 直接类方法调用:不创建中间对象,每次调用时显式传入参数。适合一次性计算或参数频繁变动的场景。

配合 matplotlib 可直观验证两种方式的输出一致性,并同步观察概率密度曲线与随机抽样数据的区别。示例代码如下:

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 8))
x = np.linspace(-5, 5, num=20)

# 第1种调用方式:冻结分布状态
gauss1 = stats.norm(loc=0, scale=2)  # loc控制均值(mean),scale控制标准差(std)
gauss2 = stats.norm(loc=1, scale=3)
y1 = gauss1.pdf(x)
y2 = gauss2.pdf(x)

plt.subplot(2, 2, 1)
plt.plot(x, y1, color='orange', label='μ=0,σ=2')
plt.plot(x, y2, color='green', label='μ=1,σ=3')
plt.legend(loc='upper right')

# 第2种调用方式:直接调用类方法
gauss2_sub = plt.subplot(2, 2, 2)
y1_direct = stats.norm.pdf(x, loc=0, scale=2)
y2_direct = stats.norm.pdf(x, loc=1, scale=3)

plt.plot(x, y1_direct, color='red', label='μ=0,σ=2')
plt.plot(x, y2_direct, color='blue', label='μ=1,σ=3')
plt.legend(loc='upper right')

# 对比 rvs(随机抽样)与 pdf 的输出差异
# 子图3:未排序的随机样本
plt.subplot(2, 2, 3)
y1_rvs = stats.norm.rvs(loc=0, scale=2, size=20)
y2_rvs = stats.norm.rvs(loc=1, scale=3, size=20)
plt.plot(x, y1_rvs, color='black', linestyle=':', label='μ=0,σ=2')
plt.plot(x, y2_rvs, color='purple', label='μ=1,σ=3')
plt.legend(loc='upper right')

# 子图4:排序后的随机样本
plt.subplot(2, 2, 4)
y1_sorted = sorted(stats.norm.rvs(loc=0, scale=2, size=20))
y2_sorted = sorted(stats.norm.rvs(loc=1, scale=3, size=20))
plt.plot(x, y1_sorted, color='black', linestyle=':', label='μ=0,σ=2')
plt.plot(x, y2_sorted, color='purple', label='μ=1,σ=3')
plt.legend(loc='upper right')

plt.tight_layout()
plt.show()

第3步:确认运行结果与参数含义

上述脚本将生成包含四个子图的可视化面板。左侧两幅子图展示的是 stats.norm.pdf 的连续概率密度分布曲线,右侧两幅子图展示的是 stats.norm.rvs 提取的离散随机变量样本。其中 rvs(random variates)表示从目标分布中抽取的具体数值,而非密度曲线。

scipy.stats.norm两种调用方式及pdf与rvs输出对比图
scipy.stats.norm两种调用方式及概率密度(pdf)与随机抽样(rvs)输出对比结果

当使用冻结分布对象时,控制台打印该对象会返回类似 <scipy.stats._distn_infrastructure.rv_frozen object at ...> 的内部标识。调用 stats.norm.rvs(loc=0, scale=2, size=10) 则会直接返回一组符合 N(0, 2²) 分布的浮点数列表,可用于后续蒙特卡洛模拟或分布检验。

stats.norm 核心公共方法对照

  • rvs(loc, scale, size):生成服从该正态分布的随机样本数组。
  • pdf(x, loc, scale):计算指定位置的概率密度值(Probability Density Function)。
  • cdf(x, loc, scale):计算累计分布函数,返回 X ≤ x 的累积概率。
  • sf(x, loc, scale):计算残存函数,结果为 1 - CDF,常用于处理极左尾的高精度计算。
  • ppf(q, loc, scale):分位数函数(CDF 的反函数),输入概率值返回对应的横坐标临界点。
  • isf(q, loc, scale):逆残存函数(SF 的反函数),等价于 ppf(1-q)。
  • stats(loc, scale, moments):批量返回统计特征,moments 参数可组合使用 m(均值)、v(方差)、s(偏度)、k(峰度)。
  • moment(n, loc, scale):计算指定阶数的非中心矩。

总结

掌握 scipy.stats.norm 的两种调用范式及其核心统计方法,能够显著提升 Python 环境下分布建模与假设检验的开发效率。注意区分连续密度计算(pdf/cdf/ppf)与离散抽样(rvs)的应用边界,即可准确支撑各类统计分析任务。以上就是scipy.stats.norm正态分布函数使用指南的详细内容,更多关于Python统计学与数据分析的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。