《神经网络与PyTorch实战》——3.5.2 蒙特卡洛算法求解圆周率的实现

举报
华章计算机 发表于 2019/06/05 20:20:08 2019/06/05
【摘要】 本书摘自《神经网络与PyTorch实战》——书中第3章,第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类及其科学计算。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。