贝叶斯公式简单解释及其运用

简介

贝叶斯定理是18世纪英国数学家托马斯·贝叶斯(Thomas Bayes)提出得重要概率论理论。以下摘一段 wikipedia 上的简介:

所谓的贝叶斯定理源于他生前为解决一个“逆概”问题写的一篇文章,而这篇文章是在他死后才由他的一位朋友发表出
来的。在贝叶斯写这篇文章之前,人们已经能够计算“正向概率”,如“假设袋子里面有 N 个白球,M 个黑球,你伸手
进去摸一把,摸出黑球的概率是多大”。而一个自然而然的问题是反过来:“如果我们事先并不知道袋子里面黑白球
的比例,而是闭着眼睛摸出一个(或好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里
面的黑白球的比例作出什么样的推测”。这个问题,就是所谓的逆向概率问题。
概率复习

在正式介绍公式前,先通过几道简单的概率题来复习概率相关的知识

职业体型女神是否喜欢
程序员超重不喜欢
产品匀称喜欢
程序员匀称喜欢
程序员超重喜欢
美工匀称不喜欢
美工超重不喜欢
产品匀称喜欢

1.女神喜欢的概率?
2.职业是程序员并且体型匀称的概率?
3.在女神喜欢的条件下,职业是程序员的概率?
4.在女神喜欢的条件下,职业是产品,体重是超重的概率?

在解答前先引入几个概念
事件A发生的概率记作P(A)
联合概率:事件A与事件B同时成立的概率
记作:P(A,B)=P(A)P(B)
条件概率:事件A在另一个事件B已经发生条件下的成立概率
记作:P(A|B)
特性:P(A1,A2|B)=P(A1|B)P(A2|B)

代入公式分别为
1.P(女神喜欢)
2.P(程序员,体型匀称)
3.P(程序员|女神喜欢)
4.P(产品,超重|女神喜欢)

公式定义

贝叶斯定理是关于随机事件 A 和 B 的条件概率:
在这里插入图片描述
先根据上面的例子核对公式
3.P(程序员|女神喜欢)=P(女神喜欢|程序员)P(程序员)/P(女神喜欢)=?
2/3*3/7 / 4/7

其中P(A|B)是在 B 发生的情况下 A 发生的可能性。
在贝叶斯定理中,每个名词都有约定俗成的名称:

P(A)是 A 的先验概率,之所以称为“先验”是因为它不考虑任何 B 方面的因素。
P(A|B)是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率。
P(B|A)是已知 A 发生后 B 的条件概率,也由于得自 A 的取值而被称作 B 的后验概率。
P(B)是 B 的先验概率,也作标淮化常量(normalizing constant)。

按这些术语,贝叶斯定理可表述为:
后验概率 = (相似度 * 先验概率)/标淮化常量
也就是说,后验概率与先验概率和相似度的乘积成正比。
另外,比例P(B|A)/P(B)也有时被称作标淮相似度(standardised likelihood),Bayes定理可表述为:
后验概率 = 标淮相似度 * 先验概率
条件概率就是事件 A 在另外一个事件 B 已经发生条件下的发生概率。条件概率表示为P(A|B),
读作“在 B 发生的条件下 A 发生的概率”。

联合概率表示两个事件共同发生(数学概念上的交集)的概率。A 与 B 的联合概率表示为

在这里插入图片描述

推导

我们可以从条件概率的定义推导出贝叶斯定理。

根据条件概率的定义,在事件 B 发生的条件下事件 A 发生的概率为:
在这里插入图片描述
同样地,在事件 A 发生的条件下事件 B 发生的概率为:
在这里插入图片描述

结合这两个方程式,我们可以得到:
在这里插入图片描述

这个引理有时称作概率乘法规则。上式两边同除以 P(A),若P(A)是非零的,我们可以得到贝叶斯定理:

在这里插入图片描述

实际应用

问题替换
P(科技|文档)=P(科技|词1,词2,词3)=P(词1,词2,词3|科技)*P(科技) / P(词1,词2,词3)
P(水果税收编码|商品名称)=P(水果税收编码|词1,词2,词3)

在这里插入图片描述
现有一篇被预测文档:出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?
在这里插入图片描述
思考:属于某个类别为0,合适吗?
在这里插入图片描述

根据名称判断男女

所需要训练集下载地址
http://sofasofa.io/competition.php?id=3#c1

import pandas as pd
from collections import defaultdict
import math

# 处理名称中的空格和特殊字符
def handleName(name):
    name.strip()

    name = ''.join(name.split())
    name.replace(' ', '')
    name = name[1:]

    first = name.find("(")
    last = name.find(")")

    if first != -1 and last != -1:
        name = name[0:first]
    return name

test = pd.read_csv("name.csv")
test['chuLiNmae'] = test['name'].apply(handleName)


# 读取train.txt
train = pd.read_csv('train.txt')

# 把数据分为男女两部分
names_female = train[train['gender'] == 0]
names_male = train[train['gender'] == 1]

# 统计男女的人数
totals = {'f': len(names_female),
          'm': len(names_male)}

# 女性词汇累积发生概率
frequency_list_f = defaultdict(int)
for name in names_female['name']:
    for char in name:
        frequency_list_f[char] += 1. / totals['f']

# 男性词汇累积发生概率
frequency_list_m = defaultdict(int)
for name in names_male['name']:
    for char in name:
        frequency_list_m[char] += 1. / totals['m']

# 计算时增加默认拉普拉斯平滑系数alpha
def LaplaceSmooth(char, frequency_list, total, alpha=1.0):
    count = frequency_list[char] * total
    distinct_chars = len(frequency_list)
    freq_smooth = (count + alpha) / (total + distinct_chars * alpha)
    return freq_smooth


# 运用贝叶斯公式计算其某种性别的概率
def GetLogProb(char, frequency_list, total):
    freq_smooth = LaplaceSmooth(char, frequency_list, total)
    return math.log(freq_smooth) - math.log(1 - freq_smooth)


# 累积每个词汇对应性别的概率
def ComputeLogProb(name, bases, totals, frequency_list_m, frequency_list_f):
    logprob_m = bases['m']
    logprob_f = bases['f']
    for char in name:
        logprob_m += GetLogProb(char, frequency_list_m, totals['m'])
        logprob_f += GetLogProb(char, frequency_list_f, totals['f'])
    return {'male': logprob_m, 'female': logprob_f}

# 得到最终答案
def GetGender(LogProbs):
    return LogProbs['male'] > LogProbs['female']


# 求女生的概率的自然对数
base_f = math.log(1 - train['gender'].mean())
# 求女生所有词汇发生概率之和
base_f += sum([math.log(1 - frequency_list_f[char]) for char in frequency_list_f])

# 求男的概率的自然对数
base_m = math.log(train['gender'].mean())
# 求男生所有词汇发生概率之和
base_m += sum([math.log(1 - frequency_list_m[char]) for char in frequency_list_m])

# 得到男女所有词汇发生的概率值的自然对数
bases = {'f': base_f, 'm': base_m}
result = []
for name in test['chuLiNmae']:
    # 得到一个名字准备预测性别
    LogProbs = ComputeLogProb(name, bases, totals, frequency_list_m, frequency_list_f)
    gender = GetGender(LogProbs)
    result.append(int(gender))

test['gender'] = result

test.to_csv('MyXingBie.csv', index=False)

最终结果

一平,1
昶胜,1
馨,0
星驰,1
梦媛,0
陈,1
忠良,1
浪,1
建,1
小惠,0
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值