概率刻度:为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)
(数据集可以找几篇英文阅读即可。)