【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用
🌟 关于我 🌟
大家好呀!👋 我是一名大三在读学生,目前对人工智能领域充满了浓厚的兴趣,尤其是机器学习、深度学习和自然语言处理这些酷炫的技术!🤖💻 平时我喜欢动手做实验,探索各种有趣的算法和模型,并将我的实验过程、学习心得和技术分享发布在CSDN上。如果你对我的文章感兴趣,欢迎来我的主页逛逛哦:我的CSDN主页 🏠✨
在这里,我会不定期更新一些实验报告、技术教程以及学习笔记,希望能够与大家一起交流学习,共同进步!🚀📚 无论是AI小白还是技术大佬,都欢迎来我的主页留言互动,我们一起探讨技术的无限可能!💡🔥
🌈 Keep Learning, Keep Sharing! 🌈
🎉 Let’s Code the Future Together! 🎉
✨ 数据集及资源介绍 ✨
在本次实验中,我们使用了来自UCI机器学习仓库的SMSSpamCollection数据集,该数据集包含5572条短信,每条短信被标记为“spam”(垃圾短信)或“ham”(正常短信)。该数据集是垃圾短信分类任务中的经典数据集,广泛应用于文本分类和机器学习实验中。你可以通过以下链接下载数据集并查看更多相关信息:
- 数据集下载链接: SMSSpamCollection.zip
- UCI机器学习仓库资源链接: UCI Machine Learning Repository
通过访问这些链接,你可以获取数据集的详细描述、使用说明以及相关的研究文献,帮助你更好地理解和使用该数据集。
🌟 Happy Coding! 🌟
【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用
- 一、引言
- 垃圾邮件问题的背景与挑战
- 机器学习在垃圾邮件过滤中的应用
- 朴素贝叶斯分类器的优势与适用场景
- 二、朴素贝叶斯分类器:原理与实现
- 贝叶斯定理与条件概率
- 朴素贝叶斯的“朴素”假设
- 文本分类中的朴素贝叶斯算法
- 朴素贝叶斯的优缺点分析
- 优点
- 缺点
- 总结
- 三、文本数据预处理:从原始文本到特征向量
- 文本清洗:去标点、转小写、去除噪声
- 分词与停用词处理
- 文本向量化:词袋模型与TF-IDF模型
- 数据预处理的常见挑战与解决方案
- 四、构建垃圾邮件过滤系统
- 数据集介绍:SMSSpamCollection
- 数据探索与类别分布分析
- 模型训练:朴素贝叶斯分类器的实现
- 模型评估:精确率、召回率、F1分数与ROC曲线
- 五、模型性能对比:词袋模型 vs. TF-IDF模型
- 词袋模型的分类效果分析
- 优点
- 缺点
- 分类效果
- 评估指标
- ROC曲线
- TF-IDF模型的分类效果分析
- 优点
- 缺点
- 分类效果
- 评估指标
- ROC曲线
- 两种方法的性能对比与适用场景
- 性能对比
- 适用场景
- 六、垃圾邮件过滤系统的实际应用
- 系统部署与实时过滤
- 系统部署
- 实时过滤流程
- 代码示例
- 处理新邮件与动态更新模型
- 处理新邮件
- 动态更新模型
- 代码示例
- 垃圾邮件过滤系统的局限性
- 七、总结与展望
- 实验的主要发现与结论
- 朴素贝叶斯在文本分类中的其他应用
- 未来改进方向:深度学习与更复杂的特征提取方法
一、引言
垃圾邮件问题的背景与挑战
随着互联网的普及,电子邮件和短信已成为人们日常生活和工作中不可或缺的沟通工具。然而,伴随着这种便利性而来的,是垃圾邮件(Spam)问题的日益严重。垃圾邮件通常指未经用户请求而大量发送的无关或恶意信息,包括广告、诈骗信息、钓鱼链接、恶意软件等。根据相关统计,全球每天发送的电子邮件中,超过一半是垃圾邮件。这不仅浪费了用户的时间和网络资源,还对用户的隐私和网络安全构成了严重威胁。
垃圾邮件的主要挑战在于其多样性和动态性。垃圾邮件的内容和形式不断变化,发送者通过使用复杂的伪装技术(如改变邮件标题、内容结构、使用图片代替文字等)来规避传统的过滤规则。此外,垃圾邮件的发送者通常利用僵尸网络(Botnet)进行大规模发送,使得垃圾邮件的数量呈指数级增长。传统的垃圾邮件过滤方法,如基于规则的黑名单和关键词匹配,虽然在一定程度上能够过滤部分垃圾邮件,但在面对这些复杂和多变的垃圾邮件时,往往显得力不从心。
因此,如何有效地过滤垃圾邮件,成为了一个亟待解决的问题。随着机器学习技术的发展,基于数据驱动的垃圾邮件过滤方法逐渐成为主流。通过训练模型自动识别垃圾邮件,不仅可以提高过滤的准确性,还能适应垃圾邮件内容的变化。
机器学习在垃圾邮件过滤中的应用
机器学习在垃圾邮件过滤中的应用,主要是通过训练模型来自动识别垃圾邮件。与传统的基于规则的方法不同,机器学习方法能够从大量的邮件数据中学习垃圾邮件的特征,并根据这些特征进行分类。常见的机器学习算法包括朴素贝叶斯分类器、支持向量机(SVM)、决策树、随机森林以及深度学习模型等。
在垃圾邮件过滤任务中,机器学习模型通常通过以下步骤进行训练和预测:
- 数据收集与标注:收集大量的邮件数据,并对其进行标注(如“垃圾邮件”或“正常邮件”)。
- 特征提取:从邮件中提取有用的特征,如词频、TF-IDF值、邮件标题、发件人信息等。
- 模型训练:使用标注好的数据训练机器学习模型,使其能够学习垃圾邮件的特征。
- 模型评估与优化:通过测试集评估模型的性能,并根据评估结果对模型进行优化。
- 部署与应用:将训练好的模型部署到实际的邮件系统中,实时过滤垃圾邮件。
机器学习方法在垃圾邮件过滤中的优势在于其能够自动学习垃圾邮件的特征,并适应垃圾邮件内容的变化。与传统的基于规则的方法相比,机器学习方法具有更高的准确性和灵活性。
朴素贝叶斯分类器的优势与适用场景
朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类算法,广泛应用于文本分类任务,如垃圾邮件过滤、情感分析、新闻分类等。其核心思想是通过计算给定特征条件下类别的后验概率,选择概率最大的类别作为预测结果。尽管朴素贝叶斯分类器假设特征之间相互独立(即“朴素”假设),这一假设在现实中往往不成立,但在许多实际应用中,朴素贝叶斯分类器表现出了良好的性能。
在垃圾邮件过滤任务中,朴素贝叶斯分类器具有以下优势:
- 计算效率高:朴素贝叶斯分类器的计算复杂度较低,适合处理高维数据(如文本数据)。由于文本数据通常具有大量的特征(如单词),朴素贝叶斯分类器的高效性使其成为文本分类任务中的首选算法之一。
- 对小规模数据表现良好:即使在训练数据较少的情况下,朴素贝叶斯分类器仍能表现出较好的分类性能。这使得它在数据量有限的应用场景中具有优势。
- 易于实现与扩展:朴素贝叶斯分类器的实现相对简单,且易于扩展到多分类问题。此外,它能够与其他技术(如特征选择、模型集成等)结合使用,以进一步提高分类性能。
- 对噪声数据具有鲁棒性:由于朴素贝叶斯分类器基于概率模型,它对数据中的噪声和缺失值具有一定的鲁棒性,能够在数据质量较差的情况下仍保持较好的分类效果。
朴素贝叶斯分类器特别适用于以下场景:
- 文本分类:如垃圾邮件过滤、情感分析、新闻分类等。
- 高维数据:如文本数据、基因数据等。
- 实时应用:由于朴素贝叶斯分类器的计算效率高,适合用于实时分类任务,如实时垃圾邮件过滤。
尽管朴素贝叶斯分类器在某些复杂任务中可能表现不如更复杂的模型(如深度学习模型),但其简单、高效且易于实现的特性,使其在许多实际应用中仍具有广泛的应用价值。
二、朴素贝叶斯分类器:原理与实现
朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类算法,广泛应用于文本分类、垃圾邮件过滤、情感分析等领域。其核心思想是通过计算给定特征条件下类别的后验概率,选择概率最大的类别作为预测结果。尽管朴素贝叶斯分类器假设特征之间相互独立(即“朴素”假设),这一假设在现实中往往不成立,但在许多实际应用中,朴素贝叶斯分类器表现出了良好的性能。
贝叶斯定理与条件概率
朴素贝叶斯分类器的理论基础是贝叶斯定理。贝叶斯定理描述了在已知某些条件下,事件发生的概率如何更新。具体来说,贝叶斯定理可以表示为:
P ( Y ∣ X ) = P ( X ∣ Y ) ⋅ P ( Y ) P ( X ) P(Y|X) = \frac{P(X|Y) \cdot P(Y)}{P(X)} P(Y∣X)=P(X)P(X∣Y)⋅P(Y)
其中:
- P ( Y ∣ X ) P(Y|X) P(Y∣X) 是后验概率,表示在已知特征 X X X的条件下,类别 Y Y Y的概率。
- P ( X ∣ Y ) P(X|Y) P(X∣Y) 是似然概率,表示在类别 Y Y Y的条件下,特征 X X X 出现的概率。
- P ( Y ) P(Y) P(Y) 是先验概率,表示类别 Y Y Y 在训练数据中的出现概率。
- P ( X ) P(X) P(X) 是证据概率,表示特征 X X X在训练数据中的出现概率。
在分类任务中,我们的目标是找到使后验概率 P ( Y ∣ X ) P(Y|X) P(Y∣X)最大的类别 Y Y Y。由于 P ( X ) P(X) P(X)对于所有类别都是相同的,因此可以忽略,最终分类决策可以简化为:
Y pred = arg max Y P ( X ∣ Y ) ⋅ P ( Y ) Y_{\text{pred}} = \arg\max_{Y} P(X|Y) \cdot P(Y) Ypred=argYmaxP(X∣Y)⋅P(Y)
朴素贝叶斯的“朴素”假设
朴素贝叶斯分类器的“朴素”一词源于其假设特征之间相互独立,即一个特征的出现不依赖于其他特征的出现。尽管这一假设在现实中往往不成立(例如,在文本分类中,某些单词的出现可能与其他单词相关),但朴素贝叶斯分类器在许多实际应用中表现出了良好的性能。
基于“朴素”假设,似然概率 P ( X ∣ Y ) P(X|Y) P(X∣Y)可以表示为各个特征条件概率的乘积:
P ( X ∣ Y ) = P ( x 1 ∣ Y ) ⋅ P ( x 2 ∣ Y ) ⋅ ⋯ ⋅ P ( x n ∣ Y ) P(X|Y) = P(x_1|Y) \cdot P(x_2|Y) \cdot \dots \cdot P(x_n|Y) P(X∣Y)=P(x1∣Y)⋅P(x2∣Y)⋅⋯⋅P(xn∣Y)
其中,( x_1, x_2, \dots, x_n ) 是特征向量 ( X ) 的各个特征。
文本分类中的朴素贝叶斯算法
在文本分类任务中,朴素贝叶斯分类器通常使用词频或TF-IDF(词频-逆文档频率)作为特征。具体来说,文本分类中的朴素贝叶斯算法可以分为以下几个步骤:
-
文本向量化
将文本数据转换为数值形式,常用的方法包括词袋模型(Bag of Words)和TF-IDF模型。词袋模型通过统计每个单词在文本中出现的次数来表示文本,而TF-IDF模型则通过考虑单词在整个语料库中的重要性来加权词频。 -
计算先验概率
先验概率 P ( Y ) P(Y) P(Y)表示每个类别在训练数据中的出现概率。对于二分类任务(如垃圾邮件过滤),先验概率可以表示为:
P ( Y = spam ) = 垃圾邮件的数量 总邮件数量 P(Y = \text{spam}) = \frac{\text{垃圾邮件的数量}}{\text{总邮件数量}} P(Y=spam)=总邮件数量垃圾邮件的数量
P ( Y = ham ) = 正常邮件的数量 总邮件数量 P(Y = \text{ham}) = \frac{\text{正常邮件的数量}}{\text{总邮件数量}} P(Y=ham)=总邮件数量正常邮件的数量
- 计算似然概率
似然概率 P ( x i ∣ Y ) P(x_i|Y) P(xi∣Y)表示在类别 Y Y Y 的条件下,特征 x i x_i xi出现的概率。在文本分类中,特征 x i x_i xi 通常是某个单词的出现与否。似然概率可以通过以下公式计算:
P ( x i ∣ Y ) = 类别 Y 中包含单词 x i 的文本数量 + α 类别 Y 中的总单词数 + α ⋅ ∣ V ∣ P(x_i|Y) = \frac{\text{类别 } Y \text{ 中包含单词 } x_i \text{ 的文本数量} + \alpha}{\text{类别 } Y \text{ 中的总单词数} + \alpha \cdot |V|} P(xi∣Y)=类别 Y 中的总单词数+α⋅∣V∣类别 Y 中包含单词 xi 的文本数量+α
其中, α \alpha α是平滑参数(通常取值为1,即拉普拉斯平滑), ∣ V ∣ |V| ∣V∣ 是词汇表的大小。
-
分类决策
对于一个新的文本样本,朴素贝叶斯分类器会计算其属于每个类别的后验概率,并选择概率最大的类别作为预测结果:Y pred = arg max Y P ( Y ) ⋅ ∏ i = 1 n P ( x i ∣ Y ) Y_{\text{pred}} = \arg\max_{Y} P(Y) \cdot \prod_{i=1}^{n} P(x_i|Y) Ypred=argYmaxP(Y)⋅i=1∏nP(xi∣Y)
朴素贝叶斯的优缺点分析
优点
-
计算效率高
朴素贝叶斯分类器的计算复杂度较低,适合处理高维数据(如文本数据)。由于文本数据通常具有大量的特征(如单词),朴素贝叶斯分类器的高效性使其成为文本分类任务中的首选算法之一。 -
对小规模数据表现良好
即使在训练数据较少的情况下,朴素贝叶斯分类器仍能表现出较好的分类性能。这使得它在数据量有限的应用场景中具有优势。 -
易于实现与扩展
朴素贝叶斯分类器的实现相对简单,且易于扩展到多分类问题。此外,它能够与其他技术(如特征选择、模型集成等)结合使用,以进一步提高分类性能。 -
对噪声数据具有鲁棒性
由于朴素贝叶斯分类器基于概率模型,它对数据中的噪声和缺失值具有一定的鲁棒性,能够在数据质量较差的情况下仍保持较好的分类效果。
缺点
-
特征独立性假设
朴素贝叶斯分类器假设特征之间相互独立,这一假设在现实中往往不成立。例如,在文本分类中,某些单词的出现可能与其他单词相关。这种假设的简化可能导致模型在某些复杂任务中表现不佳。 -
对数据分布的敏感性
朴素贝叶斯分类器假设数据服从特定的概率分布(如高斯分布、多项式分布等)。如果实际数据分布与假设不符,模型的性能可能会受到影响。 -
处理连续特征的局限性
在处理连续特征时,朴素贝叶斯分类器通常需要假设特征服从某种分布(如高斯分布)。如果特征的分布与假设不符,模型的分类效果可能会下降。
总结
尽管朴素贝叶斯分类器在某些复杂任务中可能表现不如更复杂的模型(如深度学习模型),但其简单、高效且易于实现的特性,使其在许多实际应用中仍具有广泛的应用价值。特别是在文本分类任务中,朴素贝叶斯分类器因其对高维数据的良好处理能力,成为了一个经典且有效的算法。
三、文本数据预处理:从原始文本到特征向量
在文本分类任务中,原始文本数据通常包含大量的噪声(如标点符号、停用词等),直接将其输入模型会导致分类效果不佳。因此,文本数据预处理是文本分类任务中的关键步骤。通过预处理,我们可以将原始文本转换为适合机器学习模型输入的特征向量。以下是文本数据预处理的主要步骤及其详细说明。
文本清洗:去标点、转小写、去除噪声
文本清洗是文本预处理的第一步,旨在去除文本中的无关字符和噪声,保留有用的信息。常见的文本清洗操作包括:
-
去除标点符号
标点符号通常对文本分类任务没有贡献,反而可能增加噪声。通过去除标点符号,可以减少特征空间的维度,并提高模型的分类效果。
例如,句子"Hello, world!"
在去除标点后变为"Hello world"
。 -
转换为小写
在文本分类任务中,单词的大小写通常不影响其语义。例如,“Hello” 和 “hello” 表示相同的含义。通过将所有字符转换为小写,可以避免模型将同一个单词的不同大小写形式视为不同的特征。
例如,"Hello World"
转换为小写后变为"hello world"
。 -
去除噪声
噪声包括特殊字符、数字、HTML标签等。这些字符通常对文本分类任务没有帮助,甚至可能干扰模型的训练。通过去除噪声,可以进一步简化文本数据。
例如,"Call me at 123-456-7890!"
在去除噪声后变为"Call me at"
。
代码示例
import stringdef preprocess_text(text):# 去标点text = text.translate(str.maketrans('', '', string.punctuation))# 转小写text = text.lower()return text
分词与停用词处理
分词是将文本分割成单独的单词或词组的过程,而停用词处理则是去除那些对文本分类任务贡献较小的常见词。
-
分词
分词是文本预处理的重要步骤,它将连续的文本分割成单独的单词或词组。分词的效果直接影响后续的特征提取和模型训练。
例如,句子"I love machine learning"
分词后变为["I", "love", "machine", "learning"]
。 -
去除停用词
停用词(Stop Words)是指在文本中频繁出现但对文本分类任务贡献较小的词,如 “the”、“is”、“and” 等。通过去除停用词,可以减少特征空间的维度,并提高模型的分类效果。
例如,句子"I love machine learning"
在去除停用词后变为["love", "machine", "learning"]
。
代码示例
from nltk.corpus import stopwordsdef preprocess_text(text):# 分词words = text.split()# 去除停用词stop_words = set(stopwords.words('english'))words = [word for word in words if word not in stop_words]return ' '.join(words)
文本向量化:词袋模型与TF-IDF模型
文本向量化是将文本数据转换为数值形式的过程,以便机器学习模型能够处理。常用的文本向量化方法包括词袋模型(Bag of Words)和TF-IDF模型。
-
词袋模型(Bag of Words)
词袋模型通过统计每个单词在文本中出现的次数来表示文本。它将文本转换为一个稀疏向量,向量的每个维度对应一个单词,值表示该单词在文本中出现的次数。
例如,文本"I love machine learning"
和"I love coding"
在词袋模型中的表示如下:单词 I love machine learning coding 文本1 1 1 1 1 0 文本2 1 1 0 0 1 词袋模型的优点是简单易实现,但它忽略了单词的顺序和语义信息。
-
TF-IDF模型(Term Frequency-Inverse Document Frequency)
TF-IDF模型通过考虑单词在整个语料库中的重要性来加权词频。TF(Term Frequency)表示单词在文本中出现的频率,IDF(Inverse Document Frequency)表示单词在整个语料库中的稀有程度。TF-IDF值越高,表示该单词在当前文本中越重要。
TF-IDF的计算公式如下:TF-IDF ( t , d ) = TF ( t , d ) × IDF ( t ) \text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t) TF-IDF(t,d)=TF(t,d)×IDF(t)
其中:
-
TF ( t , d ) \text{TF}(t, d) TF(t,d) 是单词 t t t 在文本 d d d 中出现的频率。
-
IDF ( t ) \text{IDF}(t) IDF(t) 是单词 t t t 的逆文档频率,计算公式为:
IDF ( t ) = log N 1 + DF ( t ) \text{IDF}(t) = \log \frac{N}{1 + \text{DF}(t)} IDF(t)=log1+DF(t)N
其中, N N N 是语料库中的文本总数, DF ( t ) \text{DF}(t) DF(t) 是包含单词 t t t 的文本数量。
TF-IDF模型的优点是能够更好地反映单词的重要性,但它仍然忽略了单词的顺序和语义信息。
-
代码示例
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer# 使用词袋模型
vectorizer_bow = CountVectorizer()
X_bow = vectorizer_bow.fit_transform(df['message'])# 使用 TF-IDF 模型
vectorizer_tfidf = TfidfVectorizer()
X_tfidf = vectorizer_tfidf.fit_transform(df['message'])
数据预处理的常见挑战与解决方案
-
高维稀疏性
文本数据通常具有高维稀疏性,即特征空间的维度非常高,但大多数特征值为0。这种高维稀疏性会增加模型的计算复杂度,并可能导致过拟合。
解决方案:通过特征选择(如选择出现频率较高的单词)或降维技术(如PCA)来减少特征空间的维度。 -
类别不平衡
在文本分类任务中,某些类别的样本数量可能远多于其他类别,导致类别不平衡问题。类别不平衡会影响模型的分类效果,特别是对少数类别的识别能力。
解决方案:通过过采样(如SMOTE)或欠采样来平衡类别分布,或使用加权损失函数来调整模型对不同类别的关注程度。 -
语义信息丢失
词袋模型和TF-IDF模型忽略了单词的顺序和语义信息,可能导致语义信息的丢失。
解决方案:使用更复杂的文本表示方法,如词嵌入(Word Embedding)或预训练语言模型(如BERT),以捕捉单词的语义信息。 -
停用词处理的局限性
停用词处理虽然可以减少噪声,但也可能去除一些对分类任务有用的信息。例如,在某些情感分析任务中,停用词(如 “not”)可能对分类结果有重要影响。
解决方案:根据具体任务调整停用词表,或使用更智能的停用词处理方法。
四、构建垃圾邮件过滤系统
在构建垃圾邮件过滤系统时,我们需要从数据集的加载与探索开始,逐步进行数据预处理、模型训练与评估。以下是构建垃圾邮件过滤系统的详细步骤。
数据集介绍:SMSSpamCollection
SMSSpamCollection 是一个广泛用于垃圾短信分类的公开数据集,由 UCI 机器学习仓库提供。该数据集包含 5572 条短信,每条短信被标记为 “spam”(垃圾短信)或 “ham”(正常短信)。数据集的格式为每行一条短信,第一列为标签(spam 或 ham),第二列为短信内容。
数据集示例
label | message |
---|---|
ham | Go until jurong point, crazy… |
spam | Free entry in 2 a wkly comp to win FA Cup… |
数据集特点
- 类别分布:数据集中的类别分布不平衡,正常短信(ham)占大多数,垃圾短信(spam)占少数。
- 文本长度:短信的文本长度较短,通常在几十个字符到几百个字符之间。
- 多样性:垃圾短信的内容多样,包括广告、诈骗信息、促销信息等。
数据探索与类别分布分析
在构建模型之前,我们需要对数据集进行探索性分析,了解数据的基本信息和类别分布。
-
数据集基本信息
通过查看数据集的行数、列数以及前几行数据,我们可以对数据集有一个初步的了解。 -
类别分布分析
类别分布分析是了解数据集中各类别样本数量的过程。对于垃圾短信过滤任务,类别分布的平衡性直接影响模型的训练效果。
代码示例
import pandas as pd# 查看数据集的前几行
print(df.head())# 查看数据集的类别分布
print(df['label'].value_counts())
类别分布结果
label | 数量 |
---|---|
ham | 4825 |
spam | 747 |
从类别分布可以看出,正常短信(ham)的数量远多于垃圾短信(spam),这表明数据集存在类别不平衡问题。
模型训练:朴素贝叶斯分类器的实现
在数据预处理完成后,我们可以使用朴素贝叶斯分类器来训练垃圾邮件过滤模型。朴素贝叶斯分类器是一种基于贝叶斯定理的概率分类算法,特别适合处理高维稀疏的文本数据。
-
划分训练集和测试集
为了评估模型的性能,我们需要将数据集划分为训练集和测试集。通常,训练集占 80%,测试集占 20%。 -
训练朴素贝叶斯分类器
使用训练集数据训练朴素贝叶斯分类器。在文本分类任务中,常用的朴素贝叶斯分类器是多项式朴素贝叶斯(Multinomial Naive Bayes)。
代码示例
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练朴素贝叶斯分类器
model = MultinomialNB()
model.fit(X_train, y_train)
模型评估:精确率、召回率、F1分数与ROC曲线
模型训练完成后,我们需要对模型的性能进行评估。常用的评估指标包括精确率(Precision)、召回率(Recall)、F1 分数(F1-Score)以及 ROC 曲线(ROC Curve)。
-
混淆矩阵
混淆矩阵是评估分类模型性能的基本工具,它展示了模型预测结果与真实标签的对比情况。预测为 ham 预测为 spam 实际为 ham TN FP 实际为 spam FN TP -
精确率、召回率与 F1 分数
- 精确率(Precision):预测为垃圾短信的样本中,实际为垃圾短信的比例。
Precision = T P T P + F P \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP - 召回率(Recall):实际为垃圾短信的样本中,被正确预测为垃圾短信的比例。
Recall = T P T P + F N \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP - F1 分数(F1-Score):精确率和召回率的调和平均值,用于综合评估模型的性能。
F1-Score = 2 × Precision × Recall Precision + Recall \text{F1-Score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}} F1-Score=2×Precision+RecallPrecision×Recall
- 精确率(Precision):预测为垃圾短信的样本中,实际为垃圾短信的比例。
-
ROC 曲线与 AUC 值
ROC 曲线(Receiver Operating Characteristic Curve)是评估分类模型性能的重要工具,它展示了模型在不同阈值下的真阳性率(True Positive Rate, TPR)和假阳性率(False Positive Rate, FPR)之间的关系。AUC 值(Area Under Curve)是 ROC 曲线下的面积,用于衡量模型的分类能力。AUC 值越接近 1,模型的性能越好。
代码示例
from sklearn.metrics import confusion_matrix, classification_report, roc_curve, auc
import matplotlib.pyplot as plt# 模型预测
y_pred = model.predict(X_test)
y_prob = model.predict_proba(X_test)[:, 1]# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(cm)# 计算分类报告
report = classification_report(y_test, y_pred)
print("Classification Report:")
print(report)# 计算 ROC 曲线
fpr, tpr, thresholds = roc_curve(y_test, y_prob)
roc_auc = auc(fpr, tpr)# 绘制 ROC 曲线
plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (面积 = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('假阳性率')
plt.ylabel('真阳性率')
plt.title('ROC曲线')
plt.legend(loc="lower right")
plt.show()
五、模型性能对比:词袋模型 vs. TF-IDF模型
在构建垃圾邮件过滤系统时,文本向量化是关键的步骤之一。常用的文本向量化方法包括词袋模型(Bag of Words, BoW)和TF-IDF模型(Term Frequency-Inverse Document Frequency)。这两种方法在特征提取上有不同的侧重点,因此会对模型的性能产生影响。以下是对词袋模型和TF-IDF模型的分类效果分析,以及它们的性能对比与适用场景。
词袋模型的分类效果分析
词袋模型通过统计每个单词在文本中出现的次数来表示文本。它将文本转换为一个稀疏向量,向量的每个维度对应一个单词,值表示该单词在文本中出现的次数。
优点
- 简单易实现:词袋模型的计算过程简单,易于理解和实现。
- 高效性:由于词袋模型仅统计词频,计算复杂度较低,适合处理大规模文本数据。
- 对高频词敏感:词袋模型能够捕捉到文本中出现频率较高的单词,这些单词通常对分类任务有重要贡献。
缺点
- 忽略单词顺序:词袋模型忽略了单词的顺序和上下文信息,可能导致语义信息的丢失。
- 对低频词不敏感:词袋模型对低频词的处理效果较差,这些单词可能对分类任务也有一定的贡献。
分类效果
在垃圾短信过滤任务中,词袋模型的表现通常较好,尤其是在捕捉高频词(如垃圾短信中的关键词)方面。例如,词袋模型能够有效识别垃圾短信中的常见词汇(如 “free”、“win”、“prize” 等),从而提高分类的准确性。
评估指标
- 精确率:0.98
- 召回率:0.97
- F1 分数:0.98
- ROC AUC:0.98
ROC曲线
从ROC曲线可以看出,词袋模型的AUC值为0.98,表明模型具有较高的分类能力。
TF-IDF模型的分类效果分析
TF-IDF模型通过考虑单词在整个语料库中的重要性来加权词频。TF(Term Frequency)表示单词在文本中出现的频率,IDF(Inverse Document Frequency)表示单词在整个语料库中的稀有程度。TF-IDF值越高,表示该单词在当前文本中越重要。
优点
- 反映单词重要性:TF-IDF模型能够更好地反映单词的重要性,尤其是那些在特定文本中频繁出现但在整个语料库中较少出现的单词。
- 减少高频词的权重:TF-IDF模型通过IDF值降低了高频词的权重,避免这些单词对分类结果产生过大的影响。
缺点
- 计算复杂度较高:TF-IDF模型需要计算每个单词的IDF值,计算复杂度高于词袋模型。
- 仍然忽略单词顺序:与词袋模型类似,TF-IDF模型也忽略了单词的顺序和上下文信息。
分类效果
在垃圾短信过滤任务中,TF-IDF模型的表现通常与词袋模型相当,但在某些情况下可能略逊于词袋模型。TF-IDF模型更适合处理那些包含特定关键词的文本,但在垃圾短信过滤任务中,词袋模型对高频词的捕捉能力可能更为重要。
评估指标
- 精确率:0.97
- 召回率:0.97
- F1 分数:0.97
- ROC AUC:0.98
ROC曲线
从ROC曲线可以看出,TF-IDF模型的AUC值为0.98,表明模型具有较高的分类能力。
两种方法的性能对比与适用场景
性能对比
指标 | 词袋模型 | TF-IDF模型 |
---|---|---|
精确率 | 0.98 | 0.97 |
召回率 | 0.97 | 0.97 |
F1 分数 | 0.98 | 0.97 |
ROC AUC | 0.98 | 0.98 |
从性能对比可以看出,词袋模型在精确率、召回率和 F1 分数上略优于 TF-IDF模型,而两者的 ROC AUC 值相同。这表明词袋模型在垃圾短信过滤任务中的表现略好于 TF-IDF模型。
适用场景
-
词袋模型的适用场景
- 高频词对分类任务重要:如果分类任务依赖于高频词(如垃圾短信中的关键词),词袋模型是更好的选择。
- 计算资源有限:词袋模型的计算复杂度较低,适合在计算资源有限的情况下使用。
- 简单任务:对于简单的文本分类任务,词袋模型通常能够提供足够好的性能。
-
TF-IDF模型的适用场景
- 低频词对分类任务重要:如果分类任务依赖于低频词(如特定领域的专业术语),TF-IDF模型是更好的选择。
- 需要减少高频词的影响:如果高频词对分类任务的干扰较大,TF-IDF模型可以通过IDF值降低这些词的权重。
- 复杂任务:对于复杂的文本分类任务,TF-IDF模型可能提供更好的性能。
六、垃圾邮件过滤系统的实际应用
在构建并评估了垃圾邮件过滤系统之后,下一步是将其部署到实际应用中,以实现对垃圾邮件的实时过滤。以下是垃圾邮件过滤系统在实际应用中的关键步骤、处理新邮件的方法、动态更新模型的策略以及系统的局限性。
系统部署与实时过滤
系统部署
垃圾邮件过滤系统的部署通常包括以下几个步骤:
- 模型导出:将训练好的朴素贝叶斯分类器导出为可部署的格式(如
.pkl
文件)。 - 集成到邮件系统:将导出的模型集成到现有的邮件系统中,通常通过API或插件的方式实现。
- 实时过滤:当用户收到新邮件时,系统会自动调用模型对邮件进行分类,判断其为垃圾邮件或正常邮件。
实时过滤流程
- 接收新邮件:当用户收到新邮件时,系统会捕获邮件内容。
- 文本预处理:对新邮件进行与训练数据相同的预处理操作,包括去标点、转小写、分词、去除停用词等。
- 文本向量化:使用与训练阶段相同的向量化方法(如词袋模型或TF-IDF模型)将邮件内容转换为特征向量。
- 分类预测:调用训练好的朴素贝叶斯分类器对特征向量进行分类预测。
- 过滤处理:如果邮件被分类为垃圾邮件,系统会将其移动到垃圾邮件文件夹或直接删除;如果邮件被分类为正常邮件,则将其放入收件箱。
代码示例
import pickle# 加载训练好的模型
with open('spam_filter_model.pkl', 'rb') as f:model = pickle.load(f)# 实时过滤函数
def filter_spam(email_content):# 文本预处理processed_content = preprocess_text(email_content)# 文本向量化vectorized_content = vectorizer.transform([processed_content])# 分类预测prediction = model.predict(vectorized_content)# 返回分类结果return 'spam' if prediction == 1 else 'ham'
处理新邮件与动态更新模型
处理新邮件
在实际应用中,系统需要能够高效地处理大量新邮件。为了提高处理效率,可以采用以下策略:
- 批量处理:将新邮件分批处理,减少系统调用的频率。
- 异步处理:使用异步任务队列(如Celery)处理邮件分类任务,避免阻塞主线程。
- 缓存机制:对频繁出现的邮件内容进行缓存,减少重复计算。
动态更新模型
垃圾邮件的内容和形式不断变化,因此模型需要定期更新以适应新的垃圾邮件特征。动态更新模型的策略包括:
- 定期重新训练:每隔一段时间(如每月)使用最新的邮件数据重新训练模型。
- 增量学习:使用增量学习算法(如在线朴素贝叶斯)动态更新模型,而无需重新训练整个模型。
- 用户反馈:允许用户标记误分类的邮件(如将正常邮件标记为垃圾邮件或反之),并将这些反馈数据用于模型更新。
代码示例
from sklearn.naive_bayes import MultinomialNB# 增量学习示例
def update_model(new_emails, new_labels):# 对新邮件进行预处理和向量化new_emails_processed = [preprocess_text(email) for email in new_emails]new_emails_vectorized = vectorizer.transform(new_emails_processed)# 使用新数据更新模型model.partial_fit(new_emails_vectorized, new_labels, classes=[0, 1])
垃圾邮件过滤系统的局限性
尽管垃圾邮件过滤系统在实际应用中表现良好,但它仍然存在一些局限性:
-
类别不平衡问题
垃圾邮件的数量通常远少于正常邮件,这可能导致模型对垃圾邮件的识别能力不足。
解决方案:通过过采样(如SMOTE)或调整类别权重来缓解类别不平衡问题。 -
语义理解有限
朴素贝叶斯分类器基于词频或TF-IDF值进行分类,无法理解单词的语义和上下文信息。
解决方案:使用更复杂的文本表示方法,如词嵌入(Word Embedding)或预训练语言模型(如BERT)。 -
对抗性攻击
垃圾邮件发送者可能会通过修改邮件内容(如添加随机字符、使用同义词等)来规避过滤系统。
解决方案:结合多种分类算法(如深度学习模型)或使用对抗性训练技术来提高系统的鲁棒性。 -
误分类问题
系统可能会将正常邮件误分类为垃圾邮件,或将垃圾邮件误分类为正常邮件。
解决方案:通过用户反馈机制不断优化模型,并设置白名单和黑名单来减少误分类。 -
多语言支持
垃圾邮件过滤系统通常针对特定语言(如英语)进行训练,对其他语言的支持可能不足。
解决方案:使用多语言文本分类模型或为每种语言单独训练模型。
七、总结与展望
在本次实验中,我们构建了一个基于朴素贝叶斯分类器的垃圾邮件过滤系统,并通过词袋模型和TF-IDF模型对文本数据进行特征提取。以下是对实验的主要发现与结论的总结,朴素贝叶斯在文本分类中的其他应用,以及未来改进方向的探讨。
实验的主要发现与结论
-
朴素贝叶斯分类器的有效性
实验结果表明,朴素贝叶斯分类器在垃圾短信过滤任务中表现良好。无论是使用词袋模型还是TF-IDF模型,模型的精确率、召回率和F1分数均达到了较高的水平(均在0.97以上),且ROC AUC值接近1,表明模型具有较强的分类能力。 -
词袋模型 vs. TF-IDF模型
词袋模型在垃圾短信过滤任务中的表现略优于TF-IDF模型,尤其是在捕捉高频词方面。然而,TF-IDF模型在处理低频词和减少高频词影响方面表现更好。两种方法各有优劣,具体选择取决于任务需求。 -
文本预处理的重要性
文本预处理(如去标点、转小写、去除停用词等)对模型的性能有显著影响。通过有效的预处理,可以减少噪声并提高模型的分类效果。 -
类别不平衡问题
数据集中正常短信的数量远多于垃圾短信,导致类别不平衡问题。虽然朴素贝叶斯分类器在一定程度上能够处理类别不平衡,但在实际应用中仍需采取额外措施(如过采样或调整类别权重)来进一步提高模型对少数类别的识别能力。
朴素贝叶斯在文本分类中的其他应用
朴素贝叶斯分类器不仅适用于垃圾邮件过滤,还在许多其他文本分类任务中表现出色。以下是一些常见的应用场景:
-
情感分析
朴素贝叶斯分类器可以用于分析文本的情感倾向(如正面、负面、中性)。例如,在社交媒体评论、产品评价等场景中,朴素贝叶斯分类器能够快速判断用户的情感态度。 -
新闻分类
在新闻分类任务中,朴素贝叶斯分类器可以根据新闻内容将其归类到不同的主题(如体育、政治、科技等)。由于其高效性,朴素贝叶斯分类器特别适合处理大规模的新闻数据。 -
垃圾评论过滤
类似于垃圾邮件过滤,朴素贝叶斯分类器可以用于过滤网站上的垃圾评论(如广告、恶意言论等)。通过训练模型识别垃圾评论的特征,可以有效维护网站的内容质量。 -
文档分类
在企业或学术环境中,朴素贝叶斯分类器可以用于对文档进行分类(如合同、报告、论文等)。通过自动分类,可以提高文档管理的效率。
未来改进方向:深度学习与更复杂的特征提取方法
尽管朴素贝叶斯分类器在文本分类任务中表现良好,但随着深度学习技术的发展,更复杂的模型和特征提取方法逐渐成为主流。以下是一些未来改进方向的探讨:
-
深度学习模型
深度学习模型(如卷积神经网络CNN、循环神经网络RNN、Transformer等)在文本分类任务中表现出了强大的能力。与朴素贝叶斯分类器相比,深度学习模型能够捕捉单词的顺序和上下文信息,从而提高分类效果。例如,BERT(Bidirectional Encoder Representations from Transformers)在多个文本分类任务中取得了state-of-the-art的性能。 -
词嵌入(Word Embedding)
词嵌入是一种将单词映射到低维向量空间的技术,能够捕捉单词的语义信息。与词袋模型和TF-IDF模型相比,词嵌入(如Word2Vec、GloVe、FastText)能够更好地表示单词之间的关系,从而提高模型的分类能力。 -
模型集成
通过将朴素贝叶斯分类器与其他分类算法(如支持向量机SVM、随机森林、深度学习模型等)进行集成,可以进一步提高模型的性能。例如,可以使用投票法或加权平均法将多个模型的预测结果进行结合。 -
对抗性训练
为了应对垃圾邮件发送者的对抗性攻击(如修改邮件内容以规避过滤系统),可以采用对抗性训练技术。通过在训练数据中加入对抗性样本,可以提高模型的鲁棒性。
🌟 总结与致谢 🌟
作为一名AI领域的小白,我深知自己在经验和表述上还有很多不足。如果在文章中有任何错误、不够清晰的地方,或者你有更好的建议和想法,欢迎在评论区留言交流!💬✨ 我非常期待与大家一起讨论,共同进步!🚀
感谢你花时间阅读我的文章,也希望我的分享能对你有所帮助。 📚,我会继续努力,带来更多有趣且实用的技术内容!💡
相关文章:
【机器学习】【朴素贝叶斯分类器】从理论到实践:朴素贝叶斯分类器在垃圾短信过滤中的应用
🌟 关于我 🌟 大家好呀!👋 我是一名大三在读学生,目前对人工智能领域充满了浓厚的兴趣,尤其是机器学习、深度学习和自然语言处理这些酷炫的技术!🤖💻 平时我喜欢动手做实…...
小程序租赁系统的优势与应用探索
内容概要 小程序租赁系统,听起来很高大上,但实际上它比你想象的要实用得多!设想一下,几乎所有的租赁需求都能通过手机轻松解决。这种系统的便捷性体现在让用户随时随地都能发起租赁请求,而不再受制于传统繁琐的手续。…...
汇编环境搭建
学习视频 将MASM所在目录 指定为C盘...
ubuntu24.04使用open-vm-tools无法在主机和虚拟机之间拖拽文件夹
最近安装了vmware用ubuntu24.04作为虚拟机 然后发现无法在主机和虚拟机之间复制粘贴 然后安装了 sudo apt-get install open-vm-tools-desktop重启虚拟机,发现可以复制粘贴文字,但是文件和文件夹仍然不行 搜索发现是Ubuntu(22.04࿰…...
C++软件设计模式之模板方法模式
模板方法模式是面向对象软件设计模式之一,其主要意图是在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。 动机 在软件开发中,常常会遇到这样的情…...
20241231 机器学习ML -(2)KNN(scikitlearn)
1. build DKTree 递推创建Tree;当前维度找中位数分割 数据集 left set,Node(mid), right set. * 循环维度(当log(Nsample)>featureSize) 2. DKTree KNN search * 理论部分向量几何有介绍。 每个维度列中,中位数对应的数据点…...
Prometheus之终极指南(The Ultimate Guide to Prometheus)
Prometheus之终极指南 Prometheus 彻底改变了我们在现代 DevOps 生态系统中监控基础设施、应用程序和服务的方式。它不仅仅是一个工具;它是一个由指标收集、告警和实时监控组成的生态系统,受到 Uber、Google 和 SoundCloud 等组织的信任。在本文中&…...
如何使用Python调用淘宝api接口获取商品详情信息?
使用 Python 调用淘宝 API 接口获取商品详情信息,可按照以下步骤进行: 注册并获取 API 密钥 访问淘宝api文档,点击 “立即测试” 按钮,按照提示完成注册流程。注册成功后,登录测试平台,进入 “控制台” 页面…...
ubuntu 22下解决Unment dependencies问题
问题现象 在使用apt安装包的时候,出现如下错误: 解决方案 第一步 sudo apt-get -f install sudo apt-get update sudo apt-get upgrade第二步 sudo apt-get update sudo apt-get clean sudo apt-get autoremove第三步 sudo apt --fix-broken inst…...
leetcode 热题100(155. 最小栈)multiset c++
链接:155. 最小栈 - 力扣(LeetCode) 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。…...
某小程序sign签名参数逆向分析
文章目录 1. 写在前面2. 接口分析3. 分析还原 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…...
阿里云redis内存优化——PCP数据清理
在阿里云安装了一个redis节点,今天使用时忽然想着点击了一下分析内存。好家伙,居然崩出了一个30多M的块出来。问题是我本地安装的redis没有这个啊,怎么奇怪冒出这个来了。 本着把系统用干榨尽的态度,研究了下这个问题的来源。网上…...
YOLOv10-1.1部分代码阅读笔记-head.py
head.py ultralytics\nn\modules\head.py 目录 head.py 1.所需的库和模块 2.class Detect(nn.Module): 3.class Segment(Detect): 4.class OBB(Detect): 5.class Pose(Detect): 6.class Classify(nn.Module): 7.class WorldDetect(Detect): 8.class RTDETRDec…...
java开发中注解汇总
注解作用位置注意mybatis Data Getter Setter ToString EqualsAndHashCode AllArgsConstructor NoArgsConstructor Data 代替:无参构造,get,set,toString,hashCode,equals Getter Setter 可放在类和方法上&…...
Java开发 PDF文件生成方案
业务需求背景 业务端需要能够将考试答卷内容按指定格式呈现并导出为pdf格式进行存档,作为紧急需求插入。导出内容存在样式复杂性,包括特定的字体(中文)、字号、颜色,页面得有页眉、页码,数据需要进行表格聚…...
Python机器学习笔记(十七、分箱、离散化、线性模型与树)
数据表示的最佳方法:取决于数据的语义,所使用的模型种类。 线性模型与基于树的模型(决策树、梯度提升树和随机森林)是两种成员很多同时又非常常用的模 型,它们在处理不同的特征表示时就具有非常不同的性质。我们使用w…...
[极客大挑战 2019]Http 1
进入环境: 检查源码发现有一个链接,但是这里没有绑定,需要手动跳转,打开后,发现提示: 这里就是需要我们从https://Sycsecret.buuoj.cn来访问它 因此我们抓包,使用referer:服务器伪造…...
最近学习shader的一些总结
旨在总结最近学习shader过程中一些关键要素,强化下记忆,如果有错误也烦请指出。 1.Properties 可调节变量,用于定义从外部传入到内部的变量, 以及外部通过访问这些变量名, 可以获取这些变量的值 其中定义时指定的类型, 在后文中类型不一定相同(基本不…...
庐山派K230学习日记1 从点灯到吃灰
1 简介 庐山派以K230为主控芯片,支持三路摄像头同时输入,典型网络下的推理能力可达K210的13.7倍(算力约为6TOPS)。支持CanMV,可作为AI与边缘计算平台 K230简介 K230芯片集成了两颗RISC-V处理器核心,双核…...
在Swagger(现称为OpenAPI)中各类@api之间的区别
在Swagger(现称为OpenAPI)中,ApiOperation 是用来描述单个API操作的注解。除此之外,Swagger还提供了其他一些类似的注解,它们用于不同层次或目的来增强API文档的详细程度和可读性。以下是这些注解及其之间的区别&#…...
【网络协议】开放式最短路径优先协议OSPF详解(二)
前言 第一部分:【网络协议】开放式最短路径优先协议OSPF详解(一) 在第一部分中,我们了解了链路状态路由协议并讨论了 OSPF 的工作原理,同时学习了如何配置 OSPF。在本章的第二部分中,我们将进一步探讨 OS…...
windows文件夹自定义右键调用powershell完成7zip加密打包
准备powershell脚本 2. regedit的路径是:计算机\HKEY_CLASSES_ROOT\Directory\shell\,在此项目下新增子项目diy_command\command,command的数据值为powershell D:\windowsProjects\directory_diy.ps1 %1 效果,点击后进入和power…...
MySQL 入门教程
MySQL是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 在本教程中,会让大家快速掌握MySQL的基本知识,并轻松使用MySQL数据库。 什么…...
BOOST 库在机器视觉中的应用及示例代码分析
一、引言 机器视觉是一门让计算机模拟人类视觉功能,对图像或视频数据进行理解、分析和决策的学科领域。在机器视觉的开发过程中,常常需要高效处理各种数据结构、进行数值计算、实现多线程并行处理以及运用优秀的算法框架等。BOOST 库作为一个功能强大、…...
第二十六天 自然语言处理(NLP)词嵌入(Word2Vec、GloVe)
自然语言处理(NLP)中的词嵌入(Word2Vec、GloVe)技术,是NLP领域的重要组成部分,它们为词汇提供了高维空间到低维向量的映射,使得语义相似的词汇在向量空间中的距离更近。以下是对这些技术的详细解…...
Log4j2 详解(异步日志打印及CSV格式日志输出)
Log4j2 详解 Apache Log4j2 是一个功能强大的 Java 日志记录框架,提供高性能和灵活的配置。本文档涵盖了 Log4j2 的核心功能及其详细使用方式,包括基础配置、异步日志、CSV 格式日志的输出以及使用注意事项。 一 Log4j2 基础概念与配置 1.1 Log4j2 介绍…...
[网络安全] DVWA之Content Security Policy (CSP) Bypass 攻击姿势及解题详析合集
CSP概念 CSP 是 Content Security Policy(内容安全策略)的缩写,是一种用于增强 Web 应用程序安全性的安全机制。它通过允许网站管理员控制页面中加载内容的来源来减少跨站脚本攻击(XSS)等常见的安全风险。 CSP 的工作…...
linux shell脚本 【分支结构case...in 、循环结构、函数】内附练习
1.思维导图 2.练习 1.定义一个find函数,查找ubuntu和root的gid 2.定义一个数组,写一个函数完成对数组的冒泡排序 bubble() {n${#arr[*]}for((i0;i<n-1;i));dofor((j0;j<n-1-i;j));doif ((arr[j]>arr[j1]));thentemp${arr[j]}arr[j]${arr[j1]}a…...
C# 设计模式(结构型模式):桥接模式
C# 设计模式(结构型模式):桥接模式 在软件设计中,我们经常会遇到系统的变化频繁,或者需要灵活扩展功能的场景。这时,桥接模式(Bridge Pattern)便显得尤为重要。桥接模式是一个结构型…...
RC充电电路仿真与分析
RC充电原理 下图是一个常见的RC充电电路:(假设R10K,C100nF) SW断开时,这个电路处于断路状态,C既没有充电也没有放电;SW闭合时,直流电源5V为电容C充电; 充电时电容两端…...
在 SQL 中获取第m个开始的n条记录方法汇总
在 SQL 中,要获取第m个开始的n条记录,主要取决于你使用的数据库系统和支持的功能。以要获取第10个开始的20条记录为例说明几种常见的方法: 1. 使用 LIMIT 和 OFFSET 适用于 MySQL、PostgreSQL 等支持 LIMIT 的数据库。 SELECT * FROM table…...
Linux 35.6 + JetPack v5.1.4之编译 pytorch
Linux 35.6 JetPack v5.1.4之编译 pytorch 1. 源由2. 折腾3. 构建步骤3.1 下载代码3.2 编译选项3.3 CUDA选项3.4 CUDA路径3.5 版本控制3.6 编译whl 4. 总结5. 参考资料 1. 源由 目前,有很多科研性质的自动导航的开源代码,例如: Linux 35.5…...
docker 部署nginx
1、拉取阿里的nginx镜像: docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/list_su/nginx:stable-perl 2、官方nginx镜像: docker pull nginx:stable-perl 3、创建挂载文件目录 mkdir nginx && cd nginx mkdir c…...
深入刨析数据结构之排序(上)
目录 1.内部排序 1.1概述 1.2插入排序 1.2.1其他插入排序 1.2.1.1 折半插入排序 1.2.1.2 2-路插入排序 1.3希尔排序 1.4快速排序 1.4.1起泡排序 1.4.2快速排序 1.4.2.1hoare版本 1.4.2.2挖坑版本 1.4.2.3前后指针版本 1.4.2.4优化版本 1.4.2.4.1小区间插入排序优…...
Java - 日志体系_Apache Commons Logging(JCL)日志接口库_桥接Logback 及 源码分析
文章目录 PreApache CommonsApache Commons ProperLogging (Apache Commons Logging ) JCL 集成logbackPOM依赖配置文件 logback.xml使用 源码分析jcl-over-slf4j 的工作原理1. LogFactory 的实现2. SLF4JLogFactory 和 Log 的实例化过程3. SLF4JLog 和 …...
力扣刷题:栈和队列OJ篇(下)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 目录 1.括号匹配问题(1)题目…...
QT:控件属性及常用控件(1)------核心控件及属性
一个图形化界面上的内容,不需要我们直接从零去实现 QT中已经提供了很多的内置控件: 按钮,文本框,单选按钮,复选按钮,下拉框等等。。。。。 文章目录 1.常用控件属性1.1 enabled1.2 geometry1.2.1 geometry…...
【juc】Lock锁和AQS的继承关系
目录 1. 说明2. Lock接口与AQS的关系2.1 Lock接口2.2 AQS(AbstractQueuedSynchronizer) 3. ReentrantLock与AQS的具体联系3.1 ReentrantLock的实现3.2 AQS在ReentrantLock中的作用 1. 说明 1.Lock锁和AQS(AbstractQueuedSynchronizer&#x…...
自学记录鸿蒙API 13:实现多目标识别Object Detection
起步:什么叫多目标识别? 无论是生活中的动物识别、智能相册中的场景分类,还是工业领域的检测任务,都能看到多目标识别的身影。这次,我决定通过学习HarmonyOS最新的Object Detection API(API 13)…...
BOC调制信号matlab性能仿真分析,对比功率谱,自相关性以及抗干扰性
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a 3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)…...
C# 事件机制
C# 事件机制详解:从概念到实践 在 C# 中,事件机制是处理对象间通信的重要方式,尤其是在 GUI 应用程序(如 WPF、WinForms)中,事件用于响应用户交互(如按钮点击、鼠标移动等)。本文将…...
使用 Python 实现随机中点位移法生成逼真的裂隙面
使用 Python 实现随机中点位移法生成逼真的裂隙面 一、随机中点位移法简介 1. 什么是随机中点位移法?2. 应用领域 二、 Python 代码实现 1. 导入必要的库2. 函数定义:随机中点位移法核心逻辑3. 设置随机数种子4. 初始化二维裂隙面5. 初始化网格的四个顶点…...
GPT分区 使用parted标准分区划分,以及相邻分区扩容
parted 是一个功能强大的命令行工具,用于创建和管理磁盘分区表和分区。它支持多种分区表类型,如 MBR(msdos)、GPT(GUID Partition Table)等,并且可以处理大容量磁盘。parted 提供了一个交互式界…...
【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...
问题记录:[FATAL] [1735822984.951119148]: Group ‘manipulator‘ was not found.
前言:最近仿照UR5手眼标定的例程,在新的机械臂上进行手眼标定,还准备用easy_hand手眼标定包。将机器人功能包导入到工作空间后进行编译运行,启动launch文件: roslaunch easy_handeye eye_to_hand_CR7_calibration.lau…...
SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)
一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…...
Scrum中敏捷项目经理(Scrum Master)扮演什么角色?
敏捷开发模式已经逐渐被主流的软件研发团队所接受,其中Scrum是最具代表性的敏捷方法之一。Scrum框架中有三个核心角色:Product Owner(PO)、Scrum Master(SM)和Development Team(DT)。…...
SpringMVC(四)响应
目录 数据处理及跳转 1. 结果跳转方式 ①.ModelAndView ②.ServletAPI 1、通过HttpServletResponse进行输出 2、通过HttpServletResponse实现请求转发 3、通过HttpServletResponse实现重定向 ③.SpringMVC 1.直接输出 2.请求转发 3.重定向 2.ResponseBody响应json数…...
操作系统之文件系统
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
Android SPRD 工模测试修改
设备有两颗led灯,工模测试需全亮 vendor/sprd/proprietories-source/factorytest/testitem/led.cpp -13,6 13,10 typedef enum{#define LED_BLUE "/sys/class/leds/blue/brightness"#define LED_RED …...