numpy学习笔记15:模拟100次随机游走,观察平均行为
numpy学习笔记15:模拟100次随机游走,观察平均行为
1、代码示例
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 模拟100次随机游走,观察平均行为
n_simulations = 100
final_positions = [np.sum(np.random.choice([-1,1], 1000)) for _ in range(n_simulations)]
plt.hist(final_positions, bins=20, density=True)
plt.title("Distribution of Final Positions (100 Simulations)")
plt.xlabel("Final Position")
plt.ylabel("Probability Density")
plt.show()
展示图:
2、以下是对模拟 100 次随机游走并分析最终位置分布的代码的详细分步解释,涵盖从代码逻辑到统计学原理的全方位说明:
1. 代码功能
这段代码通过 100 次独立随机游走实验,生成最终位置的分布直方图,验证随机游走的统计学特性(如中心极限定理)。
2. 分步解析
(1) 模拟参数设置
n_simulations = 100 # 实验次数 n_steps = 1000 # 每次游走的步数 step_values = [-1, 1] # 步长选项
-
n_simulations=100
:执行 100 次独立实验,每次实验模拟一次随机游走。 -
n_steps=1000
:每次实验包含 1000 步(即粒子移动 1000 次)。 -
step_values=[-1, 1]
:每步的位移为-1
(向左)或1
(向右),概率各为 50%。
(2) 生成最终位置数据
final_positions = [ np.sum(np.random.choice(step_values, size=n_steps)) for _ in range(n_simulations) ]
-
内部逻辑:
-
np.random.choice([-1,1], size=1000)
:生成一个长度为 1000 的数组,每个元素随机为-1
或1
。 -
np.sum(...)
:计算该次随机游走的 最终位置(所有步长的代数和)。 -
列表推导式:重复 100 次实验,生成包含 100 个最终位置的列表。
-
-
示例结果:
final_positions = [12, -5, 3, ..., 8] # 100 个整数
(3) 绘制分布直方图
plt.hist(final_positions, bins=20, density=True) plt.title("Distribution of Final Positions (100 Simulations)") plt.xlabel("Final Position") plt.ylabel("Probability Density") plt.show()
-
bins=20
:将数据范围分成 20 个区间(柱状图的柱子数量)。 -
density=True
:将纵轴从频数(出现次数)转换为 概率密度(总面积为 1),便于与理论概率密度函数对比。 -
可视化效果:直方图展示最终位置的分布形态,接近正态分布(见下文理论分析)。
3. 统计学原理分析
(1) 期望与方差
(2) 中心极限定理(CLT)
-
核心结论:独立同分布随机变量的和近似服从正态分布。
-
应用:1000 步位移的和(即最终位置)近似服从正态分布:
-
直方图验证:即使原始步长(-1 和 1)是离散的,其和的分布会呈现连续的钟形曲线。
4. 模拟结果示例
假设 100 次实验的最终位置分布如下:
-
横轴:最终位置(如 -50 到 +50)。
-
纵轴:概率密度(归一化后总面积为 1)。
-
红色曲线:理论正态分布 N(0,1000)N(0,1000) 的概率密度函数。
5. 关键参数影响
(1) 实验次数 n_simulations
-
增加次数(如 10,000 次):直方图更接近理论正态分布,噪声减少。
-
减少次数(如 10 次):分布可能不规则,难以识别形态。
(2) 步数 n_steps
-
增加步数(如 10,000 步):方差增大,分布更分散。
-
减少步数(如 10 步):分布接近二项分布(离散性明显)。
(3) 步长概率
6. 应用场景
-
金融建模:模拟资产价格的随机波动(几何布朗运动)。
-
物理模拟:研究微粒扩散(布朗运动)或热力学系统的随机性。
-
算法测试:评估蒙特卡洛方法或优化算法的收敛性。
7. 完整代码改进建议
(1) 添加理论正态曲线
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
from scipy.stats import norm
# 计算理论正态分布的均值和标准差
mu = 0
n_steps=1000
sigma = np.sqrt(n_steps) # sqrt(1000) ≈ 31.62
# 生成理论曲线
x = np.linspace(mu - 4*sigma, mu + 4*sigma, 100)
pdf = norm.pdf(x, mu, sigma)
# 绘制理论曲线
plt.plot(x, pdf, 'r-', linewidth=2, label='Theoretical PDF')
plt.title("理论正态曲线")
plt.legend()
plt.show()
(2) 增加模拟次数
n_simulations = 10_000 # 更接近理论分布
总结
-
代码逻辑:通过多次独立实验生成最终位置,绘制分布直方图。
-
统计学原理:中心极限定理导致正态分布。
-
扩展性:可调整参数探索不同条件下的分布变化。
通过此代码,你能够直观验证随机游走的统计规律,并为更复杂的随机过程分析奠定基础!