一、贝叶斯算法起源
贝叶斯算法源于一个叫贝叶斯的人为了解决“逆概”问题而创作的;
二、贝叶斯主要解决的问题
贝叶斯主要解决的问题:
正向概率:假设袋子里面有n个白球,m个黑球,你伸手进去摸一把,摸出黑球的概率是多大;
逆向概率:如果我们事先不知道袋子里面黑白球的比例,闭着眼睛随便摸出一个或多个球,
观察这些取出来的球的颜色之后,我们可以就此对袋子里面的黑白球的比例作出什么样的推测?
三、为什么使用贝叶斯
为什么使用贝叶斯?
1、现实世界本身是不确定的,人类的观察能力是有限的;
2、我们日常观察到的只是事物表面上的结果,因此我们需要提供一个猜测;
四、问题:
假设学校里面人的总数是U个,
穿长裤的(男生)个数:U*P(Boy)P(Pants|Boy)–P(Boy)是男生的概率=60%;P(Pants|Boy)是条件概率,即男生这个条件下穿长裤的概率是多大,这里是100%,因为男生都穿长裤/穿长裤的女生个数:UP(Girl)P(Pants|Girl)–P(Girl)是女生的概率=40%;
(另男生总是穿长裤,女生一半穿长裤一半穿裙子)
求解:穿长裤的人里面有多少个女生(P(Girl|Pants))?
答:穿长裤的人总数为UP(Boy)P(Pants|Boy)+UP(Girl)P(Pants|Girl);
P(Girl|Pants)=UP(Girl)P(Pants|Girl)/穿长裤总数=UP(Girl)P(Pants|Girl)/[UP(Boy)P(Pants|Boy)+UP(Girl)*P(Pants|Girl)]=P(Girl)*P(Pants|Girl)/[P(Boy)*P(Pants|Boy)+P(Girl)*P(Pants|Girl)]到此发现与总人数U无关,可以消去;进一步化简分母=P(Pants,Girl),分子=P(Pants)
五、贝叶斯公式:
(求逆向概率的时候转换成正向,把难求的值转换成好求的)
六、拼写纠正例子:
问:我们看到用户输入了一个不在字典中的单词,我们需要去猜测”这个用户真正想输入的单词是什么呢?哪个单词概率最大“P(我们猜测他想输入的单词|他实际输入的单词)
用户实际输入单词记为D(D代表tha,即观测数据),
猜1:P(the|tha)
猜2:P(than|tha)
猜3:P(tan|tha)…
统一记为P(h|D);P(h|D)=P(h)*P(h|D)/P(D);
因P(D)是定量,故P(h|D)正比于P(h)*P(h|D);
对于给定观测数据,一个猜测是好是坏,取决于“这个猜测本身独立的可能性大小(先验概率Prior)”和“这个猜测生成我们观测到的数据的可能大小”
比如用户输入tlp ,那到底是 top 还是 tip ?这个时候,当最大似然
不能作出决定性的判断时,先验概率就可以插手进来给出指示——
“既然你无法决定,那么我告诉你,一般来说 top 出现的程度要高
许多,所以更可能他想打的是 top "
import urllib
import urllib.request
import re
import collections
def words(text):return re.findall('[a-z]+',text.lower())
def train(features):
model=collections.defaultdict(lambda:1)#所有词统计完一遍之后定义其 至少出现1次,概率为0代表几乎不可能发生
for f in features:
model[f]+=1
return model
NWORDS=train(words(open('big.txt').read()))
#读取语料库语言,单词抽取,转换小写
alphabet='abcdefghijklmnopqrstuvwxyz'
def edits1(word):
n=len(word)
return set([word[0:i]+word[i+1:]for i in range(n)]+
[word[0:i]+word[i+1]+word[i]+word[i+2:]for i in range(n-1)]+
[word[0:i]+c+word[i+1:]for i in range(n) for c in alphabet]+
[word[0:i]+c+word[i:]for i in range(n+1) for c in alphabet])
def known_edits2(word):
return set(e2 for e1 in edits1(word)for e2 in edits1(e1) if e2 in NWORDS)
def known(words):return set(w for w in words if w in NWORDS)
def correct(word):
candidates=known([word])or known(edits1(word))or known_edits2(word)or [word]
return max(candidates,key=lambda w:NWORDS[w])
七、模型比较理论
最大似然:最符合观测数据的(即 P(D | h) 最大的)最有优势
奥卡姆剃刀: P(h) 较大的模型有较大的优势(目标越多)
掷一个硬币,观察到的是“正”,根据最大似然估计的精神,我们应该
猜测这枚硬币掷出“正”的概率是 1,因为这个才是能最大化 P(D | h)
的那个猜测
如果平面上有 N 个点,近似构成一条直线,但绝不精确地位于一条直线
上。这时我们既可以用直线来拟合(模型1),也可以用二阶多项式(模
型2)拟合,也可以用三阶多项式(模型3),特别地,用 N-1 阶多项式
便能够保证肯定能完美通过 N 个数据点。那么,这些可能的模型之中到
底哪个是最靠谱的呢?
奥卡姆剃刀:越是高阶的多项式越是不常见
八、垃圾邮件过滤实例
问题:给定一封邮件判定它是否属于垃圾邮件,D来表示这封邮件,注意D由N个单词组成。我们用h+来表示垃圾邮件,h-表示正常邮件;P(h+|D)=P(h+)*P(D|h+)/P(D);P(h-|D)=P(h-)*P(D|h-)/P(D);
先验概率:P(h+) 和 P(h-) 这两个先验概率都是很容易求出来的,只
需要计算一个邮件库里面垃圾邮件和正常邮件的比例就行了。
D 里面含有 N 个单词 d1, d2, d3,P(D|h+) = P(d1,d2,…,dn|h+)
P(d1,d2,…,dn|h+) 就是说在垃圾邮件当中出现跟我们目前这封邮件一
模一样的一封邮件的概率是多大!(相当小)
(改进)P(d1,d2,…,dn|h+) 扩展为: P(d1|h+) * P(d2|d1, h+) * P(d3|d2,d1,
h+) * …(这里我们把原始贝叶斯问题转化为朴素贝叶斯问题,相当于对关系进行简化,假设之间特征是独立的互不影响的);简化为 P(d1|h+) * P(d2|h+) * P(d3|h+) * …
对于P(d1|h+) * P(d2|h+) * P(d3|h+) * …只要统计 di 这个单词在垃
圾邮件中出现的频率即可。