新手村:逻辑回归-理解04:熵是什么?
新手村:逻辑回归04:熵是什么?
熵是什么?
前置条件
在开始学习逻辑回归中的熵理论之前,需要掌握以下基础知识:
-
概率论与统计学:
- 概率分布(如伯努利分布、正态分布)。
- 条件概率和贝叶斯定理。
- 期望值和方差的基本概念。
-
线性代数:
- 向量和矩阵的基本运算。
- 线性组合的概念。
-
微积分:
- 导数和偏导数的计算。
- 极值问题和梯度下降的基本思想。
-
机器学习基础:
- 分类与回归的区别。
- 基本的监督学习模型(如线性回归)。
-
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)=−i∑piln(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)−(1−p)log2(1−p)
其中
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,y∑P(x,y)log2(P(x,y))
条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X) 衡量在已知
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(Y∣X)=−x,y∑P(x,y)log2(P(y∣x))
通俗解释:
联合熵就像是两个人一起猜谜语时的总不确定性,而条件熵则是当你知道一部分答案后,剩下的不确定性。
⭐️⭐️⭐️第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)=−i∑P(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=1∑N[yilog(y^i)+(1−yi)log(1−y^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=1∏NP(yi∣xi;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=1∑N[yilog(y^i)+(1−yi)log(1−y^i)]
通俗解释:
最大似然估计的目标是找到一组参数,使得模型预测的概率分布最接近真实分布。
⭐️第3章:逻辑回归与熵的关系
3.1 Sigmoid函数
Sigmoid函数将线性组合
z
=
w
⋅
x
+
b
z = w \cdot x + b
z=w⋅x+b 映射到概率空间:
σ
(
z
)
=
1
1
+
e
−
z
\sigma(z) = \frac{1}{1 + e^{-z}}
σ(z)=1+e−z1
通俗解释:
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−η⋅∂w∂L
其中
η
\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章:后续练习题与进阶学习
练习题
- 使用自定义的梯度下降算法实现逻辑回归。
- 修改上述代码,尝试添加多项式特征。
- 讨论为什么逻辑回归不能直接用于多分类问题。
进阶学习内容
- 支持向量机(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,其他分量按比例分配剩余概率。
代码解析
-
交叉熵公式:
- 函数
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)错误。
- 函数
-
构造预测分布:
- 我们让 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×(1−q1), q 3 = 0.4 × ( 1 − q 1 ) q_3 = 0.4 \times (1-q_1) q3=0.4×(1−q1))。
-
寻找最优解:
- 记录每个 q 1 q_1 q1对应的交叉熵值,并找出使交叉熵最小化的 q 1 q_1 q1值。
- 最优预测分布 Q Q Q应该接近真实分布 P P P。