《神经网络与PyTorch实战》——3.5.2 蒙特卡洛算法求解圆周率的实现
3.5.2 蒙特卡洛算法求解圆周率的实现
在上一节中,我们已经了解了利用蒙特卡洛算法计算圆周率的基本思路。首先,要生成很多在上的随机样点。然后判断每个样点是否在单位圆内。最后统计在单位圆里的样点占所有样点的比例。这个比例就接近。把这个比例乘以4,就得到圆周率的近似值。
代码清单3-20完整实现了上述逻辑。代码清单3-20先导入了torch包。接着,生成了一个大小为 (10000000, 2) 的张量sample,每个元素都是在上均匀分布的样点。张量sample的每一个零维索引得到的一维张量,如sample[0, :]、sample[1, :] 都是一个大小为 (2,) 的张量,它们可以看作上的一个点。代码“sample.norm(p=2, dim=1)”逐一计算了这些点的2范数,即这些点到原点之间的距离。其中的参数dim=1表示计算范数时应该对每个第1维以外的索引逐一计算,得到的范数张量的大小应当为 (10000000,)。根据圆的定义,如果样点到原点的距离小于1,则样点在圆内。代码“dist < 1”就是判断样点是否在圆内。代码“dist < 1”可以返回一个元素为1或0的张量,但是这个张量并不是torch.Tensor类型的。利用它的成员方法float(),可以把这个张量转换为torch.Tensor类型。接着,使用这个torch.Tensor类实例的成员方法mean(),可以求torch.Tensor类实例所有元素的平均值。用这种方法,就计算得到torch.Tensor类实例中元素1占所有元素的比例。这个比例就是上样点在单位圆里的比例。这个比例存在于零维张量ratio中。将ratio乘以4,就得到了圆周率的近似值。
代码清单3-20 使用蒙特卡洛算法计算圆周率
import torch
num_sample = 10000000
sample = torch.rand(num_sample, 2)
dist = sample.norm(p=2, dim=1)
ratio = (dist < 1).float().mean()
pi = ratio * 4
print('pi = {}'.format(pi))
这个例子综合应用了张量的随机生成和数学运算。希望通过这个例子,你能够更好地熟悉PyTorch包的torch.Tensor类及其科学计算。
- 点赞
- 收藏
- 关注作者
评论(0)