贝叶斯方法家族

发布时间:2024年01月16日

?


机器学习框架

计算机都是通过数据理解世界,数据类型可分为时间数据、空间数据。

  1. 空间数据

    • 距离是衡量这些数据点之间差异的方法
    • 距离从一阶绝对值、二阶欧式距离、衡量不确定性程度/离散程度/数据纯度的熵
    • 在处理空间数据时,模型都是判别式模型 p ( y ∣ x ) p(y|x) p(yx),根据 x 判别 y
    • 包括K近邻算法(KNN)、决策树、神经网络、支持向量机(SVM)、CNN、RNN、transformer
    • 这些模型可以处理各种空间数据,识别其中的模式和结构,学习类别边界。
  2. 时间数据

    • 时间数据强调的是顺序性,这种数据类型在贝叶斯理论中尤为重要。
    • 处理时间数据时,都是生成式模型 p ( y , x ) ? > p ( y ∣ x ) p(y,x)->p(y|x) p(y,x)?>p(yx),根据联合概率分布,预测,条件概率密度分布。
    • 包括 VAE、GAN、扩散模型。
    • 这些模型能够有效地解析和预测随时间变化的数据趋势,学习概率分布。

?


贝叶斯方法

根据结果去猜原因是不好猜的。

  • 你看见一个小孩在踢足球,正向推导那很容易,直接估算窗户被踢碎的概率即可
  • 但如果只知道窗户被打破了,从结果猜测原因是很难的,原因太多了

贝叶斯方法巧妙的解决难解的逆概率问题 P ( A ∣ B ) = P ( 原因 ∣ 窗户破了 ) P(A|B)=P(原因|窗户破了) P(AB)=P(原因窗户破了)

贝叶斯的思想是:

  • 已知的P(B|A)(原因导致结果的概率)、P(A)(原因本身发生的概率)和P(B)(结果本身发生的概率)
  • 来计算P(A|B)(在结果发生的情况下原因发生的概率)

只需要问,A、B 事件都发生的概率是多少?

  • P(B) 的发生概率,P(A|B) 的发生概率 — B 发生的情况下,A 也发生的概率,等于 P ( B ) ? P ( A ∣ B ) P(B) * P(A|B) P(B)?P(AB)
  • P(A) 的发生概率,P(B|A) 的发生概率 — A 发生的情况下,B 也发生的概率,等于 P ( A ) ? P ( B ∣ A ) P(A) * P(B|A) P(A)?P(BA)
  • 俩者一定相等 — P ( B ) ? P ( A ∣ B ) = P ( A ) ? P ( B ∣ A ) P(B) * P(A|B)=P(A) * P(B|A) P(B)?P(AB)=P(A)?P(BA)
  • 我们求逆概率问题 P ( 原因 ∣ 窗户破了 ) = P ( A ∣ B ) = P ( B ∣ A ) P ( B ) ? P ( A ) P(原因|窗户破了)=P(A|B)=\frac{P(B|A)}{P(B)}*P(A) P(原因窗户破了)=P(AB)=P(B)P(BA)??P(A)

因为 P ( A ) 、 P ( B ) 、 P ( B ∣ A ) P(A)、P(B)、P(B|A) P(A)P(B)P(BA) 都好算,才转成这样的形式

?
贝叶斯方法:

  • P ( A ∣ B ) = P ( B ∣ A ) P ( B ) ? P ( A ) P(A|B)=\frac{P(B|A)}{P(B)}*P(A) P(AB)=P(B)P(BA)??P(A)

  • 新观念 = 调整因子 ? 老观念 新观念=调整因子*老观念 新观念=调整因子?老观念

贝叶斯和其他推断方法的区别

  1. 根据结果去猜测原因:这是最基本的推理方法,通常称为“后验推理”或“逆向推理”。

    我们仅仅根据观察到的结果或效果来猜测可能的原因。

    例如,看到地上有水迹,我们可能推测之前下过雨。

    这种推理方法是直观的,但有时可能不够准确,因为相同的结果可能由多种不同的原因引起。

  2. 根据结果去猜测原因,并考虑先验知识:这种方法在逆向推理的基础上加入了“先验知识”的考虑。

    先验知识是指我们之前已经知道或相信的信息。

    在推理时结合先验知识,可以使我们的推测更加准确和有根据。

    在推测地上水迹的原因时,如果我们知道早上有浇水的习惯,那么我们可能会考虑浇水而不是下雨作为更可能的原因。

  3. 考虑先验知识,并利用新的数据来更新和改进推测:贝叶斯推理方式,观点随事实改变。

    不仅考虑先验知识,还会利用新的数据或信息来更新和改进我们的推测。

    这种方法是动态的,随着新信息的出现,原有的推测会被修正和更新。

    如果在考虑了浇水的可能性后,我们又获得了当地早上确实下过雨的气象数据,我们可能会重新评估并认为下雨是更可能的原因。

这三种方法在复杂性和精确性上逐渐提升,都是处理信息和进行决策时常用的逻辑推理方法。

?


朴素贝叶斯分类

为什么叫朴素贝叶斯?

因为采用了一个特别简化的假设,即"朴素假设"。

朴素假设是指在朴素贝叶斯分类器中,特征之间被假定为相互独立,而不考虑它们之间的关联性。

这个假设在实际情况下通常是不成立的,因为很多情况下特征之间都会存在一定的相关性。

然而,尽管这个假设非常简化,朴素贝叶斯分类器却在许多实际应用中表现得出奇地好。
?
比如,垃圾邮件过滤。

朴素贝叶斯

在朴素贝叶斯中,我们假设文本中的每个词都是相互独立的,忽略了词汇之间的关联性。

这就是“朴素”的含义。

朴素贝叶斯通过计算每个单词在垃圾邮件和非垃圾邮件中的出现概率,然后根据文本中的单词来计算整个邮件是垃圾邮件的概率。

它的计算简单、高效,但忽略了词汇之间的语义关系。

?
非朴素方法

非朴素方法考虑了词汇之间的关联性,通常使用更复杂的模型来捕捉这些关系。

例如,可以使用N-gram模型考虑词汇的顺序,或者使用深度学习模型如循环神经网络(RNN)或卷积神经网络(CNN)来学习词汇之间的语义关系。

这种方法更复杂,需要更多的计算资源和数据,但可以更准确地捕捉文本的复杂性。
?
效果对比

  • 朴素贝叶斯:由于它的简单性和高效性,在某些情况下,朴素贝叶斯可以表现得很好。

    特别是在数据量不大、特征维度较低的情况下,它可以快速训练和进行分类,并且可能获得不错的结果。

    然而,由于它忽略了词汇之间的关联性,可能会在处理语义复杂的邮件时失效。

  • 非朴素方法:非朴素方法通常需要更多的计算资源和数据来训练,但它们可以更好地捕捉文本的语义关系,因此在处理复杂的语言结构和垃圾邮件变种时可能更加强大。它们可以考虑词汇的顺序、上下文和语义含义,从而提高了分类的准确性。

效果对比取决于数据集的大小和复杂性,以及可用的计算资源。

五个 NB 分类器

  1. BernoulliNB (伯努利朴素贝叶斯):

    • 适用于二元型特征数据,通常用于文本分类任务中,其中特征表示是否出现某个词汇。
    • 假设特征是二元的(存在或不存在),因此它适合处理二值化数据,例如垃圾邮件分类,其中词汇的存在或不存在被编码为1和0。
    • 伯努利朴素贝叶斯使用伯努利分布来建模特征的条件概率。
  2. GaussianNB (高斯朴素贝叶斯):

    • 适用于连续型特征数据,通常用于数值型数据的分类任务。
    • 假设特征数据服从高斯分布(正态分布),因此适用于处理实数型特征,如一些传感器测量的连续数据。
    • 高斯朴素贝叶斯假设特征的条件概率是高斯分布。
  3. CategoricalNB (分类朴素贝叶斯):

    • 适用于具有有限类别的离散型特征数据,例如文本分类任务中的词汇,其中每个特征是一个类别。
    • 假设特征是离散的,通常表示为整数或类别标签。
    • 分类朴素贝叶斯使用多项分布来建模特征的条件概率。
  4. MultinomialNB (多项式朴素贝叶斯):

    • 通常用于文本分类任务,其中特征表示文档中单词的频率或计数。
    • 假设特征是多项分布,通常表示为正整数,表示某个类别或单词出现的次数。
    • 多项式朴素贝叶斯适用于处理文本数据中的多类别问题,如文本分类。
  5. 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

?


隐马尔科夫模型

?


贝叶斯网络

?


贝叶斯置信网络

?


贝叶斯深度学习

?


贝叶斯神经网络

?


贝叶斯卷积神经网络

?


贝叶斯图神经网络

?


贝叶斯优化方法

?

在这里插入图片描述

文章来源:https://blog.csdn.net/qq_41739364/article/details/135622726
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。