背景
《贝叶斯方法》里面有一个案例“图书管理员还是农民”:
丹尼尔卡尼曼在《思考,快与慢》中说,史蒂芬被描述为一个害羞的人,他乐于助人,但是他对其他人不太关注。他非常乐于见到事情处于合理的顺序,并对他的工作非常细心。你认为史蒂芬是一个图书管理员还是一个农民呢?
从上面的描述来看,大多数人都会认为史蒂芬看上去更像一个图书管理员,但是这里却忽视了一个关于图书管理员和农民的事实:男性图书管理员的人数只有男性农民的 1/20 。
所以统计学的角度来看,他更有可能是一个农民。本文整理该案例绘制的条形图,主要在于了解 matplotlib 的简单用法。
贝叶斯定理推断
根据贝叶斯定理推断,史蒂芬是图书管理员的先验概率和后验概率分别是:
- 先验概率:1/21 = 0.047,什么都不知道的情况下的概率。
- 后验概率:0.087,即知道史蒂芬具有一些乐于助人、细心的特点后,判断他是图书管理员的概率是 0.087,比先验概率大了一点点。
Python 条形图展示
在 PyCharm 中编码绘制两个概率的条形图:
from IPython.core.pylabtools import figsize
import numpy as np
from matplotlib import pyplot as plt# 设置参数
figsize(12.5, 4)
plt.rcParams['savefig.dpi'] = 300
plt.rcParams['figure.dpi'] = 300#设置参数
colors = ['#348ABD','#A60628']
prior = [1/21. , 20/21.]
posterior = [0.087, 1-0.087]#绘制先验概率图:
plt.bar([0, .7], prior, alpha=0.70, width=0.25,color=colors[0], label='prior distribution',lw="3",edgecolor=colors[0])#绘制后验概率图
plt.bar([0+0.25, .7+0.25],posterior, alpha=0.7,width=0.25,color=colors[1],label='posterior distribution',lw="3",edgecolor=colors[1])#设置 X 轴的位置和名称
plt.xticks([0.20, 0.95],["Librarian","Farmer"])#设置图形标题
plt.title("Prior and posterior probabilities of Steven's occupation")#设置纵轴名称
plt.ylabel("Probability")# 设置图例位置
plt.legend(loc="upper left")#展示该图,没有这句话,就没有图
plt.show()
编码注意事项,依赖模块安装,在 Pycharm 的控制台执行:
- 安装
pip3 install IPython
模块。 - 安装
pip3 install matplotlib
模块。
运行结果
原样敲的代码运行出的图形特别大,占满了电脑屏幕,就是这个图:
这个图可以看到,史蒂芬是农民的概率是远远高于图书管理员的概率的。
编程启示录
Pycharm 安装后自带了一个 venv 的目录,下面有 pyhton3.9 的环境,所以我想默认的开发都是以自带的环境为基础的。
本例中安装依赖模块都是在当前项目下执行的,看安装结果也是用的“venv/bin/python -m pip
“ 该环境的 pip3 安装的依赖模块。
那么如果用本机的 pip3 安装的模块,在 Pycharm 环境下编码能引用到吗?反之呢,刚刚安装的两个模块,直接通过命令行能访问到么?
我不记得本机 Python 环境有没有安装过这个 matplotlib ,但是通过控制台执行能导入成功: