标准正态分布缩放:调整X轴范围后匹配原分布形态的实现问题
缩放正态分布直方图的解决方案
问题概述
需要将原本X轴范围[-5,5]、步长0.01的标准正态分布密度直方图,修改为X轴范围[-500,500]、步长1,同时保持形态一致,且X=0处的Y值约为0.004。尝试按“X轴放大100倍则Y轴缩小100倍”的方法修改后未达预期,同时疑问缩放后的分布是否仍为正态分布。
原代码
import numpy as np import matplotlib.pyplot as plt import seaborn as sns np.random.seed(2023) a = np.random.normal(0, 1, 100000) sns.histplot(a, bins=np.arange(-5, 5, 0.01), stat='density', color='red') plt.title("Standard Normal Distribution") plt.xlabel('x') plt.ylabel('F(x)', rotation=0) plt.show()
关键逻辑与解决方案
1. 概率密度的缩放规则
当把随机变量X缩放为X' = k*X时,新分布的概率密度函数(PDF)满足:f'(x') = (1/k) * f(x'/k)。这里X轴放大了100倍(k=100),因此:
- 原标准正态数据需乘以100,得到对应[-500,500]范围的样本
- 新PDF在x=0处的值为原标准正态PDF值(≈0.3989)除以100,正好≈0.004,符合需求
2. 修改后的可运行代码
import numpy as np import matplotlib.pyplot as plt import seaborn as sns np.random.seed(2023) # 将原标准正态样本缩放100倍,匹配新X轴范围 scaled_data = np.random.normal(0, 1, 100000) * 100 # 设置新的bins:从-500到500,步长1(结束值设为501才能包含500) bins = np.arange(-500, 501, 1) # 用stat='density'自动计算缩放后的密度值 sns.histplot(scaled_data, bins=bins, stat='density', color='red') plt.title("Scaled Normal Distribution (μ=0, σ=100)") plt.xlabel('x') plt.ylabel('F(x)', rotation=0) plt.show()
3. 关于分布的疑问
缩放后的分布属于正态分布,是均值为0、标准差为100的正态分布,其PDF完全符合正态分布的形式,只是标准差被放大了100倍,因此整体形态和原标准正态分布一致,只是坐标轴缩放了比例。
内容的提问来源于stack exchange,提问作者Laulito
相关产品推荐
相关产品推荐

