@TOC朴素贝叶斯算法
定义:
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法
首先引入几个基本的概念(稍等一下哈)
概率重要性质
- P( ∅ \emptyset ∅)=0
- 有限可加性,若A1,A2,…An是互不相容事件。P( A 1 ⋃ A_1\bigcup A1⋃ A 2 ⋃ A_2\bigcup A2⋃… ⋃ \bigcup ⋃ A n A_n An)=P( A 1 A_1 A1)+P( A 2 A_2 A2)+…+P( A n A_n An)
- 设A,B是两个事件,若A ⊂ \subset ⊂B,则P(B) ≥ \geq ≥P(A)
- 对于任一事件A,P(A) ≤ \leq ≤ 1
- 逆事件的概率,P( A ˇ \check{A} Aˇ)= 1 - P(A)
- 加法公式,对于任意事件A,B有P( A ⋃ A\bigcup A⋃ B B B)=P( A ) A) A)+P( B B B)-P( A B AB AB)
联合概率
对于两个事件A和B,A和B同时发生的概率,记作P(AB)或P(A,B)或P(A
⋂
\bigcap
⋂B)
假如两个事件相互独立,则P(A
⋂
\bigcap
⋂B)=P(A)*P(B)
条件概率
条件概率,是事件A已发生的条件下事件B发生的概率,记为P(
B
∣
A
B|A
B∣A)
定义:设A,B是两个事件,且P(A)>0,称
P(
B
∣
A
B|A
B∣A)=
P
(
A
B
)
P
(
A
)
{P(AB)\over P(A)}
P(A)P(AB)
是在A发生的条件下B发生的概率
例子:五张彩票只有两张能中奖,甲,乙等五个人抽奖,问甲中奖的情况下乙中奖的概率。
解:记甲中奖的概率为事件A,乙中奖的概率为事件B。
则甲,乙同时中奖的概率为
1
C
5
2
{1\over C^2_5}
C521=
1
10
{1\over 10}
101
甲中奖的概率为
C
2
1
C
5
1
{C^1_2\over C^1_5}
C51C21=
2
5
{2\over 5}
52
则甲中奖的情况下乙中奖的概率为P(
B
∣
A
B|A
B∣A)=
P
(
A
B
)
P
(
A
)
{P(AB)\over P(A)}
P(A)P(AB)=
1
10
{1\over 10}
101
÷
\div
÷
2
5
{2\over 5}
52 =
1
4
{1\over 4}
41
全概率公式
公式表示若事件A1,A2,…,An构成一个完备事件组且都有正概率,则对任意一个事件B都有公式成立
P(B)=P(A1)P(B|A1)+P(A2)P(B|A2)+…+P(An)P(B|An)=
∑
i
=
1
n
\sum_{i=1}^n
∑i=1nP(
A
i
A_i
Ai)*P(
B
∣
A
i
B|A_i
B∣Ai)
先验概率
根据以往的经验和分析得到的概率
贝叶斯公式
贝叶斯公式其实就是计算后验概率
已知条件概率公式 P(
B
∣
A
B|A
B∣A)=
P
(
A
B
)
P
(
A
)
{P(AB)\over P(A)}
P(A)P(AB)
P(AB)=P(B|A)*P(A)=P(A|B)*P(B)
再根据全概率公式
P(B)=
∑
i
=
1
n
\sum_{i=1}^n
∑i=1nP(
A
i
A_i
Ai)*P(
B
∣
A
i
B|A_i
B∣Ai)
得出贝叶斯公式
P( B i ∣ A B_i|A Bi∣A)= P ( A ∣ B ) ∗ P ( B ) ∑ i = 1 n P ( B i ) ∗ P ( A ∣ B i ) {P(A|B)*P(B)\over \sum_{i=1}^nP(B_i)*P(A|B_i)} ∑i=1nP(Bi)∗P(A∣Bi)P(A∣B)∗P(B)
from numpy import *
#贝叶斯算法
def loadDataSet():
trainData=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
labels=[0, 1, 0, 1, 0, 1] #1表示侮辱性言论,0表示正常言论
return trainData, labels
#生成词汇表
def createVocabList(trainData):
VocabList = set([])
for item in trainData:
VocabList = VocabList|set(item) #取两个集合的并集
return sorted(list(VocabList)) #对结果排序后返回
#对训练数据生成只包含0和1的向量集
def createWordSet(VocabList, trainData):
VocabList_len = len(VocabList) #词汇集的长度
trainData_len = len(trainData) #训练数据的长度
WordSet = zeros((trainData_len,VocabList_len)) #生成行长度为训练数据的长度 列长度为词汇集的长度的列表
for index in range(0,trainData_len):
for word in trainData[index]:
if word in VocabList: #其实也就是,训练数据包含的单词对应的位置为1其他为0
WordSet[index][VocabList.index(word)] = 1
return WordSet
#计算向量集每个的概率
def opreationProbability(WordSet, labels):
WordSet_col = len(WordSet[0])
labels_len = len(labels)
WordSet_labels_0 = zeros(WordSet_col)
WordSet_labels_1 = zeros(WordSet_col)
num_labels_0 = 0
num_labels_1 = 0
for index in range(0,labels_len):
if labels[index] == 0:
WordSet_labels_0 += WordSet[index] #向量相加
num_labels_0 += 1 #计数
else:
WordSet_labels_1 += WordSet[index] #向量相加
num_labels_1 += 1 #计数
p0 = WordSet_labels_0 * num_labels_0 / labels_len
p1 = WordSet_labels_1 * num_labels_1 / labels_len
return p0, p1
trainData, labels = loadDataSet()
VocabList = createVocabList(trainData)
train_WordSet = createWordSet(VocabList,trainData)
p0, p1 = opreationProbability(train_WordSet, labels)
#到此就算是训练完成
#开始测试
testData = [['not', 'take', 'ate', 'my', 'stupid']] #测试数据
test_WordSet = createWordSet(VocabList, testData) #测试数据的向量集
res_test_0 = []
res_test_1 = []
for index in range(0,len(p0)):
print(p0[index])
if test_WordSet[0][index] == 0:
res_test_0.append((1-p0[index]) * test_WordSet[0][index])
res_test_1.append((1-p1[index]) * test_WordSet[0][index])
else:
res_test_0.append(p0[index] * test_WordSet[0][index])
res_test_1.append(p1[index] * test_WordSet[0][index])
if sum(res_test_0) > sum(res_test_1):
print("属于0类别")
else:
print("属于1类别")