朴素贝叶斯分类器(Python实现)

本文介绍了一种基于Python的朴素贝叶斯分类器实现方法。通过具体实例展示了如何利用该分类器进行文本分类,并提供了完整的代码示例。文中详细解释了朴素贝叶斯分类器的基本原理及其实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本思想:

朴素贝叶斯分类器,在当给出了特征向量w情况下,分类为ci的条件概率p(ci | w)。
利用贝叶斯公式:p(ci | w) = p(w | ci) * p(ci) / p(w),可以完成转化,观察公式可以发现分母p(w)都一样,所以只要比较分子的大小即可。
其中,p(ci)概率很容易求出;而对于条件概率p(w | ci),利用假设各个特征之间相互独立,因此,由w = {w1, w2, …, wn),即可以得出p(w | ci) = p(w1 | ci) * p(w2 | ci) * … * p(wn | ci),这也是朴素贝叶斯中“朴素”的意义。
利用python中的NumPy实现起来很简单,但是要注意的是这里为了防止下溢出(乘积较小)的情况发生,这里需要改为求log(p(ci | w))。


代码:

# coding=utf-8
# python 2.7
# 朴素贝叶斯分类器实现

from numpy import *

def loadDataSet():
    postingList = [['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']]
    classVec = [0, 1, 0, 1, 0, 1]
    return  postingList, classVec

def createVocabList(dataSet):
    vacabList = set([])
    for doc in dataSet:
        vacabList = vacabList | set(doc)        # 集合求并集运算
    return list(vacabList)                      # 注意要转化成列表

# 将文章转化成词向量
def wordToVec(list, doc):
    vec = [0] * len(list)
    for word in doc:
        if word in list:
            vec[list.index(word)] = 1
        else :
            print 'thr word: %s is not in my vocabulary!' % word
    return vec

# 训练函数,通过贝叶斯公式计算出特征概率向量
def trainNB(mat, cate):
    docNum = len(mat)
    wordNum = len(mat[0])
    pAb = sum(cate) * 1.0 / docNum
    p1Vec = ones(wordNum); p0Vec = ones(wordNum)      # 对数转化处理
    p1Denom = 2.0; p0Denom = 2.0
    for i in range(docNum):
        if cate[i] == 1:
            p1Vec += mat[i]
            p1Denom += sum(mat[i])
        else :
            p0Vec += mat[i]
            p0Denom += sum(mat[i])
    p1Vec = log(p1Vec / p1Denom)        # 对数转化处理
    p0Vec = log(p0Vec / p0Denom)
    return  p0Vec, p1Vec, pAb           # p0Vec是特征在0分类下的概率向量,p1Vec是特征在1分类下的概率向量,pAb是取得1分类的概率

# 分类函数
def classfyNB(testVec, p0Vec, p1Vec, pAb):
    p0 = sum(testVec * p0Vec) + log(1 - pAb)        # 这里sum(testVec * p0Vec)可以理解为p0Vec中出现的特征对数求和,也就是取对数之前的求乘积
    p1 = sum(testVec * p1Vec) + log(pAb)
    if p0 > p1:
        return 0
    else:
        return 1

def testingNB():
    postData, listClasses = loadDataSet()
    vocabList = createVocabList(postData)
    trainMat = []
    for doc in postData:
        trainMat.append(wordToVec(vocabList, doc))
    p0Vec, p1Vec, pAb = trainNB(trainMat, listClasses)
    doc = ['love', 'my', 'dalmation']
    testVec = array(wordToVec(vocabList, doc))
    print doc, 'classfied as: ', classfyNB(testVec, p0Vec, p1Vec, pAb)
    doc = ['stupid', 'garbage']
    testVec = array(wordToVec(vocabList, doc))
    print doc, 'classfied as: ', classfyNB(testVec, p0Vec, p1Vec, pAb)

testingNB()
朴素贝叶斯分类器是一种常用的机器学习算法,用于进行文本分类、垃圾邮件过滤等任务。在Python中,有多个包可以实现朴素贝叶斯分类器,其中最常用的包是scikit-learn(sklearn)。 scikit-learn是一个功能强大的机器学习库,提供了丰富的机器学习算法实现,包括朴素贝叶斯分类器。使用scikit-learn实现朴素贝叶斯分类器的步骤如下: 1. 导入所需的库和模块: ```python from sklearn.feature_extraction.text import CountVectorizer from sklearn.naive_bayes import MultinomialNB ``` 2. 准备数据集: ```python # 假设有两个类别的文本数据,分别为正面和负面 X_train = ['I love this movie', 'This movie is great', 'I hate this movie', 'This movie is terrible'] y_train = ['positive', 'positive', 'negative', 'negative'] ``` 3. 特征提取: ```python # 使用CountVectorizer将文本转换为特征向量 vectorizer = CountVectorizer() X_train_vec = vectorizer.fit_transform(X_train) ``` 4. 构建朴素贝叶斯分类器模型进行训练: ```python # 创建朴素贝叶斯分类器对象 classifier = MultinomialNB() # 使用训练数据进行模型训练 classifier.fit(X_train_vec, y_train) ``` 5. 使用模型进行预测: ```python # 假设有一个新的文本需要进行分类 X_test = ['This movie is amazing'] # 将新文本转换为特征向量 X_test_vec = vectorizer.transform(X_test) # 使用训练好的模型进行预测 y_pred = classifier.predict(X_test_vec) print(y_pred) ``` 以上就是使用scikit-learn包实现朴素贝叶斯分类器的基本步骤。你可以根据自己的需求和数据进行相应的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值