前戏
进入今日主题之前先来了解一下蒙特卡洛方法,在机器学习或统计计算领域,常常遇到这样一类问题:即如何求取一个定积分?可能求解一些积分有解析解的方程式是可以直接积分得,但是会遇到很多问题无法用分析的方法来求得精确解。遇到这种情况,常会采用一些方法去得到近似解,本文谈的蒙特卡罗方法随机模拟就是这一类近似求解的方法。
蒙特卡洛
蒙特卡洛人名吗?
第一次看到“蒙特卡洛”的时候我还以为是个人名,其实蒙特卡洛不是个人名而是个地名(赌城—摩纳哥的蒙特卡洛),用赌城名字命名说明该方法与赌博中的随机性、概率性有着天然而密切的联系。几乎涉及到复杂的、与概率相关的数值计算的领域都有可能会用到。例如经济金融、统计学、机器学习等
什么是蒙特卡罗方法(Monte Caelo)?
蒙特卡罗方法,又可以叫做 随机抽样或统计试验方法,是以概率和统计理论方法为基础的一种计算方法
使用随机数来解决计算问题,如积分。将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或采样,以获得问题的近似解,采样越多越近似最优解。
小拓展:拉斯维加斯算法:采样越多越有机会找到最优解。
蒙特卡罗方法的原理是什么?
蒙特卡罗方法通过抓住事物运动的几何特征和几何数量,进行一次数字模拟实验。它是一个以概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。
蒙特卡罗方法的主要步骤是什么?
构造问题的概率过程
实现从已知概率分布抽样
建立估计量
蒙特卡罗方法的主要优缺点?
优点:
简单,去掉繁琐的数学推导和演算过程
对于连续性的问题不必进行离散化处理
对于具有统计性质问题可以直接进行解决
方法的误差与问题的维数无关
缺点:
对于确定性问题需要转化成随机性问题
通常需要较多的计算步数N
误差是概率误差
特点:随机采样计算近似结果,随着采样的增多,得到的结果越接近正确结果。
小例子及Python实现
问题抛出:求函数y=x^2在[0,2]区间的积分?(这里举例的是个简单问题)
绘图解析(求阴影部分的所占的面积)
代码:
效果:
思想:该绿色区域在一个2×4的正方形里面,使用蒙特卡洛方法,随机在这个正方形里面产生大量随机点(数量为N),计算有多少点(数量为count)落在红色区域内(判断条件为y<x^2),(count/N)*2*4就是所要求的积分值,也即l绿色区域的面积
验证蒙特卡罗方法的特点:随机采样计算近似结果,随着采样的增多,得到的结果越接近正确结果。
代码:
效果:
努力的回报
问题描述:一个财富分配游戏,努力是否会有回报?
房间里有100个人,每人都有100元钱,他们在玩一个游戏。每轮游戏中,每个人都要拿出一元钱随机给另一个人,最后这100个人的财富分布是怎样的?
说明:
每个人初始资金100元
从18岁到65岁,每天玩一次,简化运算按照一共玩17000(365*(65-18))轮
每天拿出一元钱,并且随机分配给另一个人
当某人的财富值降到0元时,允许财富值为负,即同样需要拿出1元钱给别人,有机会得到别人给出的钱
其中,有10人勤奋努力,获得1%的竞争优势(即每轮有0.0101的概率拿到1元,其他人则为0.899/90)
利用蒙特卡罗随机模拟思想:设置努力的10个人id 分别为:[1,11,21,31,41,51,61,71,81,91],方便后续跟踪观察,随后模拟随机给另一个人一元钱。
Python核心代码:
结果可视化分析:
初始财富分配:(用红色标记比较努力的十个人)
17000轮以后财富分配:
划重点:
努力的10人财富最后基本分布在群体前列
每天多1%的努力或许就可以逆袭
世界本就很残酷了,不怕自己不努力,就怕那些比自己更优秀的人更上进。
关注“数据管道手册” 回复“财富分配”得本节代码数据。
题外话之今日电影推荐《白日梦想家》。
"To see the world,things dangerous to come to,to see behind walls,draw closer,to find each other,and to feel.That is purpose of life"