• 【机器学习】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)  # 输出每封邮件属于垃圾邮件和非垃圾邮件的概率
    
    
  • 相关阅读:
    2、Flowable基础表结构
    【已拿offer】最新AI产品经理大厂面经(含百度&腾讯&科大讯飞&商汤&蚂蚁金服)
    3297:【例50.3】 平衡数《信息学奥赛一本通编程启蒙(C++版)》
    Javashop多用户商城系统源码
    python: 用百度API读取增值税发票信息
    spring4.0事务超详细源码解析
    25考研数据结构复习·3.1栈·顺序栈·链栈
    【力扣周赛】来自VIP的原题压制:2406.将区间分为最少组数,内含福利!
    vs2019 release模式调试:此表达式有副作用,将不予计算。
    电动车企的2023:抱团活下去
  • 原文地址:https://blog.csdn.net/qq_43507078/article/details/142207524