朴素贝叶斯算法实现

@TOC朴素贝叶斯算法
定义:
朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法
首先引入几个基本的概念(稍等一下哈)

概率重要性质

  1. P( ∅ \emptyset )=0
  2. 有限可加性,若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)
  3. 设A,B是两个事件,若A ⊂ \subset B,则P(B) ≥ \geq P(A)
  4. 对于任一事件A,P(A) ≤ \leq 1
  5. 逆事件的概率,P( A ˇ \check{A} Aˇ)= 1 - P(A)
  6. 加法公式,对于任意事件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 BA)
定义:设A,B是两个事件,且P(A)>0,称
P( B ∣ A B|A BA)= 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 BA)= 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 BAi)

先验概率

根据以往的经验和分析得到的概率

贝叶斯公式

贝叶斯公式其实就是计算后验概率
已知条件概率公式 P( B ∣ A B|A BA)= 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 BAi)

得出贝叶斯公式

P( B i ∣ A B_i|A BiA)= 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(ABi)P(AB)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类别")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值