起点:玩猜硬币游戏中发现贝叶斯定理貌似有很强的预测功能,细看还真有那么回事,因此研究研究。当然,看起来学精后不止可用来猜硬币,也可猜其它玩艺。
贝叶斯统计的基础是贝叶斯定理,贝叶斯定理的基础是条件概率
例子1:综合社会调查的数据展示:
import pandas as pdgss = pd.read_csv('gss_bayes.csv')
gss.head()
展示结果:
列说明:
-
caseid
:受访者标识符。 -
year
:受访者接受调查的年份。 -
age
:受访者接受调查时的年龄。 -
sex
: 男女不限。 -
polviews
:政治观点范围从自由主义到保守主义。 -
partyid
:政治党派,民主党、独立党或共和党。 -
indus10
:受访者所在行业代码
假设indus10列银行家的代码为6870,则
True表达的为银行家
该数据集中有728位银行家
银行家的比例可以banker.mean() = 0.014769730168391155
大约 1.5% 的受访者在银行工作,因此如果我们从数据集中随机选择一个人,他们是银行家的概率约为 1.5%。至此,以数据集引出概率
概率函数
def prob(A):"""Computes the probability of a proposition, A.""" return A.mean()
计算银行家的比例:
prob(banker)=0.014769730168391155
计算受访者为女姓的比例为:
female = (gss['sex'] == 2) prob(female)=0.5378575776019476
政治观点和政党
polviews字段表示政治观点,分七级,从1至7分别从极度自由派到极度保守派
partyid字段表示党派,分八级,从0至7分别表示不同党派
我将把它定义liberal
为True
针对任何回答为“极端自由”、“自由”或“略微自由”的人。
liberal = (gss['polviews'] <= 3)
根据这一定义,以下是自由派受访者的比例。
prob(liberal)=0.27374721038750255
表达的意思是如果我们在这个数据集中随机选择一个人,他们是自由主义者的概率约为27%
democrat = (gss['partyid'] <= 1)定义为强势民主党的受访者
按照这一定义,以下是受访者中民主党人的比例
prob(democrat)=0.3662609048488537
连词
“合取”是逻辑and
运算的另一个名称,如果有两个命题,A和B,则合取就是如果两者都为True,则合取值为True,否则合取值为False
如果我们有两个布尔系列,我们可以使用&
运算符来计算它们的合取。例如,我们已经计算了受访者是银行家的概率。
受访者是银行家的概率:prob(banker)=0.014769730168391155
受访者是民主党人的可能性为:prob(democrat)=0.3662609048488537
现在我们可以计算受访者是银行家且是民主党人的概率:
prob(banker & democrat)=0.004686548995739501
正如我们所预料的,小于任意一个,因为并非所有银行家都是民主党人,且很明显,合取是可交换的:prob(banker & democrat)=prob(democrat & banker )=0.004686548995739501
条件概率
条件概率是取决于条件的概率,但这可能不是最有用的定义。以下是一些示例:
-
假设受访者是自由派,那么他们是民主党人的可能性有多大?
-
假设受访者是银行家,那么其为女性的概率是多少?
-
假设受访者是女性,那么其为自由派的可能性有多大?
让我们从第一个问题开始,我们可以这样解释:“在所有自由派受访者中,民主党人占比是多少?”
我们可以分两步计算这个概率:
-
选择所有自由派的受访者。
-
计算选定受访者中民主党人的比例。
为了选出自由派受访者,我们可以使用括号运算符,[]
如下所示:
selected = democrat[liberal] # 此表达的意思是所有自由派为真先取出来,例如我们假设总记录有20条(实际记录有49290,这里为了理解容易,先用前20条记录计算),符合自由派的有3条,这3个自由派中有1条是民主党派,如下图所示:
在此数据中算出来的为:
prob(selected)=0.3333333333333333
封装成函数:
def conditional(proposition, given):"""Probability of A conditioned on given."""return prob(proposition[given])
我们可以用它conditional
来计算受访者为女性时,其为自由派的概率。
conditional(liberal, given=female)=0.27581004111500884
约28%的女性受访者持自由派立场
条件概率不具有交换性
我们已经看到,合取是可交换的;也就是说,总是等于。prob(A & B)
prob(B & A)
但条件概率不具有交换性;也就是说,与 不同。conditional(A, B)
conditional(B, A)
如果我们看一个例子,这一点就应该很清楚了。之前,我们计算了受访者是女性的概率,假设她们是银行家。
conditional(female, given=banker)
0.7706043956043956
结果显示,大多数银行家都是女性。这与受访者是女性的情况下是银行家的概率不同:
conditional(banker, given=female)
0.02116102749801969
只有约2%的女性受访者是银行家。
概率定律
在接下来的几节中,我们将推导合取概率和条件概率之间的三种关系:
-
定理 1:使用合取函数计算条件概率。
-
定理 2:使用条件概率计算合取。
-
定理3:利用计算。
conditional(A, B)
conditional(B, A)
定理 3 也称为贝叶斯定理。
我将使用概率的数学符号来写出这些定理:
-
P(A)是命题的概率A。
-
P(A and B)是A和B,即两者都为真的概率。
-
P(A|B)是条件概率A鉴于B是真的。垂直线之间的A和B发音为“given”。
这样,我们就可以为定理 1 做好准备了。
定理1:
女性银行家占比是多少?我们已经知道了计算答案的一种方法:
-
使用括号运算符选择银行家,然后
-
用于
mean
计算女性银行家的比例。female[banker].mean() = 0.7706043956043956或是 conditional(female, given=banker)= 0.7706043956043956
另一种方法来计算这个条件概率,即计算两个概率的比率:
-
受访者中女性银行家的比例,以及
-
受访者中银行家所占比例。
换句话说:在所有银行家中,女性银行家占比是多少?我们是这样计算这个比例的。
prob(female & banker) / prob(banker) = 0.7706043956043956
公式如下:
, 这就是定理1
定理2:
将定理1的两国都乘以P(B),我们得到定理2.
这个公式提出了计算合取的第二种方法: 我们可以计算两个概率的乘积,而不是使用运算符&
例如:prob(liberal& democrat) = prob(democrat) * conditional(liberal, democrat)=
0.1425238385067965
定理3:
由于
将定理2代入,则有:
两边同时除以P(B),得到定理3:
,这就是贝叶斯定理
示例:
conditional(liberal, given=banker)=0.2239010989010989 prob(liberal) * conditional(banker, liberal) / prob(banker)=0.2239010989010989
全概率定律:
练习
-
假设受访者是民主党人,那么他是自由派的可能性有多大?
方法1,取民主党人,判断其自由派的可能性
democrat是民主党序列, liberal是自由派,可用条件判断:
conditional(liberal, given=democrat)=0.1111111111111111
方法2, 定理1
即prob(liberal & democrat)/prob(democrat)=0.1111111111111111
方法3, 定理3 贝叶斯定理
prob(liberal) * conditional(democrat, given=liberal)/prob(democrat)=0.1111111111111111
-
假设受访者是自由派,那么他们是民主党人的可能性有多大?
同样也是三种方法,1 直接条件取值,2 通过转换为合取取值/P(B)的形式,3使用叶贝斯定理
方法1:conditional(democrat, given=liberal)=0.3333333333333333
方法2:prob(democrat & liberal)/prob(liberal)=0.33333333333333337
方法3:prob(democrat) *conditional(liberal, given=democrat)/prob(liberal)=0.3333333333333333