当前位置: 首页 > article >正文

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)
]
  • 内部逻辑

    1. np.random.choice([-1,1], size=1000):生成一个长度为 1000 的数组,每个元素随机为 -1 或 1

    2. np.sum(...):计算该次随机游走的 最终位置(所有步长的代数和)。

    3. 列表推导式:重复 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. 应用场景

  1. 金融建模:模拟资产价格的随机波动(几何布朗运动)。

  2. 物理模拟:研究微粒扩散(布朗运动)或热力学系统的随机性。

  3. 算法测试:评估蒙特卡洛方法或优化算法的收敛性。


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  # 更接近理论分布

总结

  • 代码逻辑:通过多次独立实验生成最终位置,绘制分布直方图。

  • 统计学原理:中心极限定理导致正态分布。

  • 扩展性:可调整参数探索不同条件下的分布变化。

通过此代码,你能够直观验证随机游走的统计规律,并为更复杂的随机过程分析奠定基础!


http://www.kler.cn/a/592170.html

相关文章:

  • C++ 语法之函数和函数指针
  • 合约编译部署基本流程
  • Spring(8)——MyBatis入门(2)
  • pycharm运行OpenCV项目踩坑记录
  • 3D开发工具HOOPS SDK:赋能CAM软件开发的利器
  • 以太网安全管理实验——ARP欺骗
  • Deepseek本地部署及本地知识库搭建(保姆级截图)
  • VIVO手机如何实现证件照换底色?证件照换底色技巧分享
  • 【RabbitMQ】RabbitMQ的基本架构是什么?包括哪些核心组件?
  • NIC数据包的接收与发送
  • 【STL】string类用法介绍及部分接口的模拟实现
  • pnpm创建vite
  • 蓝桥杯第13届真题2
  • C++项目:高并发内存池_上
  • 【云原生之kubernetes实战】在k8s环境中高效部署minio对象存储(详细教程)
  • pytorch 笔记:张量索引的维度扩展规则
  • python二级每日十题
  • JS逆向_腾讯点选_VMP补环境
  • (五)Reactor核心-前置知识4
  • (六)Reactive-Stream 响应式流