初识蒙特卡罗算法

蒙特卡罗算法,在我看来,是一个很神奇的算法,它可以模拟出很多场景,并且模拟出来的数据,可能与真实的数据相差无几,但模拟的成本远远低于真实数据的获取。

今天,我就用蒙特卡罗算法,做两个简单的模拟。一个是π值计算,另外一个求积分。

一、π值

π值是一个无理数,无限不循环,公元480年左右,南北朝时期的数学家祖之冲进得出精确到小数点后7位的结果,今天,我们用计算机来模拟一把,我模拟的结果如何。

首先来说明模拟的思路,如下图所示,通过推导出正方形和内切圆面积存在比例关系,只要计算出它俩的面积比值,我们就可以求出π。

那怎么在不使用π的情况下,计算内切圆的面积。我们可以用打点的方式,在正方形区域随机打点n个,如果在内切圆的区域内有x个,则它俩的面积比就是n/x。如果这个n很大,则结果也是十分准确的。

具体代码如下

list_p=[]
list_p_x=[]
max_count = 100000000
first_count =10
rate = 2
count_s = 0
j=0
while first_count < max_count:
    print(first_count)
    while j < first_count:
        x = random.uniform(-1, 1)
        y = random.uniform(0, 1)
        if   x**2 + y**2 < 1:
            count_s = count_s + 1
        j = j + 1
    list_p_x.append(first_count)
    list_p.append(count_s/first_count*4)
    j=0
    count_s=0
    first_count =first_count * rate

plt.xlim(0,first_count/2)
plt.ylim(3,3.3)
plt.plot(list_p_x,list_p)
plt.hlines(y=np.pi,xmin= first_count,xmax=list_p_x, colors = "c", linestyles = "dashed")

  模拟出来的结果如下,在模拟超过1w次后,结果已经趋于稳定,基本等于3.14,这已经基本我们大部分使用场景。

二、积分

积分实际也可以理解是计算面试,比如下图,是y = -x^2+1 的函数图形,现在用蒙特卡罗求一下该函数的积分。

思路和求π得方法一致,也是通过随机打点的方式,根据在积分区域的散点数与矩形区域内散点数之比,乘以矩形面积,就是该积分区域面积。

分析模拟结果如下图,可以看到模拟3w到多次时,准确率很高了,与1.33不断接近,在9w次之后,基本保持重叠。

通过蒙特卡罗模拟,生成一系列符合预期要求的随机数,就可以模拟出一个十分接近实际值得近似值,十分适应于对数值计算精度要求不是很高的场景,比如,我们在计算圆面积的是,通常都会取3.14,而不会取3.1415926.....等。

注:

公众号:数据志(原:跟着菜鸟一起学R语言)

原文链接:https://www.cnblogs.com/wheng/articles/11832476.html

原文地址:https://www.cnblogs.com/wheng/p/11832476.html

时间: 2024-08-02 14:09:55

初识蒙特卡罗算法的相关文章

【足迹C++primer】31、初识泛型算法

初识泛型算法 理解算法的最基本方法是了解他们是否读取元素.改变元素或是重排元素顺序! 只读算法 #include<iostream> #include<numeric> using namespace std; //对vec中的元素求和,初值是0 int sum=accumulate(vec.cbegin(), vec.cend(), 0); 这里面第三个参数决定了函数使用哪个加法运算符以及返回值类型. 算法和元素类型 string sum=accumulate(v.cbegin(

初识聚类算法:K均值、凝聚层次聚类和DBSCAN

原文地址http://blog.sina.com.cn/s/blog_62186b460101ard2.html 这里只是将比较重要的部分转一下 另外还有一篇关于层次聚类的 http://blog.csdn.net/jwh_bupt/article/details/7685809 聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不同类型,通常有以下

概率算法 蒙特卡罗算法

/***Date:2014.12.11***/ //概率算法思想:统计学思路. //基本过程:1)将问题转化为应的容易计算面积的几何图形S,问题结果对应几何图形中的某一部分S1: ////////////2)向几何图形中随机撒点: ////////////3)统计几何图形S.S1中的点数,根据二者面积关系以及二者中的点数来计算得到结果: ////////////4)判断结果是否达到需要精度结果,若符合则输出,否则继续(2)步骤. //蒙特卡罗(Monte Carlo)算法 //均匀撒点:利用随机

初识RMQ算法

这个RMQ算法是专门针对于求最值的高效算法.其思路比较简单,先是利用DP预处理,之后便是查询,方法如下: 假如我们需要查询的区间为(i,j),那么我们需要找到覆盖这个闭区间(左边界取i,右边界取j)的最小幂(可以重复,比如查询5,6,7,8,9,我们可以查询5678和6789). 因为这个区间的长度为j - i + 1,所以我们可以取k=log2( j - i + 1),则有:RMQ(A, i, j)=max{F[i , k], F[ j - 2 ^ k + 1, k]}. 举例说明,要求区间[

初识分类算法(3)-----朴素贝叶斯算法

1. 例子引入:如上篇的play or not 例子. 未知分类的样本:D:<A=sunny, B=cool, C=high ,D=strong>,  是 or 否? 我们要判断该样本的分类,即比较该样本属于是的概率大还是否的概率大 P(是/否|A=sunny, B=cool, C=high ,D=strong) P(是|A=sunny, B=cool, C=high ,D=strong)=P(是,(A=sunny, B=cool, C=high ,D=strong))/P(A=sunny,

初识分类算法(4)-----logistic回归

参考:http://blog.csdn.net/dongtingzhizi/article/details/15962797 1.简述 在线性回归中,h函数的输出值为连续值,当需要进行归类时,输出的应该是离散值,如何将连续值转换成离散值? 如果分类结果只有两个,用1,0表示.我们希望有:函数1/(1+e^(-z)),这样就可以将函数结果限定在0~1之间. Logistic Regression 有三个主要组成部分:回归.线性回归.Logsitic方程. 1)回归其实就是对已知公式的未知参数进行估

HDU_1711_初识KMP算法

Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22568    Accepted Submission(s): 9639 Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b

初识机器学习算法有哪些?

机器学习无疑是现在数据分析领域的一个重要内容,凡事从事IT工作领域的人都在平时的工作中或多 或少的会用到机器学习的算法. 机器学习有很多算法,不过大的方面可分为两类:一个是学习的方式,一个是算法的类似性. 学习方式: 根据数据类型的不同,对一个问题的建模有不同的方式.在机器学习或者人工智能领域,人们首先会 考虑算法的学习方式.在机器学习领域,有几种主要的学习方式.将算法按照学习方式分类是一个不 错的想法,这样可以让人们在建模和算法选择的时候考虑能根据输入数据来选择最合适的算法来获得 最好的结果.

初识分类算法(2)------决策树ID3算法

例子:分类:play or not ?(是/否)             目的:根据训练样本集S构建出一个决策树,然后未知分类样本通过决策树就得出分类. 问题:怎么构建决策树,从哪个节点开始(选择划分属性的问题) 方法:ID3(信息增益),C4.5(信息增益率),它们都是用来衡量给定属性区分训练样例的能力. 1. 为了理解信息增益,先来理解熵Entropy.熵是来度量样本的均一性的,即样本的纯度.样本的熵越大,代表信息的不确定性越大,信息就越混杂. 训练样本S:     S相对与目标分类的熵为: