当前位置: 首页 > article >正文

新手村:逻辑回归-理解04:熵是什么?

新手村:逻辑回归04:熵是什么?

在这里插入图片描述

熵是什么?

前置条件

在开始学习逻辑回归中的熵理论之前,需要掌握以下基础知识:

  1. 概率论与统计学

    • 概率分布(如伯努利分布、正态分布)。
    • 条件概率和贝叶斯定理。
    • 期望值和方差的基本概念。
  2. 线性代数

    • 向量和矩阵的基本运算。
    • 线性组合的概念。
  3. 微积分

    • 导数和偏导数的计算。
    • 极值问题和梯度下降的基本思想。
  4. 机器学习基础

    • 分类与回归的区别。
    • 基本的监督学习模型(如线性回归)。
  5. Python编程

    • 熟悉NumPy和Pandas库的基本操作。
    • 基本的Matplotlib可视化技能。

章节内容概述重要知识点通俗解释知识点评分(1-5)
第1章:熵的基本概念介绍熵的定义及其在信息论中的意义。- 熵的数学定义
- 香农熵
- 联合熵与条件熵
熵可以理解为“不确定性”的量化:信息越多,不确定性越低。5(核心概念)
第2章:交叉熵与对数损失函数讲解交叉熵的定义及其在分类任务中的作用。- 交叉熵公式
- 对数损失函数
- 最大似然估计
交叉熵衡量预测分布与真实分布的距离,类似于“误差”。5(核心概念)
第3章:逻辑回归与熵的关系将熵理论应用于逻辑回归模型。- Sigmoid函数
- 逻辑回归的目标函数
- 损失函数优化
逻辑回归通过最小化交叉熵来找到最佳参数,从而降低分类误差。5(核心概念)
第4章:梯度下降与参数优化学习如何通过梯度下降优化逻辑回归模型的参数。- 梯度下降算法
- 学习率选择
- 收敛性分析
梯度下降像是“找最低点”,每一步都朝着减少误差的方向前进。4(重要但不核心)
第5章:教学示例与代码实现使用一个具体的数据集进行逻辑回归建模。- 数据预处理
- 特征工程
- 模型训练与评估
从数据到模型的完整流程,帮助理解理论与实践的结合。4(重要但不核心)
第6章:后续练习题与进阶学习提供练习题,并规划下一阶段的学习内容。- 练习题类型
- 进阶资源推荐
- 下一阶段目标
通过练习巩固知识,并为更复杂的模型打下基础。3(辅助内容)

第1章:熵的基本概念
⭐️⭐️⭐️ 1.1 熵的数学定义

是信息论中的一个重要概念,用于衡量随机变量的不确定性
假设随机变量 X X X 的概率分布为 P ( X = x i ) = p i P(X = x_i) = p_i P(X=xi)=pi,则熵 H ( X ) H(X) H(X) 定义为:

H ( X ) = − ∑ i p i ln ⁡ ( p i ) H(X) = -\sum_{i} p_i \ln(p_i) H(X)=ipiln(pi)
其中, p i p_i pi 是事件 x i x_i xi 发生的概率, ln ⁡ \ln ln 表示以2为底的对数。
示例字符串
example_string = "123123124351512431234123414321368969867898706785874674"
在这里插入图片描述

通俗解释
想象你正在猜一个骰子的结果。如果骰子是公平的(每个面的概率都是 1 / 6 1/6 1/6),那么不确定性最高;如果骰子被做了手脚(比如某一面的概率接近1),那么不确定性最低。熵就是用来量化这种不确定性的指标。

1.2 ⭐️香农熵

香农熵是熵的一种形式,专门用于描述离散随机变量的信息量

例如,对于二分类问题(如是否购买手机),伯努利分布的熵为:
H ( p ) = − p log ⁡ 2 ( p ) − ( 1 − p ) log ⁡ 2 ( 1 − p ) H(p) = -p \log_2(p) - (1-p) \log_2(1-p) H(p)=plog2(p)(1p)log2(1p)
其中 p p p 是事件发生的概率。

在这里插入图片描述

通俗解释
假设你正在预测一个人是否会点击某个广告。如果点击的概率是0.5(完全随机),那么不确定性最大;如果点击的概率接近0或1(几乎确定),那么不确定性最小。

1.3 联合熵与条件熵

联合熵 H ( X , Y ) H(X, Y) H(X,Y) 衡量两个随机变量 X X X Y Y Y 的联合不确定性:
H ( X , Y ) = − ∑ x , y P ( x , y ) log ⁡ 2 ( P ( x , y ) ) H(X, Y) = -\sum_{x,y} P(x, y) \log_2(P(x, y)) H(X,Y)=x,yP(x,y)log2(P(x,y))
条件熵 H ( Y ∣ X ) H(Y|X) H(YX) 衡量在已知 X X X 的情况下, Y Y Y 的剩余不确定性:
H ( Y ∣ X ) = − ∑ x , y P ( x , y ) log ⁡ 2 ( P ( y ∣ x ) ) H(Y|X) = -\sum_{x,y} P(x, y) \log_2(P(y|x)) H(YX)=x,yP(x,y)log2(P(yx))

在这里插入图片描述

通俗解释
联合熵就像是两个人一起猜谜语时的总不确定性,而条件熵则是当你知道一部分答案后,剩下的不确定性。


⭐️⭐️⭐️第2章:交叉熵与对数损失函数
2.1 交叉熵公式

交叉熵衡量两个概率分布之间的差异。假设真实分布为 P P P,预测分布为 Q Q Q,则交叉熵 H ( P , Q ) H(P, Q) H(P,Q) 定义为:
H ( P , Q ) = − ∑ i P ( i ) log ⁡ ( Q ( i ) ) H(P, Q) = -\sum_{i} P(i) \log(Q(i)) H(P,Q)=iP(i)log(Q(i))
在这里插入图片描述

通俗解释
交叉熵可以看作是“预测错误的成本”。如果你的预测分布越接近真实分布,交叉熵就越小;反之,预测分布偏离真实分布越多,交叉熵就越大。

2.2 对数损失函数

在逻辑回归中,对数损失函数是对交叉熵的具体应用。对于二分类问题,对数损失函数为:

L ( w ) = − 1 N ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] L(w) = -\frac{1}{N} \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] L(w)=N1i=1N[yilog(y^i)+(1yi)log(1y^i)]
其中 y i y_i yi 是真实标签, y ^ i \hat{y}_i y^i 是预测概率。

通俗解释
在这里插入图片描述

对数损失函数衡量的是模型预测的准确性

  • 如果预测概率 y ^ \hat{y} y^接近真实标签(如 y = 1 y=1 y=1 y ^ = 0.9 \hat{y}=0.9 y^=0.9),损失会很小;
  • 如果预测概率 y ^ \hat{y} y^远离真实标签(如 y = 1 y=1 y=1 y ^ = 0.1 \hat{y}=0.1 y^=0.1),损失会很大。
⭐️2.3 最大似然估计

新手村:逻辑回归-理解03:逻辑回归中的最大似然函数

逻辑回归通过最大化似然函数(等价于最小化交叉熵)来优化参数。似然函数 L ( w ) L(w) L(w) 定义为:

L ( w ) = ∏ i = 1 N P ( y i ∣ x i ; w , b ) L(w) = \prod_{i=1}^N P(y_i|x_i; w,b) L(w)=i=1NP(yixi;w,b)
取对数后得到对数似然函数:
log ⁡ L ( w ) = ∑ i = 1 N [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] \log L(w) = \sum_{i=1}^N [y_i \log(\hat{y}_i) + (1-y_i) \log(1-\hat{y}_i)] logL(w)=i=1N[yilog(y^i)+(1yi)log(1y^i)]

通俗解释
最大似然估计的目标是找到一组参数,使得模型预测的概率分布最接近真实分布。


⭐️第3章:逻辑回归与熵的关系
3.1 Sigmoid函数

Sigmoid函数将线性组合 z = w ⋅ x + b z = w \cdot x + b z=wx+b 映射到概率空间:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1

通俗解释
Sigmoid函数就像一个“压缩器”,把任何实数压缩到0到1之间,方便解释为概率。

#####⭐️⭐️ 3.2 逻辑回归的目标函数
逻辑回归的目标是最小化对数损失函数(即最大化似然函数)。通过梯度下降法不断调整参数 w w w b b b,使预测概率 y ^ \hat{y} y^ 更接近真实标签 y y y

通俗解释
逻辑回归的核心思想是通过调整模型参数,让预测结果尽可能准确,同时用交叉熵来衡量预测的误差。


第4章:梯度下降与参数优化
4.1 梯度下降算法

梯度下降是一种迭代优化算法,用于最小化损失函数。更新规则为:
w : = w − η ⋅ ∂ L ∂ w w := w - \eta \cdot \frac{\partial L}{\partial w} w:=wηwL
其中 η \eta η 是学习率。

通俗解释
梯度下降就像是沿着山坡向下走,每次迈出一步,直到找到最低点。

4.2 学习率选择

学习率 η \eta η 决定了每次更新的步长。如果学习率过大,可能会错过最优解;如果过小,收敛速度会很慢。

通俗解释
学习率就像是走路的步伐大小,太大容易踩空,太小走得太慢。


第5章:教学示例与代码实现
教学示例

假设我们有一个简单的数据集,包含学生的考试成绩和是否被录取的信息。我们将使用逻辑回归预测学生是否会被录取。

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 数据集
data = {
    'Exam1': [45, 78, 65, 89, 90],
    'Exam2': [52, 89, 70, 95, 85],
    'Admitted': [0, 1, 0, 1, 1]
}

# 数据预处理
X = np.array([[data['Exam1'][i], data['Exam2'][i]] for i in range(len(data['Exam1']))])
y = np.array(data['Admitted'])

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 预测
y_pred = model.predict(X_test)

# 评估
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")

第6章:后续练习题与进阶学习
练习题
  1. 使用自定义的梯度下降算法实现逻辑回归。
  2. 修改上述代码,尝试添加多项式特征。
  3. 讨论为什么逻辑回归不能直接用于多分类问题。
进阶学习内容
  • 支持向量机(SVM)。
  • 决策树与随机森林。
  • 神经网络与深度学习。

术语与术语解释

术语解释
衡量随机变量不确定性的指标。
交叉熵衡量两个概率分布之间的差异。
对数损失函数在分类任务中常用的损失函数,基于交叉熵。
Sigmoid函数将任意实数映射到[0,1]区间的函数,用于概率估计。
梯度下降一种优化算法,用于最小化损失函数。

总结陈述

逻辑回归中的熵理论是机器学习的重要基础之一。通过学习熵、交叉熵以及它们在逻辑回归中的应用,你可以更好地理解分类模型的工作原理。建议按照上述计划逐步深入学习,并通过代码实践巩固理论知识。

代码

香农熵

import numpy as np
import matplotlib.pyplot as plt

# 计算香农熵的函数
def shannon_entropy(p):
    if p == 0 or p == 1:
        return 0
    else:
        return - (p * np.log2(p) + (1-p) * np.log2(1-p))

# 定义概率范围从0到1
probabilities = np.linspace(0, 1, 400)
entropies = [shannon_entropy(p) for p in probabilities]

# 绘制香农熵随概率变化的曲线
plt.figure(figsize=(8, 6))
plt.plot(probabilities, entropies, label='香农熵')
plt.title('香农熵与事件发生概率的关系')
plt.xlabel('事件发生概率 (p)')
plt.ylabel('熵')
plt.grid(True)
plt.legend()
plt.show()
联合熵和条件熵
import numpy as np
import matplotlib.pyplot as plt

# 定义联合概率分布P(x, y)
joint_prob = np.array([[0.1, 0.2], 
                       [0.3, 0.4]])

# 计算边缘概率P(x)和P(y)
marginal_X = joint_prob.sum(axis=1)  # P(x), 按列求和
marginal_Y = joint_prob.sum(axis=0)  # P(y), 按行求和

# 计算条件概率P(y|x)
conditional_prob_Y_given_X = joint_prob / marginal_X[:, None]  # P(y|x)

# 联合熵H(X, Y)
def joint_entropy(joint_prob):
    non_zero_probs = joint_prob[joint_prob > 0]  # 过滤掉零概率项
    return -np.sum(non_zero_probs * np.log2(non_zero_probs))  

# 条件熵H(Y|X)
def conditional_entropy(joint_prob, marginal_X):
    cond_ent = 0
    for i in range(joint_prob.shape[0]):  # 遍历每个x
        px = marginal_X[i]
        if px > 0:
            py_given_x = joint_prob[i] / px  # P(y|x)
            non_zero_py_given_x = py_given_x[py_given_x > 0]  # 过滤掉零概率项
            cond_ent -= px * np.sum(non_zero_py_given_x * np.log2(non_zero_py_given_x))
    return cond_ent

# 计算联合熵和条件熵
h_xy = joint_entropy(joint_prob)
h_y_given_x = conditional_entropy(joint_prob, marginal_X)

# 打印结果
print(f"联合熵 H(X, Y): {h_xy:.4f}")
print(f"条件熵 H(Y|X): {h_y_given_x:.4f}")

# 可视化联合概率分布和条件概率分布
fig, axes = plt.subplots(1, 2, figsize=(12, 5))

# 绘制联合概率分布热力图
im = axes[0].imshow(joint_prob, cmap='Blues', interpolation='nearest')
axes[0].set_title("联合概率分布 P(x, y)")
axes[0].set_xlabel("Y")
axes[0].set_ylabel("X")
for (i, j), val in np.ndenumerate(joint_prob):
    axes[0].text(j, i, f"{val:.2f}", ha='center', va='center', color='black', fontsize=12)
fig.colorbar(im, ax=axes[0])

# 绘制条件概率分布条形图
bar_width = 0.35
indices = np.arange(len(marginal_X))
bars = []
for i in range(joint_prob.shape[1]):
    bar = axes[1].bar(indices + i * bar_width, conditional_prob_Y_given_X[:, i], bar_width, label=f"P(y={i}|x)")
    bars.append(bar)
axes[1].set_title("条件概率分布 P(y|x)")
axes[1].set_xticks(indices + bar_width / 2)
axes[1].set_xticklabels([f"x={i}" for i in indices])
axes[1].legend()

plt.tight_layout()
plt.show()

交叉熵
import numpy as np
import matplotlib.pyplot as plt

# 定义交叉熵函数
def cross_entropy(P, Q):
    """
    计算交叉熵 H(P, Q)
    :param P: 真实分布 (list 或 numpy array)
    :param Q: 预测分布 (list 或 numpy array)
    :return: 交叉熵值
    """
    P = np.array(P)
    Q = np.array(Q)
    # 过滤掉Q中的零概率项以避免log(0)错误
    Q_nonzero_mask = Q > 0
    return -np.sum(P[Q_nonzero_mask] * np.log2(Q[Q_nonzero_mask]))

# 示例的真实分布P
P = [0.5, 0.3, 0.2]

# 构造一系列不同的预测分布Q,并计算对应的交叉熵
q1_values = np.linspace(0.01, 0.98, 100)  # 第一个分量q1从0.01到0.98
entropy_values = []

for q1 in q1_values:
    q2 = (1 - q1) * 0.6  # 剩余概率按固定比例分配给q2和q3
    q3 = (1 - q1) * 0.4
    Q = [q1, q2, q3]
    entropy_values.append(cross_entropy(P, Q))

# 找到最小交叉熵及其对应的Q
min_index = np.argmin(entropy_values)
optimal_q1 = q1_values[min_index]
optimal_Q = [optimal_q1, (1 - optimal_q1) * 0.6, (1 - optimal_q1) * 0.4]
min_cross_entropy = entropy_values[min_index]

# 输出最优解
print(f"最小交叉熵: {min_cross_entropy:.4f}")
print(f"对应的最优预测分布 Q: {optimal_Q}")

# 可视化交叉熵随q1变化的趋势
plt.figure(figsize=(10, 6))
plt.plot(q1_values, entropy_values, label="交叉熵", color='blue')
plt.scatter(optimal_q1, min_cross_entropy, color='red', label=f"最小交叉熵 ({min_cross_entropy:.4f})", zorder=5)
plt.axvline(x=optimal_q1, color='gray', linestyle='--', linewidth=1)

plt.title("交叉熵随预测分布的第一个分量 $q_1$ 的变化", fontsize=16)
plt.xlabel("$q_1$", fontsize=14)
plt.ylabel("交叉熵值", fontsize=14)
plt.grid(True)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()

场景设定
假设我们有一个真实分布 P = [ 0.5 , 0.3 , 0.2 ] P = [0.5, 0.3, 0.2] P=[0.5,0.3,0.2],代表某个事件发生的三种可能性的概率。接着,我们尝试使用不同的预测分布 Q Q Q 来逼近 P P P,并通过计算交叉熵来评估预测的准确性。

我们将逐步调整 Q Q Q的值,并观察交叉熵如何变化。为了简化问题,这里只调整 Q Q Q的第一个分量 q 1 q_1 q1,其他分量按比例分配剩余概率。

在这里插入图片描述

代码解析

  1. 交叉熵公式

    • 函数 cross_entropy 根据公式 H ( P , Q ) = − ∑ i P ( i ) log ⁡ 2 ( Q ( i ) ) H(P, Q) = -\sum_i P(i) \log_2(Q(i)) H(P,Q)=iP(i)log2(Q(i))实现。
    • 使用掩码过滤掉 Q Q Q 中的所有零概率项,以避免出现 log ⁡ ( 0 ) \log(0) log(0)错误。
  2. 构造预测分布

    • 我们让 Q Q Q的第一个分量 q 1 q_1 q1 在区间 [ 0.01 , 0.98 ] [0.01, 0.98] [0.01,0.98] 内变化。
    • 其他两个分量 q 2 q_2 q2 q 3 q_3 q3 按照固定的比值分配剩余概率( q 2 = 0.6 × ( 1 − q 1 ) q_2 = 0.6 \times (1-q_1) q2=0.6×(1q1) q 3 = 0.4 × ( 1 − q 1 ) q_3 = 0.4 \times (1-q_1) q3=0.4×(1q1))。
  3. 寻找最优解

    • 记录每个 q 1 q_1 q1对应的交叉熵值,并找出使交叉熵最小化的 q 1 q_1 q1值。
    • 最优预测分布 Q Q Q应该接近真实分布 P P P


http://www.kler.cn/a/613648.html

相关文章:

  • # 线性代数:660习题总结660# 宋浩讲解视频
  • 安装docker版jira8.0.2
  • Go 语言标准库中reflect模块详细功能介绍与示例
  • 如何使用 GPT-4o API 实现视觉、文本、图像等功能 附赠gpt升级和4o额度购买
  • OPPO Pad 4 Pro图赏,轻薄大屏,多面出色
  • QT四 资源文件;绘图;绘图设备;qpixmap 和 qimage 转换;QPixmap、QBitmap、QImage和 QPicture的区别
  • Golang中间件的原理与实现
  • 使用 Selenium 构建简单高效的网页爬虫
  • Docker Compose 基础知识
  • rnn的ho的维度 (num_layers * num_directions, batchsize, hidden_size)
  • 付账问题 | 第9届蓝桥杯省赛C++A组
  • Kafka 偏移量
  • 安卓车载app面经
  • 嵌入式单片机程序的映像文件解读
  • idea中如何使用git
  • git在实践使用中的操作流程
  • Java----用正则表达式爬取数据
  • SpringCloud Hystrix的用法详解
  • 【C#.NET】Web API项目Swagger配置扩展
  • vscode无法打开Terminal终端