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

numpy学习笔记14:模拟随机游走过程

numpy学习笔记14:模拟随机游走过程

随机游走是一种数学统计模型,其中的每一步方向和大小都是随机的。下面使用 NumPy 模拟一维和二维的随机游走过程:

1.代码示例

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def simulate_1d_random_walk(num_steps):
    """
    模拟一维随机游走
    :param num_steps: 游走的步数
    :return: 一维随机游走的位置数组
    """
    steps = np.random.choice([-1, 1], size=num_steps)
    positions = np.cumsum(steps)
    return positions


def simulate_2d_random_walk(num_steps):
    """
    模拟二维随机游走
    :param num_steps: 游走的步数
    :return: 二维随机游走的 x 和 y 坐标数组
    """
    steps_x = np.random.choice([-1, 1], size=num_steps)
    steps_y = np.random.choice([-1, 1], size=num_steps)
    positions_x = np.cumsum(steps_x)
    positions_y = np.cumsum(steps_y)
    return positions_x, positions_y


# 模拟一维随机游走
num_steps_1d = 1000
positions_1d = simulate_1d_random_walk(num_steps_1d)

# 绘制一维随机游走轨迹
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
plt.plot(positions_1d)
plt.title('一维随机游走')
plt.xlabel('步数')
plt.ylabel('位置')


# 模拟二维随机游走
num_steps_2d = 1000
positions_x, positions_y = simulate_2d_random_walk(num_steps_2d)

# 绘制二维随机游走轨迹
plt.subplot(1, 2, 2)
plt.plot(positions_x, positions_y)
plt.title('二维随机游走')
plt.xlabel('X 位置')
plt.ylabel('Y 位置')

plt.tight_layout()
plt.show()

  1. simulate_1d_random_walk 函数:该函数通过 np.random.choice 从 [-1, 1] 中随机选择 num_steps 个步长,然后使用 np.cumsum 计算累积和,得到一维随机游走的位置数组。
  2. simulate_2d_random_walk 函数:分别为 x 和 y 方向生成随机步长,再分别计算它们的累积和,得到二维随机游走的 x 和 y 坐标数组。
  3. 可视化部分:使用 matplotlib 绘制一维和二维随机游走的轨迹图。

2. 分步解释

(1) 生成随机步长
steps = np.random.choice([-1, 1], size=1000)
  • 功能:生成包含 1000 个元素的数组,每个元素随机为 -1(向左移动)或 1(向右移动)。

  • 概率:默认均匀分布,即 -1 和 1 出现的概率均为 50%。

(2) 计算累积位移
positions = np.cumsum(steps)
  • 功能:通过 np.cumsum() 对步长数组逐步累加,生成随时间变化的位置序列

(3) 可视化结果
plt.plot(positions)
  • 输出:绘制位置随时间变化的折线图,展示粒子的随机运动轨迹。

3. 示例输出图形

横轴为步数,纵轴为位置,展示粒子在直线上的随机移动轨迹。

4. 扩展分析

(1) 多次模拟统计特性
# 模拟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) 均方位移分析

5. 关键参数调整

  • 非对称概率(如向右概率 70%):

    steps = np.random.choice([-1,1], size=1000, p=[0.3, 0.7])
  • 可变步长(如步长为 0.5 或 2):

    steps = np.random.choice([-0.5, 2], size=1000)

6. 应用场景

  1. 金融价格模型:模拟股票价格的随机波动。

  2. 分子扩散:研究微粒在液体中的布朗运动。

  3. 算法测试:评估路径规划或搜索算法的性能。


通过上述代码和分析,你可以灵活模拟不同条件下的随机游走,并深入理解其统计特性!

相关文章:

  • hadoop-HDFS操作
  • 【链表】一文搞定链表算法:从基础到实战
  • 人工智能:如何把excel中某数据区域中,含有空格数据的单元格标记背景颜色出来?
  • S32K144外设实验(二):ADC单通道单次采样(软件触发)
  • 《Linux:动态库动态链接与静态库静态链接》
  • 声动未来,门店数字化助力韶音加速破圈
  • 4. 移动到末尾(蓝桥云课)
  • stm32第七天震动传感器
  • Java 文件和IO流基础(生动形象版)
  • 进程间通信(1)——管道
  • Android AI ChatBot-v1.6.3-28-开心版[免登录使用GPT-4o和DeepSeek]
  • 深入理解Java内存模型(JMM)及其并发编程中的应用
  • 「JavaScript深入」WebSocket:高效的双向实时通信技术
  • 【基于深度学习的验证码识别】---- part3数据加载、模型等API介绍(2)
  • HAL库编程知识点---Can.c和Driver_can.c分层开发
  • Linux | gcc编译篇
  • 从零构建大语言模型全栈开发指南:第一部分:数学与理论基础-1.1.2核心数学基础:线性代数、概率论与梯度优化
  • Blender制作次表面材质
  • python 函数入门指南
  • sql小记,20250319
  • 网络主播直播泄机密,别让这些“小事”成威胁国家安全的“突破口”
  • 习近平会见古共中央第一书记、古巴国家主席迪亚斯-卡内尔
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • 方正证券总裁何亚刚到龄退休,54岁副总裁姜志军接棒
  • 古埃及展进入百天倒计时,闭幕前168小时不闭馆
  • 报告:4月份新增发行的1763亿元专项债中,投向房地产相关领域约717亿元