Python实现朴素贝叶斯算法

Python实现朴素贝叶斯算法


1、算法介绍

朴素贝叶斯假设特征相互独立,于是有下面的公式: x表示特征向量,c表示类别。
这里写图片描述
原理: 通过数据集计算出公式中右边分子中的各个概率。预测时根据公式计算出该样本属于不同类别的概率,选择概率大的那个类别作为预测值。


2、算法流程

模型中各个概率的计算,看下面代码中的 trainNB() 函数。


3、Python代码实现及注释

import numpy as np


# 创建数据集
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']]
    # 1表示不好,0表示好
    classVec = [0, 1, 0, 1, 0, 1]
    return postingList, classVec


# 从数据集中生成词汇表
def createVocabList(dataSet):
    # 创建空集合
    vocabSet = set([])
    # 提取数据集中所有的词汇,不重复
    for document in dataSet:
        vocabSet = vocabSet | set(document)
    return list(vocabSet)


# 把文本转化为特征向量
def setOfWords2Vec(vocabList, inputSet):
    # 创建特征向量,全0
    returnVec = [0]*len(vocabList)
    # 文本中出现的词汇相应的在特征向量中对应的位置置1
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else:
            print("the word: %s is not in my Vocabulary!" % word)
    return returnVec


# 创建贝叶斯分类器,输入用特征向量表示的数据集及数据集的标记
def trainNB(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    # 计算数据集中不好语句的占比
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    # 存放不同类别中各词汇出现的次数
    p0Num = np.ones(numWords)
    p1Num = np.ones(numWords)
    # 存放不同类别中词汇的总数
    p0Denom = 2.0
    p1Denom = 2.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 = np.log(p1Num/p1Denom)
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect, p1Vect, pAbusive


# 用朴素的贝叶斯分类
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    # 计算该样本属于不同类别的概率,注意加了一个log
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)
    p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1)
    # 根据概率预测结果
    if p1 > p0:
        return 1
    else:
        return 0


# 把数据集转换为用特征向量表示样本的数据集
def getTrainMat(trainSet, myVocabList):
    trainMat = []
    for example in trainSet:
        trainMat.append(setOfWords2Vec(myVocabList, example))
    return trainMat


if __name__ == '__main__':
    # 加载数据集
    trainSet, labels = loadDataSet()
    # 构建词汇表
    myVocabList = createVocabList(trainSet)
    # 得到用特征向量表示样本的数据集
    trainMat = getTrainMat(trainSet, myVocabList)
    # 朴素的贝叶斯分类器得到模型参数
    p0V, p1V, pAb = trainNB(trainMat, labels)
    # print(p0V, '\n', p1V, '\n', pAb)
    # 测试分类器
    test = ['cute', 'has']
    testVec = np.array(setOfWords2Vec(myVocabList, test))
    predict = classifyNB(testVec, p0V, p1V, pAb)
    print(test, 'be predicted as ', predict)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您解答关于朴素贝叶斯算法的问题,并提供用Python实现朴素贝叶斯算法的方法。 朴素贝叶斯算法是一种基于概率统计的分类方法,它的基本思想是通过先验概率和条件概率来计算后验概率,从而得到最终的分类结果。具体来说,朴素贝叶斯算法假设所有特征之间相互独立,从而简化了计算过程,因此被广泛应用于自然语言处理、文本分类等领域。 下面是用Python实现朴素贝叶斯算法的步骤: 1. 收集数据:根据具体问题收集相关数据集,例如文本分类数据集、垃圾邮件数据集等。 2. 准备数据:将数据集转换成适合朴素贝叶斯算法使用的形式,通常是特征向量。 3. 训练模型:根据训练数据计算先验概率和条件概率,构建朴素贝叶斯分类器模型。 4. 测试模型:使用测试数据对训练好的模型进行评估,计算分类准确率等指标。 5. 应用模型:将模型应用于新的数据集,进行分类预测。 以下是一个简单的朴素贝叶斯算法实现示例: ```python import numpy as np class NaiveBayes: def fit(self, X, y): n_samples, n_features = X.shape self.classes = np.unique(y) n_classes = len(self.classes) # 计算先验概率 self.priors = np.zeros(n_classes) for i, c in enumerate(self.classes): self.priors[i] = np.sum(y == c) / float(n_samples) # 计算条件概率 self.means = np.zeros((n_classes, n_features)) self.vars = np.zeros((n_classes, n_features)) for i, c in enumerate(self.classes): X_c = X[y == c] self.means[i] = np.mean(X_c, axis=0) self.vars[i] = np.var(X_c, axis=0) def predict(self, X): y_pred = [] for x in X: posteriors = [] for i, c in enumerate(self.classes): prior = np.log(self.priors[i]) likelihood = np.sum(np.log(self._pdf(x, self.means[i], self.vars[i]))) posterior = prior + likelihood posteriors.append(posterior) y_pred.append(self.classes[np.argmax(posteriors)]) return y_pred def _pdf(self, x, mean, var): eps = 1e-4 coef = np.sqrt(2 * np.pi * var + eps) exponent = -(x - mean)**2 / (2 * var + eps) return np.log(coef * np.exp(exponent + eps)) ``` 该实现使用了numpy库进行矩阵计算,包括计算先验概率、条件概率、似然函数等。其,_pdf函数用于计算概率密度函数。 使用示例: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score X, y = load_iris(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) clf = NaiveBayes() clf.fit(X_train, y_train) y_pred = clf.predict(X_test) acc = accuracy_score(y_test, y_pred) print("Accuracy:", acc) ``` 这里使用sklearn库的鸢尾花数据集进行测试,将数据集分成训练集和测试集,使用上面实现的NaiveBayes模型进行训练和预测,最后输出准确率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值