机器学习|贝叶斯算法

目录

一、贝叶斯算法概述

1、贝叶斯要解决的问题:

2、贝叶斯公式推导

二、拼写纠正实例

三、垃圾邮件过滤实例

1、分析

2、朴素贝叶斯算法

(1)邮件数据读取

(2)预料表与特征向量构建

(3)分类别统计词频

(4)贝叶斯公式对数变换

(5)完成预测模块



一、贝叶斯算法概述

1、贝叶斯要解决的问题:

        正向概率:假设袋子里面有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大?

        逆向概率:如果我们事先并不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例做出什么样的推测?

2、贝叶斯公式推导

        用一个实例进行推导:

一个学校男生占60%,女生占40%,男生总是穿长裤,女生一半穿长裤一半穿裙子

        ·正向概率:随机选取一个学生,ta穿长裤的概率和穿裙子的概率。

        ·逆向概率:你看到一位穿长裤的学生,你只看见ta穿的是长裤,而无法确定ta的性别,推断ta是女生的概率。

        假设学校里面的人总数是U个,则穿长裤的男生

eq?U%5Ctimes%20P%28boy%29%5Ctimes%20P%28pants%7Cboy%29

        穿长裤的女生

eq?U%5Ctimes%20P%28girl%29%5Ctimes%20P%28pants%7Cgirl%29

        所以穿长裤的总人数

eq?U%5Ctimes%20P%28boy%29%5Ctimes%20P%28pants%7Cboy%29+U%5Ctimes%20P%28girl%29%5Ctimes%20P%28pants%7Cgirl%29

        所以穿长裤的人是女生的概率为:

eq?P%28girl%7Cpants%29%3D%5Cfrac%7BU%5Ctimes%20P%28girl%29%5Ctimes%20P%28pants%7Cgirl%29%7D%7BU%5Ctimes%20P%28boy%29%5Ctimes%20P%28pants%7Cboy%29+U%5Ctimes%20P%28girl%29%5Ctimes%20P%28pants%7Cgirl%29%7D

                 eq?%3D%5Cfrac%7BP%28girl%29%5Ctimes%20P%28pants%7Cgirl%29%7D%7BP%28boy%29%5Ctimes%20P%28pants%7Cboy%29+P%28girl%29%5Ctimes%20P%28pants%7Cgirl%29%7D

                                                    eq?%3D%5Cfrac%7BP%28girl%29%5Ctimes%20P%28pants%7Cgirl%29%7D%7BP%28pants%29%7D

        所以贝叶斯公式为:

eq?P%28A%7CB%29%3D%5Cfrac%7BP%28A%29P%28B%7CA%29%7D%7BP%28B%29%7D

二、拼写纠正实例

问题用户输入一个不在字典里的单词,我们需要去猜测他真正想输入的单词是什么。

即求:P(猜测的他想输入的单词|他实际输入的单词),判断哪个猜测成功的概率更大。

        假设用户实际输入的单词记为D(观测数据),则猜测1:P(h1|D),猜测2:P(h2|D),猜测3:P(h3|D)······统一为:P(h|D)

        所以

eq?P%28h%7CD%29%3D%5Cfrac%7BP%28h%29P%28D%7Ch%29%7D%7BP%28D%29%7D

        而对于不同的猜测,P(D)都是一样的,所以在比较P(h1|D)和P(h2|D)时可以忽略这个常数。

        所以 eq?P%28h%7CD%29%5Cpropto%20P%28h%29P%28D%7Ch%29

        可以看出,对于给定的观测数据,一个猜测是好是坏,取决于这个猜测本身独立的可能性大小,即先验概率(Prior),和这个猜测生成我们观测到的数据的可能性大小

        总之,贝叶斯方法计算:P(h)P(D|h),P(h)是特定猜测的先验概率,P(D|h)可以由自己指定的规则得出。

三、垃圾邮件过滤实例

1、分析

问题给定一封邮件,判定它是否属于垃圾邮件。

        我们用D来表示这封邮件(D由n个单词组成),用h+表示垃圾邮件,h-表示正常邮件。

        由贝叶斯公式得:

eq?P%28h_%7B+%7D%7CD%29%3D%5Cfrac%7BP%28h_%7B+%7D%29P%28D%7Ch_%7B+%7D%29%7D%7BP%28D%29%7D

eq?P%28h_%7B-%7D%7CD%29%3D%5Cfrac%7BP%28h_%7B-%7D%29P%28D%7Ch_%7B-%7D%29%7D%7BP%28D%29%7D

        先验概率:P(h+)和P(h-)这两个先验概率很容易求出来,只需计算一个邮件库里面垃圾邮件和正常邮件的比例就好了。

        D里面含有n个单词d1、d2、d3······,eq?P%28D%7Ch+%29%3DP%28d1%2Cd2%2C...%2Cdn%7Ch+%29,而P(d1,d2,...dn|h+)可以扩展为:

eq?P%28d1%7Ch+%29P%28d2%7Cd1%2Ch+%29P%28d3%7Cd2%2Cd1%2Ch+%29...

        假设di与di-1是完全条件无关的(朴素贝叶斯假设特征之间是独立的,互不影响),则简化为:

eq?P%28d1%7Ch+%29P%28d2%7Ch+%29P%28d3%7Ch+%29...

        而对于简化后的式子只要统计di这个单词在垃圾邮件中出现的频率即可。

2、朴素贝叶斯算法

(1)邮件数据读取

import numpy as np
import re
import random

#进行预处理
def textParse(input_string):
    listofTokens = re.split(r'\W+',input_string)
    return [tok.lower() for tok in listofTokens if len(listofTokens)>2]

#入口函数
def spam():
    doclist=[]
    classlist=[]
    for i in range (1,26):
        wordlist = textParse(open('email/spam/%d.txt'%i,'r').read())
        doclist.append(wordlist)
        classlist.append(1) #1表示垃圾邮件

        wordlist = textParse(open('email/ham/%d.txt'%i,'r').read())
        doclist.append(wordlist)
        classlist.append(0) #0表示正常邮件

(2)预料表与特征向量构建

        创建预料表

def creatVocablist(doclist):
    vocabSet = set([])
    for document in doclist:
        vocaSet = vocabSet|set(document)
    return list(vocabSet)

        得到预料表的返回值

vocablist = creatVocablist(doclist)

        切分训练集和测试集

trainSet = list(range(50))
testSet = []
for i in range(10):
    ranIndex = int(random.uniform(0,len(trainSet)))
    testSet.append(trainSet[randIndex])
    del(trainSet[randIndex])
trainMat=[]
trainClass=[]
for docIndex in trainSet:
    trainMat.append(setOfWord2Vec(vocablist,doclist[docIndex]))
    trainClass.append(classlist[docIndex])

        其中setOfWord2Vec函数定义如下:

def setOfWord2Vec(vocablist,inputSet):
    returnVec = [0]*len(vocablist)
    for word in inputSet:
        if word in vocablist:
            returnVec[vocablist.index(word)] = 1
    return returnVec

(3)分类别统计词频

def trainNB( trainMat , trainClass):
    numTrainDocs = len(trainMat)
    numWords = 1en(trainMat[0])
    p1 = sum(trainClass )/float (numTrainDocs)
    p0Num = np. ones((numWords)) #做了一个平滑处理
    p1Num = np. ones((numWords)) #拉普拉斯平滑
    p0Denom = 2
    p1Denom = 2 #通常情况下都是设置成类别个数
    for i in range( numTrainDocs) :
        if trainClass[i] ==1 #垃圾邮件
            p1Num += trainMat [i]
            p1Denom += sum(trainMat [i])
        else:
            p0Num += trainMat [i]
            p0Denom += sum( trainMat [i] )

(4)贝叶斯公式对数变换

p1Vec = np.log(p1Num/ p1Denom)
p0Vec = np. log(p0Num/ p0Denom)

        得到返回值

p0Vec,p1Vec,p1 = trainNB(np.array(trainMat),np.array(trainClass))


(5)完成预测模块

errorCount = 0
for docIndex in testSet:
    wordVec = set0fWord2Vec(vocablist,doclist [docIndex])
    if classifyNB(np. array( wordVec ) , p0Vec ,p1Vec,p1) != classlist [docIndex]:
        errorCount+= 1
print ('当前10个样本,错误个数:' , errorCount)

        其中classifyNB函数为:

def classifyNB( wordVec , p0Vec, p1Vec,p1_ class):
    p1 = np.log(p1_ class) + sum( wordVec*p1Vec)
    p0 = np.log(1.0 - p1_ class) + sum( wordVec*p0Vec)
        if p0>p1 :
            return 0
        else:
            return 1

        测试结果:

47c1c8e2adbe4a44884fdfcc940f5b07.png

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,它假设特征之间相互独立。这个假设使得算法具有较快的训练和预测速度,并且在处理大规模数据集时表现良好。 下面我将用图解的方式详细介绍朴素贝叶斯算法的原理和步骤。 首先,我们需要准备一个分类任务的数据集。假设我们要构建一个垃圾邮件分类器,数据集包含了一些已经标记好的邮件样本,每个邮件样本都有一些特征(如邮件内容、发件人等)和对应的标签(垃圾邮件/非垃圾邮件)。 第一步是计算先验概率。先验概率指的是在没有任何特征信息的情况下,某个样本属于某个类别的概率。在我们的例子中,就是计算垃圾邮件和非垃圾邮件出现的概率。 第二步是计算条件概率。条件概率指的是在已知某个特征条件下,某个样本属于某个类别的概率。对于朴素贝叶斯算法来说,我们假设所有特征之间相互独立,因此可以将条件概率拆分为各个特征的概率乘积。我们需要计算每个特征在每个类别下的概率。 第三步是应用贝叶斯定理。贝叶斯定理可以根据已知的特征计算某个样本属于某个类别的后验概率。后验概率越大,就说明该样本属于该类别的可能性越大。 最后,我们可以根据后验概率进行分类预测。选择具有最大后验概率的类别作为预测结果。 总结一下,朴素贝叶斯算法通过计算先验概率、条件概率和应用贝叶斯定理,实现了对样本的分类预测。它的优势在于简单、快速,并且在一些特定的数据集上表现出色。然而,它的假设可能不符合实际情况,所以在实际应用中需要考虑和验证数据的特性和假设的合理性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值