?
计算机都是通过数据理解世界,数据类型可分为时间数据、空间数据。
空间数据:
时间数据:
?
根据结果去猜原因是不好猜的。
贝叶斯方法巧妙的解决难解的逆概率问题 P ( A ∣ B ) = P ( 原因 ∣ 窗户破了 ) P(A|B)=P(原因|窗户破了) P(A∣B)=P(原因∣窗户破了)。
贝叶斯的思想是:
只需要问,A、B 事件都发生的概率是多少?
因为 P ( A ) 、 P ( B ) 、 P ( B ∣ A ) P(A)、P(B)、P(B|A) P(A)、P(B)、P(B∣A) 都好算,才转成这样的形式
?
贝叶斯方法:
P ( A ∣ B ) = P ( B ∣ A ) P ( B ) ? P ( A ) P(A|B)=\frac{P(B|A)}{P(B)}*P(A) P(A∣B)=P(B)P(B∣A)??P(A)
新观念 = 调整因子 ? 老观念 新观念=调整因子*老观念 新观念=调整因子?老观念
根据结果去猜测原因:这是最基本的推理方法,通常称为“后验推理”或“逆向推理”。
我们仅仅根据观察到的结果或效果来猜测可能的原因。
例如,看到地上有水迹,我们可能推测之前下过雨。
这种推理方法是直观的,但有时可能不够准确,因为相同的结果可能由多种不同的原因引起。
根据结果去猜测原因,并考虑先验知识:这种方法在逆向推理的基础上加入了“先验知识”的考虑。
先验知识是指我们之前已经知道或相信的信息。
在推理时结合先验知识,可以使我们的推测更加准确和有根据。
在推测地上水迹的原因时,如果我们知道早上有浇水的习惯,那么我们可能会考虑浇水而不是下雨作为更可能的原因。
考虑先验知识,并利用新的数据来更新和改进推测:贝叶斯推理方式,观点随事实改变。
不仅考虑先验知识,还会利用新的数据或信息来更新和改进我们的推测。
这种方法是动态的,随着新信息的出现,原有的推测会被修正和更新。
如果在考虑了浇水的可能性后,我们又获得了当地早上确实下过雨的气象数据,我们可能会重新评估并认为下雨是更可能的原因。
这三种方法在复杂性和精确性上逐渐提升,都是处理信息和进行决策时常用的逻辑推理方法。
?
为什么叫朴素贝叶斯?
因为采用了一个特别简化的假设,即"朴素假设"。
朴素假设是指在朴素贝叶斯分类器中,特征之间被假定为相互独立,而不考虑它们之间的关联性。
这个假设在实际情况下通常是不成立的,因为很多情况下特征之间都会存在一定的相关性。
然而,尽管这个假设非常简化,朴素贝叶斯分类器却在许多实际应用中表现得出奇地好。
?
比如,垃圾邮件过滤。
朴素贝叶斯:
在朴素贝叶斯中,我们假设文本中的每个词都是相互独立的,忽略了词汇之间的关联性。
这就是“朴素”的含义。
朴素贝叶斯通过计算每个单词在垃圾邮件和非垃圾邮件中的出现概率,然后根据文本中的单词来计算整个邮件是垃圾邮件的概率。
它的计算简单、高效,但忽略了词汇之间的语义关系。
?
非朴素方法:
非朴素方法考虑了词汇之间的关联性,通常使用更复杂的模型来捕捉这些关系。
例如,可以使用N-gram模型考虑词汇的顺序,或者使用深度学习模型如循环神经网络(RNN)或卷积神经网络(CNN)来学习词汇之间的语义关系。
这种方法更复杂,需要更多的计算资源和数据,但可以更准确地捕捉文本的复杂性。
?
效果对比:
朴素贝叶斯:由于它的简单性和高效性,在某些情况下,朴素贝叶斯可以表现得很好。
特别是在数据量不大、特征维度较低的情况下,它可以快速训练和进行分类,并且可能获得不错的结果。
然而,由于它忽略了词汇之间的关联性,可能会在处理语义复杂的邮件时失效。
非朴素方法:非朴素方法通常需要更多的计算资源和数据来训练,但它们可以更好地捕捉文本的语义关系,因此在处理复杂的语言结构和垃圾邮件变种时可能更加强大。它们可以考虑词汇的顺序、上下文和语义含义,从而提高了分类的准确性。
效果对比取决于数据集的大小和复杂性,以及可用的计算资源。
BernoulliNB (伯努利朴素贝叶斯):
GaussianNB (高斯朴素贝叶斯):
CategoricalNB (分类朴素贝叶斯):
MultinomialNB (多项式朴素贝叶斯):
ComplementNB (补充朴素贝叶斯):
这些朴素贝叶斯分类器在不同类型的数据和问题上表现良好,选择合适的分类器通常取决于数据的特点和任务的要求。
【过滤垃圾邮件】代码实现:
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import BernoulliNB, GaussianNB, CategoricalNB, MultinomialNB, ComplementNB
from sklearn.metrics import accuracy_score
# 假设有一份邮件数据集,X为邮件内容,y为标签(0表示非垃圾邮件,1表示垃圾邮件)
X = ["Hello, this is a legitimate email.",
"Congratulations! You've won a prize!",
"Invest in this amazing opportunity now!",
"Important meeting tomorrow at 10 AM.",
"Get rich quick with our scheme!",
"Free gift with every purchase.",
"Urgent: Your account needs verification.",
"Exclusive offer for a limited time!",
"Meeting rescheduled to 2 PM.",
"Claim your lottery winnings now!",
"Important update on your account.",
"Last chance to grab this deal!"]
y = [0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1]
# 使用CountVectorizer将文本数据转换为特征向量
vectorizer = CountVectorizer()
X_vectorized = vectorizer.fit_transform(X)
# 划分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_vectorized, y, test_size=0.25, random_state=0)
# 创建不同类型的朴素贝叶斯分类器实例
classifiers = {
"BernoulliNB": BernoulliNB(),
"GaussianNB": GaussianNB(),
"CategoricalNB": CategoricalNB(),
"MultinomialNB": MultinomialNB(),
"ComplementNB": ComplementNB()
}
# 训练和测试不同类型的分类器,并计算准确度分数
scores = {}
for name, classifier in classifiers.items():
# 训练分类器
classifier.fit(X_train, y_train)
# 预测测试数据
y_pred = classifier.predict(X_test)
# 计算准确度分数
score = accuracy_score(y_test, y_pred)
# 存储准确度分数
scores[name] = score
# 输出不同类型朴素贝叶斯分类器的准确度分数
for name, score in scores.items():
print(f"{name} 准确度:{score}")
先将文本数据转换为特征向量,然后使用五种不同类型的朴素贝叶斯分类器(BernoulliNB、GaussianNB、CategoricalNB、MultinomialNB、ComplementNB)进行训练和测试,
计算它们的准确度分数。
最后,输出不同类型朴素贝叶斯分类器的准确度分数,以比较性能。
?
?
【史上最易懂】马尔科夫链-蒙特卡洛方法:基于马尔科夫链的采样方法,从概率分布中随机抽取样本,从而得到分布的近似
?
【史上最易懂】变分推断:从【求分布】的推断问题,变成【缩小距离】的优化问题,用简单的分布 q 去近似复杂的分布 p
?
?
?
?
?
?
?
?
?