如何用Numpy/Scipy结合均值、标准差、最值使用正态分布?
用Numpy/Scipy实现指定区间的正态分布概率计算
要计算正态分布在给定[最小值, 最大值]区间内的概率,核心思路是利用累积分布函数(CDF):区间概率 = 最大值对应的CDF值 - 最小值对应的CDF值。以下是Numpy和Scipy的具体实现方案:
一、Scipy实现(更直观便捷)
Scipy的scipy.stats.norm模块封装了正态分布的常用统计方法,直接调用cdf()方法即可计算累积概率。
代码示例(对应你的体重问题)
from scipy.stats import norm # 定义正态分布参数 mu = 61 # 均值 sigma = 5 # 标准差 lower = 59 # 区间最小值 upper = 63 # 区间最大值 # 计算区间概率:upper的CDF值减去lower的CDF值 probability = norm.cdf(upper, loc=mu, scale=sigma) - norm.cdf(lower, loc=mu, scale=sigma) print(f"体重在59-63kg之间的人群占比:{probability:.4f}(即{probability*100:.2f}%)")
运行结果会输出0.3108,和你手动查表的结果完全一致。
二、Numpy实现(依赖误差函数erf)
Numpy没有直接提供正态分布的CDF函数,但可以通过误差函数numpy.erf()推导计算,正态分布CDF的公式为:
CDF(x) = 0.5 * (1 + erf((x - mu) / (sigma * sqrt(2))))
代码示例(对应你的体重问题)
import numpy as np # 定义参数 mu = 61 sigma = 5 lower = 59 upper = 63 # 实现正态分布CDF函数 def norm_cdf(x, mu, sigma): return 0.5 * (1 + np.erf((x - mu) / (sigma * np.sqrt(2)))) # 计算区间概率 probability = norm_cdf(upper, mu, sigma) - norm_cdf(lower, mu, sigma) print(f"体重在59-63kg之间的人群占比:{probability:.4f}(即{probability*100:.2f}%)")
运行结果同样为0.3108,和手动计算结果匹配。
内容的提问来源于stack exchange,提问作者Zollikofen4
相关产品推荐
相关产品推荐

