Python模拟社会财富分配。


前戏

进入今日主题之前先来了解一下蒙特卡洛方法,在机器学习或统计计算领域,常常遇到这样一类问题:即如何求取一个定积分?可能求解一些积分有解析解的方程式是可以直接积分得,但是会遇到很多问题无法用分析的方法来求得精确解。遇到这种情况,常会采用一些方法去得到近似解,本文谈的蒙特卡罗方法随机模拟就是这一类近似求解的方法。

蒙特卡洛

蒙特卡洛人名吗

第一次看到“蒙特卡洛”的时候我还以为是个人名,其实蒙特卡洛不是个人名而是个地名(赌城—摩纳哥的蒙特卡洛),用赌城名字命名说明该方法与赌博中的随机性、概率性有着天然而密切的联系。几乎涉及到复杂的、与概率相关的数值计算的领域都有可能会用到。例如经济金融、统计学、机器学习等

什么是蒙特卡罗方法(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"


猜你喜欢

转载自blog.51cto.com/15127516/2683031