码迷,mamicode.com
首页 > 编程语言 > 详细

蒙特卡洛算法

时间:2018-08-29 22:51:06      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:1.3   net   absolute   highlight   区间   signed   模拟   指定   display   

一、概念

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

(以下理解引用自链接: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\n",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 << "请输入实验的次数:\n";
    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了。

 

蒙特卡洛算法

标签:1.3   net   absolute   highlight   区间   signed   模拟   指定   display   

原文地址:https://www.cnblogs.com/HeartAndSoul/p/9544286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!