You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将嵌套循环结果存入矩阵实现蒙特卡洛积分多误差计算

解决方案:生成多重复蒙特卡洛误差矩阵

基础嵌套循环实现(易懂优先)

通过两层循环实现需求:外层遍历每个样本量,内层重复M次计算误差,结果存入二维矩阵。

import numpy as np

N = 20
M = 100  # 每个样本量的重复计算次数,可自行调整
sample_size = np.zeros(N, dtype=int)
truetheta = 0.4

# 生成样本量序列:2, 4, 8, ..., 1024
for n in range(N):
    sample_size[n] = 2**(n+1)

# 初始化N行M列的误差矩阵,存储每个样本量对应的M个误差值
naive_error_matrix = np.zeros((N, M))

# 嵌套循环计算误差
for idx, sample_n in enumerate(sample_size):
    for m in range(M):
        # 生成随机样本
        x = np.random.uniform(0, 1, sample_n)
        # 计算被积函数值
        y = 2 * (2*x - 1)**4
        # 计算积分估计值并求误差
        estimate = np.mean(y)  # 等价于np.sum(y)/sample_n,写法更简洁
        naive_error_matrix[idx, m] = abs(estimate - truetheta)

关键说明:

  • 用np.zeros((N, M))初始化二维矩阵,避免列表嵌套的麻烦,后续可直接用于统计分析(如计算误差的均值、标准差)。
  • enumerate(sample_size)同时获取样本量的索引和数值,方便将误差值存入矩阵对应行。
  • 内层循环重复M次,每次独立生成随机样本,保证误差的独立性。

高效向量化实现(性能优先)

利用numpy的向量化操作替代内层循环,大幅提升计算速度(尤其当M较大时):

import numpy as np

N = 20
M = 100
# 直接生成样本量序列,替代原for循环
sample_size = 2 ** np.arange(1, N+1)
truetheta = 0.4

# 初始化误差矩阵
naive_error_matrix = np.zeros((N, M))

for idx, sample_n in enumerate(sample_size):
    # 一次性生成M组样本,每组sample_n个数据,形状为(M, sample_n)
    x = np.random.uniform(0, 1, (M, sample_n))
    # 批量计算被积函数值
    y = 2 * (2*x - 1)**4
    # 对每组样本计算积分估计值(按行求均值)
    estimates = np.mean(y, axis=1)
    # 批量计算误差并赋值到矩阵对应行
    naive_error_matrix[idx] = abs(estimates - truetheta)

关键说明:

  • 用2 ** np.arange(1, N+1)一行生成样本量序列,代码更简洁。
  • 一次性生成所有重复样本,通过numpy的向量化运算批量计算估计值和误差,避免Python内层循环的开销。
  • np.mean(y, axis=1)表示对每行(即每组样本)计算均值,得到M个估计值,效率远高于循环计算。

内容的提问来源于stack exchange,提问作者JoF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:40:50