Python实现的朴素贝叶斯算法经典示例【测试可用】

yizhihongxing

Python实现的朴素贝叶斯算法经典示例【测试可用】详细攻略

朴素贝叶斯算法是一种常见分类算法,它基于贝叶斯定理和特征条件独立假设,可以用于文本分类、圾邮件过滤、情感分析等领域。在本文中,我们将介绍Python实现的朴素贝叶斯算法经典示例,并提供测试代码。

朴素贝叶斯算法原理

朴素贝叶斯算法是一种基于贝叶斯定理的分类算法,它假设每个特征之间是相互独立的,即特征之间不存在相关性。根据贝叶斯定理,我们可以得到以下公式:

$$P(c|x_1,x_2,...,x_n)=\frac{P(c)P(x_1,x_,...,x_n|c)}{P(x_1,x_,...,x_n)}$$

其中,$c$表示类别,$x_1,x_,...,x_n$表示特征。我们需要计算$(c|x_1,x_2,...,x_n)$的概率,即在给定特征$x_1,x_2,...,x_n$的条件下,类别$c$的概率。根据贝叶定理,我们可以将其转化为以下公式:

$$P(c|x_1,x_2,...,x_n)=\frac{P(c)P(x_1,x_2,...,x_n|c)}{\sum_{i}P(c_i)P(x_1,x_2,...,x_n|c_i)}$$

其中,$c_i$表示所有类别,$\sum_{i}P(c_i)P(x_1,x_2,...,x_n|c_i)$表示所有类别的概率和。

朴素贝叶斯算法示例

示例1:使用朴素贝叶斯算法进行文本分类

在这个示例中,我们将使用朴素贝叶斯算法对文本进行分类。我们首先需要准备训练数据和测试数据。训练数据包含多个文本和对应的类别,测试数据包含多个文本。我们需要使用训练数据训练模型,并使用测试数据测试模型的准确率。

import os
import re
import math
from collections import defaultdict

class NaiveBayesClassifier:
    def __init__(self):
        self.vocab = set()  # 词汇表
        self.labels = set()  # 类别集合
        self.label_word_count = defaultdict(int)  # 每个类别中单词的数量
        self.label_count = defaultdict(int)  # 每个类别的数量
        self.word_count = 0  # 单词总数

    def train, data):
        for label, text in data:
            self.labels.add(label)
            self.label_count[label] += 1
            for word in self.tokenize(text):
                self.vocab.add(word)
                self.label_word_count[label, word] += 1
                self.word_count += 1

    def classify(self, text):
        probabilities = {}
        for label in self.labels:
            probabilities[label] = math.log(self.label_count[label] / sum(self.label_count.values()))
            for word in self.tokenize(text):
                probabilities[label] += math.log((self.label_word_count[label, word] + 1) / (self.label_count[label] + len(self.vocab)))
        return max(probabilities, key=probabilities.get)

    def tokenize(self, text):
        text = text.lower()
        text = re.sub(r'[^\w\s]', '', text)
        return text.split()

def load_data(path):
    data = []
    for label in os.listdir(path):
        for file in os.listdir(os.path.join(path, label)):
            with open(os.path.join(path, label, file), 'r', encoding='utf-8') as f:
                text = f.read()
                data.append((label, text))
    return data

train_data = load_data('train')
test_data = load_data('test')

classifier = NaiveBayesClassifier()
classifier.train(train_data)

correct = 0
for label, text in test_data:
    if classifier.classify(text) == label:
        correct += 1

accuracy = correct / len(test_data)
print('Accuracy:', accuracy)

在这个示例中,我们首先定义了一个名为NaiveBayesClassifier的类,它包含train和classify两个方法。train方法用于训练模型,classify方法用于对文本进行分类。我们使用defaultdict(int)来初始化label_word_count和label_count,它们分别表示每个类别中单词的数量和每个类别的数量。我们使用set来初始化vocab和labels,它们分表示词汇表和类别集合。我们使用tokenize方法将文本转换为单词列表。

在train方法中,我们遍历训练数据,对每个文本进行处理。我们使用add方法将类别添加到labels集合中,使用+=运算符将类别的数量加1。我们使用tokenize方法将文本转换为单词列表,遍历单词列表,对每个单词进行处理。使用add方法将单词添加到vocab集合中,使用+=运算符将单词在该类别中的数量加1,使用+=运算符将单词总数加1。

在classify方法中,我们首先定义一个空字典probabilities,用于存储每个类的概率。我们遍历labels集合,对每个类别进行处理。我们使用math.log计算别的先验概率。我们使用tokenize方法将文本转换为单词列表,遍历单词列表,对每个单词进行处理。我们使用math.log计算单词在该类别中的条件概率。最后,我们返回概率最大的类别。

load_data方法中,我们遍历训练数据或测试数据,对每个文本进行处理。我们使用os.listdir获取目录下的所有文件名,使用os.path.join拼接文件路径,使用with语句打开文件,使用read方法读取文件内容,将类别和文本添加到data列表中。

在主程序中,我们首先使用load_data加载训练数据和测试数据。我们使用NaiveBayesClassifier类创建一个分类器对象classifier,并使用train方法训练模型。我们遍历测试数据,对每个文本进行处理,使用classify方法对文本进行分类。我们使用if语句判断分类结果是否正确,使用+=运算符将正确分类数量加1。最后,我们计算准确率并输出结果。

示例2:使用朴素贝叶斯算法进行垃圾邮件过滤

在这个示例中,我们将使用朴素贝叶斯算法对邮件进行分类,判断是否为垃圾邮件。我们需要准备训练数据和测试数据,训练数据包含多个邮件和对应的类别,测试数据包含多个邮件。我们需要使用训练数据训练模型,并使用测试数据测试模型的准确率。

import os
import re
import math
from collections import defaultdict

class NaiveBayesClassifier:
    def __init__(self):
        self.vocab = set()  # 词汇表
        self.labels = set()  # 类别集合
        self.label_word_count = defaultdict(int)  # 每个类别中单词的数量
        self.label_count = defaultdict(int)  # 每个类别的数量
        self.word_count = 0  # 单词总数

    def train(self, data):
        for label, text in data:
            self.labels.add(label)
            self.label_count[label] += 1
            for word in self.tokenize(text):
                self.vocab.add(word)
                self.label_word_count[label, word] += 1
                self.word_count += 1

    def classify(self, text):
        probabilities = {}
        for label in self.labels:
            probabilities[label] = math.log(self.label_count[label] / sum(self.label_count.values()))
            for word in self.tokenize(text):
                probabilities[label] += math.log((self.label_word_count[label, word] + 1) / (self.label_count[label] + len(self.vocab)))
        return max(probabilities, key=probabilities.get)

    def tokenize(self, text):
        text = text.lower()
        text = re.sub(r'[^\w\s]', '', text)
        return text.split()

def load_data(path):
    data = []
    for label in os.listdir(path):
        for file in os.listdir(os.path.join(path, label)):
            with open(os.path.join(path, label, file), 'r', encoding='utf-8') as f:
                text = f.read()
                data.append(('spam' if label == 'spam' else 'ham', text))
    return data

train_data = load_data('train')
test_data = load_data('test')

classifier = NaiveBayesClassifier()
classifier.train(train_data)

correct = 0
for label, text in test_data:
    if classifier.classify(text) == label:
        correct += 1

accuracy = correct / len(test_data)
print('Accuracy:', accuracy)

在这个示例,我们首先定义了一个名为NaiveBayesClassifier的类,它包含train和classify两个方法。train方法用于训练模型,classify方法用于对邮件进行分类。我们使用defaultdict(int)来初始化label_word_count和label_count,它们分表示每个类别中单词的数量和每个类别的数量。我们使用set()来初始化vocab和labels,它们分别表示词汇表和类别集合。我们使用tokenize方法将邮件转换为单词列表。

train方法中,我们遍历训练数据,对每个邮件进行处理。我们使用add方法将类别添加到labels集合中,使用+=运算将类别的数量加1。我们使用tokenize方法将邮件转换为单词列表,遍历单词列表,对每个单词进行处理。我们使用add方法将单词添加到vocab集合中,使用+=运算符将单词在该类别中的数量加1,使用+=运算符将单词总数加1。

在classify方法中,我们首先定义一个空字典probabilities,用于存储每个类别的概率。我们遍历labels集合,对每个类别进行处理。我们使用math.log计算类别的先验概率。我们使用tokenize方法将邮件转换为单词列表,遍历单词列表,对每个单词进行处理。我们使用math.log计算单词在该类别中的条件概率。最后,我们返回概率最大的类。

在load_data方法中,我们遍历训练数据或测试数据,对每个邮件进行处理。我们使用os.listdir获取目录下的所有文件名,使用os.path.join拼接文件路径,使用with语句打开文件,使用read方法读取文件内容,将类别和邮件添加到列表中。我们将垃圾邮件的类别设置为'spam',将正常邮件的类别设置为'ham'。

在主程序中,我们首先使用load_data方法加载训练数据和测试数据。我们使用NaiveBayesClassifier类创建一个分类器对象classifier,并使用train方法训练模型。我们遍历测试数据,对每个邮件处理,使用classify方法对邮件进行分类。我们使用if语句判断分类结果是否正确,使用+=运算符将正确分类的数量加1。最后,我们计算准确率并输出结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python实现的朴素贝叶斯算法经典示例【测试可用】 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Random 在 Python 中的使用方法

    下面我将详细讲解如何在Python中使用Random模块,包括生成随机数、洗牌、从序列中随机选择元素等常用操作。 引入Random模块 在Python中使用Random模块,首先需要引入模块: import random 随机生成数字 生成浮点数 使用random模块的random()函数可以生成[0,1)之间的随机浮点数,示例如下: import rand…

    python 2023年5月13日
    00
  • Python多进程与多线程的使用场景详解

    Python多进程与多线程的使用场景详解 Python中提供了多进程和多线程两种方式来实现并发操作。本文将详细讲解它们的使用场景及示例说明,以帮助你更好地选择使用方法。 多进程适合的场景 多进程主要是针对CPU密集型任务,即需要大量计算的任务。因为Python解释器的GIL(Global Interpreter Lock)机制,多线程无法充分利用多核CPU,…

    python 2023年5月18日
    00
  • Python中的None与 NULL(即空字符)的区别详解

    在Python中,None和NULL(即空字符)是两个不同的概念。本文将详细讲解它们之间的区别,包括定义、用法和示例。 1. None的定义和用法 在Python中,None是一个特殊的对象,表示空值或缺失值。它常用于表示函数没有返回值或变量没有被赋值。以下是一个示例: def foo(): print("Hello, world!") …

    python 2023年5月14日
    00
  • 如何理解Python中的变量

    理解Python中的变量是Python编程中的基础知识之一,这里我们将从以下几个方面逐一进行讲解: 什么是变量 变量是程序中存储值的容器,可以将数据存储在变量中,变量可以是数字、字符串、布尔值、对象等。程序中的变量是有类型的,由于Python是一种解释性语言,因此变量声明和类型定义是自动的,无需手动指定类型。 如何声明变量 在Python中声明变量非常简单,…

    python 2023年5月18日
    00
  • Python实现随机森林RF模型超参数的优化详解

    Python实现随机森林RF模型超参数的优化详解 什么是随机森林? 随机森林(Random Forest,RF)是一种集成学习(Ensemble Learning)方法,通过集成多个决策树来实现分类、回归等任务。随机森林模型在机器学习中应用广泛,被认为是一种性能比较优秀的算法之一。 随机森林的参数 随机森林模型的参数主要包括两类: 决策树参数,如树的深度、每…

    python 2023年6月3日
    00
  • 详解Python编程中对Monkey Patch猴子补丁开发方式的运用

    详解Python编程中对Monkey Patch猴子补丁开发方式的运用 什么是猴子补丁 猴子补丁(Monkey Patching)是指在运行时动态修改一个类或模块的行为,可以加入、删除或修改属性和方法。在Python中,猴子补丁可以用来修改第三方库中的函数或方法,或者动态增加自己的代码,实现一些特定的用途。 猴子补丁的实现方式 猴子补丁的实现方式有多种,最简…

    python 2023年6月3日
    00
  • 详解字符串在Python内部是如何省内存的

    下面是详解字符串在Python内部是如何省内存的完整攻略: 1. 字符串池 Python字符串内部是通过一种叫做“字符串池”的机制来省内存的。所谓字符串池,就是把所有出现过的字符串都保存起来,下次如果有相同的字符串,就直接返回内存中已经保存的那个字符串的引用,而不需要重新创建一遍。这个池子是全局的,对所有的Python代码都是共享的,因此理论上有可能遇到和预…

    python 2023年6月5日
    00
  • 正则给header的冒号两边参数添加单引号(Python请求用)

    下面是详细的攻略: 正则给header的冒号两边参数添加单引号 在Python中,我们经常使用requests库来发送HTTP请求。在发送请求时,我们需要设置请求头,其中包含了一些参数。有时候,我们需要将请求头中的参数用单引号括起来,以便于服务器正确解析。本文将介绍如何使用正则表达式给header的冒号两边参数添加单引号。 步骤一:获取请求头 首先,我们需要…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部