假设我们有一枚硬币,可能是公平的,也可能是不公平的。我们的任务是估计硬币的正反面出现的概率。我们已知硬币有两个面:正面(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,这符合已知数据的约束条件,同时尽量保持熵的最大化。
邮件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…],同样代表单词出现的频率。
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) # 输出每封邮件属于垃圾邮件和非垃圾邮件的概率