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

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

总结

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

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

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

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

相关文章:

  • 数据处理专题(二)
  • vue2 el-table跨分页多选以及多选回显
  • Springboot的MultipartFile,获取不到inputStream
  • SeaCMS代码审计
  • 基于深度学习的OCR+NLP,医疗化验单智能识别方案
  • 【量化实战】利用miniqmt实现远程下单的完整指南
  • 阿里开源QwQ-32B推理模型!32.5B vs 671B|仅需1/10成本
  • python函数的多种参数使用形式
  • R语言软件配置(自用)
  • 人工智能之数学基础:矩阵的降维
  • 对上传的图片进行压缩,以保证它的大小不超过X MB
  • 亚马逊新品广告投放策略:从零到爆单的全链路解析
  • 黑客如何查找网络安全漏洞
  • 用 pytorch 从零开始创建大语言模型(四):从零开始实现一个用于生成文本的GPT模型
  • 关于Docker是否被淘汰虚拟机实现连接虚拟专用网络Ubuntu 22.04 LTS部署Harbor仓库全流程
  • C++ 各种map对比
  • 【JVM】内存区域划分,类加载机制和垃圾回收机制
  • openEuler24.03 LTS下安装Hadoop3完全分布式
  • 第十五届蓝桥杯C/C++组:宝石组合题目(从小学奥数到编程题详解)
  • 算法模型从入门到起飞系列——递归(探索自我重复的奇妙之旅)
  • 孙磊已任中国常驻联合国副代表、特命全权大使
  • “上博号”彩绘大飞机今日启航:万米高空传播中国古代文化
  • 百年传承,再启新程,参天中国迎来2.0时代
  • 美航母一战机坠海,美媒:为躲避胡塞武装攻击,损失超六千万美元
  • ​关键词看中国经济“一季报”:韧,长期向好看底气
  • 马上评丨机械停车库成“僵尸库”,设计不能闭门造车