蒙特卡洛算法

Posted heartandsoul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蒙特卡洛算法相关的知识,希望对你有一定的参考价值。

一、概念

蒙特卡洛方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故接用赌城蒙特卡洛命名。

(以下理解引用自链接:https://blog.csdn.net/wangjianguobj/article/details/54434280,说的挺好的)

机器学习/深度学习中的图像叠加文字识别需要大量的训练样本,自动生成样本(使用程序在背景图片上叠加文字)是一种样本的获取方式。但色彩值(为了兼顾各方向的同学,原谅我用一个这么不专业的词汇,此值可以是RGB到[0,1]区间的映射,让它能代表颜色的性质)的选择很重要,为了防止(控制)发生叠加文字与背景图片的色彩值相近的情况发生,叠加文字的色彩值最好服从我们指定的概率分布。这样就需要根据指定的概率分布来产生色彩值——蒙特卡洛方法擅长解决的问题。

简而言之蒙特卡洛方法就是生成样本,即蒙特卡洛采样。即根据某已知分布的概率密度函数 f(x), 产生服从此分布的样本 X。

二、简单用例

圆周率Π的求解

matlab代码:

function [Pi] = MonteCarlomethod(num)
% num 为实验的次数
% r 为圆的半径

% m 为落到圆内的点的个数
m=0;

%单位圆
r=1;

for i=1:num
    x=-1+rand*2*r;      %产生随机数坐标x
    y=-1+rand*2*r;      %产生随机数坐标y
    if (x^2+y^2 <= r^2)
        m=m+1;          %统计圆内的点
    end
end

Pi=4*m/num;
fprintf("当实验次数为 n = %d 时,蒙特卡洛方法计算出来的圆周率为 %d
",num,Pi);
end

C++代码:

#include<iostream>
#include<ctime>
#define r 1

int main()
{
    int num=0;            //number of experiments
    int m = 0;                //the point in circle
    double x = 0, y=0;
    using namespace std;
    cout << "请输入实验的次数:
";
    cin >> num;
    srand((unsigned)time(NULL));
    for (int i = 0; i < num; ++i)
    {
        x = -1+2*rand()/double(RAND_MAX);
        y = -1+2*rand()/double(RAND_MAX);
        if (x*x+ y*y <= r * r)
            ++m;
    }
    double pi1 = (double)4.0 * m / num;
    cout << "最终蒙特卡洛算出来的 PI=" << pi1 << endl;

    system("Pause");
    return 0;

按上述方法去计算,当实验次数达到100000次时,计算出来的Π的值已经为3.1404了。

 

以上是关于蒙特卡洛算法的主要内容,如果未能解决你的问题,请参考以下文章

通信仿真基于matlab蒙特卡罗算法2FSK系统抗噪声性能仿真含Matlab源码 1632期

golang蒙特卡洛树算法实现五子棋AI

蒙特卡洛算法

蒙特卡洛算法

蒙特卡洛算法

数学建模|Python蒙特卡洛算法