蒙特卡洛算法
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了。
以上是关于蒙特卡洛算法的主要内容,如果未能解决你的问题,请参考以下文章