欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 【机器学习】9 ——最大熵模型的直观理解

【机器学习】9 ——最大熵模型的直观理解

2024/10/25 16:17:55 来源:https://blog.csdn.net/qq_43507078/article/details/142207524  浏览:    关键词:【机器学习】9 ——最大熵模型的直观理解

机器学习9 ——最大熵模型的直观理解


文章目录

  • 机器学习9 ——最大熵模型的直观理解
  • 前奏
    • 例子
      • 硬币
      • 垃圾邮件
      • 代码


前奏

【机器学习】6 ——最大熵模型

例子

硬币

假设我们有一枚硬币,可能是公平的,也可能是不公平的。我们的任务是估计硬币的正反面出现的概率。我们已知硬币有两个面:正面(H)和反面(T),除此之外没有其他信息。因此,我们希望在不引入不必要假设的情况下,找到最合理的概率分布。

当我们没有任何关于硬币的额外信息时,我们唯一知道的是硬币只有两个面(H 和 T)。基于最大熵原则,我们希望选择最“随机”或最“均匀”的概率分布。在这种情况下,最合理的分布是:
P(H) = 0.5
P(T) = 0.5
这是因为熵的最大化意味着我们选择的是最不确定的分布,即每种可能性是等概率的。

对于两个事件 H 和 T:

H( p)=−[p(H)logp(H) + p(T)logp(T)]

代入 P(H) = 0.5 和 P(T) = 0.5:
H( p)=−[0.5log0.5+0.5log0.5] =−[0.5×(−1)+0.5×(−1)]=1
这是在没有任何其他信息时,熵最大的分布,表示正反面各有 50% 的概率。

假设我们现在有额外的信息,例如在 10 次投掷中正面出现了 7 次,反面出现了 3 次。我们不再假设正反面等概率。

我们需要在这个额外信息(正面出现更多次)和熵最大化之间找到平衡。最大熵模型会根据这个信息调整概率分布,但仍然保持最大的熵。

约束条件:正面出现的频率为 7/10,即我们期望: E(H)=0.7
拉格朗日乘数法:我们引入拉格朗日乘数来最大化熵,同时满足上述的约束条件。我们最大化以下目标函数:

L ( p)=−[p(H)logp(H)+p(T)logp(T)]+λ(p(H)−0.7)

通过求导并解方程,可以得到新的概率分布 P(H)=0.7 和 P(T)=0.3,这符合已知数据的约束条件,同时尽量保持熵的最大化。

垃圾邮件

  • 训练数据:
    假设我们有以下几封邮件,并且每封邮件已经标注为垃圾邮件(Spam)或非垃圾邮件(Not Spam):

邮件1 (Spam): “Win a million dollars now”
邮件2 (Not Spam): “Meeting at 3 PM today”
邮件3 (Spam): “Congratulations! You have won a free gift”
邮件4 (Not Spam): “Project update attached”

  • 特征提取:
    首先,从每封邮件中提取特征(即单词)。在这个例子中,我们的特征是邮件中的单词。例如:

“Win”, “million”, “dollars”, “now”, “Meeting”, “project” 等等。
我们可以将每封邮件转化为一个包含特征的向量:

  • 邮件1:[“Win”, “million”, “dollars”, “now”]
  • 邮件2:[“Meeting”, “3”, “PM”, “today”]
  • 邮件3:[“Congratulations”, “You”, “won”, “free”, “gift”]
  • 邮件4:[“Project”, “update”, “attached”]
    标签:
    邮件1 -> Spam (1)
    邮件2 -> Not Spam (0)
    邮件3 -> Spam (1)
    邮件4 -> Not Spam (0)
    例如:f 1 (x,y) = 1 if “Meeting” 出现在文本 x 中并且 y 为“Not Spam”,否则为 0。类似这样设置
  • 最大熵模型的目标:
    模型的目标是根据训练数据估计每封邮件属于垃圾邮件(Spam)或非垃圾邮件(Not Spam)的概率。为了最大化模型的熵,我们引入约束条件,比如已知邮件中出现某些单词时其分类的概率。

  • 训练过程:
    我们用最大熵模型来训练这些数据。模型根据邮件中的单词(特征)以及历史邮件的分类信息,计算每个单词在垃圾邮件和非垃圾邮件中的条件概率

如果"win"这个单词在训练集中大多数时候出现在垃圾邮件中,模型会为"win"分配一个较高的垃圾邮件概率。
如果"meeting"这个单词大多数时候出现在非垃圾邮件中,模型会为它分配一个较高的非垃圾邮件概率。
直观理解就是在数据中,出现了单词(特征),那特征f取1,分子变大,概率变大

  • 特征是独立的,通常通过词袋模型(Bag of Words)或 TF-IDF(词频-逆文档频率)方法将文本转换为数值表示。
  • 在这个例子中,特征提取可以使用词袋模型。对于每封邮件,提取其中的单词并将其表示为一个向量。例如:
    邮件1(“Win a million dollars now”)转换为 [1, 0, 0, 1, 0…],其中每个位置代表一个单词的出现次数。
    邮件2(“Meeting at 3 PM today”)转换为 [0, 1, 0, 0, 1…],同样代表单词出现的频率。
    在这里插入图片描述
  • 分类预测:
    当有一封新邮件出现时,例如 “Free gift awaiting you”, 最大熵模型会计算它属于垃圾邮件和非垃圾邮件的概率:

P(Spam | “Free gift awaiting you”) = ?
P(Not Spam | “Free gift awaiting you”) = ?

代码

这个很简单,复杂问题可能要考虑更多

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression# 训练样本数据
emails = ["Win a million dollars now", "Meeting at 3 PM today","Congratulations! You have won a free gift", "Project update attached"]# 标签:1表示垃圾邮件,0表示非垃圾邮件
labels = [1, 0, 1, 0]# 特征提取:使用词袋模型
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails)# 最大熵模型近似:使用逻辑回归实现
model = LogisticRegression()
model.fit(X, labels)# 测试新邮件
new_emails = ["Free gift awaiting you", "Meeting tomorrow"]
X_new = vectorizer.transform(new_emails)# 预测
predictions = model.predict(X_new)
print("预测结果:", predictions)  # 输出预测类别:1 表示垃圾邮件,0 表示非垃圾邮件# 计算每类概率
probs = model.predict_proba(X_new)
print("分类概率:", probs)  # 输出每封邮件属于垃圾邮件和非垃圾邮件的概率

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com