赞
踩
通过概率来判断输入的样本属于哪一种分类
比如我们要判断一个人挂不挂科,我们可以根据收集的样本建立如下列表
影响是否挂科可能有‘喝酒’,‘逛街’,‘学习’等因素。
考挂了(y) | 喝酒(x1) | 逛街(x2) | 学习(x3) |
---|---|---|---|
1 | 1 | 1 | 0 |
0 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 |
1 | 0 | 1 | 0 |
0 | 0 | 1 | 1 |
0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 |
1表示该事件发生了,0表示该事件没发生。
比如第一个样本表示 喝酒 逛街 没有学习,最后挂科了。
现在我们要判断一个人
没喝酒(x1=0),没逛街(x2=0),学习(x3=1)->有没有挂科(y为0还是1),他挂科的概率是多少。
p表示概率
事件A=考挂了
事件B=喝酒
事件C=逛街
事件D=学习
p(A∧B)=事件A和事件B同时发生的概率
p(A|B)=事件B发生的情况下事件A发生的概率
p
(
A
∣
B
)
=
p
(
A
∧
B
)
p
(
B
)
p(A|B)=\dfrac{p(A\land B)}{p(B)}
p(A∣B)=p(B)p(A∧B)
p
(
B
∣
A
)
=
p
(
B
∧
A
)
p
(
A
)
p(B|A)=\dfrac{p(B\land A)}{p(A)}
p(B∣A)=p(A)p(B∧A)
p
(
A
∣
B
)
p
(
B
)
=
p
(
B
∣
A
)
p
(
A
)
p(A|B)p(B)=p(B|A)p(A)
p(A∣B)p(B)=p(B∣A)p(A)
p(B)右移得到贝叶斯公式
p
(
A
∣
B
)
=
p
(
B
∣
A
)
p
(
A
)
p
(
B
)
p(A|B)=\dfrac{p(B|A)p(A)}{p(B)}
p(A∣B)=p(B)p(B∣A)p(A)
应用到刚才的题目里面,即判断p(y=1|x1=0,x2=0,x3=1)和p(y=0|x1=0,x2=0,x3=1)哪一个概率大
代入贝叶斯公式
p
(
y
=
1
∣
x
1
,
x
2
,
x
3
)
=
p
(
x
1
,
x
2
,
x
3
∣
y
)
p
(
y
)
p
(
x
1
,
x
2
,
x
3
)
p(y=1|x1,x2,x3)=\dfrac{p(x1,x2,x3|y)p(y)}{p(x1,x2,x3)}
p(y=1∣x1,x2,x3)=p(x1,x2,x3)p(x1,x2,x3∣y)p(y)
p
(
y
=
0
∣
x
1
,
x
2
,
x
3
)
=
p
(
x
1
,
x
2
,
x
3
∣
y
)
p
(
y
)
p
(
x
1
,
x
2
,
x
3
)
p(y=0|x1,x2,x3)=\dfrac{p(x1,x2,x3|y)p(y)}{p(x1,x2,x3)}
p(y=0∣x1,x2,x3)=p(x1,x2,x3)p(x1,x2,x3∣y)p(y)
由于这两个式子分母一样,所有只要比较分子的大小。
根据马尔可夫假设
p
(
x
1
,
x
2
,
x
3
∣
y
)
p
(
y
=
1
)
≈
p
(
x
1
∣
y
)
p
(
x
2
∣
y
)
p
(
x
3
∣
y
)
p
(
y
)
=
2
/
4
×
2
/
4
×
1
/
4
×
1
/
2
=
4
/
128
p
(
x
1
,
x
2
,
x
3
∣
y
)
p
(
y
=
0
)
≈
p
(
x
1
∣
y
)
p
(
x
2
∣
y
)
p
(
x
3
∣
y
)
p
(
y
)
=
3
/
4
×
2
/
4
×
3
/
4
×
1
/
2
=
18
/
128
p(x1,x2,x3|y)p(y=1)\approx p(x1|y)p(x2|y)p(x3|y)p(y)\\=2/4\times2/4\times1/4\times1/2\\=4/128\\ p(x1,x2,x3|y)p(y=0)\approx p(x1|y)p(x2|y)p(x3|y)p(y)\\=3/4\times2/4\times3/4\times1/2\\=18/128
p(x1,x2,x3∣y)p(y=1)≈p(x1∣y)p(x2∣y)p(x3∣y)p(y)=2/4×2/4×1/4×1/2=4/128p(x1,x2,x3∣y)p(y=0)≈p(x1∣y)p(x2∣y)p(x3∣y)p(y)=3/4×2/4×3/4×1/2=18/128
可以看出p(y=0|x1,x2,x3)的概率更大,所以不会挂科(y=0)为判断结果。
朴素贝叶斯分类器训练函数
def trainNB0(trainMatrix,trainCategory): numTrainDocs=len(trainMatrix) numWords=len(trainMatrix[0]) pAbusive=sum(trainCategory)/float(numTrainDocs) p0Num=zeros(numWords);p1Num=zeros(numWords) #初始化分子变量和分母变量 p0Denom=0.0;p1Denom=0.0 for i in range(numTrainDocs): #遍历训练集中的所有文档 if trainCategory[i]==1: #如果词条出现在文档中 p1Num+=trainMatrix[i] #增加词条计数词 p1Denom+=sum(trainMatrix[i]) #增加所有词条计数值 else: p0Num+=trainMatrix[i] p0Denom+=sum(trainMatrix[i]) p1Vect=p1Num/p1Denom #计算条件概 率 p0Vect=p0Num/p0Denom return p0Vect,p1Vect,pAbusive
朴素贝叶斯分类函数
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1): #计算两个类别的概率,返回概率更大的类别 p1=sum(vec2Classify*p1Vec)+log(pClass1)#使用NumPy的数组来计算两个向量相乘的结果 p0=sum(vec2Classify*p0Vec)+log(1.0-pClass1) if p1>p0: return 1 else: return 0 def testingNB(): listOPosts,listClasses=loadDataSet() myVocabList=createVocabList(listOPosts) trainMat=[] for postinDoc in listOPosts: trainMat.append(setOfWords2Vec(myVocabList,postinDoc)) p0V,p1V,pAb=trainNB0(array(trainMat),array(listClasses))#计算得到三个概率 testentry=['love','my','dalmation']#测试文档 thisDoc=array(setOfWords2Vec(myVocabList,testentry)) print testentry,'calssified as:',classifyNB(thisDoc,p0V,p1V,pAb)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。