news 2026/10/19 11:21:09

统计学习方法第六章:逻辑斯蒂回归与最大熵模型推导全过程详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
统计学习方法第六章:逻辑斯蒂回归与最大熵模型推导全过程详解

李航老师的《统计学习方法》第二版,第六章“逻辑斯蒂回归与最大熵模型”,是很多人在学习时最先感觉到“难度跳变”的一章。前面几章你可能还在看感知机的几何直觉、朴素贝叶斯的独立性假设,到了这一章,模型突然变成了一堆概率公式、特征函数、拉格朗日对偶,习题也更偏推导和证明,很多读者就是在这里开始怀疑自己数学是不是没学好。如果你正在啃第六章的习题,或者准备面试时被问到这一章,那这篇笔记大概率能帮到你。

我写这篇东西的核心目的,不是简单把网上流传的答案再抄一遍,而是把习题背后的推导逻辑、每一步为什么要这么做、在哪里容易出错,全部讲透。毕竟这章的题目基本都是“推导型”的,背答案没有意义,题目稍微换一个符号体系,不会推就是不会推。这篇文章适合正在学第二遍的人、准备考研复试的人,以及面试前想快速把逻辑斯蒂回归和最大熵模型串起来的人。

1. 先别急着看答案:第六章到底在解决什么问题

1.1 这一章在整本书里的定位

第二版第六章的正式名称是“逻辑斯蒂回归与最大熵模型”。表面上看是两个模型,实际上它们是同一个家族里的两个成员——对数线性模型。这个视角特别重要,因为很多人在学这一章时,把逻辑斯蒂回归和最大熵模型当成了两个完全独立的东西,分别去记公式、分别去推推导,结果发现推导过程和结论有一种说不清道不明的“相似感”。

其实,这两个模型共享同一个核心假设:把特征和标签之间的关系建模成特征的线性组合,再通过指数函数和归一化因子转成概率分布。逻辑斯蒂回归是二分类版本的对数线性模型,最大熵模型是多分类版本的对数线性模型,区别只在于你用什么视角去解释它——逻辑斯蒂回归是从传统统计学的回归角度出发,最大熵模型是从信息论的约束优化角度出发。

在整本书的脉络里,这一章是承上启下的节点。承上,它处理分类问题,和第三章k近邻、第四章朴素贝叶斯形成对比,朴素贝叶斯假设特征条件独立,逻辑斯蒂回归则不强制做这个假设。启下,最大熵模型里的特征函数、约束条件、拉格朗日对偶、IIS迭代这些概念,直接为第十一章条件随机场打了地基。你要是把第六章的推导啃透,后面学到条件随机场时会顺畅很多。

1.2 逻辑斯蒂回归的来龙去脉

逻辑斯蒂回归这个名字带“回归”两个字,实际干的是分类的活。这个命名误导过很多人,我第一次看到这个名字的时候也愣了半天。它本质上做的是:先算一个线性得分 w·x + b,然后用 sigmoid 函数把这个得分压缩到 0 到 1 之间,作为正类的概率。

这个模型最早来源于统计学,核心动机是:线性回归的输出是实数,范围从负无穷到正无穷,但概率必须落在 0 和 1 之间。于是统计学家想到,把概率先做一个 logit 变换,也就是 ln(p / (1-p)),这个变换后的值域正好是负无穷到正无穷,可以放心地用一个线性函数去拟合。反过来说,给定线性函数的值,就可以反推出 p 的表达式。这就是课本里“对数几率”那段内容的由来。

这一小段历史背景我觉得比公式本身更值得记,因为面试经常问“为什么逻辑斯蒂回归的激活函数要选 sigmoid”,标准答案说到底就是一句话:因为我们要让线性输出和概率之间满足一个可逆的、单调的对应关系,而 logit 变换是最自然的连接函数。理解了这一点,后面推导对数似然函数时,每个符号是从哪来的就清清楚楚。

1.3 最大熵模型的核心思想

最大熵模型的思想可以浓缩成一句话:在满足已知约束的条件下,选择熵最大的那个分布。这里的“已知约束”指的是我们从训练数据中提取到的事实,比如某个特征和某个标签同时出现的经验频率是多少。约束之外的细节,我们不做任何主观假设,因为不做假设就等价于让熵最大。

这个思想非常符合直觉,我经常用一个生活化的类比来理解它:假设你要猜一个人今天是开车上班还是坐地铁上班,你知道的信息只有“今天下雨”。如果“下雨”这个信息告诉你,那人选择开车的概率会增大,但你没有更多数据时,不应该脑补“他是新手所以不敢开”或者“他家离公司特别远”这种额外假设。在你掌握的信息范围内,把不确定性保留到最大,就是最大熵的做法。

在数学上,这种“不确定性最大化”体现在熵函数上。约束条件则通过特征函数的期望等式来描述,最后演变成一个带等式约束的优化问题,用拉格朗日乘子法求解。这一套推导流程,就是第六章后半部分的核心,也是课后习题最喜欢考的考点。

2. 习题答案是怎么来的:典型推导题的完整思路

2.1 对数似然函数和梯度推导

这一章最经典的习题之一,就是写出二项逻辑斯蒂回归的对数似然函数,并推导参数更新的梯度公式。

先设训练集为 T = {(x_i, y_i)}_{i=1..N},其中 y_i ∈ {0, 1}。记 π(x) = P(Y=1|x) = exp(w·x + b) / (1 + exp(w·x + b))。那么样本 (x_i, y_i) 的分布可以统一写成:

P(y_i | x_i) = π(x_i)^{y_i} · (1 - π(x_i))^{1 - y_i}

这个写法是分类分布的标准写法,好处是无论 y_i 是 0 还是 1,这个式子的值都等于正确的概率。所有样本的似然函数就是这些概率的连乘,连乘取对数后就变成连加:

L(w, b) = Σ_{i=1..N} [ y_i ln π(x_i) + (1 - y_i) ln(1 - π(x_i)) ]

这是目标函数。接下来求梯度的关键一步,是先把 ln π(x) 和 ln(1 - π(x)) 展开化简。因为 π(x) = exp(w·x+b)/(1+exp(w·x+b)),所以:

ln π(x) = w·x + b - ln(1 + exp(w·x + b))
ln(1 - π(x)) = - ln(1 + exp(w·x + b))

代回 L 之后,有一些项会合并,化简结果非常干净:

L(w, b) = Σ_{i=1..N} [ y_i (w·x_i + b) - ln(1 + exp(w·x_i + b)) ]

到这一步再说求梯度,就只需要对线性函数和 log-sum-exp 求导。log-sum-exp 的导数恰好就是 sigmoid,所以最终得到:

∂L / ∂w = Σ_{i=1..N} (y_i - π(x_i)) x_i

这个公式的优雅之处在于,梯度的形式跟线性回归的残差“y - ŷ”乘上特征“x”是一模一样的。也就是说,逻辑斯蒂回归虽然在模型形式上是非线性的,但梯度更新依然表达为“预测误差乘以特征值”,只不过误差用的是概率差而不是实数值差。

很多同学的推导在这里会出符号错误,常见的问题有两个。第一个是把 ln(1 - π(x)) 的导数符号搞反,原因多半是没有先化简就直接对复合函数求导,一旦公式写长就容易漏负号。第二个是忘记 b 对参数的梯度是单独的 Σ(y_i - π(x_i)),因为对 b 求导时 x_i 不会乘上来。建议水平一般的人,先把两个 log 项都展开,把式子化简到只含 w·x+b 和 log-sum-exp,再做逐项求导,这样可以很大程度避免符号问题。

2.2 最大熵模型的对偶函数推导

最大熵模型的课后证明题,核心是证明“对偶函数的极大化等价于最大熵模型的极大似然估计”。这个结论是整个第六章最难理解的地方,需要把拉格朗日对偶、内部极小化简、指数族分布这几个环节串起来。

先把原始问题写清楚。最大熵模型要找的是条件分布 P(y|x),目标函数是条件熵:

H(P) = - Σ_{x, y} P'(x) P(y|x) ln P(y|x)

这里 P'(x) 是训练数据中 x 的经验分布。约束条件有两组。第一组是特征期望约束,要求模型分布的某个特征期望等于经验分布下的对应特征期望:

Σ_{x, y} P'(x) P(y|x) f_i(x, y) = Σ_{x, y} P'(x, y) f_i(x, y)

第二组是概率归一化约束:对任意 x,Σ_y P(y|x) = 1。

引入拉格朗日乘子,把约束条件吸收进目标函数。这里有个容易绕晕的点:拉格朗日函数里既有对每个特征 f_i 的乘子 w_i,也有对每个 x 的归一化乘子 w_0(x)。原始问题等价于 max_P min_w L(P, w),因为如果 P 不满足约束,min_w 这一步会把这个解排除掉。对偶问题则写成 max_w min_P L(P, w),这里需要依赖强对偶条件才能保证两者相等。课本在这个地方没有展开讲条件,但做题时可以直接视为凸优化问题中的强对偶成立。

真正关键的步骤在 min_P L(P, w),这一步要对每个 P(y|x) 求偏导。求导前先把 L 里所有的 P(y|x) 找出来,分成两类:熵项里的是 P(y|x) ln P(y|x),特征约束里的是 P'(x) P(y|x) f_i,归一化约束里的是 w_0(x) P(y|x)。对 P(y|x) 求偏导并令其等于 0,会得到一个指数形式的解:

P(y|x) ∝ exp(Σ_i w_i f_i(x, y))

这里的比例常数正好被归一化约束吸收,也就是课本里的规范化因子 Z_w(x):

P_w(y|x) = (1 / Z_w(x)) · exp(Σ_i w_i f_i(x, y))
Z_w(x) = Σ_y exp(Σ_i w_i f_i(x, y))

这个结果本身就值得单独记一行:最大熵模型在最优解处的概率分布一定是指数族分布,它的“自然参数”是特征的线性组合,它的“充分统计量”是特征函数。这句话在你学第十一章条件随机场时几乎原封不动地还会出现一次。

内部极小完成后,得到对偶函数 ψ(w) = min_P L(P, w),化简后等于:

ψ(w) = Σ_{x, y} P'(x, y) Σ_i w_i f_i(x, y) - Σ_x P'(x) ln Z_w(x)

接下来看最大熵模型这条训练数据的对数似然。P_w(y|x) 的样本对数似然就是:

l(P_w) = Σ_{x, y} P'(x, y) ln P_w(y|x)

把 P_w 的指数形式代进去,展开后正好就是 ψ(w)。所以“对偶函数的极大化等价于极大似然估计”这个结论,本质上不是两个不同的目标,而是同一个目标函数绕着拉格朗日对偶走了一圈后,又回到了似然函数。这个证明确实很漂亮,理解了之后我再看条件随机场的学习算法,思路一下子通畅了。

2.3 IIS 更新公式的推导思路

第六章如果只考逻辑斯蒂回归,很多同学觉得还算友好。一旦涉及到最大熵模型的参数学习,推导难度就上来了,因为这里引入了一个专门的方法:改进的迭代尺度法,简称 IIS。

IIS 的动机可以这样理解:最大熵模型的似然函数对 w 求梯度,形式上有一个非常麻烦的期望项,很难直接得到闭式解。IIS 的思路是不一次性求解所有参数,而是固定其他参数,每次只更新一个参数,通过一个放缩技巧构造出似然函数的下界,然后让这个下界单调上升。这种“坐标上升 + 下界构造”的组合,跟 EM 算法的思路有异曲同工之妙。

推导的核心是构造下界。记当前参数为 w,目标参数为 w + δ,要保证似然函数在迭代后不减。利用不等式 -ln α ≥ 1 - α(α > 0 时成立),可以把似然函数差值的 log-sum-exp 部分放缩成一个更容易处理的形式。这是整个推导中最考验技巧的地方,也是做题时最难凭空想出来的步骤。课本里还会额外引入 f^#(x, y) = Σ_i f_i(x, y) 这个记号,再配合凸性做一个不等式的替换,最终把 δ_i 的求解分离成一个个独立方程。

很多人在复习时问:IIS 的详细推导需要背到什么程度?我的看法是,至少要把“构造下界→独立求解 δ→用牛顿法解方程”这个逻辑链条记住。面试官追问到 IIS 的概率不高,但一旦追问,基本考查的就是你是否理解它为什么要用“改进的迭代尺度”这个名字,以及它和简单梯度上升的区别。能说清楚这两点,比背下每一行代数更有用。

3. 推导中的那些坑:为什么你的答案总是差一步

3.1 sigmoid 函数的求导技巧

逻辑斯蒂回归这一章的习题,几乎绕不开 sigmoid 函数的求导。很多人觉得这一步太简单,不值得专门记。实际上,sigmoid 的导数性质如果利用好,可以把整个梯度推导缩短一半。

sigmoid 函数的定义是 σ(z) = 1 / (1 + exp(-z)),它的导数满足:

σ'(z) = σ(z)(1 - σ(z))

这个性质的意思是,sigmoid 的导数可以用它自身表达出来。这个性质在神经网络的反向传播、逻辑斯蒂回归的梯度计算、以及很多概率模型的期望计算中都会反复用到。

在做 2.1 的梯度推导时,如果你不预先化简 ln π(x),而是直接用链式法则硬算,就会遇到形如“对 exp 求导后还要除回去”的复杂步骤。如果先把 π(x) 设为 σ(w·x+b),那么在求 ∂L/∂w 时,只需要记住 σ' = σ(1-σ),再加上 ln σ 的导数是 (1-σ) x 这一条路径,就能很快推出残差形式。我建议做这章习题之前,先花几分钟把 σ'、d/dz ln σ(z) = 1 - σ(z)、d/dz ln(1-σ(z)) = -σ(z) 这三个导数手写一遍,写完后后面所有推导都会变顺。

3.2 拉格朗日对偶是“极小极大”而不是“极大极小”

最大熵模型习题里最大的一个理解障碍,是对偶问题的形式。很多第一次接触拉格朗日对偶的人会习惯性地按照“求约束优化→引入乘子→对 w 求极值”的套路走,结果一看到 min_P 和 max_w 的顺序,脑子就乱了。

这个顺序其实是有讲究的。原始问题是 max_P min_w L(P, w),这里的 min_w 并不真的在求某个最优乘子,而是利用拉格朗日函数的性质,把“约束不被满足”的情况排除掉。对偶问题则是 max_w min_P L(P, w),需要先对 P 求极小,得到关于 w 的函数,再对 w 求极大。

之所以两者在数值上相等,依赖的是强对偶条件。在你做习题这个层面,不需要验证 Slater 条件是否成立,因为最大熵模型的目标函数是凸的,约束是线性的,常规情况下强对偶成立。做题时只要记住:内部先求 P 的极小,得到指数族形式的解;外部再求 w 的极大,得到与似然函数等价的目标。这个顺序一旦理顺,2.2 的证明题基本就没有障碍了。

3.3 特征函数的设计思路

最大熵模型的特征函数 f_i(x, y) 是这一章最容易“看懂了但不会写”的东西。课本上的定义长这样:f_i(x, y) 是一个二值函数,当 x 和 y 满足某种特定关系时取 1,否则取 0。

我在实际学习时最大的困惑是:特征函数到底该怎么设?后来理解了,特征函数就是你对“哪些信息是重要的”这件事的编码。比如做一个简单的文本分类任务,如果认为“当前词是‘苹果’”和“标签是水果”同时出现是一个重要信号,那就设计一个特征函数,输入 x 是“当前词”,y 是“标签”,当当前词为“苹果”且标签为“水果”时返回 1。

一个常见误区是:特征函数是二元取值的事实判断,不是特征值和标签值的组合表。写代码时很多人会把连续特征直接塞进特征函数,这是不对的。最大熵模型天然处理的是二值特征,连续特征需要先离散化,或者用多个指示特征去分段编码。这个特性也决定了最大熵模型在文本场景里很自然,但在图像、语音这种连续特征为主的场景里几乎绝迹。

3.4 最大熵模型为什么“贵”

这一章没有直接讲最大熵模型的计算复杂度,但在做实现类习题时你会狠狠撞上一次。最大熵模型的参数量由特征函数决定,而特征函数设计得越细,特征数量越多。比如一个文本分类任务,如果特征来自词和标签的组合,词汇量一万,标签类别十个,特征空间理论上就有十万维。

更麻烦的是,IIS 的每次迭代都要计算所有特征在模型分布下的期望,这个期望的计算需要对所有可能出现的 (x, y) 组合求和。训练数据大、特征多时,这个求和非常昂贵。这也是为什么工程上很少直接使用这种朴素最大熵模型,而是会退化成逻辑斯蒂回归或者加上线性链结构形成条件随机场,来让期望的计算可以高效进行。

理解这一点,能帮你避开一个学习误区:不要试图照搬这章的最大熵公式去解决一个大规模真实问题。课本的模型是教学用的理想化形式,工程上要落地,必然要做结构假设或近似。这个心里有数就行,面试时如果被问到“最大熵模型的缺点”,这个回答是非常加分的。

4. 从公式到代码:自己动手实现一个逻辑斯蒂回归

4.1 骨架代码实现

第六章的代码类习题,最常见的任务是手动实现逻辑斯蒂回归并用它在简单数据集上训练。这类习题的重点不是掌握某个深度学习框架,而是把你刚刚推导出来的梯度公式“翻译”成代码。

我用 Python 实现了一个最精简的版本,核心就是三件事:计算模型输出、计算对数似然、用梯度上升更新参数。这里我故意不调任何机器学习库,所有计算都是 numpy 直接操作的,这样你能看到每个公式对应的代码长什么样。

import numpy as np def sigmoid(z): return 1.0 / (1.0 + np.exp(-z)) def train_logreg(X, y, lr=0.1, epochs=500): n, d = X.shape w = np.zeros(d) b = 0.0 for epoch in range(epochs): z = X @ w + b p = sigmoid(z) # 对数似然 eps = 1e-12 loss = -np.mean(y * np.log(p + eps) + (1 - y) * np.log(1 - p + eps)) # 梯度 dw = X.T @ (p - y) / n db = np.mean(p - y) # 梯度上升 w -= lr * dw b -= lr * db if epoch % 100 == 0: print(f"epoch {epoch}, loss {loss:.4f}") return w, b

这里的梯度方向跟 2.1 推导的 ∂L/∂w = Σ (y_i - π(x_i)) x_i 差了一个负号,因为代码里 loss 取的是负对数似然,所以更新方向变成了梯度下降。逻辑斯蒂回归的目标函数是凸的,梯度下降能收敛到全局最优,实际跑下来损失曲线会平稳下降。

4.2 用模拟数据验证结果

写完训练函数之后,当然要找一个数据集验证一下。这里我用 sklearn 的 make_classification 生成一个简单模拟数据,方便看清模型行为。严格来说这不算“真实项目”,但用来验证手写代码的正确性已经足够了。

from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split X, y = make_classification( n_samples=1000, n_features=5, n_informative=3, n_redundant=0, random_state=42 ) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) X_train = (X_train - X_train.mean(axis=0)) / X_train.std(axis=0) X_test = (X_test - X_test.mean(axis=0)) / X_test.std(axis=0) w, b = train_logreg(X_train, y_train, lr=0.1, epochs=500)

一个很容易踩的坑是特征标准化。逻辑斯蒂回归对特征的尺度很敏感,如果不做标准化,梯度更新时大特征对应的参数会来回震荡,损失曲线下降很慢。我第一次手写这个模型时忘了做标准化,跑了 2000 轮还像没睡醒一样,损失下不去,一度怀疑是梯度公式写错了。后来加上标准化,问题立刻消失。

验证模型好坏,除了看损失,更应该看准确率。可以用一个简单方法预测:p > 0.5 判定为正类,然后计算准确率。

def predict(X, w, b, threshold=0.5): p = sigmoid(X @ w + b) return (p >= threshold).astype(int) train_acc = np.mean(predict(X_train, w, b) == y_train) test_acc = np.mean(predict(X_test, w, b) == y_test) print(f"train acc: {train_acc:.3f}, test acc: {test_acc:.3f}")

一般模拟数据上准确率能达到 0.9 左右。如果你手写的模型和 sklearn 的 LogisticRegression 准确率相差太大,不要怀疑你的推导,先检查数据和标准化步骤是不是出了问题。

4.3 最大熵模型的最小代码框架

逻辑斯蒂回归能写代码,最大熵模型当然也能写,但完整实现 IIS 比较复杂。如果只是想去理解最大熵模型的教学实现,可以只搭一个最简框架,核心是:定义特征函数、计算经验期望、计算模型期望、迭代参数。

最大熵模型的指数形式 P_w(y|x) 在代码里就对应一行:

def compute_prob(w, X, feat_list): n = len(X) probs = np.zeros((n, num_labels)) for i in range(n): scores = np.zeros(num_labels) for y in range(num_labels): for fid, f in enumerate(feat_list): if f(X[i], y): scores[y] += w[fid] scores -= scores.max() exp_scores = np.exp(scores) probs[i] = exp_scores / exp_scores.sum() return probs

看到没有,这里的分母求和就是规范化因子 Z_w(x)。特征函数 f 是一个返回布尔值的指示函数,整个模型的自由度全部藏在特征函数里。这也是为什么在 3.3 反复强调特征函数设计的重要性——代码本身不复杂,复杂的是你定义了什么样的特征。

工程上真正做文本序列标注时,几乎没人会这样从头实现朴素最大熵模型,而是直接用条件随机场框架。但从学习角度看,动手写一个这么小的最大熵模型,能让你对“规范化因子”“特征期望”“对偶函数”这些名词的感受完全不一样。我也建议你这样做,只写框架、只跑通一个小数据集,感受会深刻得多。

5. 高频问题与经验速查

5.1 这一章需要背下来的公式表

第六章的公式很多,但真正需要熟练到能默写的其实有限。我按重要程度整理了一个速查表,复习时可以照着自查:

核心概念公式说明
逻辑斯蒂模型P(Y=1x) = exp(w·x)/(1+exp(w·x))
对数几率ln(P/(1-P)) = w·x模型本质是线性函数在拟合对数几率
对数似然Σ [y ln π + (1-y) ln(1-π)]训练时的目标函数
梯度Σ (y_i - π(x_i)) x_i残差乘特征的优雅形式
最大熵模型P_w(yx) = exp(Σ w_i f_i)/Z_w(x)
对偶函数Σ w_i E_p(f_i) - Σ P'(x) ln Z_w(x)等价于样本对数似然
IIS 更新方程E_p(f_i) = E_{P_w}(f_i exp(δ_i f^#))求解 δ_i 时核心等式

这张表不是说只背这些就够,而是说这些是做题和面试时被反复调用的基础公式。后面所有推导,几乎都是在这几个公式基础上变形得到的。

5.2 面试最可能问到的对比问题

逻辑斯蒂回归和最大熵模型这一章,是机器学习面试的重灾区。高频问题翻来覆去就是那几道,我把它们整理出来,并给一个能直接用的回答要点。

第一个问题:为什么逻辑斯蒂回归用交叉熵做损失,不用均方误差?回答要点是均方误差对 sigmoid 输出求梯度时,会出现 σ'(z) = σ(1-σ) 这种接近 0 的因子,导致参数更新极慢,也就是梯度饱和问题。交叉熵配合 sigmoid 后,梯度变成了残差乘特征,误差大时更新快,误差小时更新慢,性质非常理想。

第二个问题:逻辑斯蒂回归和朴素贝叶斯有什么区别?回答要点是朴素贝叶斯是生成式模型,对特征的联合分布做了条件独立假设,生成模型先估计 P(x|y) 再算 P(y|x);逻辑斯蒂回归是判别式模型,直接对 P(y|x) 建模,不关心特征之间的相关性。实践中如果特征之间高度相关,逻辑斯蒂回归通常比朴素贝叶斯更稳。

第三个问题:最大熵模型和逻辑斯蒂回归是什么关系?回答要点是最大熵模型在多分类场景下,如果特征函数只取 “x 的第 k 个分量” 和 “类别为 c” 这种简单指示特征,它就会退化成一个多分类逻辑斯蒂回归,也就是 Softmax 回归。所以二者是同一类模型在不同叙述下的产物。

5.3 常见理解误区

网上关于这一章的讨论很多,不少流传很广的说法其实是错的,或者只说对了一半。我把最常见的误区集中列出来,你学的时候可以对照自查。

第一个误区:逻辑斯蒂回归的“逻辑斯蒂”是某种对数据做逻辑判断的过程。它不是,它就是一个音译,对应的英文是 logistic,与“逻辑”这个词的含义无关。

第二个误区:最大熵模型要求熵最大,所以模型越随机越好。不对,最大熵是在约束条件下最大化熵,约束本身已经把训练数据里的信息注入模型了。真正做出来的是“在满足所有已知事实的分布里,不确定性最大的那个”,不是什么都不管的均匀分布。

第三个误区:逻辑斯蒂回归是一个线性模型,所以它不能处理非线性问题。这个说法要拆开看。在原始特征空间中,它确实只能学线性决策边界,但如果你对特征做非线性变换,比如多项式特征、核特征,逻辑斯蒂回归同样能表达非线性边界。它不是天生不能非线性,而是不在模型内部做非线性变换。

6. 我学这一章时的体会

说一点个人经验。我第一次学第六章时,犯了两个错误。第一个错误是试图把所有公式一次性全记住,结果推导起来还是一团乱麻。后来发现这章必须“少记多推”,核心公式只要记住 5.1 那张表的量级,剩下的都临时推,反而更牢。第二个错误是早期看逻辑斯蒂回归和最大熵模型都是分开看的,直到有一天突然意识到它们就是同一个模型,那种“通了”的感觉非常奇妙。

如果你也在啃这一章,我建议你用一条主线把所有内容串起来:线性得分 → 指数函数 → 归一化因子 → 概率表示 → 极大似然。逻辑斯蒂回归是这条主线在二分类特例下的具体化,最大熵模型是这条主线在特征约束下的完整展开。抓住这条主线,这一章所有的模型、推导、习题,就都只是这根藤上的枝叶了。

最后再分享一个做这章习题的小技巧:不要只在自己脑子里推,一定要把每一步写在纸上,尤其涉及拉格朗日对偶和 IIS 放缩的部分,写下来的过程会帮你提前暴露很多符号错误。我当年就是靠着这种笨办法,才把最大熵模型这套推导真正变成自己的东西。希望这篇笔记也能让你少走几步弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 11:19:53

diagram-design指南:从架构图到流程图的视觉传达设计

diagram-design这个词,我最早是在整理架构文档时意识到的。当时某项目上线后需要做技术交底,面对一张画得满满当当、却谁都看不懂的网络拓扑图,我才发现:会画图是一回事,把图设计得让读者一眼抓住重点,是另…

作者头像 李华
网站建设 2026/10/19 11:14:38

3D国风仙侠美少年AI绘画提示词:结构化拆解与实操模板

搞AI绘画久了你会发现一个特别尴尬的现象:你明明想画一个“仙气飘飘的古风美少年”,出来的图却像“影楼汉服写真的火柴人”,或者是“白毛红瞳的西式奇幻精灵”,唯独不像国风、不像武侠、更不像少年。问题不全在你手残,…

作者头像 李华
网站建设 2026/10/19 11:13:20

基于深度学习的七类面部表情识别项目:CNN/VGG/ResNet全实现

简介:一份面向计算机相关专业学生与初学者的深度学习面部表情识别系统毕业设计资源,整合完整源码、学术论文、数据集和答辩PPT,适用于大作业、课程设计或毕业设计参考。压缩包共36个文件,以Python脚本(14个py&#xff…

作者头像 李华
网站建设 2026/10/19 11:11:49

Matlab实现Lasso回归时间序列预测:坐标下降法与完整流程

“基于lasso回归的时间序列预测”这块,网上Python的教程一抓一大把,但点进去一看,十个里有八个是调库—— sklearn 里 Lasso 一行搞定,再配个 train_test_split 就完事儿。看起来挺像那么回事,可一旦你想换成Mat…

作者头像 李华
网站建设 2026/10/19 11:11:18

C++初阶核心:内存模型、指针与引用一次讲透

很多朋友第一次接触“C初阶”笔记时,第一反应就是打开编译器,跟着教材抄一份完整的示例代码,再工工整整地抄几页语法要点:for循环怎么写、if怎么判断、指针怎么声明。我当年也是这样过来的,抄了一厚本,可当…

作者头像 李华