机器学习(贝叶斯决策定理)

概率刻度:为0-1之间的一个实数,表示一次随机事件中事件发生可能性的大小。(概率≥0,非负)

可观测变量:在实验过程中可以观察到的变量;(如投一枚硬币出现正面、反面的情况)

在通常情况下,我们是不知道一个未知事件的确切概率的,但在大量实验的基础上我们可以用观测变量的概率分布

来间接地表达事件总体的概率分布。

如:投一枚硬币1为正面0为反面,9次实验结果为{1,1,1,0,1,0,0,1,1}

则我们用6/9来近似表示投一枚硬币正面的概率,3/9来近似表示投一枚硬币反面的概率;(观测值近似实际值

正向概率:已知各类别比例(如从M个白球,N个黑球中摸出一个球,其是黑色的概率)

逆向概率:未知各类别比例,通过多次实验观察确定未知事物的比例。

贝叶斯(why):人们基于现实事物的认知存在局限性,需要通过实验来找寻其规律;

贝叶斯决策定理----分类

贝叶斯定理是关于随机事件A和B的条件概率(边缘概率)的一则定理。其中P(A|B)是在B发生的情况下A发生的可能性。

以客户信誉度为例,用观测条件X=【X1,X2】下的伯努利随机变量C表示信誉度,C=1为高风险,C=0为低风险,

X1和X2分别指客户意图&道德规范(当热也可以为其他),在实际抽样中我们会得到多个样本数据【X1,X2,C】

则我们可以根据已知的样本数据来分析新用户的【X1,X2】并确定其C

其错误概率为 1-max(P( C=1 | x1,x2),P( C=0 | x1,x2)),在x条件下是C的概率计算(贝叶斯)公式为:

P(C=1)或P(C=0)称C取值为1或0的先验概率(与样本x取值无关),显然 P(C=1)+P(C=0)=1。这里的P(x|C)称之为

类似然,是属于C观测值为x的条件概率。p(x)称为证据,实验得到的x的边缘概率(与C无关)。

使用贝叶斯公式,有样本观测得到的类似然、证据以及先验概率我们可以得到后验概率P(C|x) 。一旦我们得到后验

概率,就可以根据P( C=1 | x),P( C=0 | x)的大小来对新事物所归类别C进行决策,显然对于二分类问题有:

在更为一般的情况下,我们由K≥2个不同的类别Ci,i∈(i,K),每个类的概率P≥0,且总和为1;

 为了将误差最小化,贝叶斯分类器选择具有最大的后验概率的类,即:选择Ci 若P( Ci |x)=maxP( Ck |x)

分类也可以视为实现一组判别式函数gi(x) { i ∈ (1,K) },使得:(即分类也可以为一个函数)

在这里设A为男生,~A为女生,同理B为穿长裤,~B为穿裙子,结合题目可得:

P(A)=0.6,P(~A)=0.4,P(B|A)=1,P(B|~A)=P(~B|~A)=0.5。

1)穿长裤的概率为P(B)=P(B|A)P(A)+P(B|~A)P(~A)=0.6+0.5*0.4=0.8,同理P(~B)=0.2;

2)穿长裤的女生的概率为P(~A|B)=0.5*0.4/0.8=0.25;(通过贝叶斯公式由已知事物概率求解未知事物概率

贝叶斯网络 

贝叶斯网络又称信念网络或者概率网络,是表示变量之间相互作用的图模型。一个贝叶斯网络是由节点和节点之间

的弧构成,每个结点代表一个随机变量X,并且有一个与此变量对应的概率P(X)。如果节点X到节点Y有弧,则表明

变量X对变量Y有直接影响。此影响为P(Y|X)影响,显然贝叶斯网络为有向无环图

实战:贝叶斯实现简单的单词拼写纠错

P(正确单词|错误单词)∝P(错误单词|正确单词)*P(正确单词)∝P(正确单词)

结合贝叶斯公式可以得出,最后经纠正后得到的的单词概率正比于对应单词的先验概率。

import re        #导入re库
alpha='abcdefghijklmnopqrstuvwxyz'    #a-z字母表
def words(text):
    return re.findall('[a-z]+',text.lower())    #通过findall方法实现单词的提取
    #获取单词数据,通过re库实现匹配。
def edit(word):
    #编辑距离为1,即只修改、删除、调换、增加一个字符
    length=len(word)        #待纠错的单词长度
    candiate=[]
    for i in range(length):
        candiate.append(word[0:i]+word[i+1:] )      #删除一个字符
        for c in alpha:
            candiate.append(word[0:i]+c+word[i+1:])     #修改一个字符
            if i+1!=length:
                candiate.append(word[0:i]+c+word[i:])   #插入一个字符
            else:
                candiate.append(word+c)             #插入一个字符
        for j in range(length):
            candiate.append(word[0:i]+word[j]+word[i+1:j]+word[i]+word[j+1:])   #交换两个字符
    return candiate        #假设用户拼写单词只有一个字符错误



worddata=words(open('data.txt',encoding='utf-8').read())    #读取单词数据集
datacollection={}                  #单词字典&得到每种单词的出现频次(先验概率)
testword=[['thk','the'],['lonq','lone'],['thonk','think'],['adaptive','alaptivo'],['ipplause','applause'],['because','becase'],
          ['fanally','finally'],['learn','learn'],['favorita','favorite'],['darlying','derlying']]           #测试数据集合

for i in worddata:
    datacollection.update({i:datacollection.get(i,0)+1})    #生成单词集字典保存其概率

L = {}            #符合条件的单词集合
count=0           #计数器,用于计数准确率
for i in testword:
    candiateword = set(edit(i[0]))        #用集合进行存取,实现去重
    for j in candiateword:
        if j in datacollection:
            L.update({j: datacollection.get(j, 0)})
    if i[0] in datacollection or len(L)==0:
        correct=i[0]
        count=count+1            #如果没找到或者在单词字典中打印,拼写正确
    elif len(L)!=0:
        correct=max(L, key=L.get)           #与先验概率最大的单词类别一致
        if correct==i[1]:
            count=count+1
    print(i[0],'纠正后单词为:',correct)     #打印纠错后的单词
    L.clear()

print('准确率:',count/len(testword))        #计算准确率

运行结果(总体效果还可以,当把单词编辑距离稍微变大点效果会变得更好,着这里长度为1)

(数据集可以找几篇英文阅读即可。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值