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
相关产品推荐
相关产品推荐

