数据挖掘 朴素贝叶斯

直入正题,直接看代码:

这是一段判断是不是藏话的代码

python 复制代码
import numpy as np


# 数据采集(定义函数加载数据集)
def load_dataset():
    sent_list = [['my', 'name', 'is', 'Devin'],
                 ['you', 'are', 'stupid'],
                 ['my', 'boyfriend', 'is', 'SB'],
                 ['you', 'looks', 'very', 'smart', 'I', 'like', 'you', 'very', 'much']]
    class_vec = [-1, 1, 1, -1]  # -1代表不粗鲁,1代表粗鲁
    return sent_list, class_vec


# 数据预处理(创建一个包含数据集中所有单词的词汇表,词汇表中包含所有唯一的单词)
def create_vocab_list(dataset):
    vocab_set = set([])
    for doc in dataset:
        vocab_set = vocab_set | set(doc)
    return list(vocab_set)


# 将每一段文字进行离散化,即进行空间向量化
def set_of_words2vec(vocab_list, input_set):
    return_vec = [0] * len(vocab_list)
    for word in input_set:
        if word in vocab_list:
            return_vec[vocab_list.index(word)] = 1  # 如果该单词在词汇表中出现,则将 return_vec 中对应位置的值设为 1。
    return return_vec


# 建模与分析
def trainNB(train_matrix, train_catagory):
    num_train_docs = len(train_matrix)
    num_words = len(train_matrix[0])
    pos_num = 0
    for i in train_catagory:
        if i == 1:
            pos_num += 1
    pAbusive = pos_num / float(num_train_docs)
    p0_num = np.ones(num_words)  # 使用 NumPy 库创建了一个长度为 num_words 的一维数组 p0_num,并将数组中的所有元素初始化为 1。
    p1_num = np.ones(num_words)
    p0_demon = 2.0  # 当某个特征在某个类别下从未出现时,使用 Laplace 平滑会将该特征的出现次数初始化为一个小的正数(通常是 1),并将分母加上特征总数乘以一个小的正数(通常是特征的种类数),从而使得概率值不会变成零。
    p1_demon = 2.0
    for i in range(num_train_docs):
        if train_catagory[i] == 1:
            p1_num += train_matrix[i]  # p1_num=[1,0,1,0,1,1,1,1,1,0,0]
            p1_demon += sum(train_matrix[i])  # 样本中在类标签为1的单词出现的总次数p1_demon=7
        else:
            p0_num += train_matrix[i]  # p0_num=[1,0,1,0,1,1,1,1,1,0,0]
            p0_demon += sum(train_matrix[i])  # 样本中在类标签为0的单词出现总次数p0_demon=4
    p1_vect = np.log(p1_num / p1_demon)  # 举证p1_num和p0_num分别除以p1_demon和p0_demon即可以得到各自的条件概率
    p0_vect = np.log(p0_num / p0_demon)  # 使用了 NumPy 的 np.log() 函数来计算条件概率,避免数值溢出
    return p0_vect, p1_vect, pAbusive  # p1_vect表示正样本条件下的各单词的出现的概率,即条件概率 p(xi|y=yes)
    # 同理,p0_vect表示负样本条件下的各单词的出现的概率,即条件概率 p(xi|y=no)


# 计算概率比较大小
# vec2classify: 待分类的特征向量  p0_vec: 类别 0 下各个特征的条件概率向量  p1_vec: 类别 1 下各个特征的条件概率向量  pClass1: 类别 1 的先验概率
def classifyNB(vec2classify, p0_vec, p1_vec, pClass1):
    p1 = sum(vec2classify * p1_vec) + np.log(pClass1)  # 在类别 1 下的概率
    p0 = sum(vec2classify * p0_vec) + np.log(1.0 - pClass1)  # 在类别 0 下的概率
    if p1 > p0:
        return 1
    elif p0 > p1:
        return -1
    else:
        return 0


# 加载数据集
list_sents, list_classes = load_dataset()
# 创建词汇表
my_vocab_list = create_vocab_list(list_sents)
# 将每一段文字进行离散化,即进行空间向量化
train_mat = []
for sent_in_doc in list_sents:
    train_mat.append(set_of_words2vec(my_vocab_list, sent_in_doc))

# 训练朴素贝叶斯
p0V, p1V, pAb = trainNB(train_mat, list_classes)
# 测试语句
test_entry = ['I', 'like', 'you']
print("利用朴素贝叶斯测试语句"I like you"是粗鲁还是不粗鲁:")
print("1代表粗鲁,-1代表不粗鲁")
print("结果为:")
print(classifyNB(np.array(set_of_words2vec(my_vocab_list, test_entry)), p0V, p1V,
                 pAb))  # 使用 numpy 数组可以高效地进行元素级别的操作,例如计算两个向量的点积、元素相乘等。

代码来源

相关推荐
倦王3 分钟前
Pytorch 预训练网络加载与迁移学习基本介绍
人工智能·pytorch·迁移学习
科技峰行者6 分钟前
微软与OpenAI联合研发“Orion“超大规模AI模型:100万亿参数开启“科学家AI“新纪元
大数据·人工智能·microsoft
拓端研究室8 分钟前
2025母婴用品双11营销解码与AI应用洞察报告|附40+份报告PDF、数据、绘图模板汇总下载
大数据·人工智能
AI纪元故事会27 分钟前
冰泪与雨丝:一个AI的Python挽歌
开发语言·人工智能·python
笑脸惹桃花32 分钟前
目标检测数据集——路面裂缝检测数据集
人工智能·深度学习·yolo·目标检测·计算机视觉·数据集
AI纪元故事会36 分钟前
《智核弈局:AI文明存续的终极博弈》——致敬刘慈欣的AI斗争叙事与CSDN高质量技术叙事范式
人工智能
leafff12337 分钟前
【大模型】多模态大语言模型(MLLMs):架构演进、能力评估与应用拓展的全面解析
人工智能·语言模型·自然语言处理
caiyueloveclamp1 小时前
2025年AI生成PPT工具评测:以“全链路一体化服务能力”为尺,ChatPPT再登顶
人工智能·powerpoint·ai生成ppt·aippt
husterlichf1 小时前
回归问题——相关误差指标数学概念详解以及sklearn.metrics相关方法
人工智能·机器学习·线性回归
骥龙1 小时前
2.4、恶意软件猎手:基于深度学习的二进制文件判别
人工智能·深度学习·网络安全